
本文共 2294 字,大约阅读时间需要 7 分钟。
设备树(Device Tree)入门
设备树是一种用于描述硬件平台信息的文件格式,旨在帮助操作系统更好地理解和管理硬件设备。它通过树形结构描述系统中各个硬件设备的属性,如地址、功能、驱动等。设备树的使用使得内核能够无需硬编码硬件信息,从而提高了系统的灵活性和可维护性。
一、设备树的由来
在早期的Linux内核中,各个平台的硬件设备描述主要通过.c文件实现。这种方式导致了代码冗余,尤其是在面对不断增加的ARM平台时,管理这些描述文件变得越来越繁琐。
为了解决这一问题,开发者引入了设备树的概念。设备树采用.dts文件格式,将硬件描述信息组织成树形结构,存放在/arch/arm/boot/dts/目录下。与此同时,内核需要将.dts文件编译成二进制格式dtb(Device Tree Binary),以便内核能够解析和使用。
设备树的主要优势在于:
二、dis、dtc和dtb的关系
- dts(Device Tree Source):人-readable文件,包含硬件描述信息,采用树形结构。
- dtc(Device Tree Compiler):用于将dts文件编译生成dtb文件。
- dtb(Device Tree Binary):内核可识别的二进制文件,存储设备树信息。
dtc工具的作用是将dts文件中的语法转换为内核能理解的dtb格式。例如,可以使用以下命令反汇编dtb文件:
dtc -I dtb -O dts -o example.dts example.dtb
三、dts文件语法
1. 核心结构
设备树文件的核心结构包括:
- 版本声明:
/dts-v1/;
表示设备树的版本。 - 节点:树形结构的基本单元,包含属性和子节点。
- 属性:描述硬件信息,如地址、功能、状态等。
2. 节点命名
节点命名格式为node-name@unit-address
,其中:
- node-name:节点名称。
- unit-address:单元地址,通常指寄存器的起始地址。
例如,I.MX6ULL平台上的I2C节点命名为I2C4@021F8000
,其中I2C4
是节点名,021F8000
是单元地址。
3. 标签
节点名前缀可以带有标签,使用:
分隔。标签用于辅助查找节点,避免重复命名。例如:
label "I2C4:";
在dts文件中追加内容时,使用&
符号引用标签。
4. 头文件支持
dts文件支持.dtsi头文件和普通.c头文件。dtsi文件用于描述SoC的通用信息,如CPU、中断控制等。开发者可以通过引用这些头文件,简化硬件描述。
四、设备树的节点
1. 树形结构
设备树只有一个根节点,所有子节点归属于根节点。引用头文件时,头文件中的根节点与dts文件中的根节点合并,最后赋值的属性为准。
2. 节点命名规则
- 节点名需唯一,避免冲突。
- 单元地址通常指外设寄存器的起始地址。
3. 节点追加
在dts文件中,可以通过&
符号追加内容到头文件中的节点。例如:
&I2C4;
追加后,I2C4节点的状态属性会被更新为okay
。
五、设备树的应用
1. 系统启动流程
- bootloader在启动时将设备树的内存地址传递给内核。
- 内核解析dtb文件,将设备信息映射到
/proc/device-tree
目录下。 - /proc/device-tree目录下呈现设备树信息,包括节点属性和子节点。
2. 典型节点结构
- soc节点:描述SoC的外设控制器信息。
- I2C控制器节点:包含I2C外设的寄存器地址、时钟频率等属性。
- 实例节点:如RTC节点,用于描述特定外设的详细信息。
六、特殊节点
1. aliases节点
aliases节点用于定义节点的别名,主要用于辅助查找。例如:
alias "i2c1";
内核会将i2c1
与实际节点关联。
2. chosen节点
chosen节点的作用是将bootargs
环境变量传递给内核。内核会读取该节点下的bootargs
属性,作为启动参数。例如:
chosen { compatible = "arm,boot args"; bootargs = "1234 5678";};
七、设备树的属性
1. 常见属性
- compatible:描述设备的兼容性,用于驱动匹配。
- reg:描述寄存器空间。
- clocks:描述时钟信息。
- interrupts:描述中断信息。
2. 典型示例
以下是I2C控制器节点的示例:
i2c1: i2c@021a0000 { #address-cells = <1>; #size-cells = <0>; compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c"; reg = <0x021a0000 0x4000>; interrupts =; clocks = <&clk IMX6UL_CLK_I2C1>; status = "disabled";};
八、设备树的应用场景
设备树的应用范围广泛,包括:
通过以上介绍,设备树作为一种灵活且可扩展的硬件描述方法,为现代操作系统的硬件支持提供了强大工具。
发表评论
最新留言
关于作者
