10. 设备树插件(Device Tree Overlays)

您所在的位置:网站首页 dtb反编译工具 10. 设备树插件(Device Tree Overlays)

10. 设备树插件(Device Tree Overlays)

2024-07-11 22:37| 来源: 网络整理| 查看: 265

10.3. 设备树插件实验一¶ 10.3.1. 硬件介绍¶

本节实验使用到Lubancat_RK系列板卡

10.3.2. 设备树插件编写和加载¶

本章的示例代码目录为:linux_driver/dynamic_device_tree

为避免冲突,需要删除上一章节在主设备树上添加的led_test节点,改为设备树插件的形式, 在内核源码/arch/arm64/boot/dts/rockchip/overlays目录下添加名为lubancat-led-overlay.dts的文件,内容参考如下:

以lubancat2为例:

led设备树插件¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22/dts-v1/; /plugin/; / { fragment@0 { target-path = "/"; __overlay__ { /*添加led_test节点,*/ led_test{ #address-cells = ; #size-cells = ; compatible = "fire,led_test"; ranges; //例程是控制lubancat2的系统灯 GPIO0_C7 led@0xfdd60004{ reg = ; //数据寄存器和数据方向寄存器(高16位) status = "okay"; }; }; };

以lubancat4为例:

led设备树插件¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23/dts-v1/; /plugin/; / { fragment@0 { target-path = "/"; __overlay__ { /*添加led_test节点,*/ led_test{ #address-cells = ; #size-cells = ; compatible = "fire,led_test"; ranges; led@0xfec50000{ reg = ; status = "okay"; }; }; }; }; };

以上内容和上一章节区别不大,只是根据设备树插件的编写格式进行修改。

第6行: 指定设备树插件的加载位置,加载到根节点下。

第8-21行: 我们要插入的设备及节点或者要引用(追加)的设备树节点放在__overlay__ {…}内,将上一章节主设备树的test_led节点添加于此。

修改内核目录/arch/arm64/boot/dts/rockchip/overlays下的Makefile文件, 添加我们编辑好的设备树插件。并把设备树插件文件放在和Makefile文件同级目录下。 以进行设备树插件的编译。

然后在内核源码顶层目录执行以下命令编译设备树插件:

rk356x系列板卡执行以下命令:

#加载配置文件 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- lubancat2_defconfig #使用dtbs参数单独编译设备树 make ARCH=arm64 -j4 CROSS_COMPILE=aarch64-linux-gnu- dtbs

rk3588系列板卡执行以下命令:

#加载配置文件 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- lubancat_linux_rk3588_defconfig #使用dtbs参数单独编译设备树 make ARCH=arm64 -j4 CROSS_COMPILE=aarch64-linux-gnu- dtbs

编译出来的设备树插件在 内核源码/arch/arm64/boot/dts/rockchip/overlay/lubancat-led-overlay.dtbo, 将设备树插件传到板卡的 /boot/dtb/overlay/ 目录下,并在 /boot/uEnv/uEnv.txt 按照格式添加我们的设备树插件,然后重启开发板,那么系统就会加载我们编译的设备树插件。

10.3.3. 驱动代码¶

驱动部分和上一章节完全一样,此处不做过多说明,区别只是上一章节使用设备树,本章节使用设备树插件,原理是一样的。

10.3.4. 测试LED¶

在本节实验中,鲁班猫系列板卡,系统设备树中均默认使能了 LED 的设备功能,需要关闭设备树的leds节点,可以修改leds节点的 status = "okay"; 为 status = "disabled";,然后编译设备树进行替换,也可以在板卡中直接使用以下命令关闭系统leds驱动对LED的控制:

sudo sh -c 'echo 0 > /sys/class/leds/sys_status_led/brightness'

将led的亮度调为0,与此同时led的触发条件自动变为none,从而取消leds驱动对LED的控制。

将设备树、驱动程序和应用程序通过NFS或SCP等方式拷贝到开发板中。

重启后在目录/proc/device-tree/下,可以找到led_test,图中控制的是GPIO0_C7引脚,如下所示:

执行如下命令加载驱动:

sudo insmod led_test.ko

驱动加载成功后直接运行应用程序如下所示。

命令:./test_app

命令是一个“unsigned char”型数据,输入1表示灭,0表示亮。

执行结果如下:

与此同时,观察板卡心跳灯可以看到LED亮或者灭。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3