以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
(1)早期内核版本(2.6及以前的版本)描述硬件信息的.h文件,一般放在arch/arm/mach-xxx 或者arch/arm/plat-xxx中。
(2)3.x以上的内核版本,xxx.dts文件放在arch/arm/boot/dts目录中。
(1)设备树源码文件,其后缀名一般为dts和dtsi。
(2)这些设备树源码文件可以include那些C语言的头文件,也可以被其他文件include。
(3)xxx.dtsi文件编写的是soc共性部分,而xxx.dts文件编写的是具体开发板的特性部分,所以xxx.dts文件一般包含并重写部分xxx.dtsi文件。
(4)注释用/**/,注意#开头的不是注释。
(5)分号是段落块之间的分隔符,{}、[]和<>是段落块的封装符号,和C语言语言类似。
(6)/dts-v1/节点,表示dts的版本号,目前都是v1。
(7)/{}是根节点,理论上只应该有一个根节点,有说法dtc会合并所有root node为同一个。
(8)dts是树状的多节点的组织,基本单元是node,除root外其他node都有parent,还可以有child。
(1)格式定义
[label:][@ ]{ [property] [child nodes] [child nodes] ...... };(2)格式解读
- [ ] 表示该项可以省略,< >表示不可省略。
- [label] 表示标签,主要是为了方便访问节点,后面可以直接通过&label来访问该节点。
- node-name表示节点名称。注意,根节点的名称必须是“/”。
- [@unit-address]表示地址,比如cpu node就是0、1这种,reg node就是0x12010000这种。
(3)实例说明
看3516dv300的dts。
(4)补充说明一般一个节点描述一个硬件模块。
不是所有硬件模块都需要用dts来描述,usb或emmc等可以自己探测。
节点的属性由一个个key-value对组成,其中属性的名称就是key。
节点的属性可以有值或者没有值(value):
[label:] prooerty-name = value; //有值 [label:] property-name; //没有值节点的属性如果有值,则其值有以下几种可能情况:
字符串 compatible = "arm,cortex-a7"; 32位无符号整数 reg = <1 0x123456 100>; 16进制字节序列 reg = [00 11 22 33]; //每个数据必须是2位,也可以附加上0x 字符串列表 compatible = "fsl,imx6ull-gpmi-nand", "fsl,imx6ul-gpmi-nand";
(1)compatible属性
节点数据将来去匹配内核策略部分的兼容性设置。
案例1:compatible = "manufacturer, model" 案例2:compatible = "fsl, imx6ul-evk-wm8960", "fsl, imx-audio-wm8960" 案例3:16dv300的串口uart根节点的compatible属性是确认内核是否适配该dtb的,作用类似于老版本的machine id。
设备节点的compatible属性是为了匹配Linux内核中的驱动程序,作用类似于以前的.name。
另外,compatible如果有多个,前面的更精准,后面的越来越泛化,所以优先匹配前面。
(2)model属性
描述设备模块信息,比如名字、详细版本号。
案例1:model = "wm8960-audio-V1.0" 案例2:model = "Hisilicon HI3516DV300 DEMO Board"
(3)status属性
描述设备状态信息,有以下几个值:
"okey" 表示设备是可操作的 "disabled" 表示当前不可操作,但是后续是可以更改为可操作性的 "fail" "failed" 表示有严重错误,几乎不可能再可操作了
(4)reg属性
配置某个硬件模块对应的地址范围信息,reg是region。
#address-cells = <1> //表示reg里面的数据address占用一个字长,注意是字长而非字节 #size-cells = <1> //表示reg里面的数据length占用一个字长,注意是字长而非字节 gpio-spi: gpio_spi@0{ compatible = ".spi" reg = //address一般用来表示起始地址,length一般表示持续长度 }
(1)interrupt-controller属性
无值属性,表示这是一个中断控制器node。
(2)#interrupt-cells属性
这是中断控制器节点的属性,用来标识这个控制器需要几个cell做中断描述符。
(3)interrupt-parent属性
标识此设备节点属于哪一个中断控制器,如果没有这个属性,会自动依附父节点。
(4)interrupts属性
一个中断标识符列表,表示每一个中断输出信号。