Android Led驱动[Linux Led子系统]
头文件:kernel/include/linux/leds.h
关于led的相关定义如下:
enum led_brightness {//定义了led的亮度控制值
LED_OFF = 0,//不亮
LED_HALF = 127,//半亮
LED_FULL = 255,//全亮
};
剩下的比较重要的结构就两个,分别是led_classdev与led_trigger,前者用来描述led,后者用来描述触发器,led设备可以与触发器进行关联,这样就可以用于触发器来控制led了。下面详细看一下。
struct led_classdev {
const char *name;
int brightness;
int max_brightness;
int flags;
/* Lower 16 bits reflect status */
#define LED_SUSPENDED (1 << 0)
/* Upper 16 bits reflect control information */
#define LED_CORE_SUSPENDRESUME (1 << 16)
/* Set LED brightness level */
/* Must not sleep, use a workqueue if needed */
void (*brightness_set)(struct led_classdev *led_cdev,
enum led_brightness brightness);//亮度设置函数
/* Get LED brightness level */
enum led_brightness (*brightness_get)(struct led_classdev *led_cdev);//获取亮度
/*
* Activate hardware accelerated blink, delays are in milliseconds
* and if both are zero then a sensible default should be chosen.
* The call should adjust the timings in that case and if it can't
* match the values specified exactly.
* Deactivate blinking again when the brightness is set to a fixed
* value via the brightness_set() callback.
*/
int (*blink_set)(struct led_classdev *led_cdev,
unsigned long *delay_on,
unsigned long *delay_off);//闪烁设置
struct device *dev;
struct list_head node; /* LED Device list *///led链表
const char *default_trigger; /* Trigger to use *///默认使用的触发器,可以看到,这里与触发器进行了关联
unsigned long blink_delay_on, blink_delay_off;//控制闪烁用的属性值
struct timer_list blink_timer;
int blink_brightness;
#ifdef CONFIG_LEDS_TRIGGERS
/* Protects the trigger data below */
struct rw_semaphore trigger_lock;//保护触发器数据的锁
struct led_trigger *trigger;//如果led配置了触发器,就会有这个成员
struct list_head trig_list;
void *trigger_data;
#endif
};
整体上,led设备的成员包括了名字、亮度、最大亮度、亮度设置函数、亮度获取函数、闪烁控制函数、一个device指针、一个list_head节点、默认使用的触发器等,如果编译或者内核配置的时候打开了CONFIG_LEDS_TRIGGERS,则还会有触发器的一些成员。
触发器的定义如下:
struct led_trigger {
/* Trigger Properties */
const char *name;//名字
void (*activate)(struct led_classdev *led_cdev);//激活函数
void (*deactivate)(struct led_classdev *led_cdev);//解激活函数
/* LEDs under control by this trigger (for simple triggers) */
rwlock_t leddev_list_lock;//锁
struct list_head led_cdevs;
/* Link to next registered trigger */
struct list_head next_trig;
};
总体上,如果需要使用触发器来控制led,配置内核时需要打开CONFIG_LEDS_TRIGGERS,这样,触发器会成为led_classdev的成员,在使用led_classdev的使用就可以使用触发器来控制led了。
好了,先到这里,后续再来看看如何使用触发器来控制led。