设备树讲解

前言:设备树很简单,只需要学习语法。

 

一、DTC DTS DTB的关系

源码 :test.dts

可执行文件: test.dtb

编译工具:DTC

编译所有dts文件:make dtbs 

编译指定的dts文件:make test.dtb

二、DTS 基本语法

头文件:

可以将芯片共有的信息提取出来作为一个通用的.dtsi文件

可以将芯片共有的信息提取出来作为一个通用的.dtsi文件

在其他文件中可以用#include 来引用这个公用的文件,例如#include "test.dtsi"

树根:

/为设备树的根

一棵树就用以下表示

/{

    ########

    %%%%%

}

或者将一个根拆为两个

/{

    ########

}

/{

    %%%%%

}

即两个根相当于一个根。在test.dts中的根和test.dtsi中的根可以合起来。

设备节点:

设备节点就相当于副树干,不同设备以设备节点的方式挂在主干上。

设备节点下是很多键值对,这些键值对称为属性,用来描述这个设备节点。

大致情况如图:

/{    /*根*/

    根节点的属性一 = 1;
    根节点的属性二 = 2;

    节点一{

        属性一 = 1;

        属性二 = 2;

    };

    节点一{

        属性一 = 1;

        属性二 = 2;

    };

}

节点命名格式:

label:node-name@usnit-addres

label:节点标签,相当于小朋友的外号

node-name:节点名字

usnit-addres:寄存器地址 可以不要

例子:

/{/*根节点*/

    cpus{/*节点一*/

    };

    uart0:uart{/*节点2*/

    };

    led0:led@00a01000{/*节点3*/

    };

}

label的作用

如果你在test.dtsi文件中使用了led节点

led0:led{

}

你想在test1.dts中修改led节点的属性就可以使用

&led0{

}

三、标准属性:

1 、compatible

兼容性

compatible 属性的值是一个字符串列表

例如:compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";

其中“fsl”表示厂商是飞思卡尔,“imx6ul-evk-wm8960”和“imx-audio-wm8960”表示驱动模块名字

2 、model

model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的

model = "wm8960-audio";

3 、status

  • “okay”  表明设备是可操作的。
  • “disabled”表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档。
  • “fail”表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
  • “fail-sss”  含义和“fail”相同,后面的 sss 部分是检测到的错误内容。

4 、#address-cells  和#size-cells

用于描述子节点的地址信息

#address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位),#size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。

一般 reg 属性都是和地址有关的内容,起始地址和地址长度。

reg 属性的格式一为:
reg = <address1 length1 address2 length2 address3 length3……>

例如:

aips3: aips-bus@02200000 {
compatible = "fsl,aips-bus", "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
    dcp: dcp@02280000 {

    compatible = "fsl,imx6sl-dcp";
    reg = <0x02280000 0x4000>;
    };
 };

5 、reg  

reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。

6 、ranges

ranges属性值可以为空或者按照<child-bus-address,parent-bus-address,length>格式编写的数字矩阵,ranges 是一个地址映射/转换表,ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成:

child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。
parent-bus-address :父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物理地址所占用的字长。
length :子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。

7 、name

name 属性值为字符串,name 属性用于记录节点名字。

8 、device_type

节点类型

 

四、设备树在系统中的体现:

系统启动以后可以在根文件系统里面看到设备树的节点信息

在 /proc/device-tree目录下存放着设备树信息

想要查看节点属性值可以使用 cat命令

如cd leds 

使用cat name查看leds的name属性值

五、在设备树的根节点下添加一个自己的节点

在linux源码目录中执行 make dtbs

将生成的dtb文件拷贝到tftp目录

nfs方式启动开发板

cd /proc/deveice-tree

就可以看到自己的节点mytestnod

### Vivado 中设备树的教程与配置方法 #### 1. 获取 Device Tree Blob (DTB) 为了在 Zynq 平台上工作,Device Tree Blob 文件是必需的。可以从预构建的源码获取 DTB 或者通过克隆特定仓库来获得最新的版本。 对于 Xilinx 的平台,建议从官方 GitHub 存储库中拉取最新版 device tree 源代码[^2]: ```bash git clone git://github.com/Xilinx/device-tree.git bsp/device-tree_v0_00_x ``` #### 2. 安装 Device Tree Generator 工具 Xilinx 提供了一个专门用于生成 Device Tree Source (.dts) 和 Device Tree Blob (.dtb) 文件的工具——Device Tree Generator。可以直接从发布页面下载并安装该工具至 SDK 环境中[^3]: 访问链接:<https://github.com/Xilinx/device-tree-xlnx/releases> #### 3. 反编译现有的 .dtb 文件为 .dts 文本格式 如果已经有了一个 `.dtb` 文件,并希望对其进行修改,则需要先将其转换成人类可读的形式即 `.dts` 文件。这一步骤可通过 `dtc` 命令完成[^1]: ```bash dtc -I dtb -O dts system-top.dtb > devicetree.dts ``` 此命令会把二进制形式的 `system-top.dtb` 转换成易于编辑的文字描述文件 `devicetree.dts`。 #### 4. 配置 MIO/EMIO 接口 当涉及到具体硬件资源分配时,在 VIVADO 中可以通过 Peripheral I/O Pins 或 MIO Configuration 来查看和设置 I/O 引脚的功能映射关系[^4]。Zynq-7000 SoC 上提供了多种外围接口选项,允许开发者灵活选择连接方式(MIO vs EMIO),以便更好地适应不同的应用场景需求。 #### 5. 编辑 DTS 文件以匹配项目需求 根据实际项目的硬件布局情况调整相应的节点定义,比如添加新的外设支持或是更改现有组件属性等。确保所有的变更都遵循标准语法结构,并保持良好的文档习惯。 #### 6. 将更新后的 DTS 文件重新编译回 DTB 格式 一旦完成了必要的改动之后,就可以利用相同的 `dtc` 实用程序将修改过的 `.dts` 文件再次转化为 `.dtb` 形式的固件镜像文件,准备部署到目标板卡上运行测试。 ```bash dtc -I dts -O dtb -o updated_system-top.dtb devicetree_modified.dts ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值