FEATURED · 精选文章

驱动开发-设备树基础

发布时间 / 2026/8/26 18:25:30
来源 / 创域科博编辑部
栏目 / 资讯中心
驱动开发-设备树基础 摘要本文系统介绍设备树Device Tree的核心概念与使用方法。文章首先说明设备树用树状结构描述设备信息并梳理其平台标识、运行时配置和设备信息集合三大作用随后讲解设备树工作流中 DTS、DTSI、DTB 与 DTC 编译器的关系再深入语法详解涵盖 .dtsi 头文件引用、节点命名格式以及 compatible、model、status、#address-cells、#size-cells、reg、ranges 等常用标准属性最后介绍 interrupts 中断、gpio 以及固定节点名称等常见节点帮助读者快速掌握设备树的编写与匹配机制。设备树用树状结构描述设备信息。特点每个设备树文件都有一个根节点每个设备都是一个节点节点间可以嵌套形成父子关系以便描述设备间的关系每个设备的属性都使用key-value对来描述作用一是平台标识就是板级识别让内核知道当前使用的哪个开发板根据root节点下的compatible字段匹配二是运行时配置比如内核启动时ramdisk的配置起始与结束地址三是设备信息集合集合各种设备控制器。设备树工作流设备书编译器DTC用于将设备树编译为系统可识别的二进制文件的工具。设备树源码DTS设备树描述文件。该文件是一种程序员可以看懂的文件格式但是U-boot和Linux只能识别二进制文件不能直接识别该文件。需要把dts文件编译成.dtb文件。设备树源码信息DTSI可包括在设备树描述文件中的头文件。设备树块DTB系统可读设备树二进制blob文件在系统中烧录以供执行。注意DTS文件可以包含很多DTSI文件简单来说DTSI文件就是共有的。然后DTC编译器将DTS编译为DTB二进制文件。语法详解1、头文件与引用.dtsi设备树支持文件引用扩展名为**.dtsi****.dtsi**一般来说用于描述Soc内部外设信息如CPU架构、主频、控制器寄存器地址相当于通用的父类。**.dtsi**描述具体板级信息可以引用.h、.dtsi甚至.dts。#include dt-bindings/input/input.h // 引用 C 头文件 #include imx6ull.dtsi // 引用 SoC 通用描述 #include imx6ull-14x14-evk.dts // 引用其他 dts2、节点Node与命名设备树由根节点 / 开始包含多个子节点。/ { aliases { can0 flexcan1; }; cpus { #address-cells lt;1gt;; #size-cells lt;0gt;; /* 节点命名格式label: node-nameunit-address */ cpu0: cpu0 { compatible arm,cortex-a7; device_type cpu; reg lt;0gt;; }; }; intc: interrupt-controller00a01000 { ... }; };命名格式labelnode-nameunit-address**label标签**方便访问节点。例如通过cpu0即可访问cpu0无需写全名**node-name名称**直观描述设备功能**unit-address地址**通常是寄存器基地址或地址总线3、节点常用标准属性节点由属性key-value组成。1compatible属性——兼容性重要作用将设备与驱动绑定。值是一个字符串列表。格式“厂商芯片型号”“厂商通用型号”compatible fsl,imx6ul-evk-wm8960, fsl,imx-audio-wm8960;匹配机制内核会先查找第一个值若无匹配在查第二个驱动侧代码驱动通过 of_device_id 表来匹配/* 驱动中的匹配表 */ static const struct of_device_id imx_wm8960_dt_ids[] { { .compatible fsl,imx-audio-wm8960, }, /* 必须与 DTS 一致 */ { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, imx_wm8960_dt_ids);2model属性作用描述设备模块信息model wm8960-audio;3status属性作用描述设备状态。值描述okay设备可操作disabled设备不可操作关闭。常用于.dtsi中默认关闭在.dts中按需开启fail设备检查到错误不可用4#address-cells和#size-cells作用描述子节点的reg属性中地址和长度各占多少字长32位#address-cells起始地址占用字长#size-cells地址长度占用字长示例spi4 { compatible spi-gpio; #address-cells 1; #size-cells 0; gpio_spi: gpio_spi0 { compatible fairchild,74hc595; reg lt;0gt;; // address0, length无(因为 size-cells0) }; };5reg属性作用描述设备地址资源寄存器地址。格式reg address1 length1 address2 length2 .../* 起始地址 0x4600长度 0x100 */ reg 0x4600 0x100;6ranges属性作用地址映射/转换表。格式child-bus-addr parent-bus-addr length**为空ranges**表示子地址空间与父地址空间完全相同11映射。非空需要进行地址抓换。/* 映射示例 */ soc { /* 子地址 0x0 映射到 父地址 0xe0000000长度 0x00100000 */ ranges 0x0 0xe0000000 0x00100000; serial { reg lt;0x4600 0x100gt;; /* 实际物理地址 0xe0000000 0x4600 0xe0004600 */ }; };interrupts中断一个计算机系统中大量设备都是通过中断请求CPU服务的设备节点需要指定中断号。常用的属性有interrupt-controller一个终端控制器节点#interrupt-cells是中断控制器节点属性用来描述子节点中“interrupts”属性使用了父节点中的interrupts属性的具体值。interrupt-parent标识此设备节点属于哪一个中断控制器。interrupts一个中断标识符列表表示每一个中断输出信号设备树中中断的部分涉及的内容比较多interrupt-controller表示这个节点是一个中断控制器需要注意的是一个Soc可能不止一个中断控制器。gpio在端口中gpio也是常见的I/O口设备树常用的属性有“gpio-controller”用来说明该节点描述的是一个gpio控制器“#gpio-cells”用来描述gpio使用节点的属性中的一个cell的内容。可以通过reg指定引脚完全取决于驱动程序既可以获取pin属性值也可以获取reg属性值。固定节点名称节点描述/根节点设备树根节点所以节点从这里开始chosen用于传递启动参数和配置信息给操作系统memory描述系统的物理内存区域reserved-memory用于定义预留的内存区域通常用于内核的特殊用途soc描述片上系统Soc中的各种硬件组件gpio用于描述GPIO控制器pinctrl描述引脚控制器clocks描述时钟控制器interrupt-controller描述中断控制器sound描述音频控制器backlight描述背光控制器
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻