[DTS]設備樹實例解析
前言
前面對設備樹的一些基本語法進行了講解,然后這一節通過一個demo來實踐一下具體的語法,可以和上一小節一起閱讀。多看多改自然就慢慢理解語法規則了。^_^
實例解析
下面的dts文件內容是網上比較常見的一個demo,我們把它拿過來解析。為什么不從arch/arm/boot/dts/中找一份呢? 因為里面的dts內容都很多,看着很容易暈,所以找一份簡短的來學習會更容易獲取成就感。
/ {
compatible = "acme,coyotes-revenge";
#address-cells = <1>; //子結點需要一個 cell 描述地址
#size-cells = <1>; //子結點需要一個 cell 描述長度
interrupt-parent = <&intc>;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
compatible = "arm,cortex-a9";
reg = <0>;
};
cpu@1 {
compatible = "arm,cortex-a9";
reg = <1>;
};
};
serial@101f1000 { //串口
compatible = "arm,pl011";
reg = <0x101f1000 0x1000 >;
interrupts = < 1 0 >;
};
serial@101f2000 { //串口
compatible = "arm,pl011";
reg = <0x101f2000 0x1000 >;
interrupts = < 2 0 >;
};
intc: interrupt-controller@10140000 { //中斷控制器
compatible = "arm,pl190";
reg = <0x10140000 0x1000 >;
interrupt-controller;
#interrupt-cells = <2>;
};
spi@10115000 { //spi 控制器
compatible = "arm,pl022";
reg = <0x10115000 0x1000 >; 起始地址為 0x10115000,長度為 0x1000
interrupts = < 4 0 >;
};
external-bus { //external bus 橋
#address-cells = <2> //子結點需要兩個 cell 描述地址,片選
#size-cells = <1>; //子結點需要一個 cell 描述長度
ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet 片選 0 0,地址 0x10100000 ,長度 0x10000
1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
ethernet@0,0 {
compatible = "smc,smc91c111";
reg = <0 0 0x1000>;
interrupts = < 5 2 >;
};
i2c@1,0 {
compatible = "acme,a1234-i2c-bus";
#address-cells = <1>; //rtc 需要一個 cell 描述地址
#size-cells = <0>; //rtc 不需要 0 描述長度
reg = <1 0 0x1000>;
rtc@58 {
compatible = "maxim,ds1338";
reg = <58>;
interrupts = < 7 3 >;
};
};
flash@2,0 {
compatible = "samsung,k8f1315ebm", "cfi-flash";
reg = <2 0 0x4000000>;
};
}; //external-bus
};
解析:
(1) 根節點
compatible: 內核通過root節點"/"的compatible屬性來判斷它啟動的是哪個machine。
#address-cells : 子結點(reg屬性)需要多少個cell描述地址。
#size-cells : 子結點(reg屬性)需要多少個cell描述長度。
interrupt-parent : 標示該節點屬於哪個中斷控制器,如果沒有該屬性,則依附於父節點。
(2) cpus節點
#address-cells : 同上
#size-cells : 同上
(3) cpu節點
@unit-address: 可選項,設備地址,節點名相同時可以通過這個來區分不同節點。unit-address地址也經常在其對應的reg屬性中給出。
reg : region,描述設備地址
格式: reg = <address1 length1 [address2 length2] [address3 length3]>
(4) serial節點
compatible: 外設節點上的compatible屬性用於驅動和設備的綁定(匹配)
reg: 外設基地址和偏移量 ,比如:reg = <0x101f1000 0x1000 >
interrupts: 中斷號和標識(上升沿,下降沿等), 里面多少個值要根據中斷控制器的#interrupt-cells屬性來決定。而#interrupt-cells屬性值要由中斷控制器的類型決定。
中斷控制器類型:
GIC: Generic Interrupt Controller(通用中斷控制器)
中斷類型,中斷號,標識(上升沿,下降沿等)
VIC : Vectored Interrupt Controller(向量中斷控制器)
中斷號
NVIC:Nested Vectored Interrupt Controller(內嵌向量中斷控制器)
中斷號,中斷優先級
參考: Documentation\devicetree\bindings\interrupt-controller
(5) interrupt-controller節點
compatible: 中斷控制器類型,查看上面路徑下的文件來獲知, 芯片datasheet也有說明。
reg:同上
interrupt-controller:空屬性,用來聲明這個節點接收中斷信號。
#interrupt-cells:標識該控制器需要幾個cell來描述中斷,其實就是決定了interrupts屬性需要幾個cell
(6) external-bus節點
ranges: 地址轉換表,每一行都包含子地址、父地址、在子地址空間內的區域大小。
ranges屬性值為空的話,表示1:1映射。
ranges屬性值的格式 <local地址, parent地址, size>
local地址的個數取決於當前含有ranges屬性的節點的#address-cells屬性的值。
parent地址的個數取決於父節點的#address-cells的值。
size取決於當前含有ranges屬性的節點的#size-cells屬性的值。
(7) rtc節點
reg: i2c設備地址
精彩還在繼續,歡迎繼續關注!!!!
歡迎加入QQ群聊
如果你喜歡就請分享給你的朋友,感謝大家的支持