[23]_Linux設備驅動模型(重要)

-----------------------沒有程序驅動的硬件,就相當是一塊廢鐵,通了電之後就是會電人的廢鐵-----------------------------

1.  驅動是處於硬件和上層應用中的中間層的,它只是負責訪問硬件(譬如觸摸屏驅動,負責收集觸摸屏上的座標數據等並上報數據)並且給操作該硬件的軟件提供一個接口(API),而你需要在觸摸屏上顯示什麼或者做其他事情,則是你應用層該乾的事了。

2. Linux下的設備驅動分3類:字符設備、塊設備、網絡設備。一直有一種說法是Linux一切設備皆文件,其實不太正確。字符設備和塊設備在Linux中式表示爲文件,在應用層可以以文件io的方式式訪問它們,不過通常不使用文件io直接去訪問網絡設備。網絡設備間通信使用的socket接口等)。

(1) 字符設備:在Linux設備驅動開發中,接觸最多。字符設備的特點是可以順序訪問;

(2) 塊 設 備:  用來存儲文件的介質;譬如SD卡、硬盤、nor flash\ nand flash等,它的特點是按塊訪問,不是按字節訪問;

(3)網絡設備:譬如有線網卡、wifi網卡,在開發板上使用最多的是DM9000,主要是是通過socket訪問,網卡配置主要是使用ifconfig命令。

3. Linux中字符設備和塊設備都表現爲文件,譬如在/dev目錄下存放的是設備驅動對應的文件:(部分截圖)

4. Linux下的塊設備文件:

6. 注:在/dev目錄下是找不到網卡驅動的,原因是網絡設備在Linux中是唯一不體現一切皆文件的東西。

-------------------------------------------------------------------迴歸正題--------------------------------------------------------------------------------

1.關於Linux驅動的發展:在Linux 2.4 以前,驅動是一種分散的架構;在Linux 2.6 之後進行了一次規整(總線、設備、驅動),(好像在Linux 3.0之後增加了設備樹,這點目前我只知道有這麼一回事),還有目前我使用的Ubuntu 16.04.3版本內核是Linux ubuntu 4.10.0  了(使用uname -a命令查看),內核更新比較快。在目前可以不買開發板使用QEMU模擬器去學習Linux內核了,如何使用這個目前我也在研究中。

2. 理解設備驅動的模型估計是離不開着三個東西了:總線、設備、驅動

(1)我這樣理解:總線就像一條鎖鏈,設備像是掛載在鎖鏈上的鎖,驅動就是開鎖的鑰匙。(好浪漫....我突然想到了自己還是單身狗,唉.....一不小心又自己虐自己了...[2017、12、9])  (我什麼時候不單身了,我就回來把這句話刪掉......)


3. Linux的總線有:iic總線、spi總線、usb總線等。不過有一些設備不是掛載總線上的,在Linux中叫法是平臺設備(platform)。有一些設備驅動即是總線設備又屬於平臺設備。

4. 在Linux的驅動模型裏面,總線的驅動是總線的驅動,設備的驅動是設備的驅動,設備的註冊時設備的註冊。它們是三個不同的組成部分,不能混淆了。

(1)總線的驅動:總線驅動,是不需要修改一行代碼就可以在其他平臺上面使用的,當然這個不要我這一般水平的人寫。

(2)設備驅動:屬於板級信息,譬如說你移植的網卡掛在什麼總線,總線地址是多少,網卡是多少位的,這是屬於板級的信息,是和你具體的硬件相關的。

(3)Linux的每個驅動在註冊的時候,會去尋找匹配的設備;每個設備在註冊的時候會去尋找匹配的驅動。如何做到的呢?驅動和設備所掛載的總線驅動會自動去匹配相應的設備和驅動。

(4)那麼platform平臺上的設備和驅動是如何匹配的呢?這裏主要是平臺根據設備名字和驅動名字進行匹配的,所以編寫平臺設備驅動的時候設備名字和驅動名字很關鍵。這麼說吧:首先是在系統的某個平臺總線上註冊一個名字叫啊貓啊狗的設備(此設備啥都沒幹),後面接着又註冊了一個阿貓阿狗的驅動,因爲它們兩個的名字一樣,所以匹配上了,然後驅動就開始進入到運行的狀態了。

---------------------------------------------------------------------------------------------------------------

5. 簡單看過Linux的內核源碼的人都知道,內核是使用匯編和C語言寫出來的,C語言是面向過程的語言,不過Linux內核實現的思想卻是面向對象的,真的是很複雜。譬如說Linux內核文件系統的結構,它的設備驅動的模型。

6. Linux內核如何體現了面向對象的思想(繼承、重載、多態):譬如說總線和設備驅動都可以繼承kobject (kernel object) , kobject在註冊的時候可以認爲是抽象的基類,Linux內核用一份源代碼支持了很多種架構,譬如:在內核源代碼的arch目錄下,每一個文件夾就代表Linux支持的一種架構。


7.還有的是在arm目錄下,是Linux源代碼支持的幾十種arm架構的soc芯片,每個文件夾對應一個開發板。


--------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------

8. 不僅僅是設備和驅動要進行分離,驅動和驅動之間也要進行分離:

9. 驅動與驅動之間還涉及分離和分層的關係。硬件操作層(大多數人的工作位置)、驅動核心層、Linux應用上層

(1)譬如IIC總線上掛了很多設備,如觸摸屏驅動、




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章