code style

2017年7月17日 星期一

Device Tree(4)Device Node Requirements

一個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,屬性如下圖:














































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的open-pic為root,有3個doamin,2個nexus nodes。可轉換為下圖: