LED驱动的方式有多种,可以自定义驱动,然后通过/dev/myled 设备文件,来控制led。
也可以通过内核 led驱动架构来控制,通过/sys/leds/myled/ 里面的各种文件来控制。内核还提供了一个非常方便的方法,就是用过leds_gpio驱动来控制LED. 我们只需要配置相关引脚就新了。
步骤如下:
1.添加配置引脚
修改 dev.c 文件 在内核目录/arch/arm/mach-nuc970/ 中。
添加头文件
#include <linux/leds.h> // add by simon for leds_gpio driver
添加引脚配置
#if defined(CONFIG_LEDS_GPIO)
//================leds_gpio add by simon =============
static struct gpio_led gpio_leds[] = {
{
.name = "red",
.gpio = NUC970_PH12,
.default_state = LEDS_GPIO_DEFSTATE_ON, // 默认LED亮
.active_low = 0, // 低电平亮
.default_trigger = "timer", // 触发器
},
};
static struct gpio_led_platform_data gpio_led_info = {
.leds = gpio_leds,
.num_leds = ARRAY_SIZE(gpio_leds),
};
static struct platform_device leds_gpio = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = &gpio_led_info,
//.release = platformdev_release,
},
};
//=====================================================
#endif
2.添加设备文件
把 leds_gpio 设备添加到 static struct platform_device *nuc970_public_dev[] __initdata 这个设备数组中。 系统启动时会自动加载设备。
static struct platform_device *nuc970_public_dev[] __initdata = {
...
#if defined(CONFIG_LEDS_GPIO)
&leds_gpio,
#endif
...
};
3.配置内核
触发器的选择按需所需,timer是1秒周期性亮灭,heartbeat 是 闪2下,闪2下,cpu是按cpu使用率闪烁等。
4.编译
编译并更新内核,可以看到在sys目录下已经有了leds目录了,下面有个red的设备,这个名称和我之前配的相同
5.测试
/sys/devices/platform/leds-gpio/leds/red # echo 1 > brightness
/sys/devices/platform/leds-gpio/leds/red # echo 0 > brightness
/sys/devices/platform/leds-gpio/leds/red # cat trigger
[none] nand-disk mmc0 timer oneshot heartbeat backlight gpio cpu0 default-on transient
/sys/devices/platform/leds-gpio/leds/red # echo oneshot > trigger
/sys/devices/platform/leds-gpio/leds/red # echo heartbeat > trigger