8. 设备树

8.1. 设备树概述

Linux内核自3.x版本起引入设备树(Device Tree,DT)机制,用于实现驱动代码与硬件描述的分离。

设备树以树状结构描述硬件平台的组成关系,内核在启动过程中解析设备树,并根据其中的硬件节点完成设备与驱动的匹配和初始化。

通过定制不同的设备树文件,可以在不修改驱动代码的情况下支持不同的硬件平台,例如 I2C、SPI、MIPI、Mini-PCIe、I2S 等接口。

../../_images/device_tree_01.png

8.2. 设备树在海思平台中的作用

在编译内核镜像时,设备树(Device Tree Blob,DTB)会与内核镜像一同打包。

../../_images/device_tree_02.png

在内核启动过程中,系统会解析设备树(Device Tree),根据其中定义的硬件节点, 通过 compatible 属性完成设备与驱动的匹配。

在海思平台中,设备树的主要作用是描述并使能片上控制器节点,用于完成驱动匹配及基础资源声明。 与具体板级实现强相关的内容,如引脚复用(pinmux)、电源、复位以及时序控制,并未完全通过设备树进行描述,而是由厂商提供的私有内核模块或外设驱动直接完成。

在该架构下,IO控制通常直接通过对应控制器的寄存器进行配置。例如在PCIe场景中:

  • RSTN引脚无需在设备树中指定为GPIO或reset引脚

  • 通过pinmux将引脚复用为PCIE_RST_N功能

  • 在PCIe驱动初始化过程中,驱动程序直接访问PCIe控制器寄存器,对RSTN信号进行控制

该机制不依赖设备树中的pinctrl、gpio或reset等通用框架。

由于外设驱动与SoC资源描述相对分离,且部分复杂外设依赖用户层驱动或私有内核模块完成初始化, 海思平台(如Hi3403)的设备树内容相对简洁,通常仅包含片上控制器等基础节点,一般情况下无需频繁修改。

8.3. 与主线Linux设备树机制的差异

在主线Linux中,设备树通常用于完整描述硬件拓扑结构和板级连接关系,引脚复用、电源管理、复位控制等资源, 均通过标准化的 DT binding(如 pinctrl、gpio、regulator、reset)进行建模,并由内核通用框架统一管理。

相比之下,海思平台采用设备树轻描述、驱动直控硬件的方式,其差异主要体现在初始化职责的划分上。

对比项

主线Linux

海思平台

DT使用范围

完整描述硬件与板级连接

主要描述控制器节点

引脚复用

通过pinctrl描述

驱动或使用工具直接修改管脚控制寄存器

复位/电源

通用框架管理

驱动直接操作寄存器

初始化位置

内核通用框架

私有ko或外设驱动

DTS复杂度

相对较高

相对简洁

8.4. 使用建议

在海思平台上进行系统或驱动开发时,应优先遵循平台既有的初始化机制, 避免直接套用主线Linux的DT binding模式,以免造成初始化流程重复或资源冲突。

有关io复用功能的几种配置方式,可以查看文档 引脚功能配置寄存器修改