8. 设备树¶
8.1. 设备树概述¶
Linux内核自3.x版本起引入设备树(Device Tree,DT)机制,用于实现驱动代码与硬件描述的分离。
设备树以树状结构描述硬件平台的组成关系,内核在启动过程中解析设备树,并根据其中的硬件节点完成设备与驱动的匹配和初始化。
通过定制不同的设备树文件,可以在不修改驱动代码的情况下支持不同的硬件平台,例如 I2C、SPI、MIPI、Mini-PCIe、I2S 等接口。
8.2. 设备树在海思平台中的作用¶
在编译内核镜像时,设备树(Device Tree Blob,DTB)会与内核镜像一同打包。
在内核启动过程中,系统会解析设备树(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复用功能的几种配置方式,可以查看文档 引脚功能配置寄存器修改
