/*************************************************************************
> 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");
转载请注明原文地址: https://ju.6miu.com/read-37519.html