linux内核的leds-gpio是使用GPIO控制LED的驱动,只要将板子上LED灯对接的GPIO引脚号进行适当的配置,就能使用这个驱动了,十分方便。网上有很多文章分析这个驱动,就不献丑——或者后面闲时再写写吧。
本文仅本着“实用”的目的,介绍从内核配置到应用实例,以期对leds-gpio驱动有一个整体概念。
一、概述
leds-gpio封装得十分好,只需要提供可正常使用的GPIO即可。另外还具备触发器功能,其实就是控制LED的亮灭(及频率)。比如default-on是点亮LED灯的触发器,没有取消前一直亮着。heartbeat是心跳触发器,经笔者实践,此触发器是快速闪烁2次,然后灭掉,灭掉时间较亮的时间长。timer为定时触发器,即1HZ内亮灭。其它还有如ide硬盘、mmc、CPU触发器,就不一一介绍了。
leds驱动位于drivers/leds目录。leds-gpio驱动名称为“leds-gpio”,驱动文件为drivers/leds/leds-gpio.c。
触发器驱动位于drivers/leds/trigger目录。
二、内核配置
本文基于linux 3.17.1版本内核进行分析。
1 | Device Drivers-> |
从配置中看到,笔者将LED触发器全部编译到内核中。这样方便使用和选择。
三、设备注册及使用
3.1 LED相关结构体
驱动开发者使用gpio_led对LED进行赋值,包括LED名称、GPIO引脚号、灯亮是哪个电平,还有默认状态。gpio_led结构体定义如下:
1 | struct gpio_led { |
另外还要填写gpio_led_platform_data结构体,其定义如下:
1 | struct gpio_led_platform_data { |
一个实例如下:
1 | static struct gpio_led gpio_leds[] = { |
从结构体中知道,系统有2个LED,一个红灯,一个绿灯,都是低电平灯亮。
3.2 LED平台设备
leds-gpio驱动定义如下(drivers/leds/leds-gpio.c):
1 | static struct platform_driver gpio_led_driver = { |
从gpio_led_driver结构体中可以看到驱动名称为leds-gpio。因此要使用这个驱动,必须另外定义一个platform设备,并调用函数platform_device_register注册。本文实例如下:
1 | static struct platform_device leds_gpio = { |
其中name表示设备名称,必须为“leds-gpio”,这样才能匹配并加载成功。最后提一下release成员,在较新的内核中必须对此进行赋值,否则会有错误信息提示: Device 'leds-gpio' does not have a release() function, it is broken and must be fixed.
最后,注册leds设备——建议在板子的GPIO正常工作之后再进行注册。
1 | platform_device_register(&leds_gpio); // 注册leds设备 |
注意,如果是以modules形式动态加载的话,必须要适合的地方如remove函数在卸载leds设备:
1 | platform_device_unregister(&leds_gpio); // 卸载leds设备 |
四、应用实例
LED设备和驱动都正常情况下,系统启动后,会产生/sys/bus/platform/devices/leds-gpio/leds目录,其下分别有red和green两个子目录。可以分别对不同的红色LED和绿色LED做操作。
4.1 亮灭LED
将1或0写入brightness文件即可控制亮灭。 示例如下:
1 | echo 0 > /sys/bus/platform/devices/leds-gpio/leds/green/brightness |
4.1 触发器
直接查看trigger文件,即可知道当前系统支持的触发器,示例:
1 | cat /sys/bus/platform/devices/leds-gpio/leds/red/trigger |
在前面的驱动中注释掉了trigger,所以现在是none。 设置触发器很简单,使用ecoh将需要的触发器名称写入trigger文件即可。注意,写入的字符串一定是trigger文件已经存在的,否则会提示参数非法。写入心跳触发器示例:
1 | echo heartbeat > /sys/bus/platform/devices/leds-gpio/leds/red/trigger |
此时板子上红灯应会闪烁。 再次查看:
1 | cat /sys/bus/platform/devices/leds-gpio/leds/red/trigger |
设置值已经生效了。
参考资源:
1、内核源码官网:https://www.kernel.org
2、内核源码查询:http://lxr.free-electrons.com/source/?v=3.17
李迟 2016.12.8 周四 晚