第十节 使用设备树插件实现RGB 灯驱动

文章介绍了Linux4.4及以上版本引入的动态设备树插件,它允许开发者无需重新编译整个设备树就能添加新的硬件驱动,如RGB驱动。设备树插件遵循特定格式,包含在主设备树中并由内核动态加载。实验部分详细展示了如何为STM32MP1开发板创建RGB灯的设备树插件,包括编写、编译和通过uEnv.txt在uboot中加载设备树插件的过程。
摘要由CSDN通过智能技术生成

Linux4.4 以后引入了动态设备树(Dynamic DeviceTree),我们这里翻译为“设备树插件”。设备树插件可以理解为主设备树的“补丁”它动态的加载到系统中,并被内核识别。例如我们要在系统中增加RGB 驱动,那么我们可以针对RGB 这个硬件设备写一个设备树插件,然后编译、加载到系统即可,无需从新编译整个设备树。

设备树插件是在设备树基础上增加的内容,我们之前讲解的设备树语法完全适用,甚至我们可以直接将之前编写的设备树节点复制到设备树插件里。具体使用方法介绍如下。

设备树插件格式

设备树插件拥有相对固定的格式,甚至可以认为它只是把设备节点加了一个“壳”编译后内核能够动态加载它。格式如下,具体节点省略。

列表1: 设备树插件基本格式

/dts-v1/;
/plugin/;

/ {
	 fragment@0 {
		target-path = "/";
		__overlay__ {
			/* 在此添加要插入的节点*/
		};
	};
};
  • 第1 行:用于指定dts 的版本。
  • 第2 行:表示允许使用未定义的引用并记录它们,设备树插件中可以引用主设备树中的节点,而这些“引用的节点”对于设备树插件来说就是未定义的,所以设备树插件应该加上“/plugin/”。
  • 第6 行:指定设备树插件的加载位置,默认我们加载到根节点下,既“target-path =“/”。
  • 第7-8 行:我们要插入的设备及节点或者要引用(追加)的设备树节点放在__overlay__ {⋯};内。

实验说明

硬件介绍

本节实验使用到STM32MP1 开发板

实验代码讲解

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

我们尝试将上一节编写的RGB 灯节点使用动态设备树的方式添加到系统中。

创建RGB 灯的设备树插件

实现方法很简单,直接复制上一小节RGB 灯的设备节点到设备树插件模板中,如下所示。

列表2: rgb_led 设备树插件

// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
* Copyright (C) STMicroelectronics 2018 - All Rights Reserved
* Author: Alexandre Torgue <alexandre.torgue@st.com>.
*/

/dts-v1/;
/plugin/;
//#include "../stm32mp157c.dtsi"
#include <dt-bindings/pinctrl/stm32-pinfunc.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/mfd/st,stpmic1.h>
#include <dt-bindings/gpio/gpio.h>

 /{
	fragment@0{
		target-path = "/";
		__overlay__ {
			 /* 添加led 节点*/
			rgb_led{
				#address-cells = <1>;
				#size-cells = <1>;
				compatible = "fire,rgb_led";

				/* 红灯节点*/
				ranges;
				rgb_led_red@0x50002000{
					compatible = "fire,rgb_led_red";
					reg = < 0x50002000 0x00000004
							0x50002004 0x00000004
							0x50002008 0x00000004
							0x5000200C 0x00000004
							0x50002018 0x00000004
							0x50000A28 0x00000004>;
					status = "okay";
				};

			/* 绿灯节点*/
			rgb_led_green@0x50000A28{
				compatible = "fire,rgb_led_green";
				reg = < 0x50008000 0x00000004
						0x50008004 0x00000004
						0x50008008 0x00000004
						0x5000800C 0x00000004
						0x50008018 0x00000004
						0x50000A28 0x00000004>;
				status = "okay";
			};

			/* 蓝灯节点*/
			rgb_led_blue@0x50000A28{
				compatible = "fire,rgb_led_blue";
				reg = < 0x50003000 0x00000004
						0x50003004 0x00000004
						0x50003008 0x00000004
						0x5000300C 0x00000004
						0x50003018 0x00000004
						0x50000A28 0x00000004>;
				status = "okay";
			};
		  };
		};
	};

};
  • 第10-13 行: RGB 灯设备节点使用到的头文件,
  • 第19-61 行:我们之前编写的RGB 灯设备节点。

就这样简单,RGB 灯的设备树插件已经做好了,下面重点是编译设备树插件并把设备树插件添加到系统。

实验准备

在板卡上的部分GPIO 可能会被系统占用,在使用前请根据需要修改/boot/uEnv.txt 文件,可注释掉某些设备树插件的加载,重启系统,释放相应的GPIO 引脚。

如本节实验中,可能在鲁班猫系统中默认使能了LED 的设备功能,用在了LED 子系统。引脚被占用后,设备树可能无法再加载或驱动中无法再申请对应的资源。

方法参考如下:

在这里插入图片描述

取消LED 设备树插件,以释放系统对应LED 资源,操作如下:

在这里插入图片描述
并按上述步骤操作。

如出现Permission denied 或类似字样,请注意用户权限,大部分操作硬件外设的功能,几乎都需要root 用户权限,简单的解决方案是在执行语句前加入sudo 或以root 用户运行程序。

通过内核工具编译设备树插件

设备树插件与设备树一样都是使用DTC 工具编译,只不过设备树编译为.dtb。而设备树插件需要编译为.dtbo。我们可以使用DTC 编译命令编译生成.dtbo,但是这样比较繁琐、容易出错。

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

在这里插入图片描述

在内核的根目录下执行如下命令即可:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- stm32mp157_ebf_defconfig

make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs

生成的.dtbo 位于内核根目录下的“/arch/arm/boot/dts/overlays”目录下。

在这里插入图片描述

本章的RGB 设备树插件为“stm-fire-rgb-led-overlay.dts”,编译之后就会在/arch/arm/boot/dts/overlays目录下生成同名的stm-fire-rgb-led.dtbo 文件。得到.dtbo 后,下一步就是将其加载到系统中。

实验效果

上一小节我们编译生成了.dtbo。.dtbo 可以被动态的加载到系统,这一小节介绍将设备树插件加入系统的方法。

uboot 加载(适用野火linux 开发板)

linux 内核从4.4 开始支持设备号树插件,支持并不代表默认开启。所以我们使用之前要配置内核开启这个功能。如果使用的是我们提供的debian 镜像(无论哪个版本)都是开启过了,无需再配置内核并重新编译。假设使用的是debian 镜像,下面介绍具体的加载步骤。

首先我们把编译好的设备树插件文件,上传到我们开发板中。

我们可以使用uboot 加载编写好的设备树插件,只需完成简单的两个步骤:

  1. 将需要加载的.dtbo 文件放入“/usr/lib/linux-image-4.19.94-stm-r1/overlays/”目录下。

在这里插入图片描述

  1. 将设备树插件写入位于“/boot”目录下的uEnv.txt 文件,文件系统启动过程中会自动从uEnv.txt 读取要加载的设备树插件。
# 使用nano 编辑器编辑
nano /boot/uEnv.txt
# 在文件中添加一行
dtoverlay=/usr/lib/linux-image-4.19.94-stm-r1/overlays/stm-fire-rgb-led.dtbo

在这里插入图片描述

添加好后,我们重启开发板,并输入对应的命令可以查看设备树插件是否加载成功:

ls /sys/firmware/devicetree/base/
# 或者
ls /proc/device-tree

看到这些文件,证明已经加载成功了。

在这里插入图片描述

删除设备树”插件”时,我们只需将对用的插件在“/boot”目录下的uEnv.txt 文件中添加# 号注释即可。

从上图可以看出在uEnv.txt 文件夹下有很多被屏蔽的设备树插件,这些设备树插件是烧写系统时自带的插件,为避免它们干扰我们的实验,这里把它们全部屏蔽掉。如果要将RGB 的设备树插件写入uEnv.txt 也很简单,参照着写即可。书写格式为“dtoverlay=< 设备树插件路径>”。修改完成后保存、退出。执行reboot 命令重启系统。正常情况下我们可以在“/proc/device-tree”找与插入的设备节点同名的文件夹。

加载RGB 灯驱动

驱动程序和应用程序的使用方法与上一章完全相同,可直接使用上一章的驱动和测试应用程序完成实验,实验现象完全相同。


参考资料:嵌入式Linux 驱动开发实战指南-基于STM32MP1 系列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值