1文件类型
后缀 作用 dtsi 一个类型芯片的统一资源,相当于头文件 dts 具体的硬件信息,每一款板卡都可以定义自己的dts dtc 编译dts的工具,可以通过apt命令安装,内核源码scripts/dtc路径下也已包含dtc工具 dtb dts编译后的二进制文件,可以通过bootloader引导程序加载进内核
辅助信息
单独编译设备树命令: make dtbs
binding文档所在内核位置: Documentation/devicetree/bindings及子设备目录
为了支持设备树,uboot在config文件中添加:#define CONFIG_OF_LIBFDT
2关键字属性
名称 关键字 作用 标准属性 compatible 指定系统名称,或者一个确切的设备名称,用字符串列表,可以包含制造商,型号等, 应用列表是为了匹配兼容性,每个字符出长度不要超过31个字节 model 指定芯片制造商的设备型号,举例: model = “Rockchip RK3399 Firefly Board(Linux Opensource)” ;model = “wm8960-audio”; //设备模块信息 chosen 不代表一个真正的设备 ,用于根参数,取代以前的bootloader的启动参数,控制台输入等;chosen {bootargs = “noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200”;} ;status 表示设备的状态: okey、disable、fail、fail-sss alias 比如SoC上有如果多个i2c控制器,alias的相当于给每个i2c控制器分配一个唯一的地址编号;可以批量的指定节点别名,与" : "单独指定节点别名来说,更方便 地址 #address-cells = <u32_t param_num> 基地址,片选号等绝对起始地址所占字长 长度 #size-cells = <u32_t length> 用来描述子节点"reg"属性的地址表中用来描述地址长度的cell的数量 寻址 reg = <list(param_num, length)> reg 是根据param_num和 length决定的一种列表结构 中断 interrupt-controller 中断控制器 ,一个空属性用来声明这个node接收中断信号,即这个node是一个中断控制器interrupt-parent 标识此设备节点属于哪一个中断控制器,如果没有设置这个属性,会自动依附父节点的 interrupts 一个中断标识符列表,表示每一个中断输出信号; 1,2,4,8标识不同的电位变化。 #interrupt-cells 中断控制器节点的属性,用来标识这个控制器需要几个单位做中断描述符,用来描述子节点中"interrupts"属性使用了父节点中的interrupts属性的具体的哪个值。 ,注意,我们谈到了父节点,那么中断也是可以嵌套的;一般,如果父节点的该属性的值是3,则子节点的interrupts一个cell的三个32bits整数值分别为:<中断域 中断 触发方式> ,如果父节点的该属性是2,则是<中断 触发方式 > ; IO gpio-controller gpio控制器 #gpio-cells 描述gpio使用节点的属性一个cell的内容; 属性 = <&引用GPIO节点别名 GPIO标号 工作模式> 第三个参数: 00: level 3 Mux; 01: sram/nor OE_B, Output; 10: NAND Flash CLE_B, Output; 11 SDIO 1 Power Control, Output 自定义键 针对具体的设备,有部分属性很难做到通用,需要驱动自己定义好,通过内核的属性提取解析函数进行值的获取
3符号
符号 作用 / 根节点 @ 如果设备有地址,则由此符号指定, i2c中也可指从设备地址 & 引用节点 : 冒号前的label是为了方便引用给节点起的别名,此label一般使用为&label , 属性名称中可以包含逗号 # 并不表示注释,常用于属性 空 空属性并不一定表示没有赋值。如 interrupt-controller 一个空属性用来声明这个node接收中断信号 " " 引号中的为字符串,不超过31字节 < > 32 位整型数字 [ ] 方括号中的为32位十六进制数,十六机制数据[0x11 0x12 0x13] 其中0x可省略
4 初步认识设备树,不再陌生
以下是stm32f429-disco.dts部分
/ {
model = "STMicroelectronics STM32F429i-DISCO board"; //指定芯片制造商的设备型号
compatible = "st,stm32f429i-disco", "st,stm32f429"; //指定系统名称
chosen {
bootargs = "root=/dev/ram"; //不代表一个真正的设备,用于根参数,取代以前的bootloader的启动参数
stdout-path = "serial0:115200n8";
};
memory@90000000 { //在stm32f4xx手册1195页,可以查到地址fsmc存储区域4的起始地址是0x9000 0000
device_type = "memory";
reg = <0x90000000 0x800000>; //起始地址 0x9000 0000, 大小是 0x800 0000
};
aliases {
serial0 = &usart1; // 引用,得到serial对应的串口编号
};
leds {
compatible = "gpio-leds";
red {
gpios = <&gpiog 14 0>; //三个参数, 选中pg14, 模式为level 3 Mux
};
green {
gpios = <&gpiog 13 0>;
linux,default-trigger = "heartbeat"; //自定义key
};
};
gpio_keys {
compatible = "gpio-keys";
#address-cells = <1>;
#size-cells = <0>;
autorepeat;
button@0 {
label = "User";
linux,code = <KEY_HOME>;
gpios = <&gpioa 0 0>;
};
};