Linux中Devcie Tree的编译

本文介绍了DeviceTree在OpenFirmware中的作用,及其作为硬件描述规范在Linux内核中的应用。DeviceTree Compiler(DTC)用于将DTS文件编译成DTB,用于嵌入式设备如ARM架构。在Yocto项目中,可以通过包含不同头文件来创建定制的设备描述。此外,还讲解了如何在Ubuntu上安装和使用DTC进行编译,并提供了卸载DTC的命令。
/* Copyright 夜流冰 -  不正经的程序员 */
Device Tree是Open Firmware里定义的一个硬件描述规范,具体OF是啥可以参见前面的博文。
Device Tree规范的官网: https://www.devicetree.org/
这个规范在Github上的项目地址: https://github.com/devicetree-org/devicetree-specification
Device Tree被引入Linux后,Linux针对Device Tree实现了一个Device Tree Compiler,在Linux Kernel代码仓库的主分支上:
Device Tree Compiler的作用是将DTS文件编译成二进制的DTB文件。
Device Tree在Linux中主要是针对嵌入式设备使用,比如ARM架构的。
在PC上,比如Ubuntu,不适用,执行:locate -b *.dtb,没有dtb文件。
X86架构的机器,用的自然是主板上BIOS来管理硬件信息。
 
同时在Linux Kernel代码里,/dirvers/of/路径下,是针对Open Firmware的device tree规范的处理。
用来解析编译好的DTB文件,提取系统的硬件设备信息。
-----------------------------------------------------
Device Tree的源文件,是后缀为dts的文件,里面还可以包含dtsi和header头文件。
举个例子,比如在Yocto里,我们创建了个名为mydevice的machine,同时创建了个mydevice.dts文件。
这个machine是基于imx6ull开发的,所以要包含imx6ull的dts文件。
Yocto里mydevice.dts
#include "imx6ull.dtsi"

.........

Linux Kernel里imx6ull.dtsi
#include <dt-bindings/clock/imx6ul-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include "imx6ull-pinfunc.h"
#include "imx6ull-pinfunc-snvs.h"
#include "skeleton.dtsi"

...........

我们看到这个和C语言类似,一个源文件可以包含其他的头文件。
一个dts文件既可以包含dtsi文件,也可以包含.h文件。
.h文件里面可以放一些预处理命令:ifndef,  define,endif,include等。
一个dts文件会由device tree compiler进行编译,类似C语言,会对dts文件进行预处理,包含的内容会进行展开,然后编译。
----------------------------------------------------- 
一般嵌入式软件的编译,是在Host Machine(比如Linux Ubuntu)上通过交叉编译工具链完成的,比如在Ubuntu上编译ARM cortex-A7架构的程序。
但把DTS文件编译成二进制DTB文件,这个过程是独立的,不依赖于平台的。因为DTB文件只是一种Linux Kernel用来解析设备信息的文件。
在Yocto构建系统中,编译好的DTB文件会被打包进rootfs文件系统里。
可以在Ubuntu上安装device tree compiler,然后手动尝试编译并调试DTS文件。
$sudo apt-get update
$sudo apt-get install device-tree-compiler
$dpkg -l | grep device-tree-compiler
ii  device-tree-compiler                       1.5.1-1                             amd64        Device Tree Compiler for Flat Device Trees
$dtc -v
Version: DTC 1.5.0

顺便介绍一些使用apt-get删除device tree compiler的方法。安装和删除包的方法是类似的。
APT: Advanced Packaging Tools
sudo apt-get remove device-tree-compiler
仅删除device-tree-compiler
sudo apt-get autoremove device-tree-compiler
除了删除指定包,其所依赖的包,如果无人使用也删除。
sudo apt-get purge device-tree-compiler
删除指定包,还包括相关的配置文件、数据文件。
sudo apt-get autoremove --purge device-tree-compiler
删除指定包,和其依赖的无人使用的包,还有相关的配置文件、数据文件。

--------------------------------------------- 
安装好dtc之后,可以使用dtc来编译dts或dtsi文件。
example.dts
/dts-v1/;

/ {
        soc {
                #address-cells = < 0x1 >;
                #size-cells = < 0x1 >;


                pic_3: pic@100 {
                        reg = < 0x100 0x20 >;
                        interrupt-controller;
                };


                uart {
                        interrupt-parent = < &pic_3 >;
                        interrupt-parent-path =  &pic_3 ;
                        
                };
        };


};

dtc -O dtb -o example.dtb example.dts
得到example.dtb文件。
dtc -I dtb -O dts -o test.dts example.dtb
将example.dtb再转换为dts文件。
dtc -O dts example.dts
将example.dts文件解析后输出解析结果。当包含多个头文件或者使用一些引用时,输出结果便于分析查看。

其他相关命令,使用man命令或help参数获取更多的信息。
$man dtc
$dtc --help
$info dtc

在使用 `mdadm` 工具将设备标记为 faulty 时失败,通常与 RAID 阵列的状态、磁盘的可用性或元数据版本有关。以下是可能导致此问题的原因及解决方法: - 当尝试执行 `mdadm --manage /dev/mdX --set-faulty /dev/sdX` 命令时,如果目标设备是阵列中唯一可用的磁盘,或者该设备正处于在线状态但无法被标记为故障,则命令会失败[^1]。此时应检查 `/proc/mdstat` 文件确认阵列当前状态,并确保至少有一个其他磁盘处于正常工作状态以便替换。 - 如果设备已经被移除或标记为失效,则再次设置它为 faulty 也会失败。可以通过运行 `mdadm --detail /dev/mdX` 来查看每个设备的具体状态和角色,以判断是否需要先添加新磁盘再移除旧磁盘[^2]。 - 某些情况下,由于文件系统正在使用该设备,导致无法更改其状态。可以卸载相关文件系统后重试,或者检查是否有进程正在访问这些设备并终止这些进程。 - 元数据版本过旧可能不支持某些操作。更新到较新的元数据版本(如 1.2)可提高兼容性和功能支持[^3]。例如,使用 `mdadm --create` 创建新阵列时指定 `--metadata=1.2` 参数。 - 在极少数情况下,RAID 控制器驱动程序或内核模块可能存在 bug,影响了 `mdadm` 的行为。升级 Linux 内核及相关软件包至最新稳定版有助于解决问题。 ### 示例:更换故障磁盘流程 ```bash # 查看阵列详情 mdadm --detail /dev/md0 # 移除故障磁盘 mdadm --remove /dev/md0 /dev/sdb1 # 添加新磁盘作为热备或直接加入阵列 mdadm --add /dev/md0 /dev/sdc1 # 或者创建一个包含新磁盘的新阵列(适用于完全重建) mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdc1 --metadata=1.2 ``` ### 可能涉及的配置调整 - 修改默认元数据版本可通过编辑 `/etc/default/mdadm` 中的 `AUTOCREATE` 设置实现。 - 对于自动管理场景,确保 `/etc/mdadm.conf` 正确配置了所有必要设备信息以便开机时正确加载阵列。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值