第十节 使用设备树插件实现RGB 灯驱动
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 0x000000040x50002004 0x000000040x50002008 0x000000040x5000200C 0x000000040x50002018 0x000000040x50000A28 0x00000004>;status = "okay";};/* 绿灯节点*/rgb_led_green@0x50000A28{compatible = "fire,rgb_led_green";reg = < 0x50008000 0x000000040x50008004 0x000000040x50008008 0x000000040x5000800C 0x000000040x50008018 0x000000040x50000A28 0x00000004>;status = "okay";};/* 蓝灯节点*/rgb_led_blue@0x50000A28{compatible = "fire,rgb_led_blue";reg = < 0x50003000 0x000000040x50003004 0x000000040x50003008 0x000000040x5000300C 0x000000040x50003018 0x000000040x50000A28 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_defconfigmake 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 加载编写好的设备树插件,只需完成简单的两个步骤:
- 将需要加载的.dtbo 文件放入“/usr/lib/linux-image-4.19.94-stm-r1/overlays/”目录下。

- 将设备树插件写入位于“/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 系列
相关文章:
第十节 使用设备树插件实现RGB 灯驱动
Linux4.4 以后引入了动态设备树(Dynamic DeviceTree),我们这里翻译为“设备树插件”。设备树插件可以理解为主设备树的“补丁”它动态的加载到系统中,并被内核识别。例如我们要在系统中增加RGB 驱动,那么我们可以针对R…...
【LeetCode】公交路线 [H](宽度优先遍历)
815. 公交路线 - 力扣(LeetCode) 一、题目 给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。 例如,路线 routes[0] [1, 5, 7] 表示第 …...
报表生成器 FastReport .Net 用户指南 2023(十):Band的属性
FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…...
DAMA数据管理知识体系指南之文档和内容管理
第10章 文档和内容管理 10.1 简介 文档和内容管理是对存储在关系数据库以外的信息的采集、存储、访问以及使用的控制活动。文档和内容管理的侧重点在完整性和访问控制上。因此,它与关系数据库的数据操作管理大致相同。由于多数非结构化数据与存储在结构化文件中的…...
C++入门:数据结构
C/C 数组允许定义可存储相同类型数据项的变量,但是结构是 C 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性&#x…...
C语言实现烟花表白,内含源码!!
虽然现在看烟花有一定难度,但代码式烟花可以随时随地看! 烟花的代码很多,实际上是可以用 Python、HTML5 等语言写烟花,但今天主要想和大家分享用C语言写的烟花代码,非常细致和实用。 同学们一定要亲自敲一遍…...
虚拟机安装CentOS 7(带界面)
目录 一、虚拟机安装CentOS 7(带界面) 1、打开下好的VMware,点击创建虚拟机 2、下一步 3、点击下一步 4、选择Linux,ContOS7,点击下一步 5、修改虚拟机名称和路径 6、下一步 7、点击自定义硬件 8、设置虚拟机大…...
Java测试——selenium具体操作
selenium的前置准备工作可以参考我之前的博客:Java测试——selenium的安装与使用教程 这篇博客讲解一下selenium的常见操作 先创建driver ChromeDriver driver new ChromeDriver();输入网址 driver.get("https://www.baidu.com");常见操作 查找元素…...
电子器件系列32:逻辑与门芯片74LS11
一、编码规则 先看看这个代码的意思:74LS11 74是一个系列(74 表示为工作温度范围,74: 0 ~ 70度。) ls的意思就是工艺类型(Bipolar(双极)工艺) 11是代码 什么是74系列逻辑芯片? - 知乎 什么是…...
LeetCode-101. 对称二叉树
目录题目分析递归法题目来源 101. 对称二叉树 题目分析 首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点! 对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一…...
使用intlinprog求解指派问题MATLAB代码分享
% 输入指派矩阵C [3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];f C(:); %生成一个列向量,作为目标函数系数,matlab默认以列排序[m,n] size(C);Aeq zeros(2*n,n*n); %2*n个等式约束,n*n个变量for i 1:n %这里先生成的是后5个…...
Spark On YARN时指定Python版本
坑很多,直接上兼容性最佳的命令,将python包上传到hdfs或者file:/home/xx/(此处无多余的/) # client 模式 $SPARK_HOME/spark-submit \ --master yarn \ --deploy-mode client \ --num-executors 2 \ --conf "spark.yarn.dist.archives<Python包…...
[数据库]库的增删改查
●🧑个人主页:你帅你先说. ●📃欢迎点赞👍关注💡收藏💖 ●📖既选择了远方,便只顾风雨兼程。 ●🤟欢迎大家有问题随时私信我! ●🧐版权:本文由[你帅…...
Wine零知识学习1 —— 介绍
一、什么是Wine Wine是“Wine Is Not an Emulator” 的首字母缩写,是一个能够在多种POSIX-compliant操作系统(诸如Linux、macOS及BSD等)上运行 Windows 应用的兼容层。Wine不像虚拟机或者模拟器那样模仿内部的Windows逻辑,而是將…...
设计模式--建造者模式 builder
设计模式--建造者模式 builder)建造者模式简介建造者模式--小例子(电脑购买)1.产品类2.抽象构建者3.实体构建类4.指导者类5.客户端测试类小结建造者模式简介 建造者模式有四个角色,概念划分如下: Product : 产品类&a…...
终于周末啦,继续来总结一下Python的一些知识点啦
目录 Python概念梳理 常见概念梳理 Python经典判断题 判断题 选择题 Python概念梳理 常见概念梳理 Python中,不仅仅变量的值是可以变化的,类型也是可以随时变化的 1、Python的变量必须初始化否则提示 is not defined 2、if、while中定义的变量在…...
CUDA By Example(八)——流
文章目录页锁定主机内存可分页内存函数页锁定内存函数CUDA流使用单个CUDA流使用多个CUDA流GPU的工作调度机制高效地使用多个CUDA流遇到的问题(未解决)页锁定主机内存 在之前的各个示例中,都是通过 cudaMalloc() 在GPU上分配内存,以及通过标准的C库函数 …...
02- pandas 数据库 (数据库)
pandas 数据库重点: pandas 的主要数据结构: Series (一维数据)与 DataFrame (二维数据)。 pd.DataFrame(data np.random.randint(0,151,size (5,3)), # 生成pandas数据 index [Danial,Brandon,softpo,Ella,Cindy], # 行索引 …...
less常用语法总结
CSS预处理器 CSS 预处理器是什么?一般来说,它们基于 CSS 扩展了一套属于自己的 DSL,来解决我们书写 CSS 时难以解决的问题: 语法不够强大,比如无法嵌套书写导致模块化开发中需要书写很多重复的选择器;没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量…...
DHCP Relay中继实验
DHCP Relay实验拓扑图设备配置结果验证拓扑图 要求PC1按照地址池自动分配,而PC要求分配固定的地址,网段信息已经在图中进行标明。 设备配置 AR1: AR1作为DHCP Server基本配置跟DHCP Server没区别,不过要加一条静态路由ÿ…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...
在ubuntu等linux系统上申请https证书
使用 Certbot 自动申请 安装 Certbot Certbot 是 Let’s Encrypt 官方推荐的自动化工具,支持多种操作系统和服务器环境。 在 Ubuntu/Debian 上: sudo apt update sudo apt install certbot申请证书 纯手动方式(不自动配置)&…...
云原生技术驱动 IT 架构现代化转型:企业实践与落地策略全解
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、背景:IT 架构演进的战略拐点 过去十年,企业 IT 架构经历了从传统集中式架构到分布式架构的转型。进入云计算…...
