尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Linux——设备树

发布时间:2026/9/29 4:38:06

资讯中心
01
ARTICLE

Linux——设备树

Linux——设备树
设备树的由来在 Linux 内核源码的ARM 体系结构 引入设备树之前相关的 BSP 代码中充斥了大量的平台设备(Platform Device) 代码而这些代码大多都是重复的、杂乱的。之前的内核移植工作有很大一部分工作就是在复制一份 BSP 代码并修改BSP 代码中和目标板中与特定硬件相关的平台设备信息。这使得ARM 体系结构的代码维护者和内核维护者在发布一个新版本内核的一段时间内有大量的工作要做。以至于 Linus Torvalds 在 2011年3月17日的ARM Linux 邮件列表中宣称“Gaah.Guys, this whole ARM thing is a f*cking pain in the ass”。这使得整个 ARM 社区不得不重新慎重地考虑这个问题于是设备树(Device TreeDT)被ARM 社区所采用。但需要说明的是在 Linux 中PowerPC 和SPARC体系结构很早就使用了设备树这并不是一个最近才提出的概念。设备树最初是由开放固件(Open Firmware)使用的用来向一个客户程序(通常是一个操作系统)传递数据的通信方法中的一部分内容。在运行时客户程序通过设备树发现设备的拓扑结构这样就不需要把硬件信息硬编码到程序中。设备树的用途设备树只是用来给内核里的驱动程序指定硬件的信息。在以前的驱动代码中会存在两个文件一个是描述硬件资源的dev.c比如某个寄存器的地址这些另个就是我们的设备驱动文件drive.c假如soc四不变我们每换一个平台都要修改C文件并且还要重新编译而且会在arch/arm/plat-xxx和arch/arm/mach-xxx 下面留下大量的关于板级细节的代码这些代码相对于Linux内核来说就是“垃圾代码”。为了改变这个现状设备树也就被引进到Linux上了即内核对于同一soC的不同主板只需更换设备树文件dtb即可实现不同主板的无差异支持而无需更换内核文件设备树的使用在介绍设备树之前需要先简单介绍几个相关概念DTS、DTC、DTSI和DTBDTSdevice tree source 设备树文件DTBdevice tree blob 设备树文件被编译后生成的二进制文件由Linux内核解析DTC设备树的编译器将DTS编译为DTBDTSI被包含的设备树源文件类似C语言中的头文件示例/ { node1 { a-string-property A string; a-string-list-property first stringsecond string a-byte-data-property [0x01 0x23 0x34 0x56]; child-nodel { first-child-property; second-child-property 1; a-string-property Helloworld; }; child-node2 { }; }; node2 { an-empty-property; a-cell-property 1;/* each number (cell) is uint32 */ child-node1 { }; }; };这就是一个简单的.dts设备树文件主要包含以下内容一个单独的根节点:/。两个子节点:node1和node2。两个nodel的子节点:child-node 和child-node2一堆分散在设备树中的属性。格式DTS文件格式/dts-v1/; // 表示版本 [memory reservations] // 格式为: /memreserve/ address length; / { [property definitions] [child nodes] };node格式[label:] node-name[unit-address] { [properties definitions] [child nodes] };label是标号可以省略。label的作用是为了方便地引用node比如/dts-v1/; / { uart0: uartfe001000 { compatiblens16550; reg0xfe001000 0x100; }; };可以使用下面2种方法来修改uartfe001000这个node// 在根节点之外使用 label 引用 node uart0 { status “disabled”; }; 或在根节点之外使用全路径 {/uartfe001000} { status “disabled”; };下面介绍几个常用的节点根节点dts中必须有一个根节点/dts-v1/; / { model SMDK24440; compatible samsung,smdk2440; #address-cells 1; #size-cells 1; };且必须包含以下几个属性#address-cells // 在它的子节点的 reg 属性中, 使用多少个 u32 整数来描述地址(address) #size-cells // 在它的子节点的 reg 属性中, 使用多少个 u32 整数来描述大小(size) compatible // 定义一系列的字符串, 用来指定内核中哪个 machine_desc 可以支持本设备 // 即这个板子兼容哪些平台 // uImage : smdk2410 smdk2440 mini2440 machine_desc model // 咱这个板子是什么 // 比如有 2 款板子配置基本一致, 它们的 compatible 是一样的 // 那么就通过 model 来分辨这 2 款板CPU节点一般不需要我们设置cpus { #address-cells 1; #size-cells 0; cpu0: cpu0 { ....... } };memory节点芯片厂家不可能事先确定你的板子使用多大的内存所以memory节点需要 板厂设置比如memory { reg 0x80000000 0x20000000; };chosen节点我们可以通过设备树文件给内核传入一些参数这要在chosen节点中设置 bootargs 属性chosen { bootargs noinitrd root/dev/mtdblock4 rw init/linuxrc consolettySAC0,115200; };属性属性有以下两种格式[label:] property-name value; //有值 [label:] property-name; //无值其中的value有三种取值arrays of cells(1 个或多个 32 位数据, 64 位数据使用 2 个 32 位数据表示), string(字符串), bytestring(1 个或多个字节)文本字符串(无结束符):可以用双引号表示如a-string-propertyA stringcells:32位无符号整数用尖括号限定如 second-child-property l。二进制数据:用方括号限定如a-byte-data-property [0x010x230x340x56]。混合表示:使用逗号连在一起如mixed-property astring”,[0x010x230x450x67]0x12345678。字符串列表:使用逗号连在一起如string-listred fish,blue fish。以下介绍几个常用的属性address-cells和size-cellscell指一个32位的数值address-cells总线地址要用多少个32位数来表示size-cells子总线地址要用多少个32位数来表示。compatible“compatible”表示“兼容”对于某个LED内核中可能有A、B、C三个驱 动都支持它那可以这样写led { compatible “A”, “B”, “C”; };内核启动时就会为这个LED按这样的优先顺序为它找到驱动程序A、B、C。 根节点下也有 compatible属性用来选择哪一个“machine desc”一个 内核可以支持 machine A也支持machine B内核启动后会根据根节点的 compatible 属性找到对应的machine desc结构体执行其中的初始化函数。compatible 的值建议取这样的形式manufacturer,model即“厂家名模块名”。modelmodel属性与compatible属性有些类似但是有差别。compatible属性是一个字符串列表表示可以你的硬件兼容A、B、C等驱 动model用来准确地定义这个硬件是什么。{ compatible samsung,smdk2440, samsung,mini2440; model jz2440_v3; };它表示这个单板可以兼容内核中的“smdk2440”也兼容“mini2440”。 从 compatible属性中可以知道它兼容哪些板但是它到底是什么板用 model 属性来明确。status表示设备的使用状态reg表示节点地址资源比如常见的寄存器的起始地址和大小内核对DT的处理从源代码文件dts文件开始设备树的处理过程为dts在PC机上被编译为dtb 文件u-boot把dtb文件传给内核内核解析dtb文件把每一个节点都转换为device_node 结构体对于某些device_node结构体会被转换为platform_device结构体以下三种device_node会转换为platform_device根节点下含有compatile属性的子节点含有特定compatile属性的节点的子节点compatile 属性它的值是这 4 者之一simple-bus,simple-mfd,isa,arm,amba-bus, 那 么 它 的子结点( 需 含 compatile 属性)也可以转换为 platform_device。总线I2C、SPI节点下的子节点不转换为platform_device匹配过程
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。