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

news2024/11/25 16:55:09

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 系列

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Android图形系统

一、图形系统简介图形系统是计算机中最重要的子系统之一。我们平时使用的电脑、手机都是图形界面的。对于普通人来说&#xff0c;没有图形界面的计算机几乎是没法用的&#xff0c;今天我们就来讲一讲图形系统背后的原理。1.1 图形系统的诞生早期的计算机是没有图形界面的&#…

一种基于深度学习的单导联心电信号睡眠呼吸暂停检测方法

在R峰识别的基础上&#xff0c;加入S峰的识别&#xff0c;并论正了该策略对检测结果的有效性。 1、大致方法 将数据集&#xff08;ECG信号&#xff09;划分为每五分钟的一个片段&#xff0c;为了减少噪声和信号伪影&#xff0c;首先对信号应用了一个有限脉冲响应&#xff08;…

使用python加密主机文件几种方法实现

本文主要介绍了使用python加密主机文件几种方法实现&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧数据加密是一种保护数据安全的技术&#xff0c;通过对数据进行编…

你所不知道的Number()、parseInt()、parseFloat()转换细则

为什么要写这篇文章 最近在阅读《javascript高级程序设计》&#xff08;第6版&#xff09;这本书&#xff0c;以写代记。同时刚刚入职新公司&#xff0c;发现自己对于number类型转换的细节掌握不足 使用场景 我们常常对于很多字符串类型的数字需要转换成Number&#xff0c;一…

2023春节,蔚来高速免费换电累计达37万余次

2023年春节放假前&#xff0c;蔚来官方宣布高速换电免费消息&#xff1a; 在高速公路上&#xff08;含高速出入口&#xff09;的所有蔚来汽车换电站将为蔚来用户&#xff0c;提供不限次免费换电服务。 消息发布后&#xff0c;部分电动车企也进行了跟进&#xff0c;提供了特定区…

二十四、Gtk4-GtkExpression

GtkExpression是一种基本类型。它不是GObject的后代。GtkExpression提供了一种描述对值的引用的方法。GtkExpression需要求值才能获得值。 它类似于算术计算。 1 2 3 12是一个表达式。给出了计算的方法。3是来自表达式的值。求值是计算表达式并得到值。 GtkExpression是一种…

【大厂高频真题100题】《有效的井字游戏》 真题练习第26题 持续更新~

有效的井字游戏 给你一个字符串数组 board 表示井字游戏的棋盘。当且仅当在井字游戏过程中,棋盘有可能达到 board 所显示的状态时,才返回 true 。 井字游戏的棋盘是一个 3 x 3 数组,由字符 ,X 和 O 组成。字符 代表一个空位。 以下是井字游戏的规则: 玩家轮流将字符…

CODESYS开发教程10-文件读写(SysFile库)

今天继续我们的小白教程&#xff0c;老鸟就不要在这浪费时间了&#x1f60a;。 前面一期我们介绍了CODESYS的文件操作库CAA File。这一期主要介绍CODESYS的SysFile库所包含的文件读写功能块&#xff0c;主要包括文件路径、名称、大小的获取以及文件的创建、打开、读、写、拷贝…

mysql数据库安装

三种安装方式 tar -xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz [rootsc-mysql opt]# tar -xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz [rootsc-mysql opt]# ls apache-zookeeper-3.6.3-bin kafka_2.12-2.8.1.tgz apache-zookeeper-3.6.3-bin.tar.gz mysql…

无线局域网

无线局域网&#xff08;Wireless Local Ara Network&#xff0c;WLAN&#xff09; 一、无线局域网的组成 无线局域网可分为两大类&#xff1a;&#xff08;1&#xff09;有基础设施的&#xff1b;&#xff08;2&#xff09;无基础设施的。 1. IEEE802.11 对于有基础设施的无…

Spring boot 实战指南(三):整合Elasticsearch、swagger、redis、mq

文章目录一、Elasticsearch创建项目配置maven完善依赖es连接配置实体映射repositoryservicecontroller二、swagger依赖启动类路径匹配配置配置类controller注解三、redis一、Elasticsearch 官方文档 Elasticsearch教程 自己搭建了一个简单的demo&#xff0c;仓库在这里&#…

分布式之CAP理论分析

写在前面 任何存在的事物都有其内在的特性&#xff0c;分布式也不例外&#xff0c;那么分布式都有什么特性呢&#xff1f;国外有大牛就帮我们总结了如下的三点&#xff1a; C:Consitency,一致性 A&#xff1a;Available&#xff0c;可用性 P&#xff1a;Partition tolerance&…

细讲一个 TCP 连接能发多少个 HTTP 请求(二)

第三个问题&#xff1a;一个 TCP 连接中 HTTP 请求发送可以一起发送么&#xff08;比如一起发三个请求&#xff0c;再三个响应一起接收&#xff09;&#xff1f; HTTP/1.1 存在一个问题&#xff0c;单个 TCP 连接在同一时刻只能处理一个请求&#xff0c;意思是说&#xff1a;两…

测试员都是背锅侠?测试人员避“锅”攻略,拿走不谢

最近发生了一起生产事故&#xff0c;究其根源&#xff0c;事故本身属于架构或者需求层面需要规避的问题&#xff0c;测试人员的责任其实是非常小的&#xff0c;但实际情况是&#xff1a;相关测试人员因此承担了很大的压力&#xff0c;成为质量问题的“背锅侠”。 实际上&#…

极验2代验证码分析

目标链接 aHR0cDovL3d3dy5qc2dzai5nb3YuY246NTg4ODgvbWluaS9uZXR3ZWIvU01MaWJyYXJ5LmpzcA接口分析 点击搜索就会跳出验证码&#xff0c;netWebServlet.json 的请求&#xff0c;会返回 challenge 和 gt 接着可以看响应请求图片信息的接口&#xff0c;可以看到请求参数包含cha…

iOS 组件化或SDK时对资源加载注意点

本文针对cocoapods进行打包的资源做个讲解&#xff0c;针对自身项目注意调整资源访问策略。 资源文件打包方式 使用pod lib create AppResourceModule 来进行演示。 use_frameworks! target AppResourceModule_Example dopod AppResourceModule, :path > ../ end podfil…

Python+Flask+MySQL开发的在线外卖订餐系统(附源码)

文章目录一、项目模块及功能介绍1、登录模块2、注册模块3、商家用户模块4、买家用户模块5、系统管理员模块源码二、项目结构三、环境依赖四、运行方法五、系统部分界面展示1、首页2、注册界面3、登录界面4、商家主界面5、商家菜单界面6、商家添加菜品界面7、商家修改菜品界面8、…

数值程序分析

原文来自微信公众号“编程语言Lab”&#xff1a;数值程序分析 搜索关注“编程语言Lab”公众号&#xff08;HW-PLLab&#xff09;获取编程语言更多技术内容&#xff01; 欢迎加入编程语言社区 SIG-程序分析&#xff0c;了解更多程序分析相关的技术内容。 加入方式&#xff1a;添…

实现自动化部署前端项目,从安装Jenkins到部署完成的整体配置 --适合初学Jenkins、想实现或者学习自动化部署的同学,知识点比较全面,过程写的清晰

前言 一、什么是Jenkins 二、Jenkins安装配置 Linux环境安装JDK Linux环境安装Maven Linux安装Jenkins 启动Jenkins jenkins配置 配置汉化版的jenkins 安装gitHub插件 gitHub配置 jenkins的配置 jenkins的gitHub配置 jenkins的java环境配置 小总结 两种情况 第…

RPCMon:一款基于ETW的RPC监控工具

关于RPCMon RPCMon是一款基于事件跟踪的WindowsRPC监控工具&#xff0c;该工具是一款GUI工具&#xff0c;可以帮助广大研究人员通过ETW&#xff08;Event Tracing for Windows&#xff09;扫描RPC通信。 RPCMon能够为广大研究人员提供进程之间RPC通信的高级视图&#xff0c;该…