1.1字元裝置簡介
字元裝置是一種按序列順序來訪問的裝置,如觸控螢幕,磁帶驅動器,滑鼠等。
1.2字元裝置驅動
字元裝置驅動負責驅動字元裝置,通常實現由open
,read
,write
,close
,ioctl
等函式。
1.3裝置號
裝置號分為主次裝置號,主裝置號標示裝置與哪個驅動相連,次裝置號標示同乙個驅動下的具體裝置。
1.4字元驅動編寫相關結構1
)file
結構體file
結構體代表乙個開啟的檔案(裝置也對應乙個檔案),在系統中,每開啟乙個檔案都在核心存在乙個對應的file
結構體。
它在乙個檔案開啟時有核心建立,關閉時由核心釋放。在期間傳遞在檔案上進行操作的函式。
structfile
的指標通常命名為filp
。structfile f_u;
structpath f_path;
conststruct file_operations *f_op; /*和檔案關聯的操作*/
spinlock_t f_lock;
atomic_long_t f_count;
unsignedint f_flags; /*檔案標誌,如:o_rdonly,o_nonblock*/
fmode_tf_mode; /*檔案讀/寫模組,fmode_readfmode_write*/
loff_t f_pos; /*當前讀寫位置*/
structfown_struct f_owner;
conststruct cred *f_cred;
structfile_ra_state f_ra;
u64 f_version;
void *private_data; /*檔案私有資料指標*/2
)inode
結構vfsinode
包含檔案訪問許可權,屬主,組,大小,生成時間,訪問時間,最後修改時間等資訊。它是linux
管理檔案系統的最基本單位,也是檔案系統連線任何子目錄,檔案的橋梁。
struct inode
3)cdev
結構體cdev
結構體用於描述字元裝置,可以理解為cdev
就是裝置。
structcdev ;
dev_t
:其實質為unsignedint 32
位整數,其中高12
位為主裝置號,低20
位為次裝置號。使用下列巨集可以從dev_t
獲得主裝置號和次裝置號:
major(dev_tdev);
minor(dev_tdev);
使用下列巨集可以通過主裝置號和次裝置號生成dev_t
mkdev(intmajor,int minor);4
)kobject
結構體5
)file_operations
結構體file_operations
結構體專門用來繫結操作函式,如read
,write
,ioctl
等函式,
file_operations
結構體中的成員函式是字元裝置驅動程式設計的主體內容,
這些函式實際會在應用程式進行linux
的open(),write(),read(),close()
等系統呼叫時最終被呼叫,file_operations
結構體目前已經比較龐大。
2.1字元驅動編寫的要義
載入函式
解除安裝函式
實現file_operations
成員函式
其關係圖如下:
**編寫
載入模板
struct***_dev_t//裝置結構體
***_dev;
staticint __init ***_init(void) /*裝置驅動模組載入函式*/
else
ret=cdev_add(&***_dev.cdev,***_dev_no,1); //註冊裝置
...
}
解除安裝模板
staticvoid __exit ***_exit(void) /*裝置驅動模組解除安裝函式*/
file_operation
成員函式實現模板
// file_operations
結構體設定,該裝置的所有對外介面在這裡明確,此處只寫出了幾個常用的
staticstruct file_operations ***_fops =
;字元裝置驅動程式設計的主體工作是:
初始化、新增和刪除cdev結構體,申請和釋放裝置號,以及填充file_operations結構體中的操作函式,實現file_operations結構體中的read(),write(),ioctl()等函式。
編寫Linux裝置驅動
核心版本 2.4.22 閱讀此文的目的 學會編寫linux裝置 驅動。閱讀此文的方法 閱讀以下2個 檔案 hello.c,asdf.c。此文假設讀者 已經能用c語言編寫linux應用程式,理解 字元裝置檔案,塊裝置檔案,主裝置號,次裝置號 會寫簡單的shell指令碼和makefile。1.hello...
字元裝置驅動編寫步驟
1.標準字元裝置驅動 a.註冊裝置號 如 if key major 靜態註冊 err register chrdev region devno,1,device name else b.記憶體申請給cdev 當cdev定義為指標時 然後呼叫以下函式進行裝置初始化並新增該裝置 void cdev in...
字元裝置驅動編寫步驟
1.標準字元裝置驅動 a.註冊裝置號 如 if key major 靜態註冊 err register chrdev region devno,1,device name else b.記憶體申請給cdev 當cdev定義為指標時 然後呼叫以下函式進行裝置初始化並新增該裝置 void cdev in...