linux字元裝置及其驅動編寫簡介

2021-06-10 09:39:03 字數 3568 閱讀 5395

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...