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属性的具体值。,请注意,当我们谈到父节点时,中断也可以嵌套;; | |
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>;
};
};