Android灯光系统-class和HAL

首先分析下如何使用android系统自带的命令去操作单板上的led,可以使用以下命令去验证:

点亮LED及查看亮度
echo 255 > /sys/class/leds/led1/brightness
cat /sys/class/leds/led1/brightness
cat /sys/class/leds/led1/max_brightness

闪烁
echo timer > /sys/class/leds/led1/trigger
echo 100 > /sys/class/leds/led1/delay_on
echo 200 > /sys/class/leds/led1/delay_off

关闭
echo 0 > /sys/class/leds/led1/delay_on

echo 0 > /sys/class/leds/led1/brightness

这里根据源码去分析一下闪烁的过程:

echo timer > /sys/class/leds/led1/trigger  // timer对应 ledtrig-timer.c

led_trigger_store // 1. 从trigger_list找出名为"timer"的trigger
    list_for_each_entry(trig, &trigger_list, next_trig) {
        if (!strcmp(trigger_name, trig->name)) {
            // 2. 调用
            led_trigger_set(led_cdev, trig);
                // 3. 把trigger放入led_classdev的trig_list链表里
                list_add_tail(&led_cdev->trig_list, &trigger->led_cdevs);
                led_cdev->trigger = trigger;
                // 4. 
                trigger->activate(led_cdev);
                   // 5. 对于"timer"
                   timer_trig_activate
                       // 6. 创建2个文件: delay_on, delay_off
                       device_create_file
                       device_create_file
                       led_blink_set // 让LED闪烁
                            led_set_software_blink


        }
    }

echo 100 > /sys/class/leds/led1/delay_on
led_delay_on_store
  state = simple_strtoul(buf, &after, 10);
    led_blink_set  // // 让LED闪烁
    led_cdev->blink_delay_on = state;

echo 200 > /sys/class/leds/led1/delay_off
led_delay_off_store
    state = simple_strtoul(buf, &after, 10);
    led_blink_set // 让LED闪烁
    led_cdev->blink_delay_off = state

编写led_class程序的过程如下:

  1. 分配led_classdev

  2. 设置 :
    led_cdev->max_brightness
    led_cdev->brightness_set
    led_cdev->flags
    led_cdev->brightness
    led_cdev->name

  3. 注册 : led_classdev_register

把 编写好的leds_nanoT3.c 放到drivers/leds
修改 drivers/leds/Makefile:
obj-y += leds_nanoT3.o

然后:make menuconfig

根据Makefile需要添加以下选项
CONFIG_LEDS_CLASS
CONFIG_LEDS_TRIGGERS
CONFIG_LEDS_TRIGGER_TIMER

-> Device Drivers
-> LED Support
[*] LED Class Support
[*] LED Trigger support
<*> LED Timer Trigger

make uImage


按照上面这个流程编写代码如下:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <mach/gpio.h>
#include <linux/miscdevice.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <asm/io.h>
#include <linux/regulator/consumer.h>
#include <linux/delay.h>
#include <linux/types.h>
#include <linux/gpio.h>
#include <linux/leds.h>
#include <linux/init.h>
#include <asm/irq.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/of_gpio.h>
#include <asm/uaccess.h>
#include <linux/slab.h>


/* 自定义一个结构体 */
struct led_classdev_nanoT3{
  struct led_classdev cdev;
  int gpio;
};


static struct led_classdev_nanoT3 *led_devs;

static void brightness_set_nano(struct led_classdev *led_cdev,
          enum led_brightness brightness)
{
  struct led_classdev_nanoT3 *dev = (struct led_classdev_nanoT3 *)led_cdev;

  led_cdev->blink_brightness = brightness;//设置亮度

  //这里只做一个亮和灭的处理
  if(brightness != LED_OFF)
    gpio_set_value(dev->gpio, 0);
  else
    gpio_set_value(dev->gpio, 1);

}

static 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值