一、裸機驅動開發回顧
1、底層,跟寄存器打交道,有些MCU提供了庫。
二、Linux驅動開發思維
1、Linux下驅動開發直接操作寄存器不現實。
2、根據Linux下的各種驅動框架進行開發。一定要滿足框架,也就是Linux下各種驅動框架的掌握。
3、驅動最終表現就是/dev/xxx文件。打開、關閉、讀寫、。。。
4、現在新的內核支持設備樹,這個一個.dts文件,此文件 描述了板子的設備信息。
三、Linux驅動開發分類
linux驅動分為三大類:
1、字符設備驅動,最多的。
2、塊設備驅動,存儲
3、網絡設備驅動,
一個設備不說是一定只屬于某一個類型。比如USB WIFI,SDIO WIFI,屬于網絡設備驅動,因為他又有USB和SDIO,因此也屬于字符設備驅動。
四、應用程序和驅動的交互原理
1、驅動就是獲取外設、或者傳感器數據,控制外設。數據會提交給應用程序。Linux驅動編譯既要編寫一個驅動,還要我們編寫一個簡單的測試應用程序,APP。單片機下驅動和應用都是放到一個文件里面,也就是雜糅到一起。Linux下驅動和應用是完全分開的。
用戶空間(用戶態)和內核空間(內核態):
Linux操作系統內核和驅動程序運行在內核空間、應用程序運行在用戶空間。
應用程序想要訪問內核資源,怎么辦,有三種方法:系統調用、異常(中斷)和陷入。
應用程序不會直接調用系統調用,而是通過API函數來間接的調用系統調用,比如POSIX、API和C庫等。unix類操作系統中最常用的編程接口就是POSIX。
應用 程序使用open函數 打開一個設備文件。
每個系統調用都有一個系統調用號。
系統調用處于內核空間,應用程序無法直接訪問,因此需要“陷入“到內核,方法就是軟中斷。陷入內核以后還要指定系統調用號。
五、字符設備驅動開發流程
1,Linux里面一切皆文件,驅動設備表現就是一個/dev/下的文件,/dev/led。應用程序調用open函數打開設備,比如led。應用程序通過write函數向/dev/led寫數據,比如寫1表示打開,寫0表示關閉。如果要關閉設備那么就是close函數。
2,編寫驅動的 時候也需要編寫驅動對應的open、close,write函數。字符設備驅動fileoptions_struct.
1、驅動最終是被應用調用的,在寫驅動的時候要考慮應用開發的便利性。
2、驅動是分驅動框架的,要按照驅動框架來編寫,對于字符設備驅動來說,重點編寫應用程序對應的open、close、read、write等函數。