在用户空间中导出设备文件,通过一个IO控制摄像头cut
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/uaccess.h>
#include <linux/timer.h>
#include <linux/sysfs.h>
#include <linux/kobject.h>
#include <linux/gpio.h>
#define IR_CUT_EN 94
#define IR_CUT_PH 95
#define IR_DAY 0 //白天
#define IR_NIGHT 1 //黑夜
static unsigned int ircut_day_night = IR_DAY;
void ir_disable(void)
{
gpio_set_value(IR_CUT_EN,0);
}
void ir_day(void)
{
gpio_set_value(IR_CUT_EN,1);
gpio_set_value(IR_CUT_PH,1);
msleep(120);
ir_disable();
}
void ir_night(void)
{
gpio_set_value(IR_CUT_EN,1);
gpio_set_value(IR_CUT_PH,0);
msleep(120);
ir_disable();
}
void ircut_ctrl(unsigned int cmd)
{
switch (cmd)
{
case IR_DAY:
ir_day();
break;
case IR_NIGHT:
ir_night();
break;
default:
ir_disable();
break;
}
}
static ssize_t ircut_show(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
{
return sprintf(buf, "%d\n", ircut_day_night);
}
static ssize_t ircut_store(struct kobject *kobj,
struct kobj_attribute *attr,const char *buf, size_t count)
{
int day_night_flg;
sscanf(buf,"%d",&day_night_flg);
if(day_night_flg <0 || day_night_flg >1)
{
return -1;
}
ircut_day_night = day_night_flg;
ircut_ctrl(ircut_day_night);
return count;
}
struct kobj_attribute ircut_attr = __ATTR(ircut_day_night, 0664, ircut_show, ircut_store);
static int __init itcut_init(void)
{
int ret = 0;
ret=gpio_request(IR_CUT_EN,"GPIO2_D6");
if(ret<0)
{
printk("gpio_request fail\n");
goto errr_equest_gpio_ph;
}
gpio_direction_output(IR_CUT_PH,0);
ret=gpio_request(IR_CUT_PH,"GPIO2_D7");
if(ret<0)
{
printk("gpio_request fail\n");
goto errr_equest_gpio_en;
}
gpio_direction_output(IR_CUT_EN,0);
if(sysfs_create_file(kernel_kobj,&ircut_attr.attr))
{
return ret;
}
return 0;
errr_equest_gpio_ph:
gpio_free(IR_CUT_PH);
errr_equest_gpio_en:
gpio_free(IR_CUT_EN);
return ret;
}
static void __exit itcut_exit(void)
{
sysfs_remove_file(kernel_kobj,&ircut_attr.attr);
gpio_free(IR_CUT_EN);
gpio_free(IR_CUT_PH);
}
module_init(itcut_init);
module_exit(itcut_exit);
MODULE_VERSION("0.0.1");
MODULE_AUTHOR("liusan@hanwuji.com");
MODULE_LICENSE("GPL v2");