目录
一、引言
二、设备树插件格式
三、实验说明
四、实验准备
4.1 通过内核工具编译设备树插件
五、实验效果
5.1 uboot加载
5.2 加载RGB驱动
一、引言
Linux4.4以后引入了动态设备树(Dynamic DevicesTree),这里翻译位“设备树插件”。设备树插件可以理解为主设备树的“补丁”,它动态的加载到系统中,并被内核识别。例如如果要在系统中增加RGB灯驱动,那么可以针对RGB这个引荐设备写一个设备树插件,然后编译、加载到系统即可,无需重更新编译整个设备树。
二、设备树插件格式
设备树插件拥有相对固定的格式,甚至可以认为它知识把设备节点加了一个“壳”编译内核能够动态加载它。格式如下。
/* 设备树插件基本格式*/
/dts-v1/
/plugin/
/{
fragment@0 {
target-path = "/";
__overlay__{
/*在此添加要插入的节点*/
};
};
};
- 第2行:用于指定dts版本。
- 第3行:表示允许使用未定义的引用并记录他们,设备树插件中可以引用主设备树中的节点,而这些“引用的节点”对于设备树插件来说就是未定义的,所以设备树插件应该加上“/plugin”。
- 第7行:指定设备树插件的加载位置,默认我们加载到根节点下,既“target-path = “/”。
- 第8-9行:我们要插入的设备及节点或者要引用(追加)的设备树节点放在__overlay__{...};内。
三、实验说明
实现方法是复制上一节RGB灯的设备节点到设备树插件模板中,如下所示。
/dts-v1/;
/plugin/;
#include "../imx6ul-pinfunc.h"
#include "dt-bindings/gpio/gpio.h"
/ {
fragment@0 {
target-path = "/";
__overlay__ {
rgb_led{
#address-cells = <1>;
#size-cells = <1>;
compatible = "fire,rgb_led";
ranges;
/*红灯节点*/
rgb_led_red@0x020C406C{
compatible = "fire,rgb_led_red";
reg = <0x020C406C 0x00000004
0x020E006C 0x00000004
0x020E02F8 0x00000004
0x0209C000 0x00000004
0x0209C004 0x00000004>;
status = "okay";
};
/*绿灯节点*/
rgb_led_green@0x020C4074{
compatible = "fire,rgb_led_green";
reg = <0x020C4074 0x00000004
0x020E01E0 0x00000004
0x020E046C 0x00000004
0x020A8000 0x00000004
0x020A8004 0x00000004>;
status = "okay";
};
/*蓝灯节点*/
rgb_led_blue@0x020C4074{
compatible = "fire,rgb_led_blue";
reg = <0x020C4074 0x00000004
0x020E01DC 0x00000004
0x020E0468 0x00000004
0x020A8000 0x00000004
0x020A8004 0x00000004>;
status = "okay";
};
};
};
};
};
- 第4-5行:RGB灯设备节点使用到的头文件
- 第11-46行:之前编写的RGB灯设备节点
这样,RGB灯的设备树插件已经做好了,下面重点是编译设备树插件并把设备树插件添加到系统。
四、实验准备
在板卡上的部分GPIO可能会被系统占用,在使用前请根据需要修改/boot/uEndv.txt文件,可注释掉某些设备树插件的加载,重启系统,释放相应的GPIO引脚。
如若运行代码时出现“Devices or resources busy”或者运行代码卡死等等现象,请按照上述情况检查并按上述步骤操作。
4.1 通过内核工具编译设备树插件
设备树插件与设备树一样都是使用DTC工具编译,只不过设备树编译为.dtb。而设备树插件需要编译为.dtbo。可以使用DTC编译命令编译生成.dtbo,但是这样比较繁琐,容易出错。
可以修改内核目录/arch/arm/boot/dts/overlays下的Makefile文件,添加编译好的设备插件。并把设备树插件文件放到和Makefile文件同级目录下,以进行设备树插件的编译。
在内核的根目录下执行如下命令即可:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- npi_v7_defconfig
make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs
生成的.dtbo位于内核根目录下的"/arch/arm/boot/dts/overlays"目录下。
五、实验效果
上一节编译生成了.dtbo。.dtbo可以被动态的加载系统,这一小节介绍将设备树插件加入系统的方法。
5.1 uboot加载
linux内核从4.4开始支持设备号树插件,支持并不代表默认开启。所以使用之前要配置内核开启整个功能。
首先要把编译好的设备树插件文件,上传到开发板中。
可以使用uboot加载编写好的设备树插件,只需要完成简单的两个步骤:
1、将需要加载的.dtbo文件放入“/usr/lib/linux-image-4.19.35-imx6/overlays/”目录下。
2、将对应的设备树插件加载配置,写入uEnv.txt配置文件,系统启动过程中会自动从uEnv.txt读取要加载的设备树文件。
添加好,重启开发板,并输入对应的命令可以查看设备树插件是否加载成功:
ls /sys/firmware/devicetree/base/
#或者
ls /proc/device-tree
看到这些文件,证明已经加载成功了
删除设备树“插件”时,只需要将对应的插件在“/boot”目录下uEnv.txt文件中添加#号注释即可。
5.2 加载RGB驱动
驱动程序和应用程序的使用方法与上一节完全一致。