(DT系列二)device tree的書寫規範

devicetree的書寫規範

下面從節點,屬性,regranges,中斷控制器等幾個方面敘述devicetree的書寫規範。

1dts的基本元素:節點

.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>

1root結點"/"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屬性中給出。



2dts的基本元素:compatible屬性

.dts文件的每個設備,都有一個compatible屬性compatible屬性用戶驅動和設備的綁定。compatible屬性是一個字符串的列表,列表中的第一個字符串表徵了結點代表的確切設備,形式"<manufacturer>,<model>",其後的字符串表徵可兼容的其他設備。可以說前面的是特指,後面的則涵蓋更廣的範圍。

舉例說明:FreescaleMPC8349 SoC含一個串口設備,它實現了國家半導體(NationalSemiconductor)的ns16550寄存器接口。則MPC8349串口設備的compatible屬性爲compatible= "fsl,mpc8349-uart","ns16550"。其中,fsl,mpc8349-uart指代了確切的設備,ns16550代表該設備與NationalSemiconductor16550UART保持了寄存器兼容。



3dts的其它部分:reg

可尋址的設備使用如下信息來在DeviceTree中編碼地址信息:

  • reg

  • #address-cells

  • #size-cells

reg的組織形式爲reg= <address1 length1 [address2 length2] [address3 length3] ...>,其中的每一組addresslength表明了設備使用的一個地址範圍。address1個或多個32位的整型(即cell),而length則爲cell的列表或者爲空(若#size-cells= 0)。addresslength字段是可變長的,父結點的#address-cells#size-cells分別決定了子結點的reg屬性的addresslength字段的長度。



4dts的其它部分: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-cells2,父地址空間#address-cells值爲1,因此00 0x101000000x10000的前2cellexternal-bus後片選0上偏移0,第3cell表示external-bus後片選0上偏移0的地址空間被映射到CPU0x10100000位置,第4cell表示映射的大小爲0x10000ranges的後面2個項目的含義可以類推。



5Dts的其它部分:中斷控制器

DeviceTree中還可以中斷連接信息,對於中斷控制器而言,它提供如下屬性:interrupt-controller–這個屬性爲空,中斷控制器應該加上此屬性表明自己的身份;#interrupt-cells–#address-cells#size-cells相似,它表明連接此中斷控制器的設備的interrupts屬性的cell大小。

在整個DeviceTree中,與中斷相關的屬性還包括:interrupt-parent–設備結點透過它來指定它所依附的中斷控制器的phandle,當結點沒有指定interrupt-parent時,則從父級結點繼承。

interrupts–用到了中斷的設備結點透過它指定中斷號、觸發方法等,具體這個屬性含有多少個cell,由它依附的中斷控制器結點的#interrupt-cells屬性決定。而具體每個cell又是什麼含義,一般由驅動的實現決定,而且也會在DeviceTreebinding文檔中說明。值得注意的是,一個設備還可能用到多箇中斷號。除了中斷以外,在ARMLinuxclockGPIOpinmux都可以透過.dts中的結點和屬性進行描述。

6Dts的其它部分:需注意的地方

dts除了以上規則外,也可以自己加一些自定義的屬性和子節點,但是一定要符合以下的幾個規則:

(1)新的設備屬性一定要以廠家名字做前綴,這樣就可以避免他們會和當前的標準屬性存在命名衝突問題;

(2)新加的屬性具體含義以及子節點必須加以文檔描述,這樣設備驅動開發者就知道怎麼解釋這些數據了。描述文檔中必須特別說明compatiblevalue的意義,應該有什麼屬性,可以有哪個(些)子節點,以及這代表了什麼設備。每個獨立的compatible都應該由單獨的解釋。

3)新添加的這些要發送到[email protected]郵件列表中進行review,並且檢查是否會在將來引發其他的問題。

在一個樹狀結構的devicetree中,如何引用一個node呢?要想唯一指定一個node必須使用fullpath,例如/node-name-1/node-name-2/node-name-N

屬性(property)值標識了設備的特性,它的值(value)是多種多樣的:

1、可能是空,也就是沒有值的定義。例如上圖中的64-bit,這個屬性沒有賦值。

2、可能是一個u32u64的數值(值得一提的是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

發佈了34 篇原創文章 · 獲贊 5 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章