设备树节点精讲:compatible / reg / 中断属性配置
设备树节点精讲compatible / reg / 中断属性配置作者黒漂技术佬 | 系列Linux内核配置与移植引言上一篇把设备树的来龙去脉讲清楚了这一篇我们深入到节点内部来看看设备树到底是怎么描述一个硬件的。设备树看起来像 JSON但它的语义远比 JSON 更严格——每一个属性名都有固定的含义写错一个字驱动就找不到设备。本文把最核心的三个属性掰开揉碎来讲compatible谁是谁、reg在哪、interrupts怎么通知。一、设备树节点基本结构一个完整的设备树节点长这样node-nameunit-address { property-name value; compatible vendor,device; reg address size; status okay; sub-node { /* 子节点 */ }; };节点命名规则node-name节点类型名称如uart、i2c、gpiounit-address可选的地址后缀值需与reg属性中的首地址一致label引用其他节点的标签属性值的四种基本格式格式示例说明整数数组 reg 0x1000 0x100;32位大端整数序列字符串 compatible arm,pl011;普通字符串字节数组[ ]mac-address [00 11 22 33 44 55];原始十六进制字节组合引用 clocks clkc 24;引用其他节点 phandle二、compatible 属性——驱动的身份证2.1 定义与格式compatible是设备树中最重要的属性没有之一。它用一个字符串列表告诉内核这个设备是什么驱动通过它来匹配设备。uart0: serial101f1000 { compatible arm,pl011, arm,primecell; reg 0x101f1000 0x1000; };格式规范manufacturer,model第一部分是厂商名arm、ti、nxp、st 等第二部分是设备型号pl011、omap-uart、stm32-usart 等可以用多个字符串从左到右匹配越具体的放前面如果第一个匹配不到内核会尝试下一个2.2 驱动侧如何匹配在驱动代码里compatible对应这样的匹配表// drivers/tty/serial/amba-pl011.cstaticconststructof_device_idsbsa_uart_of_match[]{{.compatiblearm,sbsa-uart},{.compatiblearm,pl011},{/* sentinel */},};MODULE_DEVICE_TABLE(of,sbsa_uart_of_match);staticstructplatform_driverpl011_driver{.driver{.nameuart-pl011,.of_match_tablesbsa_uart_of_match,// ← 在这里匹配 DTS 中的 compatible},};匹配流程DTS: compatible ti,am3352-uart, ns16550a; ↓ 内核: of_match_table 逐个对比 ti,am3352-uart 匹配? → YES → 绑定该驱动 ns16550a 匹配? → (不再尝试)2.3 常见 compatible 示例设备类型compatible 字符串示例ARM GIC 中断控制器arm,gic-400PL011 串口arm,pl011STM32 USARTst,stm32-usartI2C 控制器nxp,lpc1788-i2cGPIO 控制器ti,omap4-gpio以太网卡smsc,lan9115温度传感器nxp,lm75aSD卡控制器rockchip,rk3288-dw-mshc三、reg 属性——寄存器的门牌号3.1 基本格式reg描述了设备的寄存器或内存地址范围reg 起始地址1 大小1 起始地址2 大小2 ...;格式为成对的(address, length)。具体的含义由父节点的#address-cells和#size-cells决定。3.2 address-cells 和 size-cells这两个属性定义在父节点上告诉解析器reg中一个地址或长度占几个 32 位字soc { #address-cells 1; /* 地址用1个32位数表示 */ #size-cells 1; /* 大小用1个32位数表示 */ uart0: serial40002000 { compatible arm,pl011; reg 0x40002000 0x1000; /* ↑ 地址 ↑ 大小 (4KB) */ }; };各种组合示例#address-cells#size-cellsreg 示例适用场景110x4000 0x10032位处理器外设最常见100x123只有地址没有大小如 I2C 设备210x0 0x4000 0x10064位地址空间220x0 0x4000 0x0 0x10064位地址 64位大小3.3 不同类型总线上的 reg内存映射外设MMIOamba { #address-cells 1; #size-cells 1; uart101f1000 { reg 0x101f1000 0x1000; /* 基地址 寄存器范围 */ }; };I2C 从设备i2c0 { #address-cells 1; #size-cells 0; /* I2C 设备没有地址空间概念 */ eeprom50 { /* 50 表示 I2C 从设备地址 0x50 */ compatible atmel,24c02; reg 0x50; /* 这里的 reg 是 I2C 地址不是 MMIO */ }; };SPI 从设备spi0 { #address-cells 1; #size-cells 0; flash0 { /* 0 表示 SPI 片选 CS0 */ compatible spi-nand; reg 0; /* 这里的 reg 是片选编号 */ }; };四、interrupts 属性——硬件如何喊你4.1 基本格式interrupts描述了设备使用的中断信息uart40002000 { compatible arm,pl011; reg 0x40002000 0x1000; interrupts 0 12 4; };这里0 12 4的含义取决于中断控制器的绑定规范。对于 ARM GIC 中断控制器字段含义值 0 12 4 的解释第1个值中断类型0 SPI共享外设中断第2个值中断号12 第12号中断第3个值触发方式4 高电平触发GIC 中断触发方式编码IRQ_TYPE_NONE 0 // 未定义 IRQ_TYPE_EDGE_RISING 1 // 上升沿触发 IRQ_TYPE_EDGE_FALLING 2 // 下降沿触发 IRQ_TYPE_EDGE_BOTH 3 // 双边沿触发 IRQ_TYPE_LEVEL_HIGH 4 // 高电平触发 IRQ_TYPE_LEVEL_LOW 8 // 低电平触发4.2 interrupt-parent 和 interrupts-extended当设备的中断控制器不是它的直接父节点时需要显式指定/* 方式一单独指定 interrupt-parent */ i2c40005000 { compatible vendor,i2c; reg 0x40005000 0x1000; interrupt-parent intc; /* 指定中断控制器 */ interrupts 0 21 4; /* SPI 21, 高电平 */ }; /* 方式二interrupts-extended 一步到位 */ i2c40005000 { compatible vendor,i2c; reg 0x40005000 0x1000; interrupts-extended intc 0 21 4; /* 一行搞定 */ };4.3 中断控制器的固定定义interrupt-controller中断控制器自身在设备树中也有特定的声明intc: interrupt-controller1e001000 { compatible arm,cortex-a9-gic; reg 0x1e001000 0x1000, 0x1e000100 0x100; #interrupt-cells 3; /* interrupts 属性每个单元有3个数 */ interrupt-controller; /* 宣告我是中断控制器 */ };interrupt-controller声明这是一个中断控制器空属性有就表示是#interrupt-cells声明引用该控制器时interrupts属性中每个中断用几个整数来描述GIC 是 3五、其他常用属性速查属性作用示例reg-names给 reg 中的地址区域起名字reg-names base, alias;clocks指定设备使用的时钟源clocks clkc 15;clock-names给时钟起名字clock-names apb_pclk;dmas指定 DMA 通道dmas dmac 0 2;pinctrl-0引脚复用配置pinctrl-0 uart0_pins;gpiosGPIO 引脚引用gpios gpio0 5 0;status设备状态okay/disabled/reservedphandle节点唯一标识通常自动生成DTC 自动为有 label 的节点生成status 的取值含义值含义okay设备可用正常初始化disabled设备不可用硬件存在但软件不用reserved设备预留驱动不配置但不要更改寄存器fail设备探测失败六、实操写一个完整的设备节点综合以上知识下面是 STM32 板卡上一个温度传感器的完整设备树节点i2c1 { #address-cells 1; #size-cells 0; status okay; lm75: temperature-sensor48 { compatible nxp,lm75a; reg 0x48; /* I2C 从设备地址 */ status okay; interrupts-extended gpiof 3 IRQ_TYPE_EDGE_FALLING; /* ↑PF3引脚 下降沿触发 */ #thermal-sensor-cells 0; pinctrl-0 lm75_int_pin; /* 引脚复用 */ }; };逐行解读i2c1—— 引用 SoC 级别定义好的 I2C1 控制器#address-cells 1—— I2C 设备地址用一个整数#size-cells 0—— I2C 没有地址空间48—— 设备 I2C 地址是 0x48传感器硬连接的地址脚决定compatible nxp,lm75a—— 匹配内核的 lm75 驱动reg 0x48—— 确认 I2C 地址要和 后面的值一致interrupts-extended—— 温度超限时通过 PF3 引脚触发中断pinctrl-0—— 指定 PF3 的引脚复用功能总结设备树的三个核心属性记住这个类比compatible 是身份证告诉内核我是谁reg 是门牌号告诉内核我在哪interrupts 是电话号码告诉内核怎么找我。掌握了这三个再加上#address-cells和#size-cells这对规则说明书你就能读写 80% 的设备树节点了。

相关新闻

0.雷达信号

0.雷达信号

雷达信号 目录 1 常规脉冲信号 1 2 相位编码信号 2 3 线性调频信号 4 4 非线性调频信号 6 4.1 S型非线性调频信号 6 4.2 正弦调频信号 9 4.3 正切调频信号 10 5 噪声调幅干扰信号 11 6 噪声调频干扰信号 13 7 噪声调相干扰信号 15 1 常规脉冲信号 2 相位编码信号 …

2026/10/28 2:49:08 阅读更多 →
一文搞懂 Go map 底层原理:把它想成一座会扩建的智能仓库

一文搞懂 Go map 底层原理:把它想成一座会扩建的智能仓库

文章目录一、开场:仓库明明有货,系统为什么说找不到二、先建立对应关系:map 不只是一个“字典”三、基础用法:先学会正确进出仓库3.1 三种创建方式3.2 增加和修改是同一种语法3.3 删除和清空四、最常见的坑:不存在的货…

2026/10/26 8:40:16 阅读更多 →
设备树入门:DTS / DTC / DTB 关系与核心作用

设备树入门:DTS / DTC / DTB 关系与核心作用

设备树入门:DTS / DTC / DTB 关系与核心作用作者:黒漂技术佬 | 系列:Linux内核配置与移植引言 如果你是从单片机(STM32、ESP32)转到嵌入式 Linux 的,第一次看到设备树(Device Tree)可…

2026/10/27 8:03:25 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →