news 2026/6/14 16:13:59

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式Linux驱动开发指南 —— 设备树语法与编译工具 —— 读懂这张“藏宝图“(3)

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

标准属性:那些你一定会用到的

Linux内核定义了一些标准属性,驱动程序会对它们有特定的预期处理。

compatible:驱动匹配的灵魂

这是最重要的属性,没有之一。格式为"manufacturer,model",它是驱动和硬件绑定的“红娘”:

compatible = "fsl,imx6ul-evk-wm8960", "fsl,imx-audio-wm8960";

内核会拿着这个字符串去驱动的of_match_table里匹配:

static const struct of_device_id imx_wm8960_dt_ids[] = { { .compatible = "fsl,imx-audio-wm8960", }, { /* sentinel */ } };

只要有一个能对上,驱动就会被触发。

status:设备的生死开关

  • "okay"设备可操作,内核加载驱动。
  • "disabled":设,内核忽略它。
  • "fail"/"fail-sss":设备有严重错误。

移植时最常改的属性。很多外设在.dtsi里默认disabled,我们在.dts里改成okay来激活。

reg:地址与长度

描述设备寄存器地址范围,格式由父节点的#address-cells#size-cells决定:

uart1: serial@02020000 { compatible = "fsl,imx6ul-uart", "fsl,imx6q-uart", "fsl,imx21-uart"; reg = <0x02020000 0x4000>; };

#address-cells和#size-cells:地址的度量衡

这两个属性出现在父节点里,指导子节点如何写reg

  • #address-cells:地址字段占多少个 32 位整数。
  • #size-cells:长度字段占多少个 32 位整数。
spi4 { #address-cells = <1>; #size-cells = <0>; // 没有长度字段 gpio_spi@0 { reg = <0>; // 只有一个地址 }; };

再看:

aips-bus@02200000 { #address-cells = <1>; #size-cells = <1>; dcp@02280000 { reg = <0x02280000 0x4000>; // 地址 + 长度 }; };

ranges:地址翻译

ranges是一个翻译函数:ranges = <child-bus-address parent-bus-address length>

ranges意味着子地址和父地址一一对应,不需要翻译,这在SoC内部总线中很常见:

soc { ranges; };

如果不为空,比如ranges = <0x0 0xe0000000 0x00100000>,则子总线地址0x4600会被翻译为0xe0004600。大部分普通开发板移植不需要关心这个。

语法糖:让代码更简洁

include机制

#include <dt-bindings/input/input.h> #include "imx6ull.dtsi"

DTC不仅能include.dtsi,连.h文件也支持。约定上:.h放宏定义(把“魔术数字”变成可读常量),.dtsi放节点定义。

/delete-node/:删除节点

/delete-node/ &sim2;

把不需要的节点彻底删除,而不是让它以disabled状态存在。

节点追加与覆盖

&i2c1 { status = "okay"; // 覆盖原来的 "disabled" clock-frequency = <100000>; // 新增属性 };

如果原节点已有该属性则覆盖,没有则新增。不用修改原始文件,就能完全定制设备树行为。

实战示例:一个完整的设备树文件

下面是一个用于Alpha开发板的LED驱动设备树文件:

/dts-v1/; #include "imx6ull.dtsi" #include "imx6ull-aes.dtsi" / { model = "Awesome Embedded Studio IMX6ULL Example Driver"; compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull"; imx_aes_led { #address-cells = <1>; #size-cells = <1>; compatible = "atkalpha-led"; status = "okay"; reg = < 0X020C406C 0X04 /* CCM_CCGR1_BASE */ 0X020E0068 0X04 /* SW_MUX_GPIO1_IO03_BASE */ 0X020E02F4 0X04 /* SW_PAD_GPIO1_IO03_BASE */ 0X0209C000 0X04 /* GPIO1_DR_BASE */ 0X0209C004 0X04 >; /* GPIO1_GDIR_BASE */ }; };

逐行解析:

  • /dts-v1/;:声明设备树版本,必须写。
  • #include:引入芯片级头文件和板级配置。
  • 根节点的compatible:必须和内核里某个DT_MACHINE_START.dt_compat匹配,否则内核启动失败。
  • imx_aes_led:自定义节点,没有@address后缀因为它只是描述寄存器的“容器”。
  • compatible = "atkalpha-led":驱动匹配的关键字符串。
  • reg:列出了驱动需要的五个寄存器地址,每个由物理地址和长度组成。

踩坑预警

根节点compatible拼写错误

手滑多打一个字母(比如"fsl,imx6ullll"),内核启动后只显示Starting kernel ...然后就没了。内核启动不了,第一件事检查根节点compatible拼写!

忘记写ranges

定义总线节点时忘了ranges,内核映射外设寄存器时可能拿到错误地址。SoC内部总线通常用空ranges表示直接映射。

#address-cells和#size-cells 不匹配

父节点定义了#address-cells = <1>#size-cells = <1>,子节点reg却只写了一个数字。DTC 可能不报错,但内核解析时会出问题。

直接修改.dtsi文件

新手最容易犯的错误。.dtsi是公用的,改了会影响所有引用它的项目。正确做法是,在.dts里通过&label引用修改。

小结

这一章我们先把 DTC 编译器的原理过了一遍 —— 词法分析、语法分析、二进制生成三阶段,以及DTB的文件头、结构块、字符串块布局。然后重点讲解了设备树的语法:节点命名、属性类型、标准属性、语法糖,最后通过一个完整的 LED 驱动示例串联了所有知识点。

掌握这些,你就能看懂任何.dts文件,也能写出规范的设备树代码了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 16:12:11

xiaozhi-esp32:基于MCP协议的边缘智能设备企业级集成方案

xiaozhi-esp32&#xff1a;基于MCP协议的边缘智能设备企业级集成方案 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 xiaozhi-esp32是一个基于Model Context Protoc…

作者头像 李华
网站建设 2026/6/14 16:11:55

LizzieYzy:围棋AI分析工具,让AI成为你的专属围棋教练

LizzieYzy&#xff1a;围棋AI分析工具&#xff0c;让AI成为你的专属围棋教练 【免费下载链接】lizzieyzy LizzieYzy - GUI for Game of Go 项目地址: https://gitcode.com/gh_mirrors/li/lizzieyzy LizzieYzy是一款专为围棋爱好者设计的AI分析工具&#xff0c;它通过多引…

作者头像 李华
网站建设 2026/6/14 16:11:16

014、auth.json 配置详解:API Key 生成、多 Key 轮换与安全存储

014、auth.json 配置详解&#xff1a;API Key 生成、多 Key 轮换与安全存储上周五晚上&#xff0c;我正用 CodeX 跑一个需要连续调用 200 次 API 的批量翻译任务&#xff0c;结果跑到第 37 次突然报错——401 Unauthorized。我第一反应是 Key 过期了&#xff0c;赶紧去控制台看…

作者头像 李华
网站建设 2026/6/14 16:05:58

Wayback Machine:为你的网络记忆装上时光保险箱

Wayback Machine&#xff1a;为你的网络记忆装上时光保险箱 【免费下载链接】wayback-machine-webextension A web browser extension for Chrome, Firefox, Edge, and Safari 14. 项目地址: https://gitcode.com/gh_mirrors/wa/wayback-machine-webextension 你是否曾经…

作者头像 李华
网站建设 2026/6/14 16:05:54

3步实现智能电视与PC自动化联动:LGTV Companion终极指南

3步实现智能电视与PC自动化联动&#xff1a;LGTV Companion终极指南 【免费下载链接】LGTVCompanion Power On and Off WebOS LG TVs together with your PC 项目地址: https://gitcode.com/gh_mirrors/lg/LGTVCompanion LGTV Companion 是一款专为WebOS系统LG电视设计的…

作者头像 李华