Android系统--灯光系统驱动编写

来源:互联网 发布:二级建造师考试软件 编辑:程序博客网 时间:2024/06/10 03:51

Android系统开发--Android灯光系统tiny4412_led_class驱动编写

框架分析

  • led_classdev_4412结构体

  • 创建led_classdev_4412结构体

  • 分配结构体空间

struct led_classdev_4412 {    struct led_classdev cdev;    int gpio;};
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 */    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;    struct list_head     trig_list;    void            *trigger_data;#endif};
 led_devs = kzalloc(sizeof(struct led_classdev_4412) * sizeof(led_gpios)/sizeof(led_gpios[0]), GFP_KERNEL);
  • 设置led_classdev_4412中属性,并注册结构体--led_classdev_register

  • led_classdev_4412属性如下:

  1. led_cdev->max_brightness

  2. led_cdev->brightness_set

  3. led_cdev->flags

  4. led_cdev->brightness

  5. led_cdev->name

实现代码如下:

struct led_desc { int gpio; char *name;};static struct led_desc led_gpios[] = { {EXYNOS4212_GPM4(0), "led1"}, {EXYNOS4212_GPM4(1), "led2"}, {EXYNOS4212_GPM4(2), "led3"}, {EXYNOS4212_GPM4(3), "led4"},};
for (i = 0; i < sizeof(led_gpios)/sizeof(led_gpios[0]); i++) {     s3c_gpio_cfgpin(led_gpios[i].gpio, S3C_GPIO_OUTPUT);     gpio_set_value(led_gpios[i].gpio, 1);               //设置为LED_OFF     led_devs[i].cdev.max_brightness = LED_FULL;     led_devs[i].cdev.brightness_set = brightness_set_4412;     led_devs[i].cdev.flags = LED_CORE_SUSPENDRESUME;     led_devs[i].cdev.brightness = LED_OFF;     led_devs[i].cdev.name = led_gpios[i].name;          //设置为对应的引脚设备名     led_devs[i].gpio = led_gpios[i].gpio;               //记录对应引脚                     /* 3. led_classdev_register */     ret = led_classdev_register(NULL, &led_devs[i].cdev);     /*注册失败之后,将之前注册的设备注销,并且释放空间*/     if (ret) {         i--;     while (i >= 0) {             led_classdev_unregister(&led_devs[i].cdev);             i--;         }     kfree(led_devs);     return -EIO;     } } return 0;}



0 0