imx6q内核定时器实现led闪烁

5 篇文章 0 订阅
/*************************************************************************
	> 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");


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值