目前许多嵌入式板的LED都是通过GPIO连接的。所以在初始化LED之前,必须初始化GPIO。
驱动GPIO其实不用自己写,基本上linux的platform Init部分都已经写好了初始化代码了。
linux 下实现LED 驱动非常方便了,基本上要做的事情就是定义一下LED所在的GPIO针脚。
Linux 下通过框架实现LED 大致过程如下
1、实现框架要求的几个函数
int gpio_request(unsigned gpio, const char *label)
void gpio_free(unsigned gpio)
int gpio_direction_input(unsigned gpio)
int gpio_direction_output(unsigned gpio, int value)
int gpio_get_value(unsigned gpio)
void gpio_set_value(unsigned gpio, int value)
int gpio_to_irq(unsigned gpio)
int irq_to_gpio(unsigned irq)
这几个函数是硬件相关的,具体实现就跟硬件管脚有关了
2、在结构 gpio_led 中定义gpio 的名字,并跟gpio 管脚关联起来,然后在初始时用函数platform_add_devices加到系统中
LED的定义,请参考:
platform_device.h
leds.h
3、使用时对 /sys/class/leds 下的文件接口设置相应的值即可
举个例子,例如有1个LED 灯,需要实现如下功能
亮,灭.
首先实现:
int gpio_request(unsigned gpio, const char *label)
void gpio_free(unsigned gpio)
int gpio_direction_input(unsigned gpio)
int gpio_direction_output(unsigned gpio, int value)
int gpio_get_value(unsigned gpio)
void gpio_set_value(unsigned gpio, int value)
int gpio_to_irq(unsigned gpio)
int irq_to_gpio(unsigned irq)
进行初始化。
我用的平台是IXP425,Gemtek GTWX5715 (Linksys WRV54G).
下边是我关于LED的初始化代码:
//加入对LED的支持
+#include <linux/platform_device.h>
+#include <linux/leds.h>
//#if 0
//开始自定义LED
//函数接口: { .name = "LED名称", .active_low = 1, .gpio =LED所在的GPIO, },
static struct gpio_led user_leds[] = {
{ .name = "wrv54g:Power", .active_low = 1, .gpio = GTWX5715_LED1_GPIO, },
{ .name = "wrv54g:Wireless1", .active_low = 1, .gpio = GTWX5715_LED2_GPIO, },
{ .name = "wrv54g:Wireless2", .active_low = 1, .gpio = GTWX5715_LED3_GPIO, },
{ .name = "wrv54g:Internet", .active_low = 1, .gpio = GTWX5715_LED4_GPIO, },
{ .name = "wrv54g:DMZ", .active_low = 1, .gpio = GTWX5715_LED9_GPIO, },
};
static struct gpio_led_platform_data wrv54g_led_data = {
.num_leds = ARRAY_SIZE(user_leds),
.leds = user_leds,
};
static struct platform_device wrv54g_leds = {
.name = "wrv54g_leds",
.id = -1,
.dev = {
.platform_data = &wrv54g_led_data,
}
};
//#endif
static struct platform_device *gtwx5715_devices[] __initdata = {
>wx5715_uart_device,
>wx5715_flash,
>wx5715_spi_bus,
>wx5715_npeb_device,
>wx5715_npec_device,
//在platform_device 中加入对LED的注册
+ &wrv54g_leds. //LED Device for WRV54G
};
使用方法:
要常亮 echo 1 > /sys/class/leds/wrv54g:Power/brightness
要熄灭 echo 0 > /sys/class/leds/wrv54g:Power/brightness
在openwrt中可以在LUCI下面设置。
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。