屬性(property)
device_type = "memory"就是一個(gè)屬性,等號(hào)前邊是屬性,后邊是值。節(jié)點(diǎn)是一個(gè)邏輯上相對(duì)獨(dú)立的實(shí)體,屬性是用來(lái)描述節(jié)點(diǎn)特性的,根據(jù)需要一個(gè)節(jié)點(diǎn)由0個(gè),1個(gè)或多個(gè)屬性表示節(jié)點(diǎn)的特性。一個(gè)屬性由名字和值兩部分組成。
和節(jié)點(diǎn)的名字類似,規(guī)范要求屬性名字由1到31個(gè)字符組成。和節(jié)點(diǎn)名字字符的種類有些區(qū)別,不允許有大寫字母,增加了問(wèn)號(hào)和井號(hào)兩個(gè)字符。不清楚為什么沒有和節(jié)點(diǎn)名字完全保持一致,井號(hào)對(duì)于初學(xué)者容易誤解,以為是注釋。
0-9 數(shù)字
a-z 小寫字母
, 逗號(hào)
. 句點(diǎn)(英)
_ 下劃線
+ 加號(hào)
- 破折號(hào)(英)
? 問(wèn)號(hào)
# 井號(hào)
為了容易區(qū)分以及避免重復(fù),標(biāo)準(zhǔn)未定義的屬性名字應(yīng)該用公司或組織名稱開頭,比如:
fsl,channel-fifo-len
ibm,ppc-interrupt-server#s
linux,network-index
屬性的值在內(nèi)存中由0個(gè)或多個(gè)字節(jié)存儲(chǔ)。標(biāo)準(zhǔn)定義的基本類型包括:空,u32,u64,字符串,
規(guī)范預(yù)定義了一些標(biāo)準(zhǔn)的屬性。“compatible”,“model”,"device_type"都是用來(lái)表示節(jié)點(diǎn)基本信息的。
“compatible”屬性是用來(lái)匹配驅(qū)動(dòng)的,他的類型是字符串?dāng)?shù)組,每個(gè)字符串表示一種設(shè)備的類型,從具體到一般。舉個(gè)例子就比較清楚了,比如某個(gè)串口控制器節(jié)點(diǎn)的屬性”compatible = “fsl,mpc8641-uart”, “ns16550"“。第一個(gè)字符串“fsl,mpc8641-uart”前邊部分是廠商(推測(cè)是frescale),后邊部分是控制器具體型號(hào),這個(gè)形式也是規(guī)范建議的標(biāo)準(zhǔn)寫法。第二個(gè)字符串ns16550表示一類符合同一標(biāo)準(zhǔn)的串口控制器,比第一個(gè)字符串表示的范圍更大。內(nèi)核匹配驅(qū)動(dòng)時(shí)首先看是否有匹配第一個(gè)字符串的驅(qū)動(dòng),如果沒有的話再匹配第二個(gè)(如果有更多的,依次類推,所以優(yōu)先匹配前邊的)。
"model"屬性用來(lái)表示設(shè)備的型號(hào),用字符串表示,不像"compatible"用多個(gè)字符串,只需一個(gè)就夠了。"device_type"屬性用來(lái)表示設(shè)備類型,用字符串表示。
"#address-cells","#size-cells","reg","ranges","dma-ranges"屬性都是和地址有關(guān)的。
不同的平臺(tái),不同的總線,地址位長(zhǎng)度可能不同,有32位地址,有64位地址,為了適應(yīng)這個(gè),規(guī)范規(guī)定一個(gè)32位的長(zhǎng)度為一個(gè) cell。"#address-cells"屬性用來(lái)表示總線地址需要幾個(gè)cell表示,該屬性本身是u32類型的。"#size-cells"屬性用來(lái)表示子總線地址空間的長(zhǎng)度需要幾個(gè)cell表示,屬性本身的類型也是u32?梢赃@么理解父節(jié)點(diǎn)表示總線,總線上每個(gè)設(shè)備的地址長(zhǎng)度以及地址范圍是總線的一個(gè)特性,用"#address-cells","#size-cells"屬性表示,比如總線是32位,那么"#address-cells"設(shè)置成1 就可以了。這兩個(gè)屬性不可以繼承,就是說(shuō)在未定義這兩個(gè)屬性的時(shí)候,不會(huì)繼承更高一級(jí)父節(jié)點(diǎn)的設(shè)置,如果沒有設(shè)置的話,內(nèi)核默認(rèn)認(rèn)為"#address- cells"為2,"#size-cells"為1。
"reg"屬性用來(lái)表示節(jié)點(diǎn)地址資源的,比如常見的就是寄存器的起始地址及大小。要想表示一塊連續(xù)地址,必須包含起始地址和空間大小兩個(gè)參數(shù),如果有多塊地址,那么就需要多組這樣的值表示。還記得前邊說(shuō)過(guò)的
總線上設(shè)備在總線地址和總線本身的地址可能不同,"ranges"屬性用來(lái)表示如何轉(zhuǎn)換。和'reg'屬性類似,'ranges'屬性也是
'dma-ranges'屬性的結(jié)構(gòu)和定義與'ranges'屬性完全相同,唯一不同的是地址是dma使用的地址,'ranges'中的地址是cpu使用的地址。
有的時(shí)候在一個(gè)節(jié)點(diǎn)中需要引用另外一個(gè)節(jié)點(diǎn),比如某個(gè)外設(shè)的中斷連在哪個(gè)中斷控制器上。在講節(jié)點(diǎn)那一節(jié)我們說(shuō)過(guò),可以通過(guò)節(jié)點(diǎn)的全路徑指定是哪個(gè)節(jié)點(diǎn),但這種方法非常繁瑣。'phandle'屬性是專門為方便引用節(jié)點(diǎn)設(shè)計(jì)的,想要引用哪個(gè)節(jié)點(diǎn)就在該節(jié)點(diǎn)下邊增加一個(gè)'phandle'屬性,設(shè)定值為一個(gè)u32,如'phandle = <1>',引用的地方直接使用數(shù)字1就可以引用該節(jié)點(diǎn),如'interrupt-parent = <1>'。以上是規(guī)范中描述的方法,實(shí)際上這樣也不方便,我在實(shí)際的代碼中沒有看到這么用的。還記得節(jié)點(diǎn)那節(jié)說(shuō)過(guò)節(jié)點(diǎn)名字前邊可以定義一個(gè)標(biāo)簽吧,實(shí)際情況是都用標(biāo)簽引用,比如節(jié)點(diǎn)標(biāo)簽為intc1,那么用'interrupt-parent = <&intc1>'就可以引用了。
'status'屬性用來(lái)表示節(jié)點(diǎn)的狀態(tài)的,其實(shí)就是硬件的狀態(tài),用字符串表示。'okay'表示硬件正常工作,“disabled”表示硬件當(dāng)前不可用,“fail”表示因?yàn)槌鲥e(cuò)不可用,“fail-sss”表示因?yàn)槟撤N原因出錯(cuò)不可用,sss表示具體的出錯(cuò)原因。實(shí)際中,基本只用'okay'和 'disabled'。
2015職稱計(jì)算機(jī)考試書PowerPoint2007中 .. 定價(jià):¥45 優(yōu)惠價(jià):¥42 更多書籍 | |
2015年全國(guó)職稱計(jì)算機(jī)考試教材(2007模 .. 定價(jià):¥225 優(yōu)惠價(jià):¥213 更多書籍 |