您的位置:首页 > 运维架构 > Linux

imx6q内核定时器实现led闪烁

2017-03-12 23:04 204 查看
/*************************************************************************
> 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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息