• 21 Linux 自带的LED驱动


    一、Linux 自带 LED 驱动使能

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

      输入以下命令:

    1. cd linux/atk-mpl/linux/my_linux/linux-5.4.31
    2. make menuconfig

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

    1. → Device Drivers
    2. → LED Support (NEW_LEDS [=y])
    3. →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 文件:

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

    1.2 module_platform_driver 分析

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

    1. static int __init gpio_led_driver_init(void)
    2. {
    3. return platform_driver_register (&(gpio_led_driver));
    4. }
    5. module_init(gpio_led_driver_init);
    6. static void __exit gpio_led_driver_exit(void)
    7. {
    8. platform_driver_unregister (&(gpio_led_driver) );
    9. }
    10. module_exit(gpio_led_driver_exit);

    三、设备树节点编写

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

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

      比如:

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

      ② 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 设备子节点:

      修改完后,输入命令:

    1. cd
    2. cd linux/atk-mpl/linux/my_linux/linux-5.4.31
    3. make dtbs
    4. cd arch/arm/boot/dts/
    5. 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 的打开和关闭。

      输入以下命令来打开:

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

       关闭:

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

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

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

    总结

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

  • 相关阅读:
    大一新生HTML期末作业,网页制作作业——明星介绍易烊千玺网站HTML+CSS
    建筑材料行业采购合同电子化,数商云采购商城系统助力企业采购业务更规范高效
    d的属性效果2
    拷贝assets资源目录下xml文件到sdcard
    腾讯、百度花式布局CRM
    SSM框架-获取容器的方式
    TENSEAL: A LIBRARY FOR ENCRYPTED TENSOR OP- ERATIONS USING HOMOMORPHIC ENCRYPTION 解读
    计算机毕业设计ssm+vue基本微信小程序的一起考研学习系统
    【C语言基础】第02章_变量与进制
    数据库系列:前缀索引和索引长度的取舍
  • 原文地址:https://blog.csdn.net/qq_45475497/article/details/134412466