⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 captrue.c

📁 三星s3c2440cpu的视频捕捉程序源代码
💻 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 + -