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