ARM-Linux 裝置樹用法格式(Device Tree Usage)__Linux

來源:互聯網
上載者:User

參考:
http://elinux.org/Device_Tree_Usage
http://blog.csdn.net/sgmenghuo/article/details/45071615 基本資料格式

  裝置樹是一個簡單的包含節點和屬性的樹結構。屬性通過索引值對形式描述,一個節點可以包含多個屬性或子節點,一個簡單的 .dts 格式裝置樹如下所示。

/dts-v1/;/ {    node1 {        a-string-property = "A string";        a-string-list-property = "first string", "second string";        a-byte-data-property = [0x01 0x23 0x34 0x56];        child-node1 {            first-child-property;            second-child-property = <1>;            a-string-property = "Hello, world";        };        child-node2 {        };    };    node2 {        an-empty-property;        a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */        child-node1 {        };    };};

  顯然,上述例子的裝置樹一點用都沒有,因為它根本就沒有描述任何東西,但是它可以很直觀地告訴我們樹結構中的節點和屬性的情況。具體如下:

  ◆ 有一個根節點“/”
  ◆ 有兩個子節點:node1 和 node2
  ◆ node1 有兩個子節點:child-node1 和 child-node2
  ◆ 分散在整個樹中的一些屬性

  屬性是一個簡單的索引值對,它的值可以是空的或者是任意大小的位元組流。而這樣的資料結構中並不需要包含資料類型,下面是可以在dts檔案中表達的一些基本資料:
  
  ◆ 文本字串(包含’\0’結束符)用雙引號表示:

string-property = "a string";

  ◆ Cells(32位不帶正負號的整數)用角括弧表示:

cell-property = <0xbeef 123 0xabcd1234>;

  ◆ 位元據用方括弧表示:

binary-property = [0x01 0x23 0x45 0x67];

  ◆ 類型不同的資料的組合也是可以的,但需要用逗號隔開:

mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;

  ◆ 逗號同樣用於建立字串列表:

string-list = "red fish", "blue fish";
基本概念

  為了理解 device tree 到底是怎麼用的,我們將以一個簡單的機器為例,一步步地建立起描述它的 device tree。 示範機器

  假設有這樣一台電腦(基於ARM Versatile),由“Acme”製造並命名為”Coyote’s Revenge”:

  ◆ 一個 32 位的 ARM 處理器;
  ◆ 串口、SPI 匯流排控制器、I2C 匯流排控制器、中斷控制器以及一些外部匯流排橋通過記憶體映射串連到到處理器的匯流排上;
  ◆ 256MB 的 SDRAM,基地址為 0;
  ◆ 兩個串口,基地址分別為 0x101F1000 和 0x101F2000;
  ◆ GPIO 控制器,基地址為 0x101F3000;
  ◆ SPI 控制器,基地址為 0x10170000,並且串連了 MMC 插槽(SS管腳串連到GPIO #1);
  ◆ 外部匯流排橋,串連了以下裝置:
    ① 串連到外部匯流排的 SMC SMC91111 乙太網路裝置,基地址為 0x10100000;
    ② I2C 控制器,基地址為 0x10160000,並串連了 Maxim DS1338 系統時鐘(裝置從地址為1101000,即0x58);
    ③ 64MB 的 NOR flash,基地址為 0x30000000; 初始結構

  首先搭建該機器 device tree 的基本架構,即一個有效裝置樹的最小架構。在這一步,要唯一地標識這台電腦。

/dts-v1/;/ {    compatible = "acme,coyotes-revenge";};

  compatible 屬性指定了系統的名字,它的值是一個"<manufacturer>,<model>"格式的字串。為一個特定裝置指定 compatible 值是很必要的,因為包含製造商名字可以避免命名空間衝突。作業系統會根據 compatible 值來決定如何運行這台電腦,所以在該屬性中填入正確的資料很重要。
  理論上,compatible 是作業系統唯一標識一台機器的所有資料,如果所有機器細節都寫入程式碼,那麼 OS 可以在頂層 compatible 屬性中專門尋找”acme,coyotes-revenge”。 CPUs

  接下來就要描述各個 CPU 了。先添加一個“cpus”容器節點,再將每個 CPU 作為子節點添加進去。在這個例子中,是基於 ARM 的雙核 Cortex A9 處理器。

/dts-v1/;/ {    compatible = "acme,coyotes-revenge";    cpus {        cpu@0 {            compatible = "arm,cortex-a9";        };        cpu@1 {            compatible = "arm,cortex-a9";        };    };};

  類似於頂層 compatible 屬性,每個 cpu 節點中的 compatible 屬性也是一個 "<manufacturer>,<model>" 格式的字串,指定了 CPU 的確切型號。
  後面會有更多的屬性被添加到 cpu 節點,因此我們首先需要先瞭解一些基本概念。 節點命名

  花些時間談談命名習慣是值得的。每個節點都必須有一個<name>[@<unit-address>]格式的名稱。
  <name>是一個最大長度為 31 個字元的 ASCII 字串,一般來說,節點的命名是根據它所表示的裝置而定的。比如說,一個表示 3com 乙太網路適配器的節點應該命名為 ethernet,而不是 3com509。
  如果該節點所表示的裝置有相關裝置地址的話,則需要包含 <unit-address> 資訊。<unit-address> 通常是用來訪問裝置的首地址,並在節點的 reg 屬性中會被列出。後面我們還會詳細介紹 reg 屬性。
  同級節點必須唯一地命名,但只要地址不相同,多個節點採用相同的命名是沒問題的(例如 serial@101f1000 和 serial@101f2000)。
  關於節點命名的全部細節請參考 ePAPR 規範 2.2.1 節。 裝置

  系統中的每個裝置都用裝置樹上的節點來表示,所以接下來就是要在裝置樹中為各個裝置添加裝置節點。現在我們添加的新節點先置為空白,後面我們談到定址和中斷的時候再進行處理。

/dts-v1/;/ {    compatible = "acme,coyotes-revenge";    cpus {        cpu@0 {            compatible = "arm,cortex-a9";        };        cpu@1 {            compatible = "arm,cortex-a9";        };    };    serial@101F0000 {        compatible = "arm,pl011";    };    serial@101F2000 {        compatible = "arm,pl011";    };    gpio@101F3000 {        compatible = "arm,pl061";    };    interrupt-controller@10140000 {        compatible = "arm,pl190";    };    spi@10115000 {        compatible = "arm,pl022";    };    external-bus {        ethernet@0,0 {            compatible = "smc,smc91c111";        };        i2c@1,0 {            compatible = "acme,a1234-i2c-bus";            rtc@58 {                compatible = "maxim,ds1338";            };        };        flash@2,0 {            compatible = "samsung,k8f1315ebm", "cfi-flash";        };    };};

  在上面這個樹中,已經為系統中的每個裝置添加了節點,並且裝置樹的階層反映了裝置是如何串連到系統的。例如,掛接在外部匯流排上的裝置是外部匯流排節點的子節點,I2C 裝置是 I2C 匯流排控制器節點的子節點。總的來說,裝置樹的階層是從 CPU 的角度來看的系統檢視表。
  現在這個裝置樹仍然是無效的,因為它缺少了描述裝置之間到底如何串連的資訊。後面我們會給它添加這些資料。
  關於這個裝置樹有以下一些注意事項:
  ◆ 每個裝置節點都有一個 compatible 屬性;
  ◆ flash-節點的 compatible 屬性有兩個字串;(下一節會說明為什麼)
  ◆ 之前提到的,節點命名應該反映裝置的類型,而不是特定型號;(請參考ePAPR規範2.2.2節的通用節點命名,應優先使用這些命名) 理解 compatible 屬性

  裝置樹中的每個節點都需要有 compatible 屬性,作業系統會通過這個 compatible 的值來決定用該裝置應該綁定哪個裝置驅動程式。
  compatible 的值是一個字串列表,列表中的第一個字串用“<manufacturer>,<model>” 格式準確描述相應裝置,後面的字串表示相容的其他裝置。
  例如,Freescale MPC8349 SoC有一個串口裝置實現了National Semiconductor ns16550寄存器介面。因此MPC8349串口裝置的compatible屬性為:compatible = “fsl,mpc8349-uart”, “ns16550”。在這裡,fsl,mpc8349-uart指定了確切的裝置,ns16550表明它與National Semiconductor 16550 UART是寄存器級相容的。
  
註:由於曆史原因,ns16550沒有製造商首碼,所有新的compatible值都應使用製造商的首碼。這種做法使得現有的裝置驅動程式可以綁定到一個新裝置上,同時仍能唯一準確的識別硬體。

警告:不要使用萬用字元compatible值,如”fsl,mpc83xx-uart”等類似表達,晶片廠商總會改變並打破你的萬用字元假設,到時候再想修改就為時已晚了。相反,你應當選擇一個特定的晶片實現,並與所有後續晶片保持相容。 How Addressing Works

  可編址的裝置使用下面屬性來將地址資訊編碼進裝置樹:
  ◆ reg
  ◆ #address-cells
  ◆ #size-cells
  
  Each addressable device gets a reg which is a list of tuples in the form reg =

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.