標籤:des style blog http color 使用
第一篇
轉載自csdn vipclx
編寫Linux驅動八步驟
一、建立Linux驅動架構(裝載、卸載Linux驅動)
Linux核心在使用驅動時首先要裝載驅動,在裝載過程中進行一些初始化動作(建立裝置檔案、分配記憶體等),在驅動程式中需提供相應函數來處理驅動初始化工作,該函數須使用module_init宏指定;Linux系統在退出是需卸載Linux驅動,卸載過程中進行一些退出工作(刪除裝置檔案、釋放記憶體等),在驅動程式中需提供相應函數來處理退出工作,該函數須使用module_exit宏指定。Linux驅動程式一般都要這兩個宏指定這兩個函數,所以包含這兩個宏以及其所指定的兩個函數的C程式可看作是Linux驅動的架構。
二、註冊和登出裝置檔案
任何Linux驅動都需要有一個裝置檔案來與應用程式進行互動。建立裝置檔案的工作一般在上一步module_init宏指定的函數中完成的,可以使用misc_register函數建立裝置檔案;刪除裝置檔案的工作一般在上一步module_exit宏指定的函數中完成的,可以使用misc_deregister函數刪除裝置檔案。
三、指定驅動相關資訊
驅動程式是自描述的,驅動程式的資訊需要在驅動原始碼中指定。通過MODULE_AUTHOR(作者姓名)、MODULE_LICENSE(使用的開源協議)、MODULE_ALIAS(別名)、MODULE_DESCRIPTION(驅動描述)等宏來指定與驅動相關的資訊,這些宏一般寫在驅動源碼檔案的結尾。可通過modinfo命令擷取這些資訊。
四、指定回呼函數
Linux驅動包含了很多動作,也稱為事件,如“讀”“寫”事件,觸發相應事件時Linux系統會自動調用對於驅動程式的相應回呼函數。一個驅動程式不一定要指定所以的回呼函數。回呼函數通過相關機制進行註冊。如與裝置檔案相關的回呼函數使用misc_register函數註冊。
五、編寫商務邏輯
沒什麼可說的,總不能註冊一些空的回呼函數,什麼也不做吧。
六、編寫Makefile檔案
Linux核心源碼的編譯規則是通過Makefile檔案定義的,每個Linux驅動程式必須要有一個Makefile檔案。
七、編譯Linux驅動程式
Linux驅動程式可直接編譯進核心(使用obj-y編譯),也可以作為模組單獨編譯(使用obj-m編譯)。
八、安裝和卸載Linux驅動
如果將驅動編譯進核心,只要Linux使用該核心,驅動程式就會自動裝載。如果Linux驅動程式以模組單獨存在,需要使用insmod或modprobe命令裝載Linux驅動模組,使用rmmod命令卸載該模組。
第二篇
Linux 驅動程式開發步驟
Linux 核心就是由各種驅動組成的,核心源碼中大約85%是各種驅動程式的代碼。核心中驅動程式種類齊全,可以在同類型驅動的基礎上進行修改以適應具體單板
編寫驅動的痛點並不是硬體的具體操作,而是弄清楚現有驅動程式的構架,在這個構架中加入這個硬體。花費精力的地方在於,瞭解某裝置的驅動構架,找到修改的位置。
此外,還要考慮驅動的並發問題等。
編寫Linux大致流程:
1.查看原理圖,資料手冊,瞭解裝置的操作方法
2.在核心中找到相近的驅動程式,以它為模板進行開發,有時候需要從0開始
3.實現驅動程式的初始化,比如向核心註冊這個驅動程式,這樣應用程式傳入檔案名稱時,核心才能找到相應的驅動程式。
4.設計所要實現的操作,如open,close,read,write等函數。
5.實現中斷服務(中斷並不是每個裝置驅動所必須的)
6.編譯驅動程式到核心中,或者用insmod命令載入
7.測試驅動程式。
驅動程式的載入和卸載
可以將驅動程式靜態編譯進核心中,也可以將他作為一個模組在使用時再載入。在配置核心時,如果某個配置項被設為m,就表示他被編譯成一個模組
insmod載入 rmmod卸載 lsmod查看核心中已經載入了哪些模組
當使用insmod載入模組時,模組的初始化函數被調用,它用來向核心註冊驅動程式。
當使用rmmod卸載模組時,模組的清除函數被調用
假設初始化函數為my_init,清除函數為my_cleanup
則 module_init(my_init);
module_exit(my_cleanup);
一 編寫字元裝置驅動
編寫字元裝置驅動程式就是為具體的硬體的file_operations結構編寫各個函數
那麼,當應用程式通過open,read,write等系統調用訪問某個裝置檔案時,Linux系統怎麼知道去調用哪個驅動程式的file_operator結構中的open,read,write等成員呢?
1.模組初始化時,將主裝置號與file_operations一起註冊
驅動程式中有一個初始化函數,在安裝驅動程式時會調用它。在初始化函數中,會將驅動程式file_operation結構連同其主裝置號一起向核心進行註冊。對於字元型裝置,使用int register_chrdev
這樣,應用程式操作裝置檔案時,Linux系統會根據裝置檔案類型,主裝置號找到核心中註冊的file_operation結構,(對於塊裝置為block_device_operations結構),次裝置號僅供驅動程式自身用來分辨他是同類裝置中的第幾個。
編寫驅動程式的大致過程:
1.編寫驅動程式初始化函數。
進行必要的初始化,包括硬體初始化(也可放在其他地方),向核心註冊驅動程式等。
2.構造file_operation
進階的驅動編程還涉及中斷,select機制,fasync非同步通知機制。等
驅動程式編譯
將光碟片上編寫好的XXX.c的驅動檔案放入核心drivers/char 子目錄下,在drivers/char/Makefile中添加下面一行
obj-m += XXX.o
然後在核心根目錄下執行“make modules”,就可以產生.ko檔案
最後,要在開發板根檔案系統中建立裝置檔案
mknod /dev/leds c 231 0