devicetree的書寫規範
下面從節點,屬性,reg,ranges,中斷控制器等幾個方面敘述devicetree的書寫規範。
1,dts的基本元素:節點
.dts(或者其include的.dtsi)基本元素爲結點和屬性。舉例說明節點的概念:
<span lang="en-US">/ {</span> <span lang="en-US">node1 {</span> <span lang="en-US">a-string-property = "A string";</span> <span lang="en-US">a-string-list-property = "first string", "second string";</span> <span lang="en-US">a-byte-data-property = [0x01 0x23 0x34 0x56];</span> <span lang="en-US">child-node1 {</span> <span lang="en-US">first-child-property;</span> <span lang="en-US">second-child-property = <1>;</span> <span lang="en-US">a-string-property = "Hello, world";</span> <span lang="en-US">};</span> <span lang="en-US">child-node2 {</span> <span lang="en-US">};</span> <span lang="en-US">};</span> <span lang="en-US">node2 {</span> <span lang="en-US">an-empty-property;</span> <span lang="en-US">a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */</span> <span lang="en-US">child-node1 {</span> <span lang="en-US">};</span> <span lang="en-US">};</span> <span lang="en-US">};</span>
1個root結點"/";root結點下面含一系列子結點,本例中爲"node1"和"node2";
結點"node1"下又含有一系列子結點,本例中爲"child-node1"和"child-node2";
各結點都有一系列屬性。這些屬性可能爲空,如"an-empty-property";可能爲字符串,如"a-string-property";可能爲字符串數組,如"a-string-list-property";可能爲Cells(由u32整數組成),如"second-child-property",可能爲二進制數,如"a-byte-data-property"。
子結點的命名遵循的組織形式爲:<name>[@<unit-address>],<>中的內容是必選項,[]中的則爲可選項。name是一個ASCII字符串,用於描述結點對應的設備類型,如3comEthernet適配器對應的結點name宜爲ethernet,而不是3com509。如果一個結點描述的設備有地址,則應該給出@unit-address。多個相同類型設備結點的name可以一樣,只要unit-address不同即可。設備的unit-address地址也經常在其對應結點的reg屬性中給出。
2,dts的基本元素:compatible屬性
在.dts文件的每個設備,都有一個compatible屬性,compatible屬性用戶驅動和設備的綁定。compatible屬性是一個字符串的列表,列表中的第一個字符串表徵了結點代表的確切設備,形式爲"<manufacturer>,<model>",其後的字符串表徵可兼容的其他設備。可以說前面的是特指,後面的則涵蓋更廣的範圍。
舉例說明:FreescaleMPC8349 SoC含一個串口設備,它實現了國家半導體(NationalSemiconductor)的ns16550寄存器接口。則MPC8349串口設備的compatible屬性爲compatible= "fsl,mpc8349-uart","ns16550"。其中,fsl,mpc8349-uart指代了確切的設備,ns16550代表該設備與NationalSemiconductor的16550UART保持了寄存器兼容。
3,dts的其它部分:reg
可尋址的設備使用如下信息來在DeviceTree中編碼地址信息:
-
reg
-
#address-cells
-
#size-cells
其中reg的組織形式爲reg= <address1 length1 [address2 length2] [address3 length3] ...>,其中的每一組addresslength表明了設備使用的一個地址範圍。address爲1個或多個32位的整型(即cell),而length則爲cell的列表或者爲空(若#size-cells= 0)。address和length字段是可變長的,父結點的#address-cells和#size-cells分別決定了子結點的reg屬性的address和length字段的長度。
4,dts的其它部分:ranges
ranges是地址轉換表,其中的每個項目是一個子地址、父地址以及在子地址空間的大小的映射。映射表中的子地址、父地址分別採用子地址空間的#address-cells和父地址空間的#address-cells大小。舉例如下:
<span lang="en-US"> ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet</span> <span lang="en-US">1 0 0x10160000 0x10000 // Chipselect 2, i2c controller</span> <span lang="en-US">2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash</span>
對於本例而言,子地址空間的#address-cells爲2,父地址空間的#address-cells值爲1,因此00 0x101000000x10000的前2個cell爲external-bus後片選0上偏移0,第3個cell表示external-bus後片選0上偏移0的地址空間被映射到CPU的0x10100000位置,第4個cell表示映射的大小爲0x10000。ranges的後面2個項目的含義可以類推。
5,Dts的其它部分:中斷控制器
DeviceTree中還可以中斷連接信息,對於中斷控制器而言,它提供如下屬性:interrupt-controller–這個屬性爲空,中斷控制器應該加上此屬性表明自己的身份;#interrupt-cells–與#address-cells和#size-cells相似,它表明連接此中斷控制器的設備的interrupts屬性的cell大小。
在整個DeviceTree中,與中斷相關的屬性還包括:interrupt-parent–設備結點透過它來指定它所依附的中斷控制器的phandle,當結點沒有指定interrupt-parent時,則從父級結點繼承。
interrupts–用到了中斷的設備結點透過它指定中斷號、觸發方法等,具體這個屬性含有多少個cell,由它依附的中斷控制器結點的#interrupt-cells屬性決定。而具體每個cell又是什麼含義,一般由驅動的實現決定,而且也會在DeviceTree的binding文檔中說明。值得注意的是,一個設備還可能用到多箇中斷號。除了中斷以外,在ARMLinux中clock、GPIO、pinmux都可以透過.dts中的結點和屬性進行描述。
6,Dts的其它部分:需注意的地方
dts除了以上規則外,也可以自己加一些自定義的屬性和子節點,但是一定要符合以下的幾個規則:
(1)新的設備屬性一定要以廠家名字做前綴,這樣就可以避免他們會和當前的標準屬性存在命名衝突問題;
(2)新加的屬性具體含義以及子節點必須加以文檔描述,這樣設備驅動開發者就知道怎麼解釋這些數據了。描述文檔中必須特別說明compatible的value的意義,應該有什麼屬性,可以有哪個(些)子節點,以及這代表了什麼設備。每個獨立的compatible都應該由單獨的解釋。
(3)新添加的這些要發送到[email protected]郵件列表中進行review,並且檢查是否會在將來引發其他的問題。
在一個樹狀結構的devicetree中,如何引用一個node呢?要想唯一指定一個node必須使用fullpath,例如/node-name-1/node-name-2/node-name-N。
屬性(property)值標識了設備的特性,它的值(value)是多種多樣的:
1、可能是空,也就是沒有值的定義。例如上圖中的64-bit,這個屬性沒有賦值。
2、可能是一個u32、u64的數值(值得一提的是cell這個術語,在DeviceTree表示32bit的信息單位)。例如#address-cells= <1> 。當然,可能是一個數組。例如<0x000000000x00000000 0x00000000 0x20000000>
3、可能是一個字符串。例如device_type= "memory" ,當然也可能是一個stringlist。例如"PowerPC,970"
在描述DeviceTree的結構時,那些可以動態探測到的設備是不需要描述的,例如USBdevice。不過對於SOC上的usbhost controller,它是無法動態識別的,需要在devicetree中描述。同樣的道理,在computersystem中,PCIdevice可以被動態探測到,不需要在devicetree中描述,但是PCIbridge如果不能被探測,那麼就需要描述之。
轉自:http://blog.csdn.net/lichengtongxiazai/article/details/38941997