亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mx27_v4l2_capture.c

?? LINUX下的ov2640驅(qū)動(dòng)程序
?? C
?? 第 1 頁 / 共 4 頁
字號(hào):
		 */	case VIDIOC_S_FBUF:{			struct v4l2_framebuffer *fb = arg;			cam->v4l2_fb.flags = fb->flags;			cam->v4l2_fb.fmt.pixelformat = fb->fmt.pixelformat;			break;		}	case VIDIOC_G_PARM:{			struct v4l2_streamparm *parm = arg;			if (parm->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {				pr_debug("VIDIOC_G_PARM invalid type\n");				retval = -EINVAL;				break;			}			parm->parm.capture = cam->streamparm.parm.capture;			break;		}	case VIDIOC_S_PARM:{			struct v4l2_streamparm *parm = arg;			retval = mxc_v4l2_s_param(cam, parm);			break;		}		/* linux v4l2 bug, kernel c0485619 user c0405619 */	case VIDIOC_ENUMSTD:{			struct v4l2_standard *e = arg;			*e = cam->standard;			pr_debug("VIDIOC_ENUMSTD call\n");			retval = 0;			break;		}	case VIDIOC_G_STD:{			v4l2_std_id *e = arg;			*e = cam->standard.id;			break;		}	case VIDIOC_S_STD:{			break;		}	case VIDIOC_ENUMOUTPUT:		{			struct v4l2_output *output = arg;			if (output->index >= num_registered_fb) {				retval = -EINVAL;				break;			}			strncpy(output->name,				registered_fb[output->index]->fix.id, 31);			output->type = V4L2_OUTPUT_TYPE_ANALOG;			output->audioset = 0;			output->modulator = 0;			output->std = V4L2_STD_UNKNOWN;			break;		}	case VIDIOC_G_OUTPUT:		{			int *p_output_num = arg;			*p_output_num = cam->output;			break;		}	case VIDIOC_S_OUTPUT:		{			int *p_output_num = arg;			if (*p_output_num >= num_registered_fb) {				retval = -EINVAL;				break;			}			cam->output = *p_output_num;			break;		}	case VIDIOC_G_INPUT:		{			int *p_input_index = arg;			retval = mxc_get_video_input(cam);			if (0 == retval)				*p_input_index = 1;			else				*p_input_index = -ENODEV;			break;		}	case VIDIOC_ENUM_FMT:	case VIDIOC_TRY_FMT:	case VIDIOC_QUERYCTRL:	case VIDIOC_ENUMINPUT:	case VIDIOC_S_INPUT:	case VIDIOC_G_TUNER:	case VIDIOC_S_TUNER:	case VIDIOC_G_FREQUENCY:	case VIDIOC_S_FREQUENCY:	default:		retval = -EINVAL;		break;	}	up(&cam->busy_lock);	return retval;}/* * V4L interface - ioctl function * * @return  None */static intmxc_v4l_ioctl(struct inode *inode, struct file *file,	      unsigned int cmd, unsigned long arg){	return video_usercopy(inode, file, cmd, arg, mxc_v4l_do_ioctl);}/*! * V4L interface - mmap function * * @param file        structure file * * * @param vma         structure vm_area_struct * * * @return status     0 Success, EINTR busy lock error, ENOBUFS remap_page error */static int mxc_mmap(struct file *file, struct vm_area_struct *vma){	struct video_device *dev = video_devdata(file);	unsigned long size;	int res = 0;	cam_data *cam = dev->priv;	pr_debug("pgoff=0x%lx, start=0x%lx, end=0x%lx\n",		 vma->vm_pgoff, vma->vm_start, vma->vm_end);	/* make this _really_ smp-safe */	if (down_interruptible(&cam->busy_lock))		return -EINTR;	size = vma->vm_end - vma->vm_start;	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);	if (remap_pfn_range(vma, vma->vm_start,			    vma->vm_pgoff, size, vma->vm_page_prot)) {		pr_debug("mxc_mmap: remap_pfn_range failed\n");		res = -ENOBUFS;		goto mxc_mmap_exit;	}	vma->vm_flags &= ~VM_IO;	/* using shared anonymous pages */      mxc_mmap_exit:	up(&cam->busy_lock);	return res;}/*! * V4L interface - poll function * * @param file       structure file * * * @param wait       structure poll_table * * * @return  status   POLLIN | POLLRDNORM */static unsigned int mxc_poll(struct file *file, poll_table * wait){	struct video_device *dev = video_devdata(file);	cam_data *cam = dev->priv;	wait_queue_head_t *queue = NULL;	int res = POLLIN | POLLRDNORM;	if (down_interruptible(&cam->busy_lock))		return -EINTR;	queue = &cam->enc_queue;	poll_wait(file, queue, wait);	up(&cam->busy_lock);	return res;}static structfile_operations mxc_v4l_fops = {	.owner = THIS_MODULE,	.open = mxc_v4l_open,	.release = mxc_v4l_close,	.read = mxc_v4l_read,	.ioctl = mxc_v4l_ioctl,	.mmap = mxc_mmap,	.poll = mxc_poll,};static struct video_device mxc_v4l_template = {	.owner = THIS_MODULE,	.name = "Mxc Camera",	.type = 0,	.type2 = VID_TYPE_CAPTURE,	.hardware = 0,	.fops = &mxc_v4l_fops,	.release = video_device_release,};static void camera_platform_release(struct device *device){}/*! Device Definition for Mt9v111 devices */static struct platform_device mxc_v4l2_devices = {	.name = "mxc_v4l2",	.dev = {		.release = camera_platform_release,		},	.id = 0,};extern struct camera_sensor camera_sensor_if;/*!* Camera V4l2 callback function.** @return status*/static void camera_callback(u32 mask, void *dev){	struct mxc_v4l_frame *done_frame;	struct mxc_v4l_frame *ready_frame;	cam_data *cam = (cam_data *) dev;	if (cam == NULL)		return;	if (mask == 1) {		cam->overflow = 1;	}	if (list_empty(&cam->working_q)) {		if (empty_wq_cnt == 0) {			printk(KERN_ERR			       "camera_callback: working queue empty %d\n",			       empty_wq_cnt);		}		empty_wq_cnt++;		if (list_empty(&cam->ready_q)) {			cam->skip_frame++;		} else {			ready_frame =			    list_entry(cam->ready_q.next, struct mxc_v4l_frame,				       queue);			list_del(cam->ready_q.next);			list_add_tail(&ready_frame->queue, &cam->working_q);			cam->enc_update_eba(ready_frame->paddress,					    &cam->ping_pong_csi);		}		return;	}	done_frame =	    list_entry(cam->working_q.next, struct mxc_v4l_frame, queue);	if (done_frame->buffer.flags & V4L2_BUF_FLAG_QUEUED) {		done_frame->buffer.flags |= V4L2_BUF_FLAG_DONE;		done_frame->buffer.flags &= ~V4L2_BUF_FLAG_QUEUED;		if (list_empty(&cam->ready_q)) {			cam->skip_frame++;		} else {			ready_frame =			    list_entry(cam->ready_q.next, struct mxc_v4l_frame,				       queue);			list_del(cam->ready_q.next);			list_add_tail(&ready_frame->queue, &cam->working_q);			cam->enc_update_eba(ready_frame->paddress,					    &cam->ping_pong_csi);		}		/* Added to the done queue */		list_del(cam->working_q.next);		list_add_tail(&done_frame->queue, &cam->done_q);		/* Wake up the queue */		cam->enc_counter++;		wake_up_interruptible(&cam->enc_queue);	} else {		printk(KERN_ERR "camera_callback :buffer not queued\n");	}}/*! * initialize cam_data structure * * @param cam      structure cam_data * * * @return status  0 Success */static void init_camera_struct(cam_data * cam){	int i;	/* Default everything to 0 */	memset(cam, 0, sizeof(cam_data));	init_MUTEX(&cam->param_lock);	init_MUTEX(&cam->busy_lock);	cam->video_dev = video_device_alloc();	if (cam->video_dev == NULL)		return;	*(cam->video_dev) = mxc_v4l_template;	video_set_drvdata(cam->video_dev, cam);	dev_set_drvdata(&mxc_v4l2_devices.dev, (void *)cam);	cam->video_dev->minor = -1;	for (i = 0; i < FRAME_NUM; i++) {		cam->frame[i].width = 0;		cam->frame[i].height = 0;		cam->frame[i].paddress = 0;	}	init_waitqueue_head(&cam->enc_queue);	init_waitqueue_head(&cam->still_queue);	/* setup cropping */	cam->crop_bounds.left = 0;	cam->crop_bounds.width = 800;	cam->crop_bounds.top = 0;	cam->crop_bounds.height = 600;	cam->crop_current = cam->crop_defrect = cam->crop_bounds;	cam->streamparm.parm.capture.capturemode = 0;	cam->standard.index = 0;	cam->standard.id = V4L2_STD_UNKNOWN;	cam->standard.frameperiod.denominator = 30;	cam->standard.frameperiod.numerator = 1;	cam->standard.framelines = 600;	cam->streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;	cam->streamparm.parm.capture.timeperframe = cam->standard.frameperiod;	cam->streamparm.parm.capture.capability = V4L2_CAP_TIMEPERFRAME;	cam->overlay_on = false;	cam->capture_on = false;	cam->skip_frame = 0;	cam->v4l2_fb.capability = V4L2_FBUF_CAP_EXTERNOVERLAY;	cam->v4l2_fb.flags = V4L2_FBUF_FLAG_PRIMARY;	cam->v2f.fmt.pix.sizeimage = 352 * 288 * 3 / 2;	cam->v2f.fmt.pix.bytesperline = 288 * 3 / 2;	cam->v2f.fmt.pix.width = 288;	cam->v2f.fmt.pix.height = 352;	cam->v2f.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;	cam->win.w.width = 160;	cam->win.w.height = 160;	cam->win.w.left = 0;	cam->win.w.top = 0;	cam->cam_sensor = &camera_sensor_if;	cam->enc_callback = camera_callback;	init_waitqueue_head(&cam->power_queue);	cam->int_lock = SPIN_LOCK_UNLOCKED;	spin_lock_init(&cam->int_lock);}extern void gpio_sensor_active(void);extern void gpio_sensor_inactive(void);/*! * camera_power function *    Turn Sensor power On/Off * * @param       cameraOn      true to turn camera on, otherwise shut down * * @return status */static u8 camera_power(bool cameraOn){	if (cameraOn == true) {		gpio_sensor_active();		csi_enable_mclk(csi_mclk_flag_backup, true, true);	} else {		csi_mclk_flag_backup = csi_read_mclk_flag();		csi_enable_mclk(csi_mclk_flag_backup, false, false);		gpio_sensor_inactive();	}	return 0;}/*! * This function is called to put the sensor in a low power state. Refer to the * document driver-model/driver.txt in the kernel source tree for more * information. * * @param   pdev  the device structure used to give information on which I2C *                to suspend * @param   state the power state the device is entering * * @return  The function returns 0 on success and -1 on failure. */static int mxc_v4l2_suspend(struct platform_device *pdev, pm_message_t state){	cam_data *cam = platform_get_drvdata(pdev);	if (cam == NULL) {		return -1;	}	cam->low_power = true;	if (cam->overlay_on == true)		stop_preview(cam);	if ((cam->capture_on == true) && cam->enc_disable) {		cam->enc_disable(cam);	}	camera_power(false);	return 0;}/*! * This function is called to bring the sensor back from a low power state.Refer * to the document driver-model/driver.txt in the kernel source tree for more * information. * * @param   pdev  the device structure * * @return  The function returns 0 on success and -1 on failure */static int mxc_v4l2_resume(struct platform_device *pdev){	cam_data *cam = platform_get_drvdata(pdev);	if (cam == NULL) {		return -1;	}	cam->low_power = false;	wake_up_interruptible(&cam->power_queue);	if (cam->overlay_on == true)		start_preview(cam);	if (cam->capture_on == true)		mxc_streamon(cam);	camera_power(true);	return 0;}/*! * This structure contains pointers to the power management callback functions. */static struct platform_driver mxc_v4l2_driver = {	.driver = {		   .name = "mxc_v4l2",		   .owner = THIS_MODULE,		   .bus = &platform_bus_type,		   },	.probe = NULL,	.remove = NULL,	.suspend = mxc_v4l2_suspend,	.resume = mxc_v4l2_resume,	.shutdown = NULL,};/*! * Entry point for the V4L2 * * @return  Error code indicating success or failure */static __init int camera_init(void){	u8 err = 0;	cam_data *cam;	if ((g_cam = cam = kmalloc(sizeof(cam_data), GFP_KERNEL)) == NULL) {		pr_debug("failed to mxc_v4l_register_camera\n");		return -1;	}	init_camera_struct(cam);	/* Register the I2C device */	err = platform_device_register(&mxc_v4l2_devices);	if (err != 0) {		pr_debug("camera_init: platform_device_register failed.\n");		video_device_release(cam->video_dev);		kfree(cam);		g_cam = NULL;	}	/* Register the device driver structure. */	err = platform_driver_register(&mxc_v4l2_driver);	if (err != 0) {		platform_device_unregister(&mxc_v4l2_devices);		pr_debug("camera_init: driver_register failed.\n");		video_device_release(cam->video_dev);		kfree(cam);		g_cam = NULL;		return err;	}	/* register v4l device */	if (video_register_device(cam->video_dev, VFL_TYPE_GRABBER, video_nr)	    == -1) {		platform_driver_unregister(&mxc_v4l2_driver);		platform_device_unregister(&mxc_v4l2_devices);		video_device_release(cam->video_dev);		kfree(cam);		g_cam = NULL;		pr_debug("video_register_device failed\n");		return -1;	}	return err;}/*! * Exit and cleanup for the V4L2 * */static void __exit camera_exit(void){	pr_debug("unregistering video\n");	video_unregister_device(g_cam->video_dev);	platform_driver_unregister(&mxc_v4l2_driver);	platform_device_unregister(&mxc_v4l2_devices);	if (g_cam->open_count) {		pr_debug("camera open -- setting ops to NULL\n");	} else {		pr_debug("freeing camera\n");		mxc_free_frame_buf(g_cam);		kfree(g_cam);		g_cam = NULL;	}}module_init(camera_init);module_exit(camera_exit);module_param(video_nr, int, -1);MODULE_AUTHOR("Freescale Semiconductor, Inc.");MODULE_DESCRIPTION("V4L2 capture driver for Mxc based cameras");MODULE_LICENSE("GPL");MODULE_SUPPORTED_DEVICE("video");

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩成人精品视频| 成人午夜精品在线| 国产精品丝袜在线| 欧美高清激情brazzers| 成人丝袜18视频在线观看| 蜜桃av一区二区三区| 亚洲欧美色图小说| 欧美激情艳妇裸体舞| 欧美一区二区三区视频免费| 日本丰满少妇一区二区三区| 国产伦精品一区二区三区免费迷| 亚洲成av人综合在线观看| 日韩一区在线看| 国产亚洲人成网站| 欧美成人a在线| 欧美一区二区三区在线看| 欧美自拍偷拍午夜视频| 99精品久久免费看蜜臀剧情介绍| 国产成人av影院| 国产一区二区三区免费在线观看 | 久久女同性恋中文字幕| 欧美精品久久久久久久久老牛影院| 91碰在线视频| 99久久久国产精品免费蜜臀| 国产精品亚洲视频| 国产精品一级在线| 国产成人av资源| 国产99久久久精品| 国产激情精品久久久第一区二区| 黄色日韩三级电影| 国产一区在线不卡| 激情丁香综合五月| 国产伦精一区二区三区| 国产精选一区二区三区| 国产美女av一区二区三区| 精品亚洲aⅴ乱码一区二区三区| 日本va欧美va瓶| 日本不卡一区二区三区高清视频| 亚洲国产精品综合小说图片区| 亚洲欧美日韩在线| 亚洲一区在线观看免费| 亚洲成人激情综合网| 午夜精品在线看| 日韩高清一区二区| 久久国产夜色精品鲁鲁99| 精品一区二区三区免费观看| 精品无人码麻豆乱码1区2区 | 粉嫩av亚洲一区二区图片| 国产69精品一区二区亚洲孕妇| 国产·精品毛片| 成人激情免费电影网址| 色婷婷av一区二区三区软件| 欧美中文字幕亚洲一区二区va在线 | **网站欧美大片在线观看| 国产精品久久一卡二卡| 日韩美女啊v在线免费观看| 一区二区三区四区乱视频| 亚洲第一福利一区| 另类小说图片综合网| 国产成人综合视频| 97精品电影院| 欧美日韩免费不卡视频一区二区三区| 欧美久久久久久久久久| 精品国产乱子伦一区| 国产精品卡一卡二卡三| 亚洲高清中文字幕| 国产一区二区三区美女| 色综合天天在线| 欧美精品aⅴ在线视频| 久久久久久久网| 一区二区高清在线| 久久精品国产网站| 91麻豆国产福利在线观看| 69堂国产成人免费视频| 欧美国产日韩a欧美在线观看| 一区二区久久久久| 国产麻豆视频一区| 91精品福利视频| 久久综合九色综合97婷婷| 国产不卡视频在线观看| 91网上在线视频| 欧美大片国产精品| 亚洲精品欧美激情| 国产在线精品一区二区不卡了 | 亚洲在线观看免费视频| 久久精品二区亚洲w码| 一本一道综合狠狠老| 日韩一本二本av| 亚洲色图清纯唯美| 国产精一品亚洲二区在线视频| 欧美日韩中文字幕精品| 国产欧美日产一区| 免费成人在线影院| 一本久道中文字幕精品亚洲嫩| 精品欧美乱码久久久久久1区2区| 成人免费在线视频| 国产美女在线观看一区| 678五月天丁香亚洲综合网| 中文字幕在线观看不卡| 男人的j进女人的j一区| 色婷婷香蕉在线一区二区| 久久亚洲精品国产精品紫薇| 亚洲 欧美综合在线网络| 91亚洲男人天堂| 久久综合九色综合97_久久久| 婷婷成人综合网| 91九色02白丝porn| 日韩一区在线免费观看| 国产成人午夜片在线观看高清观看| 欧美一区日韩一区| 无码av中文一区二区三区桃花岛| 91污在线观看| 国产精品久久久久久久久晋中 | 精品国产三级电影在线观看| 亚洲国产另类精品专区| 日本久久一区二区三区| 国产精品国产三级国产普通话蜜臀| 国产一区二区成人久久免费影院| 91精品麻豆日日躁夜夜躁| 亚洲一区影音先锋| 91久久久免费一区二区| 亚洲欧洲综合另类在线| bt欧美亚洲午夜电影天堂| 中文字幕va一区二区三区| 国产精品一区二区91| www亚洲一区| 国产美女娇喘av呻吟久久| 日韩精品最新网址| 激情亚洲综合在线| 精品久久久久一区二区国产| 日本欧洲一区二区| 91精品黄色片免费大全| 日本伊人精品一区二区三区观看方式| 欧美日韩一区二区欧美激情 | 全国精品久久少妇| 91精品黄色片免费大全| 欧美96一区二区免费视频| 日韩一区二区三区电影| 免费成人美女在线观看.| 日韩欧美亚洲国产另类| 韩国女主播一区二区三区| 久久久国产午夜精品| 高清免费成人av| 国产精品国产三级国产aⅴ无密码| 99在线精品观看| 亚洲一区二区三区国产| 欧美一区二区在线不卡| 激情小说亚洲一区| 欧美国产激情一区二区三区蜜月 | 成人h版在线观看| 亚洲免费视频中文字幕| 在线观看日韩电影| 日本特黄久久久高潮| 久久久噜噜噜久噜久久综合| 成人免费看的视频| 亚洲一区二区偷拍精品| 日韩一级片在线观看| 国产一区二区在线视频| 亚洲欧洲三级电影| 欧美美女喷水视频| 经典三级视频一区| 亚洲丝袜精品丝袜在线| 欧美浪妇xxxx高跟鞋交| 国产自产2019最新不卡| 国产精品麻豆视频| 欧美日韩亚洲综合| 国产麻豆精品theporn| 一区二区在线观看av| 欧美大片日本大片免费观看| 成人综合在线观看| 午夜国产精品影院在线观看| 26uuu亚洲综合色欧美| 色综合亚洲欧洲| 久久国产精品第一页| 亚洲欧洲日本在线| 日韩视频一区二区三区 | 欧美大度的电影原声| 成人黄色777网| 青青草国产成人av片免费| 国产欧美va欧美不卡在线| 亚洲人成在线播放网站岛国| 欧美猛男男办公室激情| 国产a精品视频| 日韩av成人高清| 中文字幕一区不卡| 精品国产一区二区三区久久久蜜月| av在线不卡免费看| 蜜桃av噜噜一区| 一区二区三区四区不卡在线| 久久一夜天堂av一区二区三区| 日本道免费精品一区二区三区| 精品亚洲国内自在自线福利| 一区二区三区久久| 欧美韩国一区二区| 欧美一区二区三区视频免费播放| 91在线视频免费观看| 国产精品亚洲一区二区三区在线| 亚洲风情在线资源站| 国产精品久久久久久妇女6080 | 欧美日韩久久久一区|