Linux下的led子系统分析(一)

最近工作用到Linux内核中的led框架,所以写几篇文章记录自己学习的知识点以及遇到的问题。这批文章是leds-class.txt一文的翻译;文件地址如下:Documentation\leds\leds-class.txt。

如果您正在阅读本文并准备实现键盘的LED灯,则这些功能可以由输入子系统处理,并不需要使用led子系统来实现。

led子系统的实现很简单,允许从用户空间控制led灯。其实,这个"led灯"并不一定是真指的led灯,可以控制GPIO的电平等。对led的控制出现在/sys/class/leds/目录中。led的最大亮度在max_brightness文件中定义。"brightness"文件用来设置led的亮度(取值0-max_brightness)。大多数led硬件不可以支持调节亮度,因此只需通过往"brightness"文件中写入非零值即可打开led灯。

该led类(leds_class)还引入了led触发器的概念。触发器是基于内核的led事件源来触发。触发器可以是简单的也可以是复杂的。简单的触发器是不可配置的,旨在以最少的代码插入现有的子系统。例如ide-disk,nand-disk和sharpsl-charge触发器,禁用led触发器后,代码将被优化掉。

所有led均可使用的复杂触发器触发led的特定参数,并可在每个led的基础上工作。定时器触发器就是一个例子,定时器触发器会定期改变LED_OFF和当前亮度设置之间的LED亮度。"on"和"off"时间可以通过/sys/class/leds/<device>/delay_{on/off}指定,以毫秒为单位。您可以独立于定时器触发器更改led的亮度值。但是,如果将亮度值设置为LED_OFF,定时器触发器将被自动禁用。

您可以通过与IO调度程序类似的方式更改触发器(通过/sys/class/leds/<device>/trigger)。一旦选择了触发器,触发器特定调试文件将会出现在/sys/class/leds/<device>目录中。

设计理念:

led子系统的基本设计理念是简单的,led是简单的设备,目的是保持少量代码提供尽可能多的功能。当增加功能时请记住这一点。

led设备命名:

目前的形式是:"devicename:colour:function"

已经要求将诸如颜色led属性导出为单独的led属性。作为一个不会产生太多开销的解决方案,我建议这些成为设备名称的一部分。如果需要,上面的命名方案可以进一步增加属性的范围。如果名称的某部分不适用,请将该部分留空。

硬件加速led闪烁:

某些LED可以编程为闪烁形式而无需与CPU交互。要支持此功能,led驱动程序必须实现blink_set()函数(请参阅<linux/leds.h>)。但是,要让led闪烁起来,最好使用API函数led_blink_set(),因为它会在必要时检查并实现软件回退。

要关闭led闪烁,请使用API函数led_brightness_set(),因为其不仅可以设置LED亮度,还可以停止闪烁所需的软件定时器。

如果调用blink_set()函数时,传入的delay_on和delay_off参数都为0,则驱动程序选择用户友好的闪烁值。在这种情况下,驱动程序应通过delay_on和delay_off参数将所选值返回给leds子系统。

使用brightness_set()回调函数将亮度设置为零就会完全关闭led并取消之前设定的硬件闪烁功能(如果有)。

已知的问题:

led触发器核心代码不是模块,因为简单的触发器功能会导致噩梦般的依赖性问题。与触发器功能带来的好处相比,我认为这是一个小问题。LED子系统的其余部分可以是模块化的。

未来发展:

目前,无法专门为单个LED创建触发器。在大多情况下,触发器只能映射到特定的led。led子系统提供的触发器的添加应涵盖此选项,并且可以在不破坏当前接口的情况下添加。

猜你喜欢

转载自blog.csdn.net/caihaitao2000/article/details/82728620