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

📄 cpia2_v4l.c

📁 V4l driver for DVB HD
💻 C
📖 第 1 页 / 共 4 页
字号:
	buf->timestamp = cam->buffers[buf->index].timestamp;	buf->sequence = cam->buffers[buf->index].seq;	buf->m.offset = cam->buffers[buf->index].data - cam->frame_buffer;	buf->length = cam->frame_size;	buf->input = 0;	buf->reserved = 0;	memset(&buf->timecode, 0, sizeof(buf->timecode));	DBG("DQBUF #%d status:%d seq:%d length:%d\n", buf->index,	    cam->buffers[buf->index].status, buf->sequence, buf->bytesused);	return 0;}/****************************************************************************** * *  cpia2_ioctl * *****************************************************************************/static int cpia2_do_ioctl(struct inode *inode, struct file *file,			  unsigned int ioctl_nr, void *arg){	struct video_device *dev = video_devdata(file);	struct camera_data *cam = video_get_drvdata(dev);	int retval = 0;	if (!cam)		return -ENOTTY;	/* make this _really_ smp-safe */	if (mutex_lock_interruptible(&cam->busy_lock))		return -ERESTARTSYS;	if (!cam->present) {		mutex_unlock(&cam->busy_lock);		return -ENODEV;	}	/* Priority check */	switch (ioctl_nr) {	case VIDIOCSWIN:	case VIDIOCMCAPTURE:	case VIDIOC_S_FMT:	{		struct cpia2_fh *fh = file->private_data;		retval = v4l2_prio_check(&cam->prio, &fh->prio);		if(retval) {			mutex_unlock(&cam->busy_lock);			return retval;		}		break;	}	case VIDIOCGMBUF:	case VIDIOCSYNC:	{		struct cpia2_fh *fh = file->private_data;		if(fh->prio != V4L2_PRIORITY_RECORD) {			mutex_unlock(&cam->busy_lock);			return -EBUSY;		}		break;	}	default:		break;	}	switch (ioctl_nr) {	case VIDIOCGCAP:	/* query capabilities */		retval = ioctl_cap_query(arg, cam);		break;	case VIDIOCGCHAN:	/* get video source - we are a camera, nothing else */		retval = ioctl_get_channel(arg);		break;	case VIDIOCSCHAN:	/* set video source - we are a camera, nothing else */		retval = ioctl_set_channel(arg);		break;	case VIDIOCGPICT:	/* image properties */		memcpy(arg, &cam->vp, sizeof(struct video_picture));		break;	case VIDIOCSPICT:		retval = ioctl_set_image_prop(arg, cam);		break;	case VIDIOCGWIN:	/* get/set capture window */		memcpy(arg, &cam->vw, sizeof(struct video_window));		break;	case VIDIOCSWIN:		retval = ioctl_set_window_size(arg, cam, file->private_data);		break;	case VIDIOCGMBUF:	/* mmap interface */		retval = ioctl_get_mbuf(arg, cam);		break;	case VIDIOCMCAPTURE:		retval = ioctl_mcapture(arg, cam, file->private_data);		break;	case VIDIOCSYNC:		retval = ioctl_sync(arg, cam);		break;		/* pointless to implement overlay with this camera */	case VIDIOCCAPTURE:	case VIDIOCGFBUF:	case VIDIOCSFBUF:	case VIDIOCKEY:		retval = -EINVAL;		break;		/* tuner interface - we have none */	case VIDIOCGTUNER:	case VIDIOCSTUNER:	case VIDIOCGFREQ:	case VIDIOCSFREQ:		retval = -EINVAL;		break;		/* audio interface - we have none */	case VIDIOCGAUDIO:	case VIDIOCSAUDIO:		retval = -EINVAL;		break;	/* CPIA2 extension to Video4Linux API */	case CPIA2_IOC_SET_GPIO:		retval = ioctl_set_gpio(arg, cam);		break;	case VIDIOC_QUERYCAP:		retval = ioctl_querycap(arg,cam);		break;	case VIDIOC_ENUMINPUT:	case VIDIOC_G_INPUT:	case VIDIOC_S_INPUT:		retval = ioctl_input(ioctl_nr, arg,cam);		break;	case VIDIOC_ENUM_FMT:		retval = ioctl_enum_fmt(arg,cam);		break;	case VIDIOC_TRY_FMT:		retval = ioctl_try_fmt(arg,cam);		break;	case VIDIOC_G_FMT:		retval = ioctl_get_fmt(arg,cam);		break;	case VIDIOC_S_FMT:		retval = ioctl_set_fmt(arg,cam,file->private_data);		break;	case VIDIOC_CROPCAP:		retval = ioctl_cropcap(arg,cam);		break;	case VIDIOC_G_CROP:	case VIDIOC_S_CROP:		// TODO: I think cropping can be implemented - SJB		retval = -EINVAL;		break;	case VIDIOC_QUERYCTRL:		retval = ioctl_queryctrl(arg,cam);		break;	case VIDIOC_QUERYMENU:		retval = ioctl_querymenu(arg,cam);		break;	case VIDIOC_G_CTRL:		retval = ioctl_g_ctrl(arg,cam);		break;	case VIDIOC_S_CTRL:		retval = ioctl_s_ctrl(arg,cam);		break;	case VIDIOC_G_JPEGCOMP:		retval = ioctl_g_jpegcomp(arg,cam);		break;	case VIDIOC_S_JPEGCOMP:		retval = ioctl_s_jpegcomp(arg,cam);		break;	case VIDIOC_G_PRIORITY:	{		struct cpia2_fh *fh = file->private_data;		*(enum v4l2_priority*)arg = fh->prio;		break;	}	case VIDIOC_S_PRIORITY:	{		struct cpia2_fh *fh = file->private_data;		enum v4l2_priority prio;		prio = *(enum v4l2_priority*)arg;		if(cam->streaming &&		   prio != fh->prio &&		   fh->prio == V4L2_PRIORITY_RECORD) {			/* Can't drop record priority while streaming */			retval = -EBUSY;		} else if(prio == V4L2_PRIORITY_RECORD &&		   prio != fh->prio &&		   v4l2_prio_max(&cam->prio) == V4L2_PRIORITY_RECORD) {			/* Only one program can record at a time */			retval = -EBUSY;		} else {			retval = v4l2_prio_change(&cam->prio, &fh->prio, prio);		}		break;	}	case VIDIOC_REQBUFS:		retval = ioctl_reqbufs(arg,cam);		break;	case VIDIOC_QUERYBUF:		retval = ioctl_querybuf(arg,cam);		break;	case VIDIOC_QBUF:		retval = ioctl_qbuf(arg,cam);		break;	case VIDIOC_DQBUF:		retval = ioctl_dqbuf(arg,cam,file);		break;	case VIDIOC_STREAMON:	{		int type;		DBG("VIDIOC_STREAMON, streaming=%d\n", cam->streaming);		type = *(int*)arg;		if(!cam->mmapped || type != V4L2_BUF_TYPE_VIDEO_CAPTURE)			retval = -EINVAL;		if(!cam->streaming) {			retval = cpia2_usb_stream_start(cam,					  cam->params.camera_state.stream_mode);		} else {			retval = -EINVAL;		}		break;	}	case VIDIOC_STREAMOFF:	{		int type;		DBG("VIDIOC_STREAMOFF, streaming=%d\n", cam->streaming);		type = *(int*)arg;		if(!cam->mmapped || type != V4L2_BUF_TYPE_VIDEO_CAPTURE)			retval = -EINVAL;		if(cam->streaming) {			retval = cpia2_usb_stream_stop(cam);		} else {			retval = -EINVAL;		}		break;	}	case VIDIOC_ENUMOUTPUT:	case VIDIOC_G_OUTPUT:	case VIDIOC_S_OUTPUT:	case VIDIOC_G_MODULATOR:	case VIDIOC_S_MODULATOR:	case VIDIOC_ENUMAUDIO:	case VIDIOC_G_AUDIO:	case VIDIOC_S_AUDIO:	case VIDIOC_ENUMAUDOUT:	case VIDIOC_G_AUDOUT:	case VIDIOC_S_AUDOUT:	case VIDIOC_ENUMSTD:	case VIDIOC_QUERYSTD:	case VIDIOC_G_STD:	case VIDIOC_S_STD:	case VIDIOC_G_TUNER:	case VIDIOC_S_TUNER:	case VIDIOC_G_FREQUENCY:	case VIDIOC_S_FREQUENCY:	case VIDIOC_OVERLAY:	case VIDIOC_G_FBUF:	case VIDIOC_S_FBUF:	case VIDIOC_G_PARM:	case VIDIOC_S_PARM:		retval = -EINVAL;		break;	default:		retval = -ENOIOCTLCMD;		break;	}	mutex_unlock(&cam->busy_lock);	return retval;}static int cpia2_ioctl(struct inode *inode, struct file *file,		       unsigned int ioctl_nr, unsigned long iarg){	return video_usercopy(inode, file, ioctl_nr, iarg, cpia2_do_ioctl);}/****************************************************************************** * *  cpia2_mmap * *****************************************************************************/static int cpia2_mmap(struct file *file, struct vm_area_struct *area){	int retval;	struct video_device *dev = video_devdata(file);	struct camera_data *cam = video_get_drvdata(dev);	/* Priority check */	struct cpia2_fh *fh = file->private_data;	if(fh->prio != V4L2_PRIORITY_RECORD) {		return -EBUSY;	}	retval = cpia2_remap_buffer(cam, area);	if(!retval)		fh->mmapped = 1;	return retval;}/****************************************************************************** * *  reset_camera_struct_v4l * *  Sets all values to the defaults *****************************************************************************/static void reset_camera_struct_v4l(struct camera_data *cam){	/***	 * Fill in the v4l structures.  video_cap is filled in inside the VIDIOCCAP	 * Ioctl.  Here, just do the window and picture stucts.	 ***/	cam->vp.palette = (u16) VIDEO_PALETTE_RGB24;	/* Is this right? */	cam->vp.brightness = (u16) cam->params.color_params.brightness * 256;	cam->vp.colour = (u16) cam->params.color_params.saturation * 256;	cam->vp.contrast = (u16) cam->params.color_params.contrast * 256;	cam->vw.x = 0;	cam->vw.y = 0;	cam->vw.width = cam->params.roi.width;	cam->vw.height = cam->params.roi.height;	cam->vw.flags = 0;	cam->vw.clipcount = 0;	cam->frame_size = buffer_size;	cam->num_frames = num_buffers;	/* FlickerModes */	cam->params.flicker_control.flicker_mode_req = flicker_mode;	cam->params.flicker_control.mains_frequency = flicker_freq;	/* streamMode */	cam->params.camera_state.stream_mode = alternate;	cam->pixelformat = V4L2_PIX_FMT_JPEG;	v4l2_prio_init(&cam->prio);	return;}/*** * The v4l video device structure initialized for this device ***/static struct file_operations fops_template = {	.owner		= THIS_MODULE,	.open		= cpia2_open,	.release	= cpia2_close,	.read		= cpia2_v4l_read,	.poll		= cpia2_v4l_poll,	.ioctl		= cpia2_ioctl,	.llseek		= no_llseek,	.compat_ioctl	= v4l_compat_ioctl32,	.mmap		= cpia2_mmap,};static struct video_device cpia2_template = {	/* I could not find any place for the old .initialize initializer?? */	.owner=		THIS_MODULE,	.name=		"CPiA2 Camera",	.type=		VID_TYPE_CAPTURE,	.type2 = 	V4L2_CAP_VIDEO_CAPTURE |			V4L2_CAP_STREAMING,	.hardware=	VID_HARDWARE_CPIA2,	.minor=		-1,	.fops=		&fops_template,	.release=	video_device_release,};/****************************************************************************** * *  cpia2_register_camera * *****************************************************************************/int cpia2_register_camera(struct camera_data *cam){	cam->vdev = video_device_alloc();	if(!cam->vdev)		return -ENOMEM;	memcpy(cam->vdev, &cpia2_template, sizeof(cpia2_template));	video_set_drvdata(cam->vdev, cam);	reset_camera_struct_v4l(cam);	/* register v4l device */	if (video_register_device	    (cam->vdev, VFL_TYPE_GRABBER, video_nr) == -1) {		ERR("video_register_device failed\n");		video_device_release(cam->vdev);		return -ENODEV;	}	return 0;}/****************************************************************************** * *  cpia2_unregister_camera * *****************************************************************************/void cpia2_unregister_camera(struct camera_data *cam){	if (!cam->open_count) {		video_unregister_device(cam->vdev);	} else {		LOG("/dev/video%d removed while open, "		    "deferring video_unregister_device\n",		    cam->vdev->minor);	}}/****************************************************************************** * *  check_parameters * *  Make sure that all user-supplied parameters are sensible *****************************************************************************/static void __init check_parameters(void){	if(buffer_size < PAGE_SIZE) {		buffer_size = PAGE_SIZE;		LOG("buffer_size too small, setting to %d\n", buffer_size);	} else if(buffer_size > 1024*1024) {		/* arbitrary upper limiit */		buffer_size = 1024*1024;		LOG("buffer_size ridiculously large, setting to %d\n",		    buffer_size);	} else {		buffer_size += PAGE_SIZE-1;		buffer_size &= ~(PAGE_SIZE-1);	}	if(num_buffers < 1) {		num_buffers = 1;		LOG("num_buffers too small, setting to %d\n", num_buffers);	} else if(num_buffers > VIDEO_MAX_FRAME) {		num_buffers = VIDEO_MAX_FRAME;		LOG("num_buffers too large, setting to %d\n", num_buffers);	}	if(alternate < USBIF_ISO_1 || alternate > USBIF_ISO_6) {		alternate = DEFAULT_ALT;		LOG("alternate specified is invalid, using %d\n", alternate);	}	if (flicker_mode != NEVER_FLICKER && flicker_mode != ANTI_FLICKER_ON) {		flicker_mode = NEVER_FLICKER;		LOG("Flicker mode specified is invalid, using %d\n",		    flicker_mode);	}	if (flicker_freq != FLICKER_50 && flicker_freq != FLICKER_60) {		flicker_freq = FLICKER_60;		LOG("Flicker mode specified is invalid, using %d\n",		    flicker_freq);	}	if(video_nr < -1 || video_nr > 64) {		video_nr = -1;		LOG("invalid video_nr specified, must be -1 to 64\n");	}	DBG("Using %d buffers, each %d bytes, alternate=%d\n",	    num_buffers, buffer_size, alternate);}/************   Module Stuff ***************//****************************************************************************** * * cpia2_init/module_init * *****************************************************************************/static int __init cpia2_init(void){	LOG("%s v%d.%d.%d\n",	    ABOUT, CPIA2_MAJ_VER, CPIA2_MIN_VER, CPIA2_PATCH_VER);	check_parameters();	cpia2_usb_init();	return 0;}/****************************************************************************** * * cpia2_exit/module_exit * *****************************************************************************/static void __exit cpia2_exit(void){	cpia2_usb_cleanup();	schedule_timeout(2 * HZ);}module_init(cpia2_init);module_exit(cpia2_exit);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -