imx6q工作队列实现led闪烁

LED驱动与delayed_work
/*************************************************************************
	> File Name: led_drv.c
	> Author: XXDK
	> Email: v.manstein@qq.com 
	> Created Time: Sun 12 Mar 2017 06:42:42 AM PDT
 ************************************************************************/
// led + delayed_work 

#include<linux/init.h>
#include<linux/module.h>
#include<asm/gpio.h>
#include<mach/iomux-mx6q.h>
#include<linux/fs.h>
#include<linux/device.h>
#include<linux/cdev.h>
#include<linux/uaccess.h>
// led对应的gpio
#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)
#define LED_ON	1
#define LED_OFF 0

// 实例化delayed_work 类的对象
struct delayed_work led_dwork;
// 定义led_resource 类型
struct led_resource {
	int gpio;
	char *name;
	int data;
};

static struct led_resource led_res[] = {
	[0] = {
		.gpio = SABRESD_GPIO_LED4,
		.name = "xxdk_led4"
	},
	[1] = {
		.gpio = SABRESD_GPIO_LED5,
		.name = "xxdk_led5"
	},
	[2] = {
		.gpio = SABRESD_GPIO_LED6,
		.name = "xxdk_led6"
	}
};

static void led_dwork_func(struct delayed_work* dwork)
{
	int i;

	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);
	}
	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, 0);
	}
	//2秒后 再次登记,形成循环
	schedule_delayed_work(&led_dwork, 2*HZ);
}

static int led_init(void)
{
	int i;

	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);
	}
	// 初始化delayed_work 对象 led_dwork 指定到时执行的函数
	INIT_DELAYED_WORK(&led_dwork, led_dwork_func);
	// 2秒后登记,登记完成后,cpu在适当的时刻执行对应的函数
	schedule_delayed_work(&led_dwork, 2*HZ);

	return 0;
}

static void led_exit(void)
{
	int i;

	for(i = 0; i<ARRAY_SIZE(led_res); i++) {
		gpio_direction_output(led_res[i].gpio, 0);
		gpio_free(led_res[i].gpio);
	}
	cancel_delayed_work(&led_dwork);
}

module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值