news 2026/7/6 4:49:05

Linux 驱动开发必知:设备树中 #address-cells 与 #size-cells 的 4 种配置模式详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 驱动开发必知:设备树中 #address-cells 与 #size-cells 的 4 种配置模式详解

Linux 驱动开发必知:设备树中 #address-cells 与 #size-cells 的 4 种配置模式详解

1. 设备树寻址基础概念

在嵌入式Linux开发中,设备树(Device Tree)已成为描述硬件资源的标准化方式。其中#address-cells#size-cells这两个属性构成了设备树地址描述的基础框架,它们定义了如何解析子节点的reg属性。

关键术语解析

  • #address-cells:指定表示地址所需的32位单元数量
  • #size-cells:指定表示地址范围大小所需的32位单元数量
  • reg:包含<地址 长度>对的属性,描述设备资源
// 典型reg属性格式示例 reg = <address1 length1 address2 length2...>;

注意:当#size-cells为0时,表示不需要/不支持地址范围大小描述,此时reg属性中只包含地址值

2. 四种核心配置模式分析

2.1 标准32位地址模式

配置参数

#address-cells = <1>; #size-cells = <1>;

应用场景

  • 32位地址空间的简单外设
  • 内存映射寄存器区域描述

实例解析

soc { #address-cells = <1>; #size-cells = <1>; serial@4000F000 { compatible = "ns16550"; reg = <0x4000F000 0x1000>; }; };

特点对比

参数地址宽度长度宽度适用场景
1,132-bit32-bit常规32位系统

2.2 纯地址无长度模式

配置参数

#address-cells = <1>; #size-cells = <0>;

应用场景

  • I2C/SPI等总线设备地址
  • 不需要地址范围描述的场合

实例解析

i2c@3000 { #address-cells = <1>; #size-cells = <0>; eeprom@50 { compatible = "at24"; reg = <0x50>; }; };

特殊说明

  • 常见于非内存映射设备
  • 地址通常表示从设备选择号或寄存器偏移

2.3 64位地址扩展模式

配置参数

#address-cells = <2>; #size-cells = <2>;

应用场景

  • 64位地址空间系统
  • 大内存范围描述

实例解析

memory { #address-cells = <2>; #size-cells = <2>; reg = <0x00000000 0x80000000 0x00000000 0x20000000>; };

数据格式

address_high address_low size_high size_low

2.4 复合地址空间模式

配置参数

#address-cells = <2>; #size-cells = <1>;

应用场景

  • 带片选信号的存储控制器
  • 多级地址译码系统

实例解析

flash-controller { #address-cells = <2>; #size-cells = <1>; flash@0 { reg = <0 0x00000000 0x1000000>; // CS0, offset 0, size 16MB }; };

关键点

  • 第一个cell通常表示片选信号
  • 第二个cell表示片选空间内的偏移

3. 多总线层级配置实践

在复杂系统中,不同总线层级可能需要不同的地址表示方式。以下是典型SoC的配置示例:

/ { #address-cells = <1>; #size-cells = <1>; soc { #address-cells = <1>; #size-cells = <1>; ranges = <0x0 0xe0000000 0x100000>; i2c@3000 { #address-cells = <1>; #size-cells = <0>; sensor@48 { compatible = "ti,tmp102"; reg = <0x48>; }; }; spi@7000 { #address-cells = <1>; #size-cells = <0>; flash@0 { reg = <0>; }; }; }; };

层级关系说明

  1. 根节点定义系统级地址单元
  2. SoC节点启用地址转换(ranges)
  3. 串行总线(I2C/SPI)使用无长度模式

4. 调试与验证技巧

4.1 常见问题排查

问题现象

  • 内核启动时设备未正确识别
  • 资源分配冲突警告

诊断步骤

  1. 检查/proc/device-tree对应节点的属性
  2. 使用dtc工具反编译DTB:
    dtc -I dtb -O dts -o dump.dts /boot/board.dtb
  3. 验证地址范围是否重叠

4.2 实用调试命令

# 查看处理后的设备树 cat /proc/device-tree/*/compatible # 检查特定节点reg属性 hexdump -C /proc/device-tree/soc/serial@4000F000/reg

调试建议

  • 逐步验证各级总线配置
  • 注意父子节点属性继承关系
  • 使用ranges属性时检查地址映射

5. 进阶应用场景

5.1 动态修改技术

通过覆盖节点实现运行时配置调整:

// 在板级DTS中覆盖原配置 &i2c1 { #address-cells = <2>; #size-cells = <0>; new_device@60 { reg = <0x01 0x60>; }; };

5.2 地址转换实战

复杂内存映射示例:

pcie@f0000000 { #address-cells = <3>; #size-cells = <2>; ranges = <0x02000000 0 0xe0000000 0x02000000 0 0xe0000000 0 0x10000000>; device@0 { reg = <0x000000 0 0 0 0>; }; };

参数解析

  • PCIe使用3-cell地址(空间类型+地址)
  • ranges实现PCI地址到CPU地址转换

6. 最佳实践与优化建议

  1. 一致性原则

    • 同一总线下的设备保持相同配置模式
    • 避免混合使用不同位宽的配置
  2. 文档规范

    /* * 配置说明: * - address-cells: 2 (支持64位地址) * - size-cells: 1 (32位长度足够) */ #address-cells = <2>; #size-cells = <1>;
  3. 性能考量

    • 简单设备尽量使用1-cell模式
    • 仅在必要时启用64位地址
  4. 兼容性处理

    / { // 默认值 #address-cells = <1>; #size-cells = <1>; soc { // 覆盖默认值 #address-cells = <2>; }; };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 4:46:51

LDA主题模型实战:折肘法与困惑度结合,5步确定最优主题数K

LDA主题模型实战&#xff1a;折肘法与困惑度结合确定最优主题数的工程化实践1. 理解LDA主题模型与主题数选择的核心挑战在文本分析领域&#xff0c;LDA&#xff08;Latent Dirichlet Allocation&#xff09;是一种广泛使用的无监督主题建模方法。它能够从文档集合中自动发现潜在…

作者头像 李华
网站建设 2026/7/6 4:46:14

知识图谱赋能RAG:构建可解释、可追溯的结构化推理系统

1. 项目概述&#xff1a;为什么知识图谱正在成为RAG应用的“结构化大脑”你有没有遇到过这样的情况&#xff1a;向一个AI助手提问“张伟在哪家公司担任CTO&#xff1f;”&#xff0c;它翻遍了整篇PDF简历却只答出“张伟是技术负责人”&#xff0c;漏掉了最关键的公司名和职位全…

作者头像 李华
网站建设 2026/7/6 4:42:57

MongoDB的应用

近&#xff0c;因为工作的原因&#xff0c;我们正在使用MongoDB做一些大数据量存储的尝试。对于MongoDB的复制功能部署问题&#xff0c;有一些无奈&#xff01;首先说明一下我们的情况&#xff0c;我们需要使用的项目情况&#xff0c;对于MongoDB的期望&#xff0c;MongoDB的无…

作者头像 李华
网站建设 2026/7/6 4:42:41

面向对象之对象世界

面向对象就是是以对象的观点出发&#xff0c;思考软件世界中的对象和对象之间关系。 对象是面向对象世界的原子 对象在对象世界中的位置就好像物质世界中的分子、原子一样。对象是面向对象世界的基本单位。 前面的文章提高到对象&#xff0c;现实生活中的对象。 面向对象方法…

作者头像 李华