1. 程式人生 > >玩轉開發板--簡單的字元裝置

玩轉開發板--簡單的字元裝置

一.前言:

    開發環境:CentOS6.7(虛擬機器);

    開發板fl2440使用的Linux版本3.0最小核心;

    編寫驅動原則:只提供機制,不實現功能;     

    Linux核心將裝置按照訪問特性分為三類:字元裝置、塊裝置、網路裝置;

    

    字元裝置(本次學習目標)

一個字元裝置是一種可以當做一個位元組流來存取的裝置(如同一個檔案),對於這些裝置它一次I/O只訪問一個位元組。一個字元驅動負責實現這種行為,這樣的驅動常常至少實現open,close,read,和write系統呼叫

    例如:本例程使用命令mknod 建立的led節點如下:

/drivers >: ls /dev/led*
/dev/led0  /dev/led1  /dev/led2  /dev/led3

    注:mknod命令使用法則,可以通過mknod --help檢視

塊裝置

    常見的塊裝置有磁碟、光碟、U盤、SD卡、Nandflash、Norflash等。一個塊裝置一次I/O通常訪問一個塊的大小資料,這個大小通常2的冪次方位元組(Nnadflash使用2048個位元組)。對於塊裝置的使用,需要分割槽格式化後建立檔案系統,之後在應用程式空間中使用mount命令掛載起來後使用

    網路裝置

    網路裝置包括有線網絡卡(eth0)、無線網絡卡(wlan0)、迴環裝置(lo0)、撥號網路裝置(ppp0)等,他們在Linux核心裡由網路協議棧實現,在/dev路徑下並沒有相應的裝置節點,通過ifconfig -a命令可以檢視所有網路裝置。在應用程式程式設計時,所有對網路裝置的訪問都是通過socket()來訪問的

二.字元裝置驅動(注意要點)

    1.主次裝置號

    字元裝置通過檔案系統中的裝置名來存取,慣例上它們位於/dev目錄。我們可以通過ls -l /dev 來檢視當前有多少字元裝置(由於有很多就不列舉出來);也可以直接檢視當前正在使用的cat /proc/devices;

/drivers >: ls -l /dev/led*
crwxr-xr-x    1 root     root      250,   0 Jan  1 00:01 /dev/led0
crwxr-xr-x    1 root     root      250,   1 Jan  1 00:01 /dev/led1
crwxr-xr-x    1 root     root      250,   2 Jan  1 00:01 /dev/led2
crwxr-xr-x    1 root     root      250,   3 Jan  1 00:01 /dev/led3
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
....

    開頭c表示字元裝置,d表示資料夾,b表示塊裝置,s表示網路裝置;

    250,    0:表示主次裝置號;

    在編寫底層驅動時,我們可以獲取其主次裝置號;

MAJOR(dev_t dev);
MINOR(dev_t dev);

    設定主、次裝置號有2種方法:1.靜態設定    2.動態設定;

    注:1.靜態設定時要注意防止與其它裝置住次裝置號衝突;

           2.由於主次裝置號是系統資源,故一定要在程式退出時釋放其對應的裝置號;

    2.file_operation結構

file_operation就是把系統呼叫和驅動程式關聯起來的關鍵資料結構。也就是說我們平常的open,read,ioctl,close等函式的使用與其密切相關;以下是部分file_operation說明:(標頭檔案:/usr/include/linux/fs.h)

    

    例如:led_fops包涵open,close,ioctl呼叫

/* file operations open, close and ioctl */
static struct file_operations led_fops =
{
    .owner = THIS_MODULE,
    .open = led_open,
    .release = led_release,
    .unlocked_ioctl = led_ioctl,
};

    open函式:

static int led_open(struct inode *inode,struct file *file)
{   
    int minor = iminor(inode);

    file->private_data = (void *)minor;
    
    printk(KERN_DEBUG "/dev/drv_led %d opened.\n",minor);
    return 0;
}

3.inode結構

    當我們在Linux中建立一個檔案時,就會在相應的檔案系統中建立一個inode與之對應,檔案實體和檔案的inode是一一對應的,建立好一個inode會存在儲存器中

    當我們使用mknod建立一個裝置檔案時,也會在檔案系統中建立一個inode,這個inode和其他的inode一樣,用來儲存關於這個檔案的靜態資訊,包括這個裝置檔案對應的裝置號,檔案的路徑以及對應的驅動物件等。(標頭檔案:/usr/include/linux/fs.h)

    可以檢視2.的例子程式,會用到inode關聯;

4.file結構

    linux核心會為每一個程序維護一個檔案描述符表,這給表其實就是struct file的索引。open()的過程其實就是根據傳入的路徑填充好一個file結構並將其賦值到陣列中並返回其索引。下面是file的主要內容,他一樣是定義在include/linuxfs.h檔案中;

    可以檢視2.的例子程式,會用到file關聯;

5.cdev結構體

    核心在內部適用型別struct cdev的結構代表字元裝置。在核心呼叫你的裝置操作前,你必須分配一個這樣的結構體並註冊給Linux核心,在這個結構體裡對於這個裝置進行操作的函式,具體定義在file_operation結構體中。

    例如:

static struct cdev      *led_cdev;
static int __init s3c_led_init(void)
{
    led_cdev->owner = THIS_MODULE;
    cdev_init(led_cdev,&led_fops);
    cdev_add(led_cdev,devno,dev_count);
}

    注:cdev結構體還可以以動態方式初始化;也要記得釋放cdev結構體;
    

相關推薦

開發--簡單字元裝置

一.前言:     開發環境:CentOS6.7(虛擬機器);     開發板fl2440使用的Linux版本3.0最小核心;     編寫驅動原則:只提供機制,不實現功能;          Linux核心將裝置按照訪問特性分為三類:字元裝置、塊裝置、網路裝置;

微信開發-微信控制智慧家居簡易模型

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

ZYNQ Linux驅動開發——第一個字元裝置驅動

硬體平臺:XCZ7020 CLG484-1 完全適配Zedboard 開發環境:Widows下Vivado 2016.2 、 SDK2016.2 、 Linux機器:debin 目的:操作板載的LED燈LD9,受PS部分的MIO7控制 linux裝置驅

簡單字元裝置驅動示例

#include <linux/init.h> //for module_init #include <linux/module.h> //for printk #include <asm-generic/errno-base.h> #

C#精通C#程式設計:開發例項...C#程式設計入門、C#程式設計例項、C#開發例項與網路程式設計等....

            C#是微軟公司釋出的一種面向物件的、運行於.NET Framework之上的高階程式設計語言。並定於在微軟職業開發者論壇(PDC)上登臺亮相。C#是微軟公司研究員Anders Hejlsberg的最新成果。C#看起來與Java有著驚人的相似;它包

從零開始寫linux字元裝置驅動程式(一)(基於友善之臂tiny4412開發)

從這篇博文開始,我將開始手把手教會大家寫linux裝置驅動程式這是開篇,如何來寫第一個字元裝置驅動程式。首先,寫一個最簡單的字元裝置驅動程式需要什麼?或者說我們需要了解什麼?1、每一個字元裝置至少需要有一個裝置號2、裝置號 = 主裝置號 + 次裝置號3、同一類裝置的主裝置號一

TPYBoard開發帶你輕松MicroPython

性價比 擁有 開發板 大小 虛擬 背景 工業 使用 中一 說到MicroPython,也許有人會感到陌生。而說到和它密切相關的Python,是否會恍然大悟呢?Python屬於解釋型語言,1989年才開發完成的Python顯然非常年輕。然而經過數十年的磨礪,如今Python已

Android Camera開發(二):使用TextureView和SurfaceTexture預覽Camera 基礎拍照demo

處理 pict all sans 格式 facet ace ets nth Google自Android4.0出了TextureView。為什麽推出呢?就是為了彌補Surfaceview的不足。另外一方面也是為了平衡GlSurfaceView。當然這是本人揣度的。關於Te

TurnipBit—MicroPython開發:妥妥拽拽零基礎也能編程

電腦 開始 更多 教育 pin img 時代 python 實驗   可視化編程網站入口:www.turnipbit.com   說到編程、談到硬件,你也許會想到屌絲逆襲女神的“傳奇”故事,也許會浮現出帶著眼鏡、頭發稀少、無精打采的程序猿形象。“編程”,聽起來高大上卻似乎離

HTML5+跨平臺開發[6] H5多媒體標簽

sch -s play 框架 none 加粗 都是 特殊 class 匯總 1. video標簽 2. audio標簽 3. summary標簽和details標簽-詳情和概要標簽 4. marquee標簽-跑馬燈效果 5. HTML中被廢棄的標簽 6. HTM

HTML5+跨平臺開發[7] HTML meta標簽的其它類型

兩個 域名 信息展示 而且 爬蟲 搜索 scrip 註意 需要 meta其它類型 Keywords類型 作用: 告訴搜索引擎當前網頁的關鍵詞, 在SEO中非常重要, 能夠提高搜索命中率, 讓別人更容易找到你; 格式: <meta name="keywords

iOS開發 - Runloop 具體解釋

img mar dsm ews down eas log ada 開發 Runloop 具體解釋

開發自己的 chart - 每天5分鐘 Docker 容器技術(167)

Kubernetes Docker 容器 教程 Kubernetes 給我們提供了大量官方 chart,不過要部署微服務應用,還是需要開發自己的 chart,下面就來實踐這個主題。創建 chart執行 helm create mychart 的命令創建 chart mychart:Helm 會

小程序雲開發

上傳 記錄 rac new .json 環境 一個數 文件 哈哈 前言   好久沒寫小程序的文章了,最近小程序變動也比較大。最主要的是我之前也曾寫過個人如果開發小程序,可以使用Bmob免費的服務去開發自己的一套小程序,Bmob提供了免費的雲函數以及數據庫(20G空間)。

ESP32 LyraT音頻開發(一):搭建開發環境

star 技術 txt 開發板 工程 pri app 界面 比較 我是卓波,很高興你來看我的博客。 系列文章: ESP32 LyraT音頻開發板試玩(一):搭建開發環境 ESP32 LyraT音頻開發板試玩(二):播放音樂 關於ESP32的開發環境搭建,官方有教程,

Linux驅動開發(9)——註冊字元裝置

static int scdev_init(void) { int ret = 0,i; dev_t num_dev; printk(KERN_EMERG "numdev_major is %d!\n",numdev_major); printk(KERN_EMERG "

Linux驅動開發(8)——靜態和動態申請字元裝置

先貼一段demo #include <linux/init.h> /*包含初始化巨集定義的標頭檔案,程式碼中的module_init和module_exit在此檔案中*/ #include <linux/module.h> /*包含初始化載入模組的標頭檔案,程

Android Camera開發 四 預覽介面四周暗中間亮,只拍攝矩形區域圖片 附完整原始碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

從0到1kylin-01-kylin簡單介紹

這篇文章主要解答的一個問題就是: kylin 是什麼 ?  根據官方的介紹 http://kylin.apache.org/cn/docs/ 這篇部落格也很優秀:http://tech.meiyou.com/?p=97 Apache Kylin™是一個開源的分

AI&DS第一步:個人計算裝置搭建指南

      深度學習是人工智慧必不可少的一部分。而在硬體配置上,大家都在談論GPU的重要性。不可置否,GPU是掀起深度學習熱潮的主要力量,也是開展該領域工作所必不可少的硬體裝置。   不幸的是,人們往往把CPU、RAM、主機板、儲存和