当前位置: 首页 > 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.jsqmd.com/news/1012848/

相关文章:

  • 多 Agent 协作系统:从任务分解到冲突消解的编排架构
  • 深入解析MPC8272 PowerQUICC II通信处理器架构与应用
  • 大模型 RAG 系统检索增强生成的幻觉抑制策略:从“自信编造“到“有据可依“
  • 5分钟上手SillyTavern:打造属于你的AI角色扮演游戏世界
  • 亚马逊运营 亚马逊选品 FBA发货 东莞跨境电商 TikTok培训 亚马逊培训 Facebook推广 Shopee运营 - 东莞选校指南
  • MPC7450软件页表搜索:TLB未命中时软件接管内存地址转换的机制详解
  • 如何快速构建专业的2D国际象棋游戏:UnityChess开源项目完全指南
  • 2026青岛香港中路名表回收实测,保卡齐全多卖20% - 逸程
  • 终极指南:5分钟永久激活Internet Download Manager的完整教程
  • *阿姆达尔定律(Amdahl‘s Law)
  • 5个技巧让Mac Mouse Fix彻底改变你的macOS鼠标体验:从新手到专家
  • 嵌入式SDIO驱动开发实战:中断处理与高速模式切换详解
  • 多工况无忧!2026玻璃钢冷却塔/玻璃钢化粪池/玻璃钢盖板厂家选购宝典 - 速递信息
  • 2026乐清装修口碑榜:本地老师傅极简奶油风全屋定制电话 - 速递信息
  • 如何在5分钟内用UI-TARS桌面版实现零代码GUI自动化
  • 2026西安名表回收全品类实测:实体门店与上门回收双向服务,七家品牌综合测评 - 薛定谔的梨花猫
  • 如何快速上手IINA:macOS终极视频播放器完整指南
  • 别盲目自建 Milvus:我把向量引擎、RAG 和 API 中转站连续跑了 4 个月,成本与报错率到底差在哪?
  • 深入解析FlexCAN控制器寄存器配置:从CAN总线原理到MPC8309实战
  • 如何通过pypdf实现企业级PDF文档自动化处理:从基础部署到高级加密的完整解决方案
  • 2026深度测评青岛 6 家金店 本地黄金回收靠谱门店甄选 - 讯息早知道
  • 深入解析USB主机控制器:数据结构与DMA引擎工作原理
  • 终极指南:如何用KKManager简化Illusion游戏模组管理
  • 为什么你的旧Kindle应该变成节能仪表盘?一个让电子墨水屏重获新生的方案
  • MoE稀疏激活原理:万亿参数为何只用2%?
  • 2026年6月做得好的铝氧化公司有哪些,铝制品铝氧化/硬质氧化/阳极着色氧化/铝材着色氧化,铝氧化公司哪家强 - 品牌推荐师
  • 我把向量引擎 API 中转站跑了 4 个月,RAG 知识库终于稳定下来
  • 技术人转型 AI:从后端工程到 AI 应用的能力迁移路径
  • 实现轮播图效果
  • 2026年6月目前知名的虹吸排水源头厂家推荐,虹吸排水系统/虹吸雨水斗/屋面虹吸排水,虹吸排水源头厂家哪家好 - 品牌推荐师