Linux驱动中已经将led驱动作为一个子系统来实现了,针对Tiny210采用通用IO口来控制led的情况,linux采用platform驱动来实现led子系统,因此我们可以通过led子系统来了解一下platform驱动的框架结构和驱动移植过程应该注意的地方。
首先,我们应该找到通用IO口驱动led的platform驱动代码的位置:drivers/leds/leds-gpio.c,如图26:
图26
根据platform驱动和设备的匹配原则,我们找到driver对应的name为”leds-gpio”,如图27:
图27
其次,我们需要在板级文件(arch/arm/mach-s5pv210/mach-mini210.c)中添加一项platform device,如下:
static struct gpio_led gpio_leds[] = {
{
.name = "led1",
.gpio = S5PV210_GPJ2(0),
.active_low = 1,
.default_state = LEDS_GPIO_DEFSTATE_OFF,
.default_trigger = "heartbeat",
},
{
.name = "led2",
.gpio = S5PV210_GPJ2(1),
.active_low = 1,
.default_state = LEDS_GPIO_DEFSTATE_OFF,
.default_trigger = "none",
},
{
.name = "led3",
.gpio = S5PV210_GPJ2(2),
.active_low = 1,
.default_state = LEDS_GPIO_DEFSTATE_OFF,
.default_trigger = "none",
},
{
.name = "led4",
.gpio = S5PV210_GPJ2(3),
.active_low = 1,
.default_state = LEDS_GPIO_DEFSTATE_OFF,
.default_trigger = "none",
},
};
static struct gpio_led_platform_data gpio_led_info = {
.leds = gpio_leds,
.num_leds = ARRAY_SIZE(gpio_leds),
};
static struct platform_device s5p_device_leds = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = &gpio_led_info,
},
};
之后需要将s5p_device_leds添加进platform device数组mini210_devices[],还需要添加头文件<linux/leds.h>,之后配置menuconfig可以将其编译为模块mini210_leds.ko。修改之后的板级文件如mach-mini210.c(附件中)。
最后,动态插入leds模块之后我们进入/sys/class/leds/led2,查看trigger的值为none,如图28:
图28
可以使用cat和echo命令修改brightness的值观察led的状态,将brightness的值改为1时,对应的led2点亮,将brightness的值改为0时,对应的led2熄灭。如图29:
图29
文章评论(0条评论)
登录后参与讨论