📄 captrue.c
字号:
/********************************************************
* Name : pictrue captrue driver
* Describe :
* Author :
* Date : 2005-10-15
* Modify :
*******************************************************/
#include <linux/module.h>
#include <linux/config.h>
#include <linux/spinlock.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/tty.h>
#include <linux/mm.h>
#include <linux/signal.h>
#include <linux/init.h>
#include <linux/kbd_ll.h>
#include <linux/delay.h>
#include <linux/random.h>
#include <linux/poll.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#include <linux/kbd_kern.h>
#include <linux/ioport.h>
#include <linux/tqueue.h>
#include <linux/wait.h>
#include <asm/hardware.h>
#include <asm/bitops.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/system.h>
#include <asm/io.h>
/* Some configuration switches are present in the include file... */
#include <asm/hardware/sa1111.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/param.h>
#include <asm/arch/hardware.h>
#define CAPTRUE_MAJOR 55
#define flash_irq IRQ_EINT0
unsigned char in_state;
unsigned long time_f;
wait_queue_head_t read_int;
static int captrue_open(struct inode *node,struct file *fp)
{
// fp->f_flags = O_NBLOCK;
printk("<1>captrue is open.\n");
return 0;
}
static int captrue_release(struct inode *node,struct file *fp)
{
printk("<1>captrue is release.\n");
return 0;
}
static ssize_t captrue_read(struct file *fp,char *buf,size_t count,loff_t *l_t)
{
interruptible_sleep_on(&read_int);
// return -ERESTARTSYS;
if(count > 0)
{
copy_to_user(buf, &in_state, 1);
in_state = 0;
// printk("read return state\n");
return 1;
}
else
return 0;
}
static ssize_t captrue_write(struct file *fp,const char *buf,size_t count,loff_t *l_t)
{
return 0;
}
static int captrue_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)
{
switch (cmd)
{
}
return 0;
}
struct file_operations captrue_fops =
{
read: captrue_read,
write: captrue_write,
ioctl: captrue_ioctl,
open: captrue_open,
release: captrue_release,
};
void gpio_interrupt(int irq,void *dev_id,struct pt_regs *regs)
{
unsigned long j;
disable_irq(flash_irq);
j=jiffies;
if((j - time_f) > 100)//big 1 second
{
time_f = j;
in_state = 1;
wake_up_interruptible(&read_int);
// printk("dhwu test putput. in_state = %d\n",in_state);
}
// printk("time = %ld j = %ld\n",time_f,j);
enable_irq(flash_irq);
return;
}
int init_module(void)
{
int result;
in_state = 0;
time_f = jiffies;
set_external_irq(flash_irq, EXT_RISING_EDGE, GPIO_PULLUP_DIS);
result = request_irq(flash_irq, gpio_interrupt, SA_INTERRUPT,"captrue",NULL);
if (result)
{
printk("unable to get IRQ%d (errno=%d).\n",flash_irq,result);
return result;
}
// result = devfs_register (NULL, "captrue", DEVFS_FL_NONE,
// CAPTRUE_MAJOR, 0,
// S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,
// &captrue_fops, NULL);
result = register_chrdev(CAPTRUE_MAJOR,"captrue",&captrue_fops);
if (0 > result)
{
printk("captrue:can't get major %d.\n",CAPTRUE_MAJOR);
return result;
}
init_waitqueue_head(&read_int);
printk("Init captrue success.\n");
return 0;
}
void cleanup_module(void)
{
free_irq(flash_irq,NULL);
unregister_chrdev(CAPTRUE_MAJOR,"captrue");
printk("Clean up captrue success.\n");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -