当前位置: 首页 > news >正文

I.MX6ULL内核开发12:使用设备树插件实现RGB灯驱动

目录

一、引言

二、设备树插件格式

三、实验说明

四、实验准备

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 0x000000040x020E006C 0x000000040x020E02F8 0x000000040x0209C000 0x000000040x0209C004 0x00000004>;status = "okay";};/*绿灯节点*/rgb_led_green@0x020C4074{compatible = "fire,rgb_led_green";reg = <0x020C4074 0x000000040x020E01E0 0x000000040x020E046C 0x000000040x020A8000 0x000000040x020A8004 0x00000004>;status = "okay";};/*蓝灯节点*/rgb_led_blue@0x020C4074{compatible = "fire,rgb_led_blue";reg = <0x020C4074 0x000000040x020E01DC 0x000000040x020E0468 0x000000040x020A8000 0x000000040x020A8004 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驱动

驱动程序和应用程序的使用方法与上一节完全一致。

 

http://www.lryc.cn/news/23218.html

相关文章:

  • 大家一起来找茬,新手第一次layout到底能挑出多少毛病?
  • Java集合概述(Collection集合)
  • 运动无线蓝牙耳机哪款好、运动无线蓝牙耳机推荐
  • 解决AAC音频编码时间戳的计算问题
  • Android 9.0 添加自定义开机广播
  • 第四阶段10-添加类别,类别列表mapper层,service层,controller层
  • linux内核启动分析(一)
  • wireshark常见使用操作讲解以及几个故障解决案例分享
  • 利用逻辑分析仪解析串口通讯数据
  • 新整理的前端面试题
  • 数据仓库-数仓分层
  • 【Linux】Linux根文件系统扩容
  • RPC编程:Hessian RPC一个老的RPC框架(一)
  • 逆向 x蜂窝 zzzghostsigh
  • QML 鼠标事件
  • 极智项目 | 实战pytorch arcface人脸识别
  • 【IP技术】ipv4和ipv6是什么?
  • linux基本功系列之uniq命令实战
  • 六、SpringBoot项目搭建
  • 【LeetCode】2363. 合并相似的物品
  • 华为OD机试题,用 Java 解【出租车计费】问题
  • 【人脸识别】DDL:数据分布知识蒸馏思想,提升困难样本(遮挡、低分辨率等)识别效果
  • 如何管理好仓库/库房?
  • Unity Lighting -- Unity的光源简介
  • Android仿网易云音乐歌单详情页
  • linux基本功系列之free命令实战
  • 华为OD机试模拟题 用 C++ 实现 - 连续子串(2023.Q1)
  • 【软考——系统架构师】UML 建模与架构文档化
  • Spring中常用注解
  • 基于SpringCloud的可靠消息最终一致性06:轮询事务消息