嵌入式Linux驱动开发指南 —— 设备树语法与编译工具 —— 读懂这张“藏宝图“(2)

发布时间:2026/6/14 16:14:20
嵌入式Linux驱动开发指南 —— 设备树语法与编译工具 —— 读懂这张“藏宝图“(2) 接前一篇文章嵌入式Linux驱动开发指南 —— 设备树语法与编译工具 —— 读懂这张“藏宝图“1节点语法树的枝干设备树的核心结构就是树。每个设备都是一个节点每个节点里是一堆键值对我们称之为属性。节点命名规则节点的命名格式通常如下node-nameunit-addressnode-name节点名字ASCII字符串比如uart1、i2c0。unit-address设备的寄存器首地址可省略。实际文件中我们经常看到带标签的写法cpu0: cpu0 intc: interrupt-controller00a01000格式是label: node-nameunit-address。冒号前面的cpu0和intc是节点标签方便后面通过label引用不用每次敲那长长的一串名字。我们来看一个从I.MX6ULL设备树截取的完整例子/ { aliases { can0 flexcan1; }; cpus { #address-cells 1; #size-cells 0; cpu0: cpu0 { compatible arm,cortex-a7; device_type cpu; reg 0; }; }; intc: interrupt-controller00a01000 { compatible arm,cortex-a7-gic; reg 0x00a01000 0x1000; interrupt-controller; #interrupt-cells 2; }; }几个关键点根节点/整个树的起点所有其它节点都是它的子孙。节点嵌套cpus是根节点的子节点cpu0又是cpus的子节点反映了硬件的层级结构。标签的使用cpu0和intc是标签可以在文件其它地方通过cpu0或intc引用。节点引用label机制这是设备树中最实用的语法糖。假设imx6ull.dtsi里定义了i2c1: i2c021a0000 { compatible fsl,imx6ul-i2c, fsl,imx21-i2c; reg 0x021a0000 0x4000; status disabled; };你想启用I2C1并挂两个设备只需要在.dts里写i2c1 { clock-frequency 100000; status okay; mag31100e { compatible fsl,mag3110; reg 0x0e; }; fxls84711e { compatible fsl,fxls8471; reg 0x1e; }; };既启用了控制器又挂上了从设备而且不会污染原始.dtsi。这种“通过引用标签来追加内容”的机制是设备树移植中最常用的操作。属性类型数据的各种面孔节点里面全是属性属性就是键值对。DTS支持的数据类型非常直观。字符串属性model Freescale i.MX6 ULL 14x14 EVK Board; status okay; device_type cpu;字符串列表用逗号分隔非常关键 —— 它表示“先试着找前一个驱动找不到就找后一个”compatible fsl,imx6ull-gpmi-nand, fsl,imx6ul-gpmi-nand;数值属性数值用尖括号包裹默认是32位无符号整数支持十进制和十六进制reg 0x02020000 0x4000;前一个是地址后一个是长度16KB。引用属性phandle一个节点需要引用另一个节点时用labelgpio1: gpio0209c000 { #gpio-cells 2; gpio-controller; }; some-device { gpios gpio1 12 0; };编译后的DTB里gpio1会被替换为该节点的唯一数字IDphandle。空属性有些属性不需要值它们的存在本身就表示某种含义gpio-controller; interrupt-controller;更多内容请看下回。