原创 LED子系统

2014-3-1 12:34 1226 31 31 分类: 消费电子

        Linux驱动中已经将led驱动作为一个子系统来实现了,针对Tiny210采用通用IO口来控制led的情况,linux采用platform驱动来实现led子系统,因此我们可以通过led子系统来了解一下platform驱动的框架结构和驱动移植过程应该注意的地方。

首先,我们应该找到通用IO口驱动led的platform驱动代码的位置:drivers/leds/leds-gpio.c,如图26:

26.jpg

图26

根据platform驱动和设备的匹配原则,我们找到driver对应的name为”leds-gpio”,如图27:

27.jpg

图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.jpg

图28

可以使用cat和echo命令修改brightness的值观察led的状态,将brightness的值改为1时,对应的led2点亮,将brightness的值改为0时,对应的led2熄灭。如图29:

29.jpg

图29

文章评论0条评论)

登录后参与讨论
我要评论
0
31
关闭 站长推荐上一条 /2 下一条