led子系统实际是linux编写好的一个led驱动框架.对于驱动开发者来说只需要按照规定填充结构体然后调用api注册驱动,就可以完成一个led驱动的编写,并且这样写的led驱动为上层提供了统一的接口或者称为标准linux接口.方便了应用开发人员也减少了驱动开发人员的工作量.
` 有些led是gpio控制的.有些led是pwm控制,可以控制led的亮度.所以在此基础上又引出了GPIO_LED子系统和GPIO_pwm子系统.当然也可以直接使用led子系统,忽略gpio_pwm子系统和gpio_子系统.
led子系统
led子系统驱动的源码位于dirvers/leds目录下, 可以看到有很多的文件,但是很多是 在led子系统上编写的led驱动,不是led子系统的源码.
ls led- 列出的以led-开头的文件菜式led子系统实现代码.
部分文件的功能如下:
- led-core.c: led抽象功能实现代码.led灯的亮灭, 闪烁,呼吸.
- led-class.c: 调用class_create函数在/sys/class/leds目录创建用户空间控制接口.
- led-triggers.c: led 抽象触发功能实现代码
- led-class-flash.c: 闪烁功能实现
先不看源码,先看下如何编写一个简单的led驱动,仅仅实现亮灭控制.
基于led子系统驱动实现
选一个最简单的led驱动,上源码(kernel/drivers/leds/leds-rb532.c),如下:
/*
* LEDs driver for the "User LED" on Routerboard532
*
* Copyright (C) 2009 Phil Sutter <n0-1@freewrt.org>
*
* Based on leds-cobalt-qube.c by Florian Fainelly and
* rb-diag.c (my own standalone driver for both LED and
* button of Routerboard532).
*/
#include <linux/leds.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <asm/mach-rc32434/gpio.h>
#include <asm/mach-rc32434/rb.h>
static void rb532_led_set(struct led_classdev *cdev,
enum led_brightness brightness)
{
if (brightness)
set_latch_u5(LO_ULED, 0);
else
set_latch_u5(0, LO_ULED);
}
static enum