目錄
一、驅動的作用
二、裸機驅動 VS linux驅動
1、裸機驅動
2、linux驅動
三、linux驅動位于哪里?
四、應用編程 VS 內核編程
1、共同點
2、不同點
五、linux驅動分類
1、字符設備
2、塊設備
3、網絡設備
六、Linux驅動學習難點與誤區
1、學習難點
2、學習誤區
?一、驅動的作用
相信學過os的同學,對上面的圖應該不陌生,操作系統位于應用層和硬件之間,向下管理著各種硬件資源,向上屏蔽硬件細節,提供統一操作接口。當應用層需要操作硬件時,通過各種系統調用向操作系統發出請求,操作系統根據傳入的參數,找到對應硬件的驅動,驅動再根據需求,操作硬件,完成請求。
二、裸機驅動 VS linux驅動
下面以最簡單的“點燈”實驗,來看裸機驅動和linux驅動的差別:
硬件電路圖如下:
當GPIO輸出高電平時,LED燈亮
當GPIO輸出低電平時,LED燈滅
1、裸機驅動
應用層:在while循環里,調用gpio_init()對gpio做初始化,調用Led_on()/Led_off()來控制LED亮滅
驅動層:需要用到兩個moudle:gpio和Led,其中gpio提供gpio操作函數集,如gpio_init(),gpio_output()等等,Led則提供led_init(),led_on()和led_off()?,led_on()調用gpio_ouput(1),讓GPIO輸出高電平,從而點亮led,同理,led_off()調用gpio_ouput(0),讓GPIO輸出低電平,從而熄滅led
2、linux驅動
首先linux驅動都是以module的形式來寫的,其次Led屬于字符設備,所以需要注冊一個字符設備,要向linux內核注冊一個字符設備,需要滿足三要素:分配設備號,實現file_operation操作集,動態分配并add一個cdev。操作gpio的操作可以包含在file_operation操作集里write函數中
你可能會疑惑:為什么linux驅動要這么復雜呢?其實一切都是為了實現“一切皆文件”的思想,這樣操作硬件就可以像操作文本文件一樣簡單啦
三、linux驅動位于哪里?
來一張linux系統全景圖:
為了提升系統的安全性,操作系統利用處理器的特權模式,將進程的地址空間分成了兩部分:用戶空間和內核空間,從上圖可以看出,驅動位于內核空間,所以驅動開發屬于內核編程范疇。
?四、應用編程 VS 內核編程
1、共同點
1)無論應用編程,還是內核編程,都是編程,編程就是寫程序,而程序 = 數據結構 + 算法,所以常用數據結構和算法是編程的基石!?
2)熟悉相應的API及其用法,應用編程需要和內核交互,比如在linux系統中操作文件,首先要open文件,open函數需要兩個參數,一個是路徑,一個是flag。linux驅動同樣需要與linux內核交互,比如創建一個字符設備需要先分配cdev結構體,再cdev_init,最后cdev_add
2、不同點
1)應用程序執行任務,從開始到結束,內核模塊將自己注冊到內核中,在module_init中做些初始化操作后,等待被調用
2)并非所有應用程序都是事件驅動類型,但所有內核模塊都是事件驅動類型
3)應用程序可以選擇偷懶不去釋放資源,由OS來統一回收,內核模塊卸載函數需要做init里相反的操作,否則資源一直被占用,直到系統重啟
4)應用程序可以使用C庫,但內核模塊只能使用內核export出來的符號表
5)處理錯誤的方式不同:應用程序一般會出現段錯誤,可以使用gdb直接調試,內核模塊可能會使系統panic,或者重啟
五、linux驅動分類
根據設備操作的特點,分為字符設備驅動,塊設備驅動和網絡設備驅動
1、字符設備
-
字節流
-
一般順序訪問
-
存在特殊的字符設備,允許lseek,mmap等操作
2、塊設備
-
以塊大小(512 byte)進行傳輸
-
任意順序訪問
-
可以安裝文件系統
3、網絡設備
-
使用套接字,處理網絡事務
工作中遇到絕大多數的設備為字符設備,比如串口,LCD,觸摸屏,platform設備等等都是字符設備。
六、Linux驅動學習難點與誤區
1、學習難點
1)linux驅動開發屬于內核編程,需要經常與內核其他子系統交互,因此需要熟悉linux內核
2)linux驅動需要處理并發,尤其如今已屬于SMP的天下
3)linux驅動的魯棒性要求高,否則會導致kernel panic
2、學習誤區
1)沒有硬件知識,看不懂原理圖,就不能做驅動開發
解釋:并非所有驅動都依賴對原理圖的理解,在實際工作中,驅動分為外設驅動和bsp驅動,其中bsp驅動,如pinctrl驅動,gpio驅動,clk驅動,regulator驅動,這些只依賴Soc的設計,和原理圖無關。
2)沒有開發板,就沒法學習linux驅動
解釋:如果要開發的驅動不涉及具體硬件,優先選擇qemu環境進行驅動開發
3)看書和看培訓視頻就行,不需要自己動手
解釋:20%理論 + 80%實踐,多動手,多實踐,方能事半功倍!!
4)抱著經典書狂啃就夠了
解釋:其實最好的學習資料是源代碼,經典書雖然經典,但其中內容早已過時,閱讀經典書重要的是把握其中的設計思想,閱讀最新的linux內核源代碼才知曉具體實現細節
參考資料:《LDD3》
? ? ? ? ? ? ? ? ? 《linux設備驅動開發詳解,基于4.0內核》