device tree是一種描述硬體的資料結構,它起源於 openfirmware (of)。在linux 2.6中,arm架構的板極硬體細節過多地被硬編碼在arch/arm/plat-***和arch/arm/mach-***,採用device tree後,許多硬體的細節可以直接透過它傳遞給linux,而不再需要在kernel中進行大量的冗餘編碼。device tree由一系列被命名的結點(node)和屬性(property)組成,而結點本身可包含子結點。所謂屬性,其實就是成對出現的name和value。
如果要使用device tree,首先使用者要了解自己的硬體配置和系統執行引數,並把這些資訊組織成device tree source file。
device tree將會被通過dtc(device tree compiler)編譯成適合機器處理的dtb(device tree blob)檔案。
device tree不是必須要描述系統中的所有硬體資訊,可以動態探測到的裝置是不需要描述的,但是無法動態識別的,需要在device tree中描述。例如,usb device不需要描述,usb host controller不能被探測,需要描述。
下面給出乙個device tree的模版:
/ name = "device-tree"
model = "myboardname"
compatible = "myboardfamilyname"
#address-cells = <2>
#size-cells = <2>
linux,phandle = <0>
chosen {
name = "chosen"
bootargs = "root=/dev/sda2"
linux,phandle = <4>
}cpus ;
memory ;
分析上面給出的例子,總結一下幾點:
1、device tree的基本單元是node。這些node被組織成樹狀結構,root node的node name是確定的,必須是「/」。除了root node,每個node都只有乙個parent。乙個device tree檔案中只能有乙個root node。
2、每個node中包含了若干的property/value來描述該node的一些特性。
2-1、每個node用節點名字(node name)標識,節點名字的格式是node-name@unit-address。
2-2、如果該node沒有reg屬性(後面會描述這個property),那麼該節點名字中必須不能包括@和unit-address。
2-3、對於cpu,其unit-address就是從0開始編址,以此加一。而具體的裝置,其unit-address就是暫存器位址。
3、在乙個樹狀結構的device tree中,要想唯一指定乙個node必須使用full path。在上面的例子中,cpu node我們可以通過/cpus/cpu@0x000訪問。
4、屬性:
4-1、可能是空,也就是沒有值的定義。
4-2、屬性值是32bit unsigned integers可能是乙個u32、u64的數值(值得一提的是cell這個術語,在device tree表示32bit的資訊單位)。例如#address-cells = <1> 。如果乙個device node中包含了有定址需求(要定義reg property),那麼就必須要定義#address-cells和#size-cells這兩個屬性
4-3、屬性值是text string或者string list,可能是乙個字串。例如device_type = "cpu";
乙個node被定義成如下:
[label:] node-name[@unit-address]
「」表示option,label方便在dts檔案中引用,乙個dts檔案可以巢狀多個node,並且可以通過include ***.dtsi來包含其他的node(如果包含,dti中的內容將把dtsi覆蓋)
1、aliases 節點定義了一些別名。(當要引用乙個node的時候要指明相對於root node的full path,如果多次引用,每次都要寫這麼複雜的字串多少是有些麻煩,因此可以在aliases 節點定義一些裝置節點full path的縮寫。)
2、memory device node是所有裝置樹檔案的必備節點,它定義了系統物理記憶體的layout。reg定義了該memory的起始位址和長度。其device_type必須等於memory。
3、device_type屬性定義了該node的裝置型別,例如cpu、serial等。
5、model屬性指明了該裝置屬於哪個裝置生產商的哪乙個model。
6、compatible屬性,該屬性的值是string list,定義了一系列的modle(每個string是乙個model)。這些字串列表被作業系統用來選擇用哪乙個driver來驅動該裝置。compatible的作用就是,在uboot中的**能通過compatible屬性match到dts相同的driver。uboot**內容如下:
static const struct udevice_id rockchip_gpio_ids = ,
};u_boot_driver(gpio_rockchip) = ;
device tree顯示的內容如下:
gpio0: gpio0@2007c000 ;
7、在dts檔案中是用interrupt-parent這個屬性來標識,使interrupt source物理連線到interruptcontroller。因為能夠產生中斷的device node沒有定義interrupt-parent的話,其interrupt-parent屬性就是跟隨parent node。因此,與其在所有的下游裝置中定義interrupt-parent,不如統一在root node中定義了。
8、interrupts屬性有三個
interrupts = ;
第乙個member表示該 interrupt 是 spi 還是 ppi。
第二個member就是具體的中斷號了。查閱soc的手冊就可以得到。(36 = number - 32)
第三個member指的是中斷的觸發方式,每個soc是不同的,查閱soc的手冊就可以知道了。
9、dmas = <&pdma 2>, <&pdma 3>;dma位址和dma通道選擇
Device Tree的反編譯命令
最近在搗鼓dts方面的東西,有時候會擔心自己配置的dts是否正確的問題。當我們編譯kernel時,有時會擔心我們的配置結果是什麼樣子的。以android平台為例,編譯出來的dts最終以dtb的形式展現出來,由於dtb是二進位制檔案,我們無法檢視因此 必須安裝dtc工具 安裝命令 sudo apt g...
linux系統中device tree的SPI描述
spi匯流排可以使用乙個spi主裝置節點和多個spi從裝置為子節點描述。想要在dev目錄中產生乙個spidev節點的話可以增加下面的描述 spidev1 spidev 0 end spidev 0 spidev1 最新的核心遇到compatible spidev 這個屬性會報出warnning,建議...
mysql配置引數優化 mysql配置引數優化
最大連線數 優化 max connections 1000 table open cache 256 query cache type 1 查詢快取大小 query cache size 1m tmp table size 32m 執行緒快取數 thread cache size 8 關閉dns做反...