設備樹詳講


一. DTS 語法

    1.1. dts 頭文件

        1.1.1. 可以使用#include來引用

 

    1.2. 關於/dts-v1/;

        1.2.1. 用於dts的版本信息,一般使用/dts-v1/版本

    1.3. 設備節點

        1.3.1. 分析下圖節點

             <1>. “/”是跟節點,每個設備樹只有一個根節點

             <2>.設備樹中節點命名格式如下 :

                         node-name@unit-address
                    有時我們看到的是:label: node-name@unit-address;引入 label 的目的就是為了方便訪問節點 比如通過&cpu0 就可以訪問“cpu@0”這個節點,上圖的chosen,memory都屬於label。
             <3>. 每個節點都有不同屬性,不同的屬性又有不同的內容,屬性都是鍵值對,值可以為空或任意的字節流。設備樹源碼中常用的幾種數據形式:字符串,u32,數組

        1.3.2. 標准屬性

            1.3.2.1. compatible 屬性

                  compatible 屬性也叫做“兼容性”屬性,這是非常重要的一個屬性! compatible 屬性的值是 一個字符串列表, compatible 屬性用於將設備和驅動綁定起來。字符串列表用於選擇設備所要使用的驅動程序 ,compatible 屬性的值格式 :"manufacturer,model" ,例如:

compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";   //此compatible是有兩個屬性,用分號隔開

                PS:根節點“/” 下的compatible 屬性 用於查看是否支持此設備 ,取代設備ID。在沒有使用設備樹以前, uboot 會向 Linux 內核傳遞一個叫做 machine id 的值, machine id
也就是設備 ID

           1.3.2.2. model屬性

                  model 屬性值也是一個字符串,一般 model 屬性描述設備模塊信息,比如名字什么的,例如:model = "wm8960-audio";
           1.3.2.3. status屬性

                 status 屬性看名字就知道是和設備狀態有關的, status 屬性值也是字符串,字符串是設備的狀態信息,可選的狀態如下

           1.3.2.4. #address-cells和#size-cells屬性

                 這兩個屬性的值都是無符號 32 位整形, #address-cells #size-cells 這兩個屬性可以用在 任何擁有子節點的設備中,用於描述子節點的地址信息,直接上示例

/ {
    #address-cells = <0x2>; // 在root node下使用2個u32來代表address。
    #size-cells = <0x1>; // 在root node下使用1個u32來代表size。
    ...
    ...
    memory { // memory device
        ...
        reg = <0x90000000 00000000 0x800000>;
            // 0x90000000 00000000 是存取memory的address
            // 0x800000 是memory的size。
        ...
    };
    ...
    ...
}
View Code

           1.3.2.5. reg屬性

                 reg 屬性前面已經提到過了, reg 屬性的值一般是(addresslength)對。 reg 屬性一般用於描述設備地址空間資源信息,一般都是某個外設的寄存器地址范圍信息 

           1.3.2.6. device_type屬性     

                 device_type 屬性值為字符串, IEEE 1275 會用到此屬性,用於描述設備的 FCode,但是設備樹沒有 FCode,所以此屬性也被拋棄了。此屬性只能用於 cpu 節點或者 memory 節點。imx6ull.dtsi 的 cpu0 節點用到了此屬性 

       1.3.3. 向節點追加或修改

             1.3.3.1. 先看一下 I2C1 接口對應的節點,打開文件 imx6ull.dtsi 文件,找到如下所示內容:

           

             1.3.3.2. 如果我們要添加直接的具體設備(mag311)以及修改參數,我們可以定義自己的dts文件,只要文件中#include “imx6ull.dtsi ”,

         1.3.4. 特殊節點

               在根節點“/”中有兩個特殊的子節點: aliases chosen
               1.3.4.1. aliases 節點

                     單詞 aliases 的意思是“別名”,因此 aliases 節點的主要功能就是定義別名,定義別名的目的就是為了方便訪問節點。不過我們一般會在節點命名的時候會加上 label,然后通過&label來訪問節點,這樣也很方便,而且設備樹里面大量的使用&label 的形式來訪問節點 

         1.3.4.2. chosen 子節點
              chosen 並不是一個真實的設備, chosen 節點主要是為了 uboot Linux 內核傳遞數據,重點是 bootargs 參數。一般.dts 文件中 chosen 節點通常為空或者內容很少 。但是我們查看設備如下,東西屬性不是kernal解析dts得到的,而是在核, bootargs 會作為 Linux 內核的命令行參數, Linux 內核啟動的時候會打印出命令行參數(uboot設置的。前面講解 uboot 的時候說過,uboot 在啟動 Linux 內核的時候會將 bootargs 的值傳遞給 Linux就是 uboot 傳遞進來的 bootargs 的值),此節點就是橋梁
 

             chosen也可以設置參數:參考https://www.cnblogs.com/liushuhe1990/p/9704045.html

     1.4. 文件系統中查看設備樹屬性

        1.4.1. 進入設備查看設備樹根目錄

             <1>. 設備樹根位於/proc/device-tree

 

         <2>. 可以進入相應子設備以及查看屬性

     1.5. 設備樹常用of操作函數

             常用操作函數位於include/linux/of.h

 

 


 





        



 



 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM