code style

2017年7月14日 星期五

Device Tree(2)Properties

Property Names:
由1~31個字元組成,內容為下述:
Character Description 0-9
digit a-z lowercase letter
,(comma ). (period) _ (underscore) +( plus sign) - (dash) ? (question mark) #(hash)

需要一個唯一的prefix,來辨別property的名稱或組織,例如:
fsl,channel-fifo-len
ibm,ppc-interrupt-server#s
linux,network-index

Property Values:
有下面幾種類型,記憶體排方式應該是看CPU 架構為主,little-endian或big-endian:
empty => 如果是true-false的話,可以為空。
u32 => 32bit 整數
u64 => 64bit 整數
string=> 字串
prop-encoded-array=>描述property用
phandle => 一個u32 value,可以用來給別的node拿來參考用,類似指標,指向另一個node。
stringlist => 連續的字串

Standard Properties:
device tree是使用 Device Tree Source(DTS)格式來描述nodes和properties。下面列出一些標準的properties。


Property:compatible
Value type:<stringlist>
用來描述driver model,OS會照stringlist順序去找尋driver model,建議格式為 "manufacturer,model"。
例:
compatible = “fsl,mpc8641-uart”, “ns16550";

在這例子中有兩個string,OS會先去找“fsl,mpc8641-uart”, 如果找不到就會改去找 general ns16650 device type。

Property:model
Value type:<string>
driver名稱及model number。
例:
model = “fsl,MPC8349EMITX”;

Property:phandle
Value type:<u32>
一個在device tree中的唯一值,給其他的node參考用。
例:
pic@10000000 {
    phandle = <1>;
    interrupt-controller; 20
};
定義pandle=1,其他的node可用1這個值來使用pic@10000000。
例:
interrupt-parent = <1>;

Property:status
Value type:<string>
顯示driver的操作,有4種。
okay=>表示可操作
disabled=>表示目前為關閉,不可操作
fail=>表示目前為錯誤,需要修復,不可操作
fail-sss=>表示目前為錯誤,需要修復,不可操作。sss用來指示錯誤原因。

Property:#address-cells and #size-cells
Value type:<u32>
表示在child node's 的reg裡的address and size。如果沒有寫,default為2 and 1。
#size-cells是可以為0的,那reg裡面的size就會被省略。
例:
裡面表示soc的child serial node裡的reg有一個address (0x4600)和一個size(0x100)。

Property:reg
Value type:<prop-encoded-array>, 表示方式為(address, length)
register,主要是指memory-mapped IO register的offsets and lengths。
例:
#address-cells為1 and #size-cells為1
reg = <0x3000 0x20 0xFE00 0x100>;
代表在0x3000有一個32byte的block和0xFE00有一個256 byte block

Property:ranges
Value type:<empty> or <prop-encoded-array>, 表示方式為(child-bus-address, parent-bus-address, length)
表示 register定址的範圍
例:
定址範圍有0x00100000, 1024KB,child 定址在0x0, mapping 到parent 0xe0000000。
在此例中,serial的offset 為04600,而mapping後的位置為0xe0004600

Property:device_type
Value type:<string>
原本在IEEE1275中用來描述FCode,因為ePAPR沒有FCode,為了相容性,只用在cpu and memory上。
例:
 memory {
   device_type = "memory";
   reg = <0x00000000 0x100000000>; /* 4 GB */
 };








Device Tree(1)觀念和介紹

概念:
Linux  Kernel從3.x開始引入設備樹的概念。樹狀結構來描述硬體,每一個node有property/value來描述屬性,除了root node之外,都會有一個parent。原則上是非動態偵測的device,就要加入device tree,例如PCI。

下圖表示一個最簡單可以開機的OS的device tree,包含了平台、CPU、memory等資訊。 



Node Names:
名稱組成方式為 => node-name@unit-address

node-name為長度1~31的大小寫英文數字以及 ,(comma) .(period) _(underscore) +(plus sign) -(dash)組成。開頭必頭為英文字母。

unit-address要符合reg property。unit-address可以省略,只要名稱不要和其他兄弟節點一樣即可。

root node的名稱是slash(/)。

例如ethernet@fe001000和ethernet@fe002000這兩個node就是以unit-address來分別。

建議的node-name:
• atm
• cache-controller
• compact-flash 9
• can
• cpu
• crypto
• disk
• display
• dma-controller
• ethernet
• ethernet-phy
• fdc
• flash
• gpio
• i2c
• ide
• interrupt-controller
• isa
• keyboard
• mdio
• memory
• memory-controller
• mouse
• nvram
• parallel
• pc-card
• pci
• pcie
• rtc
• sata
• scsi
• serial
• sound
• spi
• timer
• usb
• vme
• watchdog