Linux驱动之Linux自带的LED灯驱动
目录
一、简介
二、使能Linux自带LED驱动
三、Linux内核自带LED驱动框架
四、设备树节点编写
五、运行测试
一、简介
前面我们都是自己编写 LED 灯驱动,其实像 LED 灯这样非常基础的设备驱动, Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 platform 框架,因此我们只需要按照要求在设备树文件中添加相应的 LED 节点即可。
本章我们就来学习如何使用 Linux 内核自带的 LED 驱动来驱动 I.MX6U-ALPHA 开发板上的 LED0。
二、使能Linux自带LED驱动
要使用 Linux 内核自带的 LED 灯驱动首先得先配置 Linux 内核,使能自带的 LED 灯驱动,输入如下命令打开 Linux 配置菜单:
make menuconfig
按照如下路径打开 LED 驱动配置项:
-> Device Drivers-> LED Support (NEW_LEDS [=y])->LED Support for GPIO connected LEDs
按照上述路径,选择“LED Support for GPIO connected LEDs”,将其编译进 Linux 内核,也即是在此选项上按下“Y”键,使此选项前面变为“<*>”,如下图所示:
在“LED Support for GPIO connected LEDs”上按下‘?’ 可以打开此选项的帮助信息,如下图所示:
从上图可 以 看 出,把 Linux 内 部 自 带 的 LED 灯 驱 动 编 译 进 内 核 以 后 ,CONFIG_LEDS_GPIO 就会等于‘y’, Linux 会根据 CONFIG_LEDS_GPIO 的值来选择如何编译LED 灯驱动,如果为‘y’就将其编译进 Linux 内核。
配置好 Linux 内核以后退出配置界面,打开.config 文件,会找到“CONFIG_LEDS_GPIO=y”,这一行,如下图所示:
重新编译 Linux 内核,然后使用新编译出来的 zImage 镜像启动开发板。
三、Linux内核自带LED驱动框架
LED 灯驱动文件为/drivers/leds/leds-gpio.c,打开/drivers/leds/Makefile 这个文件,找到如下所示内容:
如果定义了 CONFIG_LEDS_GPIO 的话就会编译 leds-gpio.c 这个文件,在上一小节我们选择将 LED 驱动编译进 Linux 内核,在.config 文件中就会有“CONFIG_LEDS_GPIO=y”这一行,因此 leds-gpio.c 驱动文件就会被编译。 接下来我们看一下 leds-gpio.c 这个驱动文件,找到如下所示内容:
static const struct of_device_id of_gpio_leds_match[] = {{ .compatible = "gpio-leds", },{},
};MODULE_DEVICE_TABLE(of, of_gpio_leds_match);
......
static struct platform_driver gpio_led_driver = {.probe = gpio_led_probe,.shutdown = gpio_led_shutdown,.driver = {.name = "leds-gpio",.of_match_table = of_gpio_leds_match,},
};module_platform_driver(gpio_led_driver);
LED 驱动的匹配表,此表只有一个匹配项, compatible 内容为“gpio-leds”,因此设备树中的 LED 灯设备节点的 compatible 属性值也要为“gpio-leds”,否则设备和驱动匹配不成功,驱动就没法工作。
platform_driver 驱动结构体变量,可以看出, Linux 内核自带的 LED 驱动采用了 platform 框架。可以看出 probe 函数为 gpio_led_probe,因此当驱动和设备匹配成功以后 gpio_led_probe 函数就会执行。驱动名字为“leds-gpio”,因此会在/sys/bus/platform/drivers 目录下存在一个名为“leds-gpio”的文件,如下图所示:
四、设备树节点编写
打开文档 Documentation/devicetree/bindings/leds/leds-gpio.txt,此文档详细的讲解了 Linux 自带驱动对应的设备树节点该如何编写,我们在编写设备节点的时候要注意以下几点:
①、创建一个节点表示 LED 灯设备,比如 dtsleds,如果板子上有多个 LED 灯的话每个 LED灯都作为 dtsleds 的子节点。
②、 dtsleds 节点的 compatible 属性值一定要为“gpio-leds”。
③、设置 label 属性,此属性为可选,每个子节点都有一个 label 属性, label 属性一般表示LED 灯的名字,比如以颜色区分的话就是 red、 green 等等。
④、每个子节点必须要设置 gpios 属性值,表示此 LED 所使用的 GPIO 引脚!
⑤、可以设置“linux,default-trigger”属性值,也就是设置 LED 灯的默认功能,可以查阅Documentation/devicetree/bindings/leds/common.txt 这个文档来查看可选功能,比如:
-
backlight: LED 灯作为背光。
-
default-on: LED 灯打开
-
heartbeat: LED 灯作为心跳指示灯,可以作为系统运行提示灯。
-
ide-disk: LED 灯作为硬盘活动指示灯。
-
timer: LED 灯周期性闪烁,由定时器驱动,闪烁频率可以修改
⑥、可以设置“default-state”属性值,可以设置为 on、 off 或 keep,为 on 的时候 LED 灯默认打开,为 off 的话 LED 灯默认关闭,为 keep 的话 LED 灯保持当前模式。
根据上述几条要求在 imx6ul-14x14-evk.dtsi 中添加如下所示 LED 灯设备节点:
led {compatible = "gpio-leds";led0 {lable = "red";gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;default-state = "off";};
};
因为 I.MX6U-ALPHA 开发板只有一个 LED0,因此在 led 这个节点下只有一个子节点led0, led0 名字为 red,默认关闭。修改完成以后保存并重新编译设备树,然后用新的设备树启动开发板。
五、运行测试
用 新 的 zImage 和 imx6ull-toto.dtb 启 动 开 发 板 , 启 动 以 后 查 看/sys/devices/platform/led/ 这个目录是否存在,如果存在的话就如到此目录中,如下所示:
/ # ls /sys/devices/platform/led/
driver leds of_node subsystem
driver_override modalias power uevent
进入到 leds 目录中,此目录中的内容如下所示:
/sys/devices/platform/led/leds # ls
led0
/sys/devices/platform/led/leds #
从上面可以看出,在 leds 目录下有一个名为“led0”子目录,这个子目录的名字就是我们在设备树中led主节点的字节点。
我们的设置究竟有没有用,最终是要通过测试才能知道的,首先查看一下系统中有没有“sys/class/leds/red/brightness”这个文件,如果有的话就输入如下命令打开 RED 这个 LED 灯:
/ # echo 1 > /sys/devices/platform/led/leds/led0/brightness //开led0
关闭 RED 这个 LED 灯的命令如下:
/ # echo 0 > /sys/devices/platform/led/leds/led0/brightness //关led0
如果能正常的打开和关闭 LED 灯话就说明我们 Linux 内核自带的 LED 灯驱动工作正常。
我们一般会使用一个 LED 灯作为系统指示灯,系统运行正常的话这个 LED 指示灯就会一闪一闪的。里我们设置 LED0 作为系统指示灯,在 led 这个设备节点中加入“linux,default-trigger”属性信息即可,属性值为“heartbeat”,修改完以后的 led 节点内容如下:
led {compatible = "gpio-leds";led0 {lable = "red";gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;linux,default-trigger = "heartbeat";default-state = "on";};
};
重新编译设备树并且使用新的设备树启动 Linux 系统,启动以后 LED0 就会闪烁,作为系统心跳指示灯,表示系统正在运行。
关于更多嵌入式C语言、FreeRTOS、RT-Thread、Linux应用编程、linux驱动等相关知识,关注公众号【嵌入式Linux知识共享】,后续精彩内容及时收看了解。
相关文章:

Linux驱动之Linux自带的LED灯驱动
目录 一、简介 二、使能Linux自带LED驱动 三、Linux内核自带LED驱动框架 四、设备树节点编写 五、运行测试 一、简介 前面我们都是自己编写 LED 灯驱动,其实像 LED 灯这样非常基础的设备驱动, Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 …...

C盘清理 “ProgramData\Microsoft\Search“ 文件夹过大
修改索引存放位置 进入控制面板->查找方式改成大图标, 选择索引选项 进入高级 填写新的索引位置 删除C盘索引信息 删除C:\ProgramData\Microsoft\Search\Data\Applications 下面的文件夹 如果报索引正在使用,参照第一步替换索引位置。关闭索引...

深入了解字符串处理算法与文本操作技巧
深入了解字符串处理算法与文本操作技巧 引言 字符串处理是计算机科学和数据处理的核心领域之一。本博客将深入介绍一些常见的字符串处理算法和文本操作技巧,包括字符串匹配、搜索、正则表达式、字符串操作和文本标准化等。 暴力匹配算法 什么是暴力匹配…...

Python爬虫:打开盈利大门的利器
导言: 随着互联网的迅速发展,越来越多的企业和个人开始意识到数据的重要性。而Python爬虫作为一种自动化获取互联网信息的技术,为人们提供了更便捷、高效的数据获取方式。本文将介绍基于Python爬虫的五种盈利模式,并提供实际案例…...

17.CSS发光按钮悬停特效
效果 源码 <!DOCTYPE html> <html> <head><title>CSS Modern Button</title><link rel="stylesheet" type="text/css" href="style.css"> </head> <body><a href="#" style=&quo…...

CSS中如何实现弹性盒子布局(Flexbox)的换行和排序功能?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 换行(Flexbox Wrapping)⭐ 示例:实现换行⭐ 排序(Flexbox Ordering)⭐ 示例:实现排序⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得…...

spark底层为什么选择使用scala语言开发
Spark 底层使用 Scala 开发有以下几个原因: 基于Scala的语言特性 集成性:Scala 是一种运行在 Java 虚拟机(JVM)上的静态类型编程语言,可以与 Java 代码无缝集成。由于 Spark 涉及到与大量 Java 生态系统的交互&#x…...

基于RabbitMQ的模拟消息队列之三——硬盘数据管理
文章目录 一、数据库管理1.设计数据库2.添加sqlite依赖3.配置application.properties文件4.创建接口MetaMapper5.创建MetaMapper.xml文件6.数据库操作7.封装数据库操作 二、文件管理1.消息持久化2.消息文件格式3.序列化/反序列化4.创建文件管理类MessageFileManager5.垃圾回收 …...

DHorse v1.3.2 发布,基于 k8s 的发布平台
版本说明 新增特性 构建版本、部署应用时的线程池可配置化; 优化特性 构建版本跳过单元测试; 解决问题 解决Vue应用详情页面报错的问题;解决Linux环境下脚本运行失败的问题;解决下载Maven安装文件失败的问题; 升…...

在vue.config.js中配置文件路径代理名
今天在公司项目中看到一个非常有趣的导入路径 crud 先是一蒙 这是个啥 突然想起一个被自己遗漏的知识点 在vue.config.js中配置路径指向 这里 我们随便找一个vue项目 在src下找到 components 目录 如果没有就创建一个 下面找到HelloWorld.vue 如果没有也是自己创建一个就好 然…...

深度学习优化算法相关文章
综述性文章 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam 从 SGD 到 Adam —— 深度学习优化算法概览(一)...

echarts自定义Y轴刻度及其颜色
yAxis: [{min:0,max:5,axisLabel: {color: "#999",textStyle: {fontSize: 14,fontWeight: 400,// 设置分段颜色color: function (value) {console.log("试试", value);if (value 1) {return "rgba(140,198,63,1)";} else if (value 2) {return…...

【云原生进阶之PaaS中间件】第一章Redis-1.3Redis配置
1 Redis配置概述 Redis支持采用其内置默认配置的方式来进行启动,而不需要提前配置任何文件,但是这种启动方式只推荐在测试和开发环境中使用,但更好的方式是通过提供一个Redis的配置文件来对Redis进行配置, 这个配置文件一般命名为…...

C++ 动态内存
C 程序中的内存分为栈和堆两个部分: 栈:在函数内部声明的所有变量都将占用栈内存;堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。 堆与栈的详细请参考:一文读懂堆与栈的区别_堆和栈的区别_恋…...

swagger 接口测试,用 python 写自动化时该如何处理?
在使用Python进行Swagger接口测试时,可以使用requests库来发送HTTP请求,并使用json库和yaml库来处理响应数据。以下是一个简单的示例代码: import requests import json import yaml# Swagger API文档地址和需要测试的接口路径 swagger_url …...

QT使用QXlsx实现Excel图片与图表操作 QT基础入门【Excel的操作】
构建图表数据 /// 构建图表数据for (int i = 1; i < 10; ++i) {mxlsx.write(i, 1, i * i * i); // A1:A9mxlsx.write(i, 2, i * i); // B1:B9mxlsx.write(i, 3, i * i - 1); // C1:C9} 需要包含头文件 #include "xlsxchart.h" 1. 饼状图 Chart *pieChart = mxlsx.…...

【Python常用函数】一文让你彻底掌握Python中的numpy.clip函数
大数据时代的到来,使得很多工作都需要进行数据挖掘,从而发现更多有利的规律,或规避风险,或发现商业价值。而大数据分析的基础是学好编程语言。本文和你一起来探索Python中的clip函数,让你以最短的时间明白这个函数的原理。也可以利用碎片化的时间巩固这个函数,让你在处理…...

Matlab(GUI程式设计)
目录 1.MatlabGUI 1.1 坐标区普通按钮 1.1.1 对齐组件 1.1.2 按钮属性 1.1.3 脚本说明 1.1.4 选择呈现 1.3 编译GUI程序 在以前的时候,我们的电脑还是这样的 随着科技的不断进步,我们的电脑也发生着翻天覆地的改变1990s: 在未来,…...

Numpy数组(随时更新)
一、Numpy数组对象的重要属性 #导入库 import numpy as npdata np.arange(12).reshape(4,3)data2 np.arange(24).reshape(3,4,2) #ndim维度个数data.ndimdata2.ndim #shape形状几行几列 数组的维度data.shapedata2.shape#size数组的总个数data.sizedata2.size #dtype数组元素的…...

Spring Cloud--从零开始搭建微服务基础环境【三】
😀前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【三】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,…...

HDFS文件的读写流程
Hadoop HDFS的读写文件流程 HDFS写文件流程 客户端通过Distributed FileSystem模块向NameNode请求上传文件(hadoop fs -put 文件名 文件路径 ) 判断该客户端是否有写入权限NameNode检查目标文件是否已存在,父目录是否存在。 NameNode返回是…...

SpringCloudGateway集成SpringDoc
SpringCloudGateway集成SpringDoc 最近在搞Spring版本升级,按客户要求升级Spring版本,原来用着SpringBoot 2.2.X版本,只需要升级SpringBoot 2.X最新版本也就可以满足客户Spring版本安全要求,可是好像最新的SpringBoot 2.X貌似也不…...

ArcGIS将两个相同范围但不同比例或位置的矢量数据移动到相同位置
有两个市图层,一个是正确经纬度的市行政范围图层,另一个是其他软件导出获取的不正确经纬度信息或缺失信息。 如果单纯的依靠移动图层,使不正确的移动到正确位置需要很久。尝试定义投影等也不能解决。 使用ArcMap 的空间校正工具条ÿ…...

MySQL编写建表语句,如何优雅处理创建时间与更新时间
在 MySQL 中,可以使用 TIMESTAMP 或者 DATETIME 数据类型来存储日期和时间信息,并结合默认值和触发器来实现自动更新 createTime 和 updateTime 字段。 以下是一个示例建表语句,演示如何设置自动更新的 createTime 和 updateTime 字段&#…...
NetSuite as OIDC Provider 演示
书接上回。上次谈了借助第三方身份认证服务SSO登录NetSuite。 NetSuite OIDC、SAML SSO 演示_NetSuite知识会的博客-CSDN博客NetSuite的SSO的策略:第三方的身份认证服务商NetSuite as OIDC Provider。本文演示前者。https://blog.csdn.net/remottshanghai/article/…...

webrtc sdp各字段含义
WebRTC使用Session Description Protocol(SDP)实现传输协议的协商和描述。以下是SDP中常见的字段及其含义: v:协议版本号o:会话创建者的标识符、会话ID、和会话版本号s:会话名称t:会话时间描述…...

Docker 常用服务 安装使用 教程
Docker安装常用服务 1、 安装mysql # 1.拉取mysql镜像到本地 docker pull mysql:tag (tag不加默认最新版本) # 2.运行mysql服务 docker run --name mysql -e MYSQL_ROOT_PASSWORDroot -d mysql:tag --没有暴露外部端口外部不能连接 docker run --name mysql -e MYSQL_ROOT_PAS…...

Java String类(2)
String方法 字符串拆分 可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串 相关方法如下: 方法功能String[ ] split(String regex)//以regex分割将字符串根据regex全部拆分String[ ] split(String regex, int limit)将字符串以指定的格式,拆…...

基于图像切割计算轨迹相似度
目录 背景思路与核心代码数值实验优缺点分析参考文献 背景 在前面2文,我们分别讨论了利用夹角余弦来计算轨迹相似度和利用缓冲原理来计算轨迹相似度两种方法,前者可以作为一个baseline提供参考,后者的计算更符合人们的感官和事实,…...

Day49|leetcode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
leetcode 121. 买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode) 视频链接:动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili 题目概述 给定一个数组 ,它的第 个元…...