linux and the device tree linux內(nèi)核設(shè)備樹數(shù)據(jù)使用模型。
open firmware device tree (dt) 是一個(gè)數(shù)據(jù)結(jié)構(gòu),也是一種描述硬件的語(yǔ)言。準(zhǔn)確地說(shuō),它是一種能被操作系統(tǒng)解析的描述硬件的語(yǔ)言,這樣操作系統(tǒng)就不需要把硬件平臺(tái)的細(xì)節(jié)在代碼中寫死。
從結(jié)構(gòu)上來(lái)說(shuō),dt是一個(gè)樹形結(jié)構(gòu),或者有名結(jié)點(diǎn)組成的非循環(huán)圖,結(jié)點(diǎn)可能包含任意數(shù)量的有名屬性,有名屬性又可以包含任意數(shù)量的數(shù)據(jù)。同樣存在一種機(jī)制,可以創(chuàng)建從一個(gè)結(jié)點(diǎn)到正常樹形結(jié)構(gòu)之外的鏈接。
從概念上講,一套通用的使用方法,即bindings。bindings定義了數(shù)據(jù)如何呈現(xiàn)在設(shè)備樹中,怎樣描述典型的硬件特性,包括數(shù)據(jù)總線,中斷線,gpio連接以及外設(shè)等。
盡可能多的硬件被描述從而使得已經(jīng)存在的bindings最大化地使用源代碼,但是由于屬性名和結(jié)點(diǎn)名是簡(jiǎn)單字符串, 可以通過(guò)定義新結(jié)點(diǎn)和屬性的方式很方便地?cái)U(kuò)展已經(jīng)存在的bindings或者創(chuàng)建一個(gè)新的binding。在沒有認(rèn)真了解過(guò)已經(jīng)存在的bindings的情況下,創(chuàng)建一個(gè)新的binding要慎之又慎。
對(duì)于i2c總線,通常有兩種不同的,互不相容的bindings出現(xiàn),就是因?yàn)樾碌腷inding創(chuàng)建時(shí)沒有研究i2c設(shè)備是如何在當(dāng)前系統(tǒng)中被枚舉的。1. 歷史 略2. 數(shù)據(jù)模型 請(qǐng)參考device tree usage章節(jié)2.1 high level view 必須要認(rèn)識(shí)到的是,dt是一個(gè)描述硬件的數(shù)據(jù)結(jié)構(gòu)。
它并沒有什么神奇的地方,也不能把所有硬件配置的問題都解決掉。它只是提供了一種語(yǔ)言,將硬件配置從linux kernel支持的board and device driver中提取出來(lái)。
dt使得board和device變成數(shù)據(jù)驅(qū)動(dòng)的,它們必須基于傳遞給內(nèi)核的數(shù)據(jù)進(jìn)行初始化,而不是像以前一樣采用hard coded的方式。觀念上說(shuō),數(shù)據(jù)驅(qū)動(dòng)平臺(tái)初始化可以帶來(lái)較少的代碼重復(fù)率,使得單個(gè)內(nèi)核映像能夠支持很多硬件平臺(tái)。
linux使用dt的三個(gè)主要原因:1) 平臺(tái)識(shí)別 (platform identification)2) 實(shí)時(shí)配置 (runtime configuration)3) 設(shè)備植入 (device population)2.2 平臺(tái)識(shí)別 第一且最重要的是,內(nèi)核使用dt中的數(shù)據(jù)去識(shí)別特定機(jī)器。最完美的情況是,內(nèi)核應(yīng)該與特定硬件平臺(tái)無(wú)關(guān),因?yàn)樗杏布脚_(tái)的細(xì)節(jié)都由設(shè)備樹來(lái)描述。
然而,硬件平臺(tái)并不是完美的,所以內(nèi)核必須在早期初始化階段識(shí)別機(jī)器,這樣內(nèi)核才有機(jī)會(huì)運(yùn)行特定機(jī)器相關(guān)的初始化序列。大多數(shù)情況下,機(jī)器識(shí)別是與設(shè)備樹無(wú)關(guān)的,內(nèi)核通過(guò)機(jī)器的核心cpu或者soc來(lái)選擇初始化代碼。
以arm平臺(tái)為例,setup_arch()會(huì)調(diào)用setup_machine_fdt(),后者遍歷machine_desc鏈表,選擇最匹配設(shè)備樹數(shù)據(jù)的machine_desc結(jié)構(gòu)體。它是通過(guò)查找設(shè)備樹根結(jié)點(diǎn)的compatible屬性并與machine_desc->dt_compat進(jìn)行比較來(lái)決定哪一個(gè)machine_desc結(jié)構(gòu)體是最適合的。
compatible屬性包含一個(gè)有序的字符串列表,它以確切的機(jī)器名開始,緊跟著一個(gè)可選的board列表,從最匹配到其他匹配類型。以ti beagleboard的compatible屬性為例,beagleboard xm board可能描述如下:compatible = "ti,omap3-beagleboard", "ti,omap3450", "ti,omap3"; compatible = "ti,omap3-beagleboard-xm", "ti,omap3450", "ti,omap3"; 在這里,”ti, omap3-beagleboard-xm”是最匹配的模型,"ti,omap3450"次之,"ti,omap3"再次之。
機(jī)敏的讀者可能指出,beagle xm也可以聲明匹配"ti,omap3-beagleboard",但是要注意的是,板級(jí)層次上,兩個(gè)機(jī)器之間的變化比較大,很難確定是否兼容。從頂層上來(lái)看,寧可小心也不要去聲明一個(gè)board兼容另外一個(gè)。
值得注意的情況是,當(dāng)一個(gè)board承載另外一個(gè),例如一個(gè)cpu附加在一個(gè)board上。(兩種cpu支持同一個(gè)board的情況)。
第一階段:linux基礎(chǔ)入門Linux基礎(chǔ)入門主要包括: Linux硬件基礎(chǔ)、Linux發(fā)展歷史、Linux系統(tǒng)安裝、xshell連接、xshell優(yōu)化、SSH遠(yuǎn)程連接故障問題排查、L inux基礎(chǔ)優(yōu)化、Linux目錄結(jié)構(gòu)知識(shí)、Linux文件屬性、Linux通配符、正則表達(dá)式、Linux系統(tǒng)權(quán)限等第二階段:linux系統(tǒng)管理進(jìn)階linux系統(tǒng)管理進(jìn)階包括:Linux定時(shí)任務(wù)、Linux用戶管理、Linux磁盤與文件系統(tǒng)、Linux三劍客之sed命令等。
第三階段:Linux Shell基礎(chǔ)Linux Shell基礎(chǔ)包括:Shell編程基礎(chǔ)、Linux三劍客之a(chǎn)wk命令等。第四階段:Linux網(wǎng)絡(luò)基礎(chǔ)第五階段:Linux網(wǎng)絡(luò)服務(wù)Linux網(wǎng)絡(luò)服務(wù)包括:集群實(shí)戰(zhàn)架構(gòu)開始及環(huán)境準(zhǔn)備、rsync數(shù)據(jù)同步服務(wù)、Linux全網(wǎng)備份項(xiàng)目、nfs網(wǎng)絡(luò)存儲(chǔ)服務(wù)精講、inotify/sersync實(shí)時(shí)數(shù)據(jù)同步/nfs存儲(chǔ)實(shí)時(shí)備份項(xiàng)目等。
第六階段:Linux重要網(wǎng)絡(luò)服務(wù)Linux重要網(wǎng)絡(luò)服務(wù)包括:patible controller: Intel Corporation 82852/855GM Integrated Graphics Device (rev 02) 00:02。 1 Display controller: Intel Corporation 82852/855GM Integrated Graphics Device (rev 02) 00:1d。
0 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (rev 03) 00:1d。 1 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (rev 03) 00:1d。
2 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (rev 03) 00:1d。 7 USB Controller: Intel Corporation 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (rev 03) 00:1e。
0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 83) 00:1f。 0 ISA bridge: Intel Corporation 82801DBM (ICH4-M) LPC Interface Bridge (rev 03) 00:1f。
1 IDE interface: Intel Corporation 82801DBM (ICH4-M) IDE Controller (rev 03) 00:1f。 3 SMBus: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (rev 03) 00:1f。
5 Multimedia audio controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (rev 03) 00:1f。 6 Modem: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller (rev 03) 02:00。
0 Ethernet controller: Realtek Semiconductor Co。 , Ltd。
RTL-8139/8139C/8139C+ (rev 10) 02:09。0 CardBus bridge: Texas Instruments Texas Instruments PCIxx21/x515 Cardbus Controller 02:09。
2 FireWire (IEEE 1394): Texas Instruments Texas Instruments OHCI Compliant IEEE 1394 Host Controller 02:09。3 Unknown mass storage controller: Texas Instruments Texas Instruments PCIxx21 Integrated FlashMedia Controller 02:09。
4 Class 0805: Texas Instruments Texas Instruments PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Secure Digital (SD)。
在linux內(nèi)核啟動(dòng)過(guò)程中,這兩個(gè)名字匹配了,就調(diào)用驅(qū)動(dòng)的probe函數(shù)。
設(shè)備樹中的每一個(gè)代表了一個(gè)設(shè)備的節(jié)點(diǎn)都要有一個(gè)compatible屬性。compatible是系統(tǒng)用來(lái)決定綁定到設(shè)備的設(shè)備驅(qū)動(dòng)的關(guān)鍵。
compatible屬性是用來(lái)查找節(jié)點(diǎn)的方法之一,另外還可以通過(guò)節(jié)點(diǎn)名或節(jié)點(diǎn)路徑查找指定節(jié)點(diǎn)。 系統(tǒng)初始化時(shí)會(huì)初始化platform總線上的設(shè)備(按鍵驅(qū)動(dòng)表現(xiàn)為Platform驅(qū)動(dòng)),根據(jù)設(shè)備節(jié)點(diǎn)"compatible"屬性和驅(qū)動(dòng)中of_match_table對(duì)應(yīng)的值,匹配了就加載對(duì)應(yīng)的驅(qū)動(dòng)。
linux設(shè)備樹驅(qū)動(dòng)exynos4412怎么寫
系統(tǒng)調(diào)用是操作系統(tǒng)內(nèi)核和應(yīng)用程序之間的接口,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口。設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以象操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它完成以下的功能:
1、對(duì)設(shè)備初始化和釋放。
2、把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù)。
3、讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)和回送應(yīng)用程序請(qǐng)求的數(shù)據(jù)。
4、檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。
在Linux操作系統(tǒng)下有三類主要的設(shè)備文件類型,一是字符設(shè)備,二是塊設(shè)備,三是網(wǎng)絡(luò)設(shè)備。字符設(shè)備和塊設(shè)備的主要區(qū)別是:在對(duì)字符設(shè)備發(fā)出讀/寫請(qǐng)求時(shí),實(shí)際的硬件I/O一般就緊接著發(fā)生了,塊設(shè)備則不然,它利用一塊系統(tǒng)內(nèi)存作緩沖區(qū),當(dāng)用戶進(jìn)程對(duì)設(shè)備請(qǐng)求能滿足用戶的要求,就返回請(qǐng)求的數(shù)據(jù),如果不能,就調(diào)用請(qǐng)求函數(shù)來(lái)進(jìn)行實(shí)際的I/O操作。塊設(shè)備是主要針對(duì)磁盤等慢速設(shè)備設(shè)計(jì)的,以免耗費(fèi)過(guò)多的CPU時(shí)間來(lái)等待。
已經(jīng)提到,用戶進(jìn)程是通過(guò)設(shè)備文件來(lái)與實(shí)際的硬件打交道。每個(gè)設(shè)備文件都都有其文件屬性(c/b),表示是字符設(shè)備還是塊設(shè)備?另外每個(gè)文件都有兩個(gè)設(shè)備號(hào),第一個(gè)是主設(shè)備號(hào),標(biāo)識(shí)驅(qū)動(dòng)程序,第二個(gè)是從設(shè)備號(hào),標(biāo)識(shí)使用同一個(gè)設(shè)備驅(qū)動(dòng)程序的不同的硬件設(shè)備,比如有兩個(gè)軟盤,就可以用從設(shè)備號(hào)來(lái)區(qū)分他們。設(shè)備文件的的主設(shè)備號(hào)必須與設(shè)備驅(qū)動(dòng)程序在登記時(shí)申請(qǐng)的主設(shè)備號(hào)一致,否則用戶進(jìn)程將無(wú)法訪問到驅(qū)動(dòng)程序。
最后必須提到的是,在用戶進(jìn)程調(diào)用驅(qū)動(dòng)程序時(shí),系統(tǒng)進(jìn)入核心態(tài),這時(shí)不再是搶先式調(diào)度。也就是說(shuō),系統(tǒng)必須在你的驅(qū)動(dòng)程序的子函數(shù)返回后才能進(jìn)行其他的工作。如果你的驅(qū)動(dòng)程序陷入死循環(huán),不幸的是你只有重新啟動(dòng)機(jī)器了,然后就是漫長(zhǎng)的fsck。
讀/寫時(shí),它首先察看緩沖區(qū)的內(nèi)容,如果緩沖區(qū)的數(shù)據(jù)未被處理,則先處理其中的內(nèi)容。
你好,首先我要說(shuō)明我是ARM嵌入式開發(fā)工程師,偏驅(qū)動(dòng)向
驅(qū)動(dòng)難,沒有3年以上的工作經(jīng)驗(yàn) 都沒什么料子的
要寫驅(qū)動(dòng)
你要很熟悉linux C 而且注重字符串和指針處理
然后你就學(xué)數(shù)字電路 要多懂
其次要學(xué)會(huì)看datasheet
這些學(xué)得差不多了就進(jìn)入了內(nèi)核,為什么要知道內(nèi)核(只需要知道內(nèi)核的工作原理機(jī)制還有版本變動(dòng)),因?yàn)閮?nèi)核跟驅(qū)動(dòng)是不分家的,你寫了驅(qū)動(dòng)就知道
然后就是進(jìn)入主菜,寫驅(qū)動(dòng),看書時(shí)必須的,我看驅(qū)動(dòng)的書不下10本,而且盡量消化,隨后你就嘗試寫某些驅(qū)動(dòng),只要你會(huì)一個(gè)類型的就會(huì)這一類型的驅(qū)動(dòng),同類驅(qū)動(dòng)是萬(wàn)變不離其宗 不要想著全部驅(qū)動(dòng)都學(xué)會(huì),要學(xué)精!像NV realtek這些厲害的工程師 一輩子就寫兩個(gè)驅(qū)動(dòng)(當(dāng)然,所有驅(qū)動(dòng)中為網(wǎng)卡驅(qū)動(dòng)和顯卡驅(qū)動(dòng)最難最容易出錯(cuò)!同時(shí)也是最厲害的人去寫的)
驅(qū)動(dòng)!路漫漫其修遠(yuǎn)兮!
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁(yè)面生成時(shí)間:4.207秒