设备树节点精讲: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/7/22 8:57:24阅读更多 →
一文搞懂 Go map 底层原理:把它想成一座会扩建的智能仓库

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

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

2026/7/22 13:05:29阅读更多 →
make menuconfig 图形化配置:内核功能裁剪入门

make menuconfig 图形化配置:内核功能裁剪入门

make menuconfig 图形化配置:内核功能裁剪入门作者:黒漂技术佬 | 系列:Linux内核配置与移植引言 上篇文章讲了 Kconfig 和 Makefile 的原理,这篇文章我们正式进入「点菜环节」。make menuconfig 是内核开发中使用频率最高的配置工…

2026/7/22 7:50:13阅读更多 →
TI VPDMA中断配置实战:从寄存器解析到系统级调试

TI VPDMA中断配置实战:从寄存器解析到系统级调试

1. 项目概述 在嵌入式视频处理系统的开发中,尤其是面对德州仪器(TI)这类高性能SoC时,中断管理往往是决定系统稳定性和实时性的关键。很多工程师拿到芯片手册,看到动辄几十页的寄存器描述,尤其是像VPDMA&…

2026/7/22 16:38:54阅读更多 →
桌面图标隐藏工具!录屏怕桌面太乱?隐藏S+!

桌面图标隐藏工具!录屏怕桌面太乱?隐藏S+!

前言 常年录教程、直播、线上会议的朋友一定深有体会,满屏文件、快捷方式全暴露,隐私文件一览无余。录出来的视频里,桌面图标乱七八糟。要是手动把图标藏起来,录完还得再费劲挪回原位。 今天分享两款“桌面图标一键隐藏工具”&a…

2026/7/22 16:38:54阅读更多 →
AI副业如何从0到月入5万?揭秘头部玩家正在用的3个公域流量裂变公式

AI副业如何从0到月入5万?揭秘头部玩家正在用的3个公域流量裂变公式

更多请点击: https://kaifayun.com 第一章:AI副业如何从0到月入5万?揭秘头部玩家正在用的3个公域流量裂变公式 在抖音、小红书、B站等公域平台,头部AI副业玩家已不再依赖“单点内容曝光”,而是通过可复制、可度量、可…

2026/7/22 16:38:54阅读更多 →
速度与精度的结合:Faster R-CNN模型的性能剖析

速度与精度的结合:Faster R-CNN模型的性能剖析

目标检测作为计算机视觉领域的核心问题之一,其重要性随着深度学习技术的发展而日益凸显。本文深入探讨了基于深度学习的Faster R-CNN模型,这是一种革命性的目标检测框架,它通过引入区域提议网络(Region Proposal Network, RPN&…

2026/7/22 16:38:54阅读更多 →
深入解析IOMM特殊复用:ADC触发、ePWM同步与安全机制实战

深入解析IOMM特殊复用:ADC触发、ePWM同步与安全机制实战

1. 项目概述与IOMM核心价值在嵌入式系统,尤其是汽车电子和工业控制这类对实时性、可靠性和资源利用率要求极高的领域,微控制器(MCU)的引脚资源往往非常紧张。一颗MCU需要驱动电机、采样传感器、处理通信、管理故障保护&#xff0c…

2026/7/22 16:38:54阅读更多 →
TI VPDMA中断寄存器深度解析与嵌入式视频处理驱动实战

TI VPDMA中断寄存器深度解析与嵌入式视频处理驱动实战

1. 项目概述与中断机制在视频处理中的核心地位在嵌入式视频处理系统的开发中,尤其是面对德州仪器(TI)这类高性能多媒体SoC时,中断管理往往是决定系统实时性、稳定性和效率的“命门”。我处理过不少基于达芬奇(DaVinci&…

2026/7/22 16:36:54阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →