继续上次文章搭建完RIoTboard开发环境后,首先熟悉了板子上的GPIO资源,最优先的当然是LED指示灯,大家已经习惯将流水灯作为驱动开发的入门操作。首先分析RIoTboard的board初始化代码,找到Board-mx6q-riot.c文件,然后查找相关的LED初始化操作
有如下简单分析步骤:
1.LED结构体: static struct gpio_led imx6q_gpio_leds[] = { { .name ="sys_led", .default_trigger = "heartbeat", .gpio =RIOT_SYS_LED, .active_low = true, }, { .name ="user_led", .gpio =RIOT_USER_LED, .active_low = true, }, }; 由上述结构体定义得知,RIOTboard定义了两个LED指示灯,一个是sys_led,作用是系统心跳指示,其实大家看到板子上D46的闪烁也正是类似心跳的闪烁方式,另一个是user_led,这个是定义为RIOT板子上用户可以操作的LED。
2.定义platform设备:
static struct platform_device imx6q_gpio_led_device = { .name = "leds-gpio", .id = -1, .num_resources = 0, .dev = { .platform_data= &imx6q_gpio_leds_data, } };
由上述代码看出,系统定义了一个名字为leds-gpio的platform设备,定义了之后就是设备注册函数:
static void __init imx6q_add_device_gpio_leds(void) { platform_device_register(&imx6q_gpio_led_device); } 由上述代码可以看出RIOTboard针对LED做了一个平台设备驱动,于是我们去系统中找相关的设备驱动文件,到路径
/sys/bus/platform/drivers下找到设备驱动文件leds-gpio。
进入这个文件夹,最后大家进入到这个路径: /sys/bus/platform/drivers/leds-gpio/leds-gpio/leds/user_led 这个路径下有个brightness,然后就可以通过写brightness来控制user_led的亮灭: 亮操作: echo 1 > brightness 这时候大家可以看到板子上的D45灯已经亮了
灭操作: echo 0 > brightness D45 灯灭就灭了。 其实这个地方的LED是大家学习linux驱动的很好的入口点,简单而且典型。 后续再继续分析LED的platform设备和驱动相关代码,这次时间紧就先到这儿了。 |