Linux中Devcie Tree的编译

/* 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夜流冰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值