设备树学习- devicetree

一、设备树格式学习:

设备树的大体框架,(以imx6ull-14x14-evk.dts为参考)

/*该句必须存在,用于声明是v1 DTS,无此句则默认为过时的v0版本,两者格式有一些小的不兼容*/
/dts-v1/;    

/*类似c语言,可以添加.h头文件,另外还可以添加.dtsi文件*/ 
#include "imx6ull-14x14-evk.dts"
#include <dt-bindings/clock/imx6ul-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include "imx6ull-pinfunc.h"
#include "imx6ull-pinfunc-snvs.h"
#include "skeleton.dtsi"

/*  / 表示根节点,在include文件的内容里,也会有 /节点,当前文件是对include文件的 / 的追加,当两者对同一属性变量定义的不同值的时候,当前的内容会覆盖include里面的内容*/
/ {            
    /*model 是属性 ,等号后是"属性值"*/
    model = “Freescale i.MC6ULL 14x14 EVK Board”;
    compatible = “fsl,imx6ull-14X14-evk”, "fsl,imx6ull"

  /* 根节点下的 ‘name {}'是根节点的一级节点,如 aliases, chosen,cpus等都是一级节点*/
    /*别名,是对节点的一些其他称呼*/
    aliases {
        can0 = &flexcan1;        
        i2c0 = &i2c1;
        i2c1 = &i2c2;
        i2c2 = &i2c3;
        i2c3 = &i2c4;
        ...
    };
    /*chosen并不是一个真实的设备,chosen节点主要是用于uboot向linux内核传递参数,uboot源码里面解析dtb的时候,回去获取chosen的值,并将bootargs的值设置为chosen节点的一个属性,所以当登录imx设备,cd /proc/devicetree/chosen的时候,会发现多了bootargs属性,而在dts文件里,并没有该属性的说明定义*/
    chosen {
        stdout-path = &uart1;
    };

    memory {
    };
    
    cpus {

/*每个“address length”组合表示一个地址范围,其中 address 是起始地址,length 是地址长

度, #address-cells 表明 address 这个数据所占用的字长, #size-cells 表明 length 这个数据所占用
的字长

*/

/*如下,#address-cells 和  #size-cells 分别为1和0,表示cpus下的子节点,比如cup0,其寄存器reg,其起始地址占1个字长,长度占0个字节。*/
        #address-cells = <1>;
        #size-cells = <0>;

        cpu0: cpu@0 {
            compatible = "arm,cortex-a7";
            device_type = "cpu";
            reg = <0>;
            ....
        }
        ...
    }
    /*intc: interrupt-controller@00a01000由2部分组成,冒号前是标签label,冒号后才是节点名。 标签的作用是方便后面的追加引用,可以以‘&label_name’的形式追加内容。之后如果要修改interrupt-controller@00a01000,只需要&intc*/
    intc: interrupt-controller@00a01000 {
   
    };
    clocks {
    
    };
    
    soc {
        #address-cells = <1>;
        #size-cells = <1>;
    /*soc里面有很多子节点,主要是描述IMX6ULL内部内存映射,内部外设信息,主要都是寄存器相关*/
        busfreq {
        };
        
        pmu {
        };
        
    /*nodeName命名见Power_ePAPR_APPROVED_v1.12.pdf 第15页。 格式: node-name@unit-address  (unitAddr可以根据imx数据手册的memory map找到,一般都是外设的起始地址,有时候是I2C的设备地址或者其他含义。)*/
        aips1: aips-bus@02000000 {
        };
        
        aips2: aips-bus@02100000 {
            
            usbotg1: usb@02184000 {
            };
            usbotg2: usb@02184200 {
            };
            
            fec1: ethernet@02188000 {
            };
            i2c1: i2c@021a0000 {
                #address-cells = <1>;
                #size-cells = <0>;
                compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c";
                reg = <0x021a0000 0x4000>;
                interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&clks IMX6UL_CLK_I2C1>;
                status = "disabled";
                /*imx6ull.dtsi定义了i2c1的基本信息,imx6ull-14X14-evk.dts追加了产品硬件上具体使用的i2c设备信息,如下*/
                &i2c1 {
                    clock-frequency = <100000>;
                    pinctrl-names = "default";
                    pinctrl-0 = <&pinctrl_i2c1>;
                    status = "okay"; /*imx6ull.dtsi里定义的status是disable,而这边重新定义成了okay,所以最终结果就是okay*/
                    /*具体的I2C设备1*/
                    mag3110@0e {
                        compatible = "fsl,mag3110";
                        reg = <0x0e>;
                        position = <2>;
                    };

                    /*具体的I2C设备2*/
                    fxls8471@1e {
                        compatible = "fsl,fxls8471";
                        reg = <0x1e>;
                        position = <0>;
                        interrupt-parent = <&gpio5>;
                        interrupts = <0 8>;
                    };
                };
            };
            
            i2c2: i2c@021a4000 {
            };
            i2c3: i2c@021a8000 {
            };
        };
        
    };
    
    reserved-memory {
    };
    
    backlight {
    };

    pxp_v4l2 {
    };

    regulators {
    };
    
    sound {
    };
    
    spi4 {
    };
};

/*在 / 节点外会有类似 &cpu0的节点,这些节点是对原有节点的追加*/
&cpu0 {

};

1、imx启动后,在/proc/device-tree可以看到整个设备树信息,该目录下的文件就是各个一级子节点
2、LynxusLAC:/proc/device-tree# cat model
Freescale i.MX6 ULL 14x14 EVK BoardLynxusLAC:/proc/device-tree# 

cat的时候可以看到,cat某个一级子节点,就会显示其相应的值

/*以i2c为例,ls显示的i2c名字是alias里面等号左边的名字*/
LynxusLAC:/proc/device-tree/aliases# ls /dev/i2c
ethernet0  gpio0      gpio2      gpio4      i2c1       i2c3       mmc1       sai1       sai3       serial1    serial3    serial5    serial7    spi1       spi3       usbphy1    
ethernet1  gpio1      gpio3      i2c0       i2c2       mmc0       name       sai2       serial0    serial2    serial4    serial6    spi0       spi2       usbphy0    

LynxusLAC:/proc/device-tree/chosen# ls
bootargs  name  stdout-path
在设备树文件里,chosen只有一个属性stdout-path,但是在网关运行的界面,ls出来的chosen多了bootargs和name,
LynxusLAC:/proc/device-tree/chosen# cat bootargs 
console=ttymxc0,115200 ubi.mtd=nandbootenv ubi.mtd=nandrootfs ubi.mtd=nandrootfsdata ubi.block=1,rootfs root=/dev/ubiblock1_0 rootfstype=squashfs rootrw=ubi2:rootfsdata rootrwfstype=ubifs init=/init mtdparts=gpmi-nand:16m(nandboot),12m(nandbootenv),4m(factory),4m(secure),16m(nandkernel),4m(nanddtb),8m(nandtee),32m(app),72m(nvm_m),72m(nvm_b),160m(nandrootfs),72m(nandrootfsdata),40m(dfu)LynxusLAC:/proc/device-tree/chosen# 

而且cat可以看到bootargs的内容和uboot里面bootargs的值是一致的。通过uboot源码搜索‘chosen’,会发现在fdt_support.c中有对chosen的处理,函数fdt_chosen().该函数获取bootargs的值并将其增加到chosen节点的属性和属性值

1、标准属性

compatible属性: 
值是字符串列表,用于将设备和驱动绑定,格式 “manufacture, model”
举例, 设备树内容为
    sound {
        compatible = "fsl,imx6ul-evk-wm8960",
               "fsl,imx-audio-wm8960";
        model = "wm8960-audio";
        ....
    }
    
然后在内核工程下依次搜索"fsl,imx6ul-evk-wm8960"和"fsl,imx-audio-wm8960",会看到sound/soc/fsl/imx-wm8960.c有如下代码
static const struct of_device_id imx_wm8960_dt_ids[] = {
        { .compatible = "fsl,imx-audio-wm8960", },
};

意思是只有compatible为"fsl,imx-audio-wm8960"的设备才能用wm8960这个驱动。


model属性: 
值也是字符类型,一般是描述设备的名字等信息

status属性:
有如下取值——
“okay” 表明设备是可操作的
"disabled" 表明设备不可操作,但是在未来可以变为可操作的,比如热插拔设备插入以后。
“fail” 表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
“fail-sss”含义和fail相同,sss部分是检测到的错误内容。


#address-cells和#size-cells属性
这2个属性都是uint32,都可以用在任何拥有子节点的设备中,用于描述子节点(注意:是子节点,不是当前节点)的地址信息。#address-cells属性值决定了子节点reg属性中地址信息所占用的字长(32位),#size-cells决定了子节点reg属性中长度信息所占的字长(32位)。
以上面的soc节点为例,其属性为
        #address-cells = <1>;
        #size-cells = <1>;
而其子节点i2c1为

    i2c1: i2c@021a0000 {
        #address-cells = <1>;
        #size-cells = <0>;
        compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c";
        reg = <0x021a0000 0x4000>;
        ....
    }
这边reg = <0x021a0000 0x4000>是由soc的#address-cells 和#size-cells决定的,也就是各位1,所以reg的格式就是1个地址,一个size。而i2c1如果还有子节点的话,其子节点的reg应该为reg= <地址>, 即只有地址,没有size


range属性: 见文档Power_ePAPR_APPROVED_v1.12.pdf
name属性 : 该属性已经被淘汰,只有一些老版本还存在这个描述。
device_type属性: 也是基本没用到该属性,只有在cpu或者memory里还有用到。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值