设备树1-设备树文件.DTS文件格式

设备树(DTS)是Linux系统中用于描述硬件信息的一种方式,它将硬件配置信息从内核源码中分离出来,以.dts文件形式存在。本文介绍了DTS的存放路径、语法、节点格式、属性格式,以及如何通过compatible属性进行设备驱动匹配。此外,还讲述了如何在.dts文件中引用.dtsi文件以实现通用性和定制化。通过对设备树的理解,有助于更好地进行嵌入式Linux系统开发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:https://www.cnblogs.com/Mike2019/p/12191769.html

将描述板级硬件信息的内容从Linux分离出来,用一个专属的文件来描述,这个专属文件叫做设备树,文件扩展名.dts。而一个SOC可以做出很多不同的板子,这些板子都有共同的信息,将这些共同的信息提取出来作为一个通用的文件,其他.dts文件直接引用这个通用文件即可,这个通用文件就是.dtsi文件。

1、存放路径
使用设备树之前ARM架构的板级信息存放在:

/arch/arm/mach-xxx

/arch/arm/plat-xxx

使用设备树之后ARM架构的板级信息存放在:

/arch/arm/boot/dts

dts工具源码存放在:

scripts/dtc/Makefile

2、DTS语法
2.1. 文件引用
  像c语言那样可以使用#include引用.dtsi、.dts、.h文件。

#include <dt-bindings/input/input.h>
#include “imx6ull.dtsi”
#include “imx6ull-14x14-evk.dts”

2.2. 文件布局

/dts-v1/;          #dts文件的版本号
[memory reservations]    #可以不写,表示内核使用全部的内存;使用,表示留下一部分内存给自己使用
/{             #根节点
  [property]
  [child nodes]
  [child nodes]
  ......
};

2.3. nodes节点格式

[label:] node-name [@unit-address]{
  [property]
  [child nodes]
  [child nodes]
  ......
};

[]:表示该项可以省略

[label]:标签,为了方便访问节点,后面可以直接通过&label来访问该节点。

node-name:节点名称。

[@unit-address]:通常表示设备的地址或寄存器首地址,为了多增加一个信息区分同一个node-name(同一级别下)。

cpu0: cpu@0 {
  compatible = "arm,cortex-a7";
  device_type = "cpu";
  reg = <0>;
  ......
};

cpu1: cpu@1 {
  compatible = "arm,cortex-a8";
  device_type = "cpu";
  ......
};

2.4. property属性格式
[label:] prooerty-name = value;  //有值

[label:]property-name;      //没有值

2.4.1 value:属性的键值
a.字符串

compatible = “arm,cortex-a7”;

b.32位无符号整数

reg = <1 0x123456 100>

c.16尽职字节序列

reg = [00 11 22 33]  //每个数据必须是2位

d.字符串列表

compatible = “fsl,imx6ull-gpmi-nand”, “fsl,imx6ul-gpmi-nand”;

2.4.2 标准属性
1.compatible
  兼容性属性,用于将设备和驱动绑定起来。格式如下:

compatible = "manufacturer, model"  //manufacturer:厂商,  model:模块对应的驱动名字

例如某开发板音频设备节点的compatible属性:

compatible = "fsl, imx6ul-evk-wm8960", "fsl, imx-audio-wm8960"

这个设备首先使用第一个compatible值在内核查找与之匹配的驱动文件,如果找不到就使用第二个人compatible值。

2.model
  描述设备模块信息,比如名字、详细版本号。用于区分compatible相同时。

model = "wm8960-audio-V1.0"

3.status
  描述设备状态信息

在这里插入图片描述
4. reg

#address-cells = <1>  //表示reg里面的数据address占用一个字长
#size-cells = <1>    //表示reg里面的数据size占用一个字长
   gpio-spi: gpio_spi@0{   
  compatible = ".spi"    
  reg = <address1 length1 address2 length2 ......> //address一般用来表示寄存器起始地址,length一般表示寄存器长度
}

2.4.3 根节点compatible属性
每个节点都有compatible属性,根节点“/”也不例外。

设备节点的compatible属性:是为了匹配Linux内核中的驱动程序。

根节点的compatible属性:是为了确认Linux内核是否支持次设备,一般,第一个值描述所使用的硬件设备名字,比如:imx6ull-14x14-evk
;第二个值描述设备所使用的SOC,比如imx6ull。

/ {
     model = "Freescale i.MX6 ULL 14x14 EVK Board";
     compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull"; 
......
}

2.5 向节点追加或修改内容
由于.dtsi文件是设备树的头文件,其他所有使用相同SOC的板子都会使用,因此我们可以在.dts文件#include相关.dtsi文件,然后在.dts文件追加或者修改内容。

例如:

imx6ull.dtsi文件:

LED:gpio_ led{
  compatible = "imx6ull_led"
  pin = <imx6ull_GPA(0)>
}

在imx6ull_evk.dts文件往gpio_led追加内容:

#include "imx6ull.dtsi"

&LED{  //使用&访问之前定义的的节点
  pin = <imx6ull_GPA(1)>  //修改内容
  reg = <......>  //追加内容
}

/{  //根节点
......
}

3 使用设备树以后,设备匹配方法
在arch/arm/mach-imx/mach-imx6ul.c 文件
在这里插入图片描述

代码中设置.dt_compat = imx6ul_dt_compat,imx6ul_dt_compat表里面有"fsl,imx6ul"和“fsl,imx6ull”两个兼容值。只要某个设备(板子)根节点“/”的compatible属性值与imx6ul_dt_compat表中的任何一个值相等,那么就表示Linux内核支持此设备。

<think>好的,我现在需要回答用户关于设备树文件.dts)和设备树包含文件.dtsi)之间差异的问题。首先,我得回忆一下设备树的基本概念。设备树用于描述硬件配置,特别是在嵌入式系统中,比如使用Linux内核的ARM架构。用户提到的.dts.dtsi文件都是设备树的一部分,但具体有什么不同呢? 我记得.dts设备树文件,通常对应一个具体的硬件平台或板子,比如某个开发板的配置。而.dtsi可能类似于头文件,包含一些通用的定义,可以被多个.dts文件包含。比如,SoC(系统级芯片)的共同配置可能会放在.dtsi中,这样不同的板级文件可以引用同一个.dtsi,避免重复代码。 接下来,我需要确认这些信息是否正确。比如,设备树的结构中,确实有这种分层设计,.dtsi作为包含文件,提供可重用的部分,而.dts则是最终的板级配置,可能包含多个.dtsi文件。例如,一个ARM SoC的.dtsi可能定义CPU、内存映射等,而具体的开发板.dts会包含这个.dtsi,并添加特定的外设配置,比如GPIO、SPI设备等。 另外,编译过程方面,设备树编译器(dtc)会将.dts和所包含的.dtsi文件合并,生成一个二进制的.dtb文件,供内核使用。所以,.dtsi在编译时被包含到.dts中,形成完整的设备树描述。 还需要考虑用户可能的后续问题,比如如何组织这些文件,或者在实际项目中如何引用.dtsi。例如,在嵌入式开发中,不同的硬件变种可能共享大部分配置,只需通过包含不同的.dtsi文件来调整部分设置,这提高了代码的复用性。 用户提供的参考引用是关于使用dd命令烧写U-Boot的,虽然不直接相关,但可能用户在进行嵌入式开发时遇到设备树配置的问题,需要理解文件结构来调整硬件描述。因此,明确.dts.dtsi的区别对于正确配置硬件非常重要,比如避免重复定义或错误覆盖配置。 总结一下,差异主要在于用途和结构:.dts是具体的设备树文件,而.dtsi是可被包含的共享部分。需要分点说明,并举例说明,确保用户能够理解层次结构和实际应用中的区别。</think>### 设备树文件.dts)与包含文件.dtsi)的差异 1. **功能定位** - **.dts** 文件是**完整的设备树描述文件**,对应具体的硬件平台(如某款开发板)。它描述系统硬件资源的完整布局,包括CPU、内存、外设等,例如: ```dts / { model = "Raspberry Pi 4"; compatible = "raspberrypi,model4"; // 具体硬件配置... }; ``` - **.dtsi** 文件是**可复用的设备树片段**,通常用于描述SoC(系统级芯片)的通用配置或共享定义,例如: ```dtsi // soc.dtsi &cpu0 { clock-frequency = <1000000000>; }; ``` 2. **代码组织结构** - **.dts** 通过 `#include` 指令**直接引用.dtsi文件**,例如: ```dts #include "soc.dtsi" #include "gpio-config.dtsi" ``` 这种分层设计提高了代码复用性,例如同一款SoC的不同开发板可共享相同的`.dtsi`文件,仅需在`.dts`中定义差异部分[^1]。 3. **编译与使用场景** - **.dts** 是编译的**最终输入文件**,由设备树编译器(dtc)生成二进制文件`.dtb`供内核使用。 - **.dtsi** 在编译时被合并到`.dts`中,**不独立生成二进制文件**。例如,在嵌入式系统启动时,U-Boot可能通过类似 `sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8` 的命令写入引导程序,而设备树文件则需与内核镜像配合使用。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值