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