21 Linux 自带的LED驱动

一、Linux 自带 LED 驱动使能

  其实 Linux 内核自带 LED 抢夺那个,但在此之前需要配置 Linux 驱动来使能 LED 驱动。

  输入以下命令:

cd linux/atk-mpl/linux/my_linux/linux-5.4.31
make menuconfig

  根据以下路径找到 LED 驱动:

→ Device Drivers
    → LED Support (NEW_LEDS [=y])
        →LED Support for GPIO connected LEDs

  配置完成后,Save 保存退出,之后重新编译 Linux,并且把新编译的 uImage 镜像启动开发版。

二、Linux 自带 LED 驱动简介

1.1 LED 驱动框架分析

  进入 /linux/atk-mpl/linux/my_linux/linux-5.4.31/drivers/leds 目录,打开 leds-gpio.c 文件:

/* 这里其实和上一章节类似,都是这种结构,除了325行是新的之外 */
......
203 static const struct of_device_id of_gpio_leds_match[] = {
204     { .compatible = "gpio-leds", },    // 这里得和设备树的LED节点一样才能匹配成功
205     {},
206 };
207
208 MODULE_DEVICE_TABLE(of, of_gpio_leds_match);
......
316 static struct platform_driver gpio_led_driver = {
317     .probe      = gpio_led_probe,
318     .shutdown   = gpio_led_shutdown,
319     .driver     = {
320         .name   = "leds-gpio",    // 这里设置为leds-gpio,那么/sys/bus/platform/drivers目录下也会出现一个这个名字
321         .of_match_table = of_gpio_leds_match,
322     },
323 };
......
325 module_platform_driver(gpio_led_driver);    // 向Linux内核注册platform

1.2 module_platform_driver 分析

  上一节的 LED 驱动中的 325 行是向 Linux 内核注册 platform。module_platform_driver 其实是 platform 驱动的注册和删除,把之前的给省略了:

static int __init gpio_led_driver_init(void)
{
    return platform_driver_register (&(gpio_led_driver));
}
module_init(gpio_led_driver_init);
static void __exit gpio_led_driver_exit(void)
{
    platform_driver_unregister (&(gpio_led_driver) );
}
module_exit(gpio_led_driver_exit);

三、设备树节点编写

  Documentation/devicetree/bindings/leds/leds-gpio.txt 这个文档就是讲解 Linux 自带驱动对应的设备的设备树如何编写。这个就是led gpio 的编写,还有其他的文档。我们从 leds-gpio.txt 文档中了解到需要注意以下几点:

  ① 创建一个节点表示 LED 灯设备,比如 dtsleds,如果板子上有多个 LED 灯的话每个 LED灯都作为 dtsleds 的子节点;

  比如:

dtsleds{
    compatible = 'gpio-leds';    // 这里必须跟leds-gpio.c中的compatible一样
    
    led0:{
        label = "red";        // 这里表示led0是红色灯
        gpios = <&gpioi 0 GPIO_ACTIVE_LOW>;
        linux,default-trigger = "heartbeat";    // 设置为心跳指示灯
        default-state = "off";    // 默认关闭
        ...
    };
    
    led1:{
        label = "bule";       // 这里同上
        gpios = <&gpiof 3 GPIO_ACTIVE_LOW>;        // 这里看的硬件原理图是PF3
        default-state = "off";
        ...
    };
    
    // 以此往下
};

  ② dtsleds 节点的 compatible 属性值一定要为“gpio-leds”,看上面的比如;

  ③ 设置 label 属性,此属性为可选,每个子节点都有一个 label 属性, label 属性一般表示LED 灯的名字,比如以颜色区分的话就是 red、 bule,如上;

  ④ 每个子节点必须要设置 gpios 属性值,表示此 LED 所使用的 GPIO 引脚,如上;

  ⑤ 可以设置“ linux,default-trigger”属性值,也就是设置 LED 灯的默认功能,查阅 Documentation/devicetree/bindings/leds/common.txt
这个文档来查看可选功能,如上,比如: 

  backlight: LED 灯作为背光。

  default-on: LED 灯打开。

  heartbeat: LED 灯作为心跳指示灯,可以作为系统运行提示灯。

  disk-activity: LED 灯作为磁盘活动指示灯。

  ide-disk: LED 灯作为硬盘活动指示灯。

  timer: LED 灯周期性闪烁,由定时器驱动,闪烁频率可以修改 

  ⑥ 设置“default-state”属性值,可以设置为 on、 off 或 keep,为 on 的时候 LED 灯默认打开,为 off 的话 LED 灯默认关闭,为 keep 的话 LED 灯保持当前模式,如上。

   第一步首先就是改设备树,打开 linux/atk-mpl/linux/my_linux/linux-5.4.31/arch/arm/boot/dts/stm32mp15-pinctrl.dtsi 创建这两个 LED 的 pinctrl 节点:

   打开 /home/alientek/linux/atk-mpl/linux/my_linux/linux-5.4.31/arch/arm/boot/dts/stm32mp157d-atk.dts ,在"/"跟节点下添加 LED 设备子节点:

  修改完后,输入命令:

cd
cd linux/atk-mpl/linux/my_linux/linux-5.4.31
make dtbs
cd arch/arm/boot/dts/
sudo cp stm32mp157d-atk.dtb /home/alientek/linux/tftpboot/ -f

四、运行测试

  开启开发板,进入 sys/devices/platform/dtsleds/leds/ 目录中,可以看见之前在设备树中设置的 label。

  查看 sys/class/leds/red/brightness 和 sys/class/leds/green/brightness 这两个文件,分别对应 LED0 和 LED1,通过操作这两个文件来实现 LED 的打开和关闭。

  输入以下命令来打开:

echo 1 > /sys/class/leds/red/brightness   # 打开 LED0
echo 1 > /sys/class/leds/green/brightness # 打开 LED1
# echo 在终端输出指定的文本或变量,这里我们指定brightness文件为1

   关闭:

echo 0 > /sys/class/leds/red/brightness    #关闭 LED0
echo 0 > /sys/class/leds/green/brightness  #关闭 LED1

   这里我搞错了,是控制绿灯亮灭,之后我改回来。其实我们可以在系统正常运行的时候加入 LED 让它一闪一闪的,打开 stm32mp157d-atk.dts 如下:

  还是以上操作,重启开发板,就可以看到红色的 LED 不断的闪烁了。

总结

  这里使用 Linux 自带的驱动去玩 LED,这里我觉得只能单纯的使用一个灯,不能和其他设备相互联动。这里或许是我的知识的浅薄,不知道还能否联动,有大佬知道的话麻烦说一下,谢谢。但是对于使用自带的很方便,只需要修改树即可。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL表的增查(进阶)

目录 1.插入查询结果 2.查询 2.1聚合查询 2.1.1聚合函数 2.1.2GROUP BY子句 2.1.3HAVING 2.2联合查询 2.2.1内连接 2.2.2外连接 2.2.3自连接 2.3子查询 2.4合并查询 1.插入查询结果 在一张表中插入另一张表的查询结果。 语法为&#xff1a; insert into 表名 (列…

【算法】区间(差分约束)

题目 给定 n 个区间 [ai,bi] 和 n 个整数 ci。 你需要构造一个整数集合 Z&#xff0c;使得 ∀i∈[1,n]&#xff0c;Z 中满足 ai≤x≤bi 的整数 x 不少于 ci 个。 求这样的整数集合 Z 最少包含多少个数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含三个…

解决Github上的README无法显示图片

首先感谢博主的思路&#xff1a;思路 最近写了点东西提交到git 发现本地能查看md里的图片用的相对路径&#xff0c;提交到github就看不见&#xff0c;并且发现不只是我自己的仓库看不见&#xff0c;其他人的我也看不见。那就有问题了 解决&#xff1a;正常使用相对路径&…

【BIM入门实战】Revit图元的选择方式,总有一款适合你

Revit图元的五种常见选择方式,总有一款适合你。 文章目录 一、直接单击二、加选和减选三、连续框选四、按类别选择五、全选过滤选择操作可以在三维视图、平面视图等多种视图中进行。 一、直接单击 直接单击,即可选中某一个图元,如选择一个扶手。 二、加选和减选 按住ctrl键…

32 _ 字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配?

从今天开始,我们来学习字符串匹配算法。字符串匹配这样一个功能,我想对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言提供的字符串查找函数,比如Java中的indexOf(),Python中的find()函数等,它们底层就是依赖接下来要讲的字符串匹配算法。 字符串…

C++二分查找算法:数组中占绝大多数的元素

题目 设计一个数据结构&#xff0c;有效地找到给定子数组的 多数元素 。 子数组的 多数元素 是在子数组中出现 threshold 次数或次数以上的元素。 实现 MajorityChecker 类: MajorityChecker(int[] arr) 会用给定的数组 arr 对 MajorityChecker 初始化。 int query(int left, …

37 _ 贪心算法:如何用贪心算法实现Huffman压缩编码?

基础的数据结构和算法我们基本上学完了,接下来几节,我会讲几种更加基本的算法。它们分别是贪心算法、分治算法、回溯算法、动态规划。更加确切地说,它们应该是算法思想,并不是具体的算法,常用来指导我们设计具体的算法和编码等。 贪心、分治、回溯、动态规划这4个算法思想…

622.设计循环队列(LeetCode)

思路 先确定什么情况为空&#xff0c;什么情况为满。 这里有两种解决方案&#xff0c; 1.留一个空间空置&#xff0c;当rear1 front时 &#xff0c;则队列为满 &#xff08;这里我们选用方案一&#xff09; 2.增加一个size变量记录数据个数&#xff0c;size 0则为空&#xff…

Uniapp导出的iOS应用上架详解

​ 目录 Uniapp导出的iOS应用上架详解 摘要 引言 苹果审核标准 苹果调试 注意事项和建议 总结 摘要 本文将探讨Uniapp导出的iOS应用能否成功上架的问题。我们将从苹果审核标准、性能影响、调试流程等多个方面进行深入分析&#xff0c;以及向开发者提供相关注意事项和建…

【计算机网络笔记】DHCP协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

JAVA 中集合取交集

日常工作 经常需要取两个数据集的交集。对常用的List 和Set集合做了一个测试 public static void main(String[] args) {List<Integer> list1 Lists.newArrayList();List<Integer> list2 Lists.newArrayList();Set<Integer> set3 Sets.newHashSet();Set&l…

优秀智慧园区案例 - 重庆AI PARK智慧创意园区,先进智慧园区建设方案经验

一、项目背景 1、智慧园区是国家实现经济增长、产业升级的载体 智慧园区建设是城市智慧化创新发展的核心&#xff0c;在数智化升级和低碳化转型的经济发展双引擎的驱动下&#xff0c;十四五、数字经济的政策大力支持&#xff0c;以及人工智能、5G、大数据、区块链等技术的不断…

ubuntu中cuda12.1配置(之前存在11.1版本的cuda)(同时配置两个版本)

ubuntu中cuda12.1配置 由于YOLOv8项目中Pytorch版本需要cuda12.1版本 在官网下载12.1版本的deb包 官网地址 sudo dpkg -i cuda-keyring_1.0-1_all.deb sudo apt-get update sudo apt-get -y install cuda然后需要修改bashrc文件&#xff08;隐藏文件&#xff09; 添加 exp…

Postman实现接口的加密和解密

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 1、目前市面上的加密的方式 对称式加密&#xff1a;DES&#xff0c;AES&#xff0c;Base64加密算法 非对称加密&#xff1a…

基于STC12C5A60S2系列1T 8051单片机的数模芯片TLC5615实现数模转换应用

基于STC12C5A60S2系列1T 8051单片的数模芯片TLC5615实现数模转换应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍数模芯片TLC5615介绍通过按键调节数模芯片TLC5615…

Postman的Cookie鉴权

近期在复习Postman的基础知识&#xff0c;在小破站上跟着百里老师系统复习了一遍&#xff0c;也做了一些笔记&#xff0c;希望可以给大家一点点启发。 一&#xff09;什么是Cookie 定义&#xff1a;存储在客户端的一小段文本信息&#xff0c;格式为键值对的形式. 二&#xff09…

低代码编辑平台后台实现

背景 之前做过一个前端低代码编辑平台&#xff0c;可以实现简单的移动端页面组件拖拽编辑&#xff1a; https://github.com/li-car-fei/react-visual-design 最近基于C的oatpp框架实现了一下后台。使用oatpp框架做web后台开发时&#xff0c;发现按照官方的示例使用的话&#…

氢原子波函数等概率面的绘制

氢原子波函数等概率面的绘制 归一化后的氢原子波函数

高浓度白酒废水处理需要哪些设备

高浓度白酒废水处理需要的设备包括预处理设备、生物反应器、二级处理设备、消毒装置等。 预处理设备&#xff1a;包括格栅、筛网等&#xff0c;用于去除污水中的大颗粒物和杂质。生物反应器&#xff1a;用于进行生物反应&#xff0c;去除污水中的有机物和氨氮等污染物。二级处…

基于平衡优化器算法优化概率神经网络PNN的分类预测 - 附代码

基于平衡优化器算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于平衡优化器算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于平衡优化器优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针…