概述
設(shè)備樹(shù)(Device tree)是一套用來(lái)描述硬件屬相的規(guī)則。ARM Linux采用設(shè)備樹(shù)機(jī)制源于2011年3月份Linux創(chuàng)始人Linus Torvalds發(fā)的一封郵件,在這封郵件中他提倡ARM平臺(tái)應(yīng)該參考其他平臺(tái)如PowerPC的設(shè)備樹(shù)機(jī)制描述硬件。因?yàn)樵诖酥,ARM平臺(tái)還是采用舊的機(jī)制,在kernel/arch/arm/plat-xxx目錄和kernel/arch/arm/mach-xxx目錄下用代碼描述硬件,如注冊(cè) platform設(shè)備,聲明設(shè)備的resource等。因?yàn)檫@些代碼都是用來(lái)描述芯片平臺(tái)及板級(jí)差異的,所以對(duì)于內(nèi)核來(lái)講都是垃圾代碼。因?yàn)榍度胧狡脚_(tái)中很多公司的芯片采用的都是ARM架構(gòu),隨著Android的成功,這些代碼越來(lái)越多。據(jù)說(shuō)常見(jiàn)的平臺(tái)如s3c2410板級(jí)目錄下邊的代碼有數(shù)萬(wàn)行,難怪Linux Torvalds會(huì)說(shuō)“this whole ARM thing is a fucking pain in the ass”。
內(nèi)核中關(guān)于設(shè)備樹(shù)的文檔位于kernel/Documentation/devicetree/目錄。設(shè)備樹(shù)是Power.org組織定義的一套規(guī)范,規(guī)范文檔可以在官網(wǎng)上找到,目前最新的版本是https://www.power.org/documentation/epapr- version-1-1/。內(nèi)核中設(shè)備樹(shù)相關(guān)的函數(shù)都是以of開(kāi)頭的,我推測(cè)原因是設(shè)備樹(shù)機(jī)制是源于IEEE 1275 Open Firmware standard規(guī)范的,相關(guān)的代碼都是繼承下來(lái)的。如果想快速了解下設(shè)備樹(shù)怎么用,可以參考//devicetree.org /Device_Tree_Usage。
設(shè)備樹(shù)是從軟件使用的角度描述硬件的,不是從硬件設(shè)計(jì)的角度描述的。我們?cè)趯?xiě)設(shè)備樹(shù)時(shí)沒(méi)有必要按照硬件邏輯生搬硬套,也不要指望通過(guò)閱讀設(shè)備樹(shù)弄清楚硬件是如何設(shè)計(jì)的。對(duì)于軟件可以自動(dòng)識(shí)別的硬件,如USB設(shè)備,PCI設(shè)備,也是沒(méi)有必要通過(guò)設(shè)備樹(shù)描述的。
我個(gè)人覺(jué)得規(guī)范內(nèi)容是可以分為兩個(gè)層次的。第一層是關(guān)于設(shè)備樹(shù)組織形式的,如設(shè)備樹(shù)結(jié)構(gòu),節(jié)點(diǎn)名字的構(gòu)成等,第一個(gè)層次是基礎(chǔ),是理解第二個(gè)層次的前提。第二層是關(guān)于設(shè)備樹(shù)內(nèi)容的,如多核CPU怎樣描述,一個(gè)具體的設(shè)備如何描述。第二層可以看成是第一層的具體應(yīng)用。相對(duì)來(lái)說(shuō)第二層內(nèi)容更多,更具體,根據(jù)描述的內(nèi)容不同,定義規(guī)范的方式也有差別,比如關(guān)于CPU,內(nèi)存,中斷這些基礎(chǔ)的內(nèi)容,是在epapr中說(shuō)明的,而關(guān)于外設(shè)的規(guī)范是在專(zhuān)門(mén)的地方說(shuō)明的。
DTS(Device tree syntax,另一種說(shuō)法是Device tree source)是設(shè)備樹(shù)源文件,為了方便閱讀及修改,采用文本格式。DTC(Device tree compiler)是一個(gè)小工具,負(fù)責(zé)將DTS轉(zhuǎn)換成DTB(Device tree blob)。DTB是DTS的二進(jìn)制形式,供機(jī)器使用。使用中,我們首先根據(jù)硬件修改DTS文件,然后在編譯的時(shí)候通過(guò)DTC工具將DTS文件轉(zhuǎn)換成 DTB文件,然后將DTB文件燒寫(xiě)到機(jī)器上(如emmc,磁盤(pán)等存儲(chǔ)介質(zhì))。系統(tǒng)啟動(dòng)時(shí),fastboot(或者類(lèi)似的啟動(dòng)程序,如Uboot)在啟動(dòng)內(nèi)核前將DTB文件讀到內(nèi)存中,跳轉(zhuǎn)到內(nèi)核執(zhí)行的同時(shí)將DTB起始地址傳給內(nèi)核。內(nèi)核通過(guò)起始地址就可以根據(jù)DTB的結(jié)構(gòu)解析整個(gè)設(shè)備樹(shù)。說(shuō)設(shè)備樹(shù)的規(guī)范可以分成兩個(gè)層次,是針對(duì)DTS的,關(guān)于DTB的結(jié)構(gòu)不在此范圍內(nèi)。DTB僅僅是為了方便機(jī)器使用而對(duì)DTS的轉(zhuǎn)換而已(也可以說(shuō)DTS僅是為了方便人類(lèi)使用而對(duì)DTB的一種描述)。
設(shè)備樹(shù)首先是一個(gè)樹(shù)形結(jié)構(gòu),并且是一棵樹(shù)。除了根節(jié)點(diǎn)外其他子節(jié)點(diǎn)都有唯一的父節(jié)點(diǎn),節(jié)點(diǎn)下可以有子節(jié)點(diǎn)和屬性(子節(jié)點(diǎn)可以看成是樹(shù)枝,屬性可以看成是葉子)。屬性由名字和值組成(名字是必須的,但是值不是必須的,如果只要根據(jù)是否存在這個(gè)屬性就可以表示我們想要的功能,那么可以不需要有值)。
下邊是我們從內(nèi)核代碼中截取的一個(gè)DTS片段!/”表示根節(jié)點(diǎn)!癿odel = "Newflow AM335x NanoBone"”是根節(jié)點(diǎn)下邊的屬性。“cpus”是根節(jié)點(diǎn)的一個(gè)子節(jié)點(diǎn)!癱pu0-supply = <&dcdc2_reg>”是“cpu@0”子節(jié)點(diǎn)下的屬性。節(jié)點(diǎn)下的屬性用來(lái)表示節(jié)點(diǎn)的特性,子節(jié)點(diǎn)和父節(jié)點(diǎn)具有一定的從屬關(guān)系。真實(shí)的硬件不可能是這樣規(guī)則的樹(shù)形結(jié)構(gòu),所以設(shè)備樹(shù)僅是軟件開(kāi)發(fā)人員為了描述硬件而做的一個(gè)近似表示而已,連抽象都算不上。
/ {
model = "Newflow AM335x NanoBone";
compatible = "ti,am33xx";
cpus {
cpu@0 {
cpu0-supply = <&dcdc2_reg>;
};
};
memory {
device_type = "memory";
reg = <0x80000000 0x10000000>; /* 256 MB */
};
leds {
compatible = "gpio-leds";
led@0 {
label = "nanobone:green:usr1";
gpios = <&gpio1 5 0>;
default-state = "off";
};
};
};
2015職稱(chēng)計(jì)算機(jī)考試書(shū)PowerPoint2007中 .. 定價(jià):¥45 優(yōu)惠價(jià):¥42 更多書(shū)籍 | |
2015年全國(guó)職稱(chēng)計(jì)算機(jī)考試教材(2007模 .. 定價(jià):¥225 優(yōu)惠價(jià):¥213 更多書(shū)籍 |