二 節點(node)的表示
首先說節點的表示方法,除了根節點只用一個斜杠“/”表示外,其他節點的表示形式如“node-name@unit-address”。@前邊是節點名字,后邊是節點地址。
節點名字的長度范圍是1到31,可以使用的字符在ePAPR規范中有說明,包括:
0-9 數字
a-z 小寫字母
A-Z 大寫字母
, 逗號
. 句點(英)
_ 下划線
+ 加號
- 破折號(英)
規范要求節點名字應該以字母開頭,雖然允許后邊的位置使用非字母的字符,但實際情況我們實在沒必要使用其他字符,一般情況全部用字母表示就夠了。特別是規范建議在起名字時采用通用的名字而不是專有的名字,比如對於網卡,使用ethernet表示就可以了,可以通過地址區分不同的網卡,網卡的區別可以通過節點下的屬性區分。還有就是關於目前存在的設備基本上都已經有被廣泛接受的名字了,我們完全沒必要在此標新立異,比如下邊規范中列舉的節點名字(經常寫驅動的人基本一眼就能猜出是哪種設備):
atm
cache-controller
compact-flash
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
節點地址是用來區別同名節點的,不是軟件意義上的地址,但是有些情況可以用軟件地址作為這個地址。比如兩個I2C控制器的名字可以都是i2c,然后用控制器寄存器首地址作為這個節點地址。對於cpu,因為它是沒有寄存器地址的,就可以用核的號碼作為地址,對於8核處理器,地址可以從0到7。ePAPR規范中關於節點地址的描述不太好理解,原文是“The unit-address component of the name is specific to the bus type on which the node sits”。其實我覺得這句話說的也不太准確,因為並不是所有節點表示的硬件都位於某個總線上,比如內存,cpu。設備樹是軟件對硬件的一種近似表示,軟件需要他怎么表示,他就怎么表示。對於cpu,軟件需要序號,那么地址就用序號,對於i2c控制器,軟件需要寄存器首地址,那么就用地址。
除此之外規范還要求,如果節點有地址,那么節點下邊必須有一個叫reg的屬性,並且該地址必須和reg的屬性的第一個地址相同。如果節點沒有reg屬性,那么節點地址及前邊的@必須都不能有。
關於屬性和值我們還沒開始介紹,這里插一句,其實reg就是register的縮寫,這個屬性主要用來表示控制器寄存器首地址的。我覺得規范中這一條不是非常有必要,因為有些設備只要有一個地址就夠了,那么放在節點地址中就夠了,完全沒必要非得再加個reg屬性。在這一段的最后一句,規范來了句“The binding for a particular bus may specify additional, more specific requirements for the format of reg and the unit-address.”,我覺得這句話的意思和“設備樹是軟件對硬件的一種近似表示,軟件需要他怎么表示,他就怎么表示”差不多,沒有什么玄的。
節點路徑也比較容易理解,從根節點到每個節點都可以形成一個路徑,如第一節的例子/cpus/cpu@0,通過這個可以唯一的表示cpu@0這個節點。因為cpu@0在cpus下邊是唯一的,但是在整個設備樹可能不是唯一的,只有用全路徑表示才能毫無異議的確認是哪個節點。如果省略了節點地址也不會產生歧義,那么可以省略不寫。就像編程中的括號一樣,個人覺得這個沒必要省。
除了名字和地址外,節點前邊還可以有一個標簽(label),這個標簽不是必須的,一般只有在別個地方需要引用這個節點時才會用標簽標示這個節點,因為如果用全路徑太繁瑣了。如“i2c_1: i2c@12C70000”中的i2c_1就是一個標簽。