一、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()等。
七、裝置的輪詢和中斷處理:
對於不支援中斷的裝置,讀寫時需要輪詢裝置狀態,以及是否需要繼續進行資料傳輸。例如,印表機。如果裝置支援中斷,則可按照中斷方式進行。
MTK平台驅動除錯指南
gpio設定篇 一 gpio有關的函式 1 gpio modesetup 函式原型 void gpio modesetup kal uint16 pin,kal uint16 conf dada 功能 設定gpio的工作模式是作為gpio,還是作為專有功能介面。引數 pin gpio 的pin腳號,...
MTK平台驅動除錯指南
gpio設定篇 一 gpio有關的函式 1 gpio modesetup 函式原型 void gpio modesetup kal uint16 pin,kal uint16 conf dada 功能 設定gpio的工作模式是作為gpio,還是作為專有功能介面。引數 pin gpio 的pin腳號,...
Linux驅動 按鍵驅動
開發板 tiny6410 核心版本 linux2.6.38 要想寫出案件驅動 需要複習的知識 1 混雜裝置的使用原理 2 系統呼叫驅動函式的原理 3 中斷處理機制 4 阻塞性裝置驅動的書寫規範 1 混雜裝置的註冊和使用比較簡單,以前也複習過,這裡不再複習 3 中斷處理機制 也有部落格內容中斷處理機制...