首页 > 系统相关 >21 Linux 自带的LED驱动

21 Linux 自带的LED驱动

时间:2023-09-07 20:44:36浏览次数:45  
标签:leds LED 21 Linux driver platform linux gpio

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

标签:leds,LED,21,Linux,driver,platform,linux,gpio
From: https://www.cnblogs.com/toutiegongzhu/p/17685512.html

相关文章

  • qt程序调用cuda-11.7,cmake编译时,提示:"CMakeCUDACompilerId.cu" failed. Compiler:
    报错显示:Running/home/wc/software/cmake-3.26.3-linux-x86_64/bin/cmake/home/wc/work/junke_src/missile-sim'-GCodeBlocks-UnixMakefiles'in/home/wc/work/junke_src/build/debug.CMakeErrorat/home/wc/software/cmake-3.26.3-linux-x86_64/share/cmak......
  • linux c语言设置系统时间
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<sys/time.h>#include<unistd.h>voidmain(){printf("beforetimeset");fflush(stdout);system("date");system("hwcl......
  • 执行python脚本报错:case by sslerror(sslcertVerificationerror(1,ssl:vertificate_ve
    【现象】  使用python编写了一个请求,报错ssl证书过期问题【解决办法】   requests.packages.urllib3.disable_warnings()  r=requests.post(service_url,data=payload,headers=self.headers,verify=False)参考链接:https://www.cnblogs.com/sea-stream/p/14......
  • Linux下查看某一进程所占用内存的方法
    Linux下查看某一进程所占用内存的方法 Linux下查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如 ps -ef| grep kafka 可以看到kafka这个程序的进程id  可以看到是2913,现在可以使用如下命令查看内存:top-p2913  这样可以动态实时的看到CPU和内存......
  • @Scheduled注解与参数
    基本参数用法@Scheduled由Spring定义,用于将方法设置为调度任务。如:定时执行一次或定时轮询执行一段代码)参数详解1、fixedDelay上一次任务执行完毕时间点之后多长时间再执行,任务的执行要等上一个任务执行结束。@Scheduled(fixedDelay=60*60*1000)  //每隔1小时执行2、fixedRate......
  • Linux驱动-I2C子系统基本分析
    第一:Linux中I2C驱动框架分析I2C核心(i2c_core)I2C核心维护了i2c_bus结构体,提供了I2C总线驱动和设备驱动的注册、注销方法,维护了I2C总线的驱动、设备链表,实现了设备、驱动的匹配探测。此部分代码由Linux内核提供。I2C总线驱动I2C总线驱动维护了I2C适配器数据结构(i2c_adapter)和适配器的......
  • @supermap/iclient-leaflet使用tiledMapLayer报错
    使用leaflet加载超图的时候有时候超图无法加载有时候报如下错误因为手上有好几个项目都在使用leaflet但是同样都使用@supermap/iclient-leaflet(版本11.1.0-a)加载超图,有的项目可行,有的不可行最后打开项目根目录下node_modules里查看@supermap文件夹里的iclient-leafl......
  • Linux速查备忘手册
    速查手册网盘文档PDF资料:链接:https://pan.baidu.com/s/111rqKfPaAiOHSHDo1SnckA  提取码:mhkv 1、  2、 3、   4、  5、  6、  7、  8、   ......
  • 【ROS2机器人入门到实战】I2C通信实验-点亮OLED
    6.I2C通信实验-点亮OLED写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn你好,我是爱吃鱼香ROS的小鱼。本节我们就尝试直接使......
  • linux的监控项
    #内存监控cat/proc/meminfo#内核线程、虚拟内存、磁盘、陷阱和CPU活动的统计信息vmstat12|tail-n1#cpu监控cat/proc/cpuinfo#负载均衡[root@localhost~]#cat/proc/loadavg0.000.010.051/25218819print"系统5分钟前的平均负载:",loadavgs[0]print"系......