一個device tree最少要由一個root node,cpus node, memory node組成。
Root Node
Root node表示符號為"/",下表是它的屬性
Aliases Node
這個屬性在root的位置,node name為aliases。必須要為小寫字元開頭,長度為1~31字元,主要是用來減少冗長的路徑名稱。
可用字元如下圖:
例:
aliases {
serial0 = "/simple-bus@fe000000/serial@llc500";
ethernet0 = "/simple-bus@fe000000/ethernet@31c000";
}
就可用serial0來代表/simple-bus@fe000000/serial@llc500
Memory Node
表示實際系統上的memory layout,屬性見下圖:
例:
一個 64-bit Power system 的 physical memory layout:
RAM: starting address 0x0, length 0x80000000 (2GB)
RAM: starting address 0x100000000, length 0x100000000 (4GB)
在root node定義address and size,這裡表示reg 屬性需要2個32-bit cells
#address-cells = <2>;
#size-cells = <2>;
可用下面兩種方式表示這兩段記憶體
(1)
memory@0 {
device_type = "memory";
reg = <0x000000000 0x00000000 0x00000000 0x80000000
0x000000001 0x00000000 0x00000001 0x00000000>;
};
(2)
memory@0 {
device_type = "memory";
reg = <0x000000000 0x00000000 0x00000000 0x80000000>;
};
memory@100000000 {
device_type = "memory";
reg = <0x000000001 0x00000000 0x00000001 0x00000000>;
};
Chosen Node
用來描述由系統firmware指定的runtime parameter。會放在root node底下。原本通過tag list傳遞的一些 kernel的運行時參數可以通過Device Tree傳遞。例如command line可以通過bootargs這個property這個屬性傳遞,node屬性如下圖:
例:
chosen {
bootargs = “root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200”;
};
CPUS Node
表示實際系統上的CPU,因為可能不只一個CPU又或是多核心,cpus node包含cpu node,等下會說到。cpus node屬性如下圖:
CPU Node
表示實際系統上的CPU,屬性如下圖:
code style
2017年7月17日 星期一
Device Tree(3)Interrupts and Interrupt Mapping
Properties for Interrupt Generating Devices
interrupt-parent
在device tree中interrupt controller有一個interrupt-parent 屬性,這個用來表示interrupt之間的路由關係,它用一個phandle value表示其parent。各個interrupt controller的定義是不一樣的,有的用3個u32,有的用4個。
interrupt tree 有可能和device tree是不一樣的。
這個node本身如果沒有這interrupt-parent 的話,就是用parent node的interrupt-parent。
interrupts
一個能產生中斷的設備,必須要定義interrups這屬性。這裡指的就是設備產生的interrupt,描述interrupt source的又叫interrupt specifier。使用<u32>來表示。
例:
interrupts = <0xA 8>;
表示interrupt number:0xA, level/sense:8
Properties for Interrupt Controllers
interrupt-controller
Value type:<empty>
用來表示interrupt-controller
interrupt-cells
Value type:<u32>
用來表示interrupt-controller需要幾個單位做interrupt specifier
Interrupt Nexus Properties
一個interrupt nexus node應該要有一個#interrupt-cells 屬性
interrupt nexus
用來轉譯的,nexus的意思就是"連結",連結上下兩個domains的那個node。
例:
PCI controller device node定義了一個nexus node,用來轉譯PCI interrupt namespace(INTA,INTB,etc.)到interrupt controller的IRQ。
interrupt關係圖示例
interrupt-parent
在device tree中interrupt controller有一個interrupt-parent 屬性,這個用來表示interrupt之間的路由關係,它用一個phandle value表示其parent。各個interrupt controller的定義是不一樣的,有的用3個u32,有的用4個。
interrupt tree 有可能和device tree是不一樣的。
這個node本身如果沒有這interrupt-parent 的話,就是用parent node的interrupt-parent。
interrupts
一個能產生中斷的設備,必須要定義interrups這屬性。這裡指的就是設備產生的interrupt,描述interrupt source的又叫interrupt specifier。使用<u32>來表示。
例:
interrupts = <0xA 8>;
表示interrupt number:0xA, level/sense:8
Properties for Interrupt Controllers
interrupt-controller
Value type:<empty>
用來表示interrupt-controller
interrupt-cells
Value type:<u32>
用來表示interrupt-controller需要幾個單位做interrupt specifier
Interrupt Nexus Properties
一個interrupt nexus node應該要有一個#interrupt-cells 屬性
interrupt nexus
用來轉譯的,nexus的意思就是"連結",連結上下兩個domains的那個node。
例:
PCI controller device node定義了一個nexus node,用來轉譯PCI interrupt namespace(INTA,INTB,etc.)到interrupt controller的IRQ。
interrupt關係圖示例
上圖中沒有interrupt-parent的open-pic為root,有3個doamin,2個nexus nodes。可轉換為下圖:
訂閱:
文章 (Atom)