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