当前位置: 首页 > news >正文

嵌入式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文件,也能写出规范的设备树代码了。

http://www.zskr.cn/news/1524664.html

相关文章:

  • 多 Agent 协作系统:从任务分解到冲突消解的编排架构
  • 5分钟上手SillyTavern:打造属于你的AI角色扮演游戏世界
  • 如何快速构建专业的2D国际象棋游戏:UnityChess开源项目完全指南
  • 深入解析MPC8272 PowerQUICC II通信处理器架构与应用
  • 大模型 RAG 系统检索增强生成的幻觉抑制策略:从“自信编造“到“有据可依“
  • 2026西安名表回收全品类实测:实体门店与上门回收双向服务,七家品牌综合测评 - 薛定谔的梨花猫
  • 如何在5分钟内用UI-TARS桌面版实现零代码GUI自动化
  • 深入解析FlexCAN控制器寄存器配置:从CAN总线原理到MPC8309实战
  • 我把向量引擎 API 中转站跑了 4 个月,RAG 知识库终于稳定下来
  • 2026年6月做得好的铝氧化公司有哪些,铝制品铝氧化/硬质氧化/阳极着色氧化/铝材着色氧化,铝氧化公司哪家强 - 品牌推荐师
  • 如何让普通鼠标在macOS上获得专业级体验:Mac Mouse Fix完全配置指南
  • OBS Advanced Timer:直播时间管理的终极解决方案,让新手也能轻松掌控直播节奏
  • PowerPC指令集实战解析:浮点存储、分支控制与内存同步优化
  • 如何快速配置Paperless-ngx多语言环境:从中文界面到全球文档管理指南
  • MPC823中断与寄存器机制解析:嵌入式实时系统开发实战指南
  • 八字命理在大模型上的部署:四种主流方案与未来展望
  • MPC8309 eLBC内存控制器错误处理机制详解与实战
  • 终极2D国际象棋体验:UnityChess免费开源游戏完全指南
  • 2026年乌鲁木齐学员咨询众智商学院中级经济师课程怎么联系?官网400和冯老师微信入口及报名费用资料核对 - 众智商学院官方
  • 第 25 篇:抓包实战:分析一次 HTTP 请求
  • 如何让老旧Mac焕发新生:OpenCore Legacy Patcher完整实战指南
  • 天津钻石首饰回收攻略,2026年6月无套路门店汇总 - 讯息早知道
  • 本地Cookie管理新选择:Get cookies.txt LOCALLY浏览器扩展详解
  • WarcraftHelper完整指南:让魔兽争霸3在新时代焕发新生的终极工具
  • Reloaded-II游戏模组管理框架终极指南:3步掌握模组安装与配置技巧
  • 2026年6月天津钻戒变现实测,全城正规回收店盘点 - 讯息早知道
  • 告别“千车一面”,定义新能源之眼:2026年新能源车灯总成升级深度测评 - 速递信息
  • 120、地面站通信:QGroundControl与Mission Planner
  • 深圳名表回收门店盘点,奢二网全城一小时上门收货 - 讯息早知道
  • 南京婚纱照攻略2026麦田影像摄影教你选对工作室不踩雷 - 速递信息