Linux裝置驅動程式框架

2021-09-30 07:01:07 字數 2226 閱讀 2247

一、linux的裝置驅動程式與外界的介面可以分為三個部分:

1.驅動程式與作業系統核心的介面。通過file_operations(include/linux/fs.h)資料結構來完成的。

2.驅動程式與系統引導的介面。這部分利用驅動程式對裝置進行初始化。

3.驅動程式與裝置的介面。這部分描述了驅動程式如何與裝置進行互動,與具體的裝置密切相關。

二、根據功能劃分,裝置驅動程式的**有以下幾部分:

1.驅動程式的註冊和登出。

2.裝置的開啟和釋放。

3.裝置的讀寫操作。

4.裝置的控制操作。

5.裝置的中斷和輪詢處理。

三、驅動程式的註冊和登出:

裝置驅動程式可以在系統啟動的時候初始化,也可以在需要的時候動態載入。字元裝置的初始化由chr_dev_init()完成,包括對記憶體(devfs_register_chrdev(mem_major,"mem",&memory_fops)),終端(tty_init()),印表機(lp_init()),滑鼠(misc_init())等字元裝置的初始化。

塊裝置初始化由blk_dev_init()完成,這包括對ide硬碟(ide_init()),軟盤(floppy_init()),光碟機等塊裝置的初始化。

每個字元裝置或是塊裝置的初始化都是通過devfs_register_chrdev()或是devfs_register_blkdev()向核心註冊。在關閉字元裝置或是塊裝置時,還需要通過devfs_unregister_chrdev()或是devfs_unregister_blkdev()從核心中登出裝置。

四、裝置的開啟和釋放:

開啟裝置是由open()來完成的。例如,印表機是用lp_open()開啟的,而硬碟是用hd_open()開啟的。在大部分裝置驅動程式中,open完成如下工作:

1.增加裝置的是用計數。

2.檢查裝置的相關錯誤,如裝置尚未準備好或是類似硬體的問題。

3.檢查是首次開啟,則初始化裝置。

4.識別次裝置號,如有必要則更新f_op指標。

5.如果需要,分配且設定要放在filp->private_data裡的資料結構。

釋放裝置由release()來完成,例如釋放印表機是用lp_release(),而釋放終端裝置是用tty_release()。釋放裝置的一般步驟包括:

1.釋放在filp->private_data中的open分配的記憶體。

2.如果是最後一次釋放,則關閉裝置。

3.遞減設別的使用計數。

五、裝置的讀寫操作:

字元裝置使用各自的read()和write()來進行資料讀寫。例如,對虛擬終端的讀寫是通過vcs_read()和vcs_write()來進行資料讀寫的。

塊裝置使用通用的generic_file_read()和generic_file_write()來進行資料讀寫。這兩個通用函式向請求表新增讀寫請求,核心可以通過ll_rw_block()優化請求順序。由於是對記憶體緩衝區而不是裝置進行操作的,因而可以加快讀寫請求。如果記憶體緩衝區內沒有要讀入的資料或是要將寫請求寫入裝置,那麼就要真正的執行資料傳輸。這是通過資料結構request_queue和request_fn()來完成(include/linux/blkdev.h)。

六、裝置的控制操作:

除了讀寫操作,有時還要控制裝置。這可以通過裝置驅動程式中的ioctl()來完成。例如ide硬碟的控制可以通過hd_ioctl(),對光碟機的控制可以通過cdrom_ioctl()。

與讀寫操作不同,ioctl()的用法與具體裝置密切相關。以軟碟機的floppy_ioctl()為例(drivers/block/floppy.c):

static int fd_ioctl(struct inode *inode,

struct file *filp,

unsigned int cmd,

unsigned long param);

其中,cmd的取值及含義都是與軟碟機有關的,比如,fdeject表示彈出軟盤。

除了ioctl(),裝置驅動程式還可能有其他控制函式,比如llseek()等。

七、裝置的輪詢和中斷處理:

對於不支援中斷的裝置,讀寫時需要輪詢裝置狀態,以及是否需要繼續進行資料傳輸。例如,印表機。如果裝置支援中斷,則可按照中斷方式進行。

linux字元裝置驅動程式框架

include include include include include include include include include include include include define device count1 字元裝置結構體 struct dev struct dev dev...

linux裝置驅動程式 字元裝置驅動程式

先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...

Linux裝置驅動程式 字元裝置驅動程式

1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...