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

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

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

2026/7/23 16:20:18 阅读更多 →
设备树入门:DTS / DTC / DTB 关系与核心作用

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

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

2026/7/20 20:17:04 阅读更多 →

最新新闻

AI工具不会选?ROI低于1.2的组合正在拖垮你的团队,这3套经天猫TOP10验证的配置必须立刻替换!

AI工具不会选?ROI低于1.2的组合正在拖垮你的团队,这3套经天猫TOP10验证的配置必须立刻替换!

更多请点击: https://codechina.net 第一章:AI电商运营工具组合的ROI陷阱与重构必要性 当企业将多个AI电商工具——如智能选品引擎、自动生成主图的视觉模型、实时竞价调价机器人、客服对话分析平台——打包采购并部署后,财务部门常收到一份…

2026/7/24 14:26:02 阅读更多 →
Unity粒子系统实战:从零手绘纹理打造动态火焰特效

Unity粒子系统实战:从零手绘纹理打造动态火焰特效

1. 项目概述:从“拖预设”到“亲手画火” 看到这个标题,你可能会心一笑。没错,在Unity里做火焰效果,很多人的第一反应就是去Asset Store找个现成的粒子特效包,或者从某个教程里拖一个预设(Prefab&#xff0…

2026/7/24 14:26:02 阅读更多 →
从事紧固件加工生产,你知道国内哪家热后搓丝板供应商更专业吗?

从事紧固件加工生产,你知道国内哪家热后搓丝板供应商更专业吗?

做紧固件生产的朋友,尤其是做12.9级高强度螺栓的朋友,肯定都懂选对搓丝版,有多重要。选不对,不仅产线停机亏产能,做出来的产品不合格,还得赔客户钱,真的太闹心了。我接触过不少老板,…

2026/7/24 14:26:02 阅读更多 →
收藏 | 大模型Agent落地指南:避开60%项目失败陷阱,小白也能看懂工程化实践

收藏 | 大模型Agent落地指南:避开60%项目失败陷阱,小白也能看懂工程化实践

本文从目标、系统、组织、人员四个维度,详细阐述了企业在大模型和Agent工程化使用中的关键原则与实施步骤。强调业务价值优先、增强优于替代,并提出了可衡量标准、小切口验证等落地策略。文章指出,工程纪律是项目成功的基石,需建立…

2026/7/24 14:26:02 阅读更多 →
C++线程池与阻塞队列实现:从原理到工业级代码实战

C++线程池与阻塞队列实现:从原理到工业级代码实战

1. 项目概述:为什么我们需要一个带阻塞队列的线程池? 在C后端开发或者高性能计算领域,多线程编程是绕不开的核心技能。但直接使用 std::thread 裸奔,就像在高速公路上徒手修车——风险极高且效率低下。你不仅要操心线程的创建与…

2026/7/24 14:26:02 阅读更多 →
AI文献综述工具:提升学术写作效率与质量

AI文献综述工具:提升学术写作效率与质量

1. 项目概述:当学术写作遇上AI魔法 去年帮导师审阅研究生论文时,一个现象让我印象深刻:超过70%的初稿在文献综述部分存在结构混乱、引用堆砌的问题。这促使我开始探索如何用AI技术重塑学术写作中最枯燥却又至关重要的环节。书匠策AI正是这样一…

2026/7/24 14:25:01 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/7/23 17:49:47 阅读更多 →

月新闻