Android Led驱动[Linux Led子系统]

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值