/*************************************************************************
> File Name: led_drv.c
> Author: XXDK
> Email: v.manstein@qq.com
> Created Time: Sun 12 Mar 2017 07:16:54 AM PDT
************************************************************************/
#include<linux/init.h>
#include<linux/module.h>
#include<linux/timer.h>
#include<asm/gpio.h>
#include<mach/iomux-mx6q.h>
#define SABRESD_GPIO_LED4 IMX_GPIO_NR(3, 21)
#define SABRESD_GPIO_LED5 IMX_GPIO_NR(3, 22)
#define SABRESD_GPIO_LED6 IMX_GPIO_NR(3, 23)
// 实例化定时器对象
struct timer_list led_timer;
int test_data = 88;
// 构建led 类型
struct led_resource {
char *name;
int gpio;
int data;
};
// 实例化led对象集群
struct led_resource led_res[] = {
[0] = {
.name = "led4",
.gpio = SABRESD_GPIO_LED4
},
[1] = {
.name = "led5",
.gpio = SABRESD_GPIO_LED5
},
[2] = {
.name = "led6",
.gpio = SABRESD_GPIO_LED6
}
};
// 定时器超时处理方法
static void Led_timer_expires_handle(unsigned long data)
{
int i;
int *pdata = (int *)data;
printk("data is: %d at %s\n", *pdata, __func__);
if(gpio_get_value(led_res[0].gpio)) {
for(i = 0; i < ARRAY_SIZE(led_res); i++)
gpio_set_value(led_res[i].gpio, 0);
}
else if(!gpio_get_value(led_res[0].gpio)) {
for(i = 0; i < ARRAY_SIZE(led_res); i++)
gpio_set_value(led_res[i].gpio, 1);
}
/****************************************************
* 修改定时器超时时间
* 此函数等价于:
* 1. 先删除定时器 del_timer(&led_timer)
* 2. 指定新的超时时间 expires = jiffies + 2*HZ
* 3. 添加注册启动timer add_timer(&led_timer);
****************************************************/
mod_timer(&led_timer, jiffies + msecs_to_jiffies(2000));
}
static int led_timer_init(void)
{
int i;
// 申请 led 的 gpio 资源
for(i = 0; i < ARRAY_SIZE(led_res); i++) {
gpio_request(led_res[i].gpio, led_res[i].name);
gpio_direction_output(led_res[i].gpio, 0);
}
// 初始化定时器对象
init_timer(&led_timer);
// 指定超时时间
led_timer.expires = jiffies + 2*HZ;
// 指定超时处理方法
led_timer.function = Led_timer_expires_handle;
// 给超时处理方法传递参数
led_timer.data = (unsigned long)&test_data;
// 向内核注册并且启动定时器,开始倒计时
add_timer(&led_timer);
return 0;
}
static void led_timer_exit(void)
{
int i;
// 从内核移除定时器对象
del_timer(&led_timer);
// 释放led 的 gpio资源
for(i = 0; i < ARRAY_SIZE(led_res); i++) {
gpio_direction_output(led_res[i].gpio, 0);
gpio_free(led_res[i].gpio);
}
}
module_init(led_timer_init);
module_exit(led_timer_exit);
MODULE_LICENSE("GPL");