设备树详讲

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

 

 


 





        



 



 

 

 

 

posted @ 2020-04-02 00:09  三七鸽  阅读(1402)  评论(0编辑  收藏  举报