首先分析下如何使用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程序的过程如下:
分配led_classdev
设置 :
led_cdev->max_brightness
led_cdev->brightness_set
led_cdev->flags
led_cdev->brightness
led_cdev->name注册 : 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