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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mx27_v4l2_capture.c

?? LINUX下的ov2640驅動程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
	g_user_buf = buf;	if (down_interruptible(&cam->busy_lock))		return -EINTR;	/* Video capture and still image capture are exclusive */	if (cam->capture_on == true) {		err = -EBUSY;		goto exit0;	}	/* The CSI-DMA can not do CSC */	if (cam->v2f.fmt.pix.pixelformat != V4L2_PIX_FMT_YUYV) {		pr_info("mxc_v4l_read support YUYV pixel format only\n");		err = -EINVAL;		goto exit0;	}	/* The CSI-DMA can not do resize or crop */	if ((cam->v2f.fmt.pix.width != cam->crop_bounds.width)	    || (cam->v2f.fmt.pix.height != cam->crop_bounds.height)) {		pr_info("mxc_v4l_read resize is not supported\n");		pr_info("supported image size width = %d height = %d\n",			cam->crop_bounds.width, cam->crop_bounds.height);		err = -EINVAL;		goto exit0;	}	if ((cam->crop_current.left != cam->crop_bounds.left)	    || (cam->crop_current.width != cam->crop_bounds.width)	    || (cam->crop_current.top != cam->crop_bounds.top)	    || (cam->crop_current.height != cam->crop_bounds.height)) {		pr_info("mxc_v4l_read cropping is not supported\n");		err = -EINVAL;		goto exit0;	}	cam->still_buf_vaddr = dma_alloc_coherent(0,						  PAGE_ALIGN(CSI_MEM_SIZE),						  &cam->still_buf,						  GFP_DMA | GFP_KERNEL);	if (!cam->still_buf_vaddr) {		pr_info("mxc_v4l_read failed at allocate still_buf\n");		err = -ENOBUFS;		goto exit0;	}	/* Initialize DMA */	g_dma_channel = mxc_dma_request(MXC_DMA_CSI_RX, "CSI RX DMA");	if (g_dma_channel < 0) {		pr_debug("mxc_v4l_read failed to request DMA channel\n");		err = -EIO;		goto exit1;	}	err = mxc_dma_callback_set(g_dma_channel,				   (mxc_dma_callback_t) mxc_csi_dma_callback,				   (void *)cam);	if (err != 0) {		pr_debug("mxc_v4l_read failed to set DMA callback\n");		err = -EIO;		goto exit2;	}	g_user_buf = buf;	if (cam->v2f.fmt.pix.sizeimage < count)		g_user_count = cam->v2f.fmt.pix.sizeimage;	else		g_user_count = count & ~0x3;	tasklet_init(&g_dma_tasklet, mxc_csi_dma_task, (unsigned long)cam);	g_dma_status = CSI_DMA_STATUS_DONE;	csi_set_callback(mxc_csi_irq_callback, cam);	csi_enable_prpif(0);	/* clear current SOF first */	csi_clear_status(BIT_SOF_INT);	csi_enable_mclk(CSI_MCLK_RAW, true, true);	do {		g_dma_completed = g_dma_copied = 0;		mxc_csi_dma_chaining(cam);		cam->still_counter = 0;		g_dma_status = CSI_DMA_STATUS_IDLE;		if (!wait_event_interruptible_timeout(cam->still_queue,						      cam->still_counter != 0,						      10 * HZ)) {			pr_info("mxc_v4l_read timeout counter %x\n",				cam->still_counter);			err = -ETIME;			goto exit3;		}		if (g_dma_status == CSI_DMA_STATUS_DONE)			break;		if (retry-- == 0)			break;		pr_debug("Now retry image capture\n");	} while (1);	if (g_dma_status != CSI_DMA_STATUS_DONE)		err = -EIO;      exit3:	csi_enable_prpif(1);	g_dma_status = CSI_DMA_STATUS_DONE;	csi_set_callback(0, 0);	csi_enable_mclk(CSI_MCLK_RAW, false, false);	tasklet_kill(&g_dma_tasklet);      exit2:	mxc_dma_free(g_dma_channel);      exit1:	dma_free_coherent(0, PAGE_ALIGN(CSI_MEM_SIZE),			  cam->still_buf_vaddr, cam->still_buf);	cam->still_buf = 0;      exit0:	up(&cam->busy_lock);	if (err < 0)		return err;	else		return g_user_count;}#else/*! * V4L interface - read function * * @param file       struct file * * @param read buf   char * * @param count      size_t * @param ppos       structure loff_t * * * @return           bytes read */static ssize_tmxc_v4l_read(struct file *file, char *buf, size_t count, loff_t * ppos){	int err = 0;	u8 *v_address;	struct video_device *dev = video_devdata(file);	cam_data *cam = dev->priv;	if (down_interruptible(&cam->busy_lock))		return -EINTR;	/* Video capture and still image capture are exclusive */	if (cam->capture_on == true) {		err = -EBUSY;		goto exit0;	}	v_address = dma_alloc_coherent(0,				       PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage),				       &cam->still_buf, GFP_DMA | GFP_KERNEL);	if (!v_address) {		pr_info("mxc_v4l_read failed at allocate still_buf\n");		err = -ENOBUFS;		goto exit0;	}	if (prp_still_select(cam)) {		err = -EIO;		goto exit1;	}	cam->still_counter = 0;	if (cam->csi_start(cam)) {		err = -EIO;		goto exit2;	}	if (!wait_event_interruptible_timeout(cam->still_queue,					      cam->still_counter != 0,					      10 * HZ)) {		pr_info("mxc_v4l_read timeout counter %x\n",			cam->still_counter);		err = -ETIME;		goto exit2;	}	err = copy_to_user(buf, v_address, cam->v2f.fmt.pix.sizeimage);      exit2:	prp_still_deselect(cam);      exit1:	dma_free_coherent(0, cam->v2f.fmt.pix.sizeimage, v_address,			  cam->still_buf);	cam->still_buf = 0;      exit0:	up(&cam->busy_lock);	if (err < 0)		return err;	else		return (cam->v2f.fmt.pix.sizeimage - err);}#endif				/* CONFIG_VIDEO_MXC_CSI_DMA *//*! * V4L interface - ioctl function * * @param inode      struct inode * * * @param file       struct file * * * @param ioctlnr    unsigned int * * @param arg        void * * * @return           0 success, ENODEV for invalid device instance, *                   -1 for other errors. */static intmxc_v4l_do_ioctl(struct inode *inode, struct file *file,		 unsigned int ioctlnr, void *arg){	struct video_device *dev = video_devdata(file);	cam_data *cam = dev->priv;	int retval = 0;	unsigned long lock_flags;	if (!cam)		return -EBADF;	wait_event_interruptible(cam->power_queue, cam->low_power == false);	/* make this _really_ smp-safe */	if (down_interruptible(&cam->busy_lock))		return -EBUSY;	switch (ioctlnr) {		/*!		 * V4l2 VIDIOC_QUERYCAP ioctl		 */	case VIDIOC_QUERYCAP:{			struct v4l2_capability *cap = arg;			strcpy(cap->driver, "mxc_v4l2");			cap->version = KERNEL_VERSION(0, 1, 11);			cap->capabilities = V4L2_CAP_VIDEO_CAPTURE |			    V4L2_CAP_VIDEO_OVERLAY | V4L2_CAP_STREAMING			    | V4L2_CAP_READWRITE;			cap->card[0] = '\0';			cap->bus_info[0] = '\0';			retval = 0;			break;		}		/*!		 * V4l2 VIDIOC_G_FMT ioctl		 */	case VIDIOC_G_FMT:{			struct v4l2_format *gf = arg;			retval = mxc_v4l2_g_fmt(cam, gf);			break;		}		/*!		 * V4l2 VIDIOC_S_FMT ioctl		 */	case VIDIOC_S_FMT:{			struct v4l2_format *sf = arg;			retval = mxc_v4l2_s_fmt(cam, sf);			break;		}		/*!		 * V4l2 VIDIOC_REQBUFS ioctl		 */	case VIDIOC_REQBUFS:{			struct v4l2_requestbuffers *req = arg;			if (req->count > FRAME_NUM) {				pr_info("VIDIOC_REQBUFS: not enough buffer\n");				req->count = FRAME_NUM;			}			if ((req->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) ||			    (req->memory != V4L2_MEMORY_MMAP)) {				pr_debug("VIDIOC_REQBUFS: wrong buffer type\n");				retval = -EINVAL;				break;			}			mxc_streamoff(cam);			mxc_free_frame_buf(cam);			retval = mxc_allocate_frame_buf(cam, req->count);			break;		}		/*!		 * V4l2 VIDIOC_QUERYBUF ioctl		 */	case VIDIOC_QUERYBUF:{			struct v4l2_buffer *buf = arg;			int index = buf->index;			if (buf->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) {				pr_debug				    ("VIDIOC_QUERYBUFS: wrong buffer type\n");				retval = -EINVAL;				break;			}			memset(buf, 0, sizeof(buf));			buf->index = index;			down(&cam->param_lock);			retval = mxc_v4l2_buffer_status(cam, buf);			up(&cam->param_lock);			break;		}		/*!		 * V4l2 VIDIOC_QBUF ioctl		 */	case VIDIOC_QBUF:{			struct v4l2_buffer *buf = arg;			int index = buf->index;			int overflow = 0;			pr_debug("VIDIOC_QBUF: %d\n", buf->index);			if (cam->overflow == 1) {				cam->enc_enable(cam);				cam->overflow = 0;				overflow = 1;				printk(KERN_INFO "VIDIOC_QBUF - overflow\n");			}			spin_lock_irqsave(&cam->int_lock, lock_flags);			if ((cam->frame[index].buffer.flags & 0x7) ==			    V4L2_BUF_FLAG_MAPPED) {				cam->frame[index].buffer.flags |=				    V4L2_BUF_FLAG_QUEUED;				if ((cam->skip_frame > 0) || (overflow == 1)) {					list_add_tail(&cam->frame[index].queue,						      &cam->working_q);					retval =					    cam->enc_update_eba(cam->								frame[index].								paddress,								&cam->								ping_pong_csi);					cam->skip_frame = 0;				} else {					list_add_tail(&cam->frame[index].queue,						      &cam->ready_q);				}			} else if (cam->frame[index].buffer.flags &				   V4L2_BUF_FLAG_QUEUED) {				pr_debug				    ("VIDIOC_QBUF: buffer already queued\n");			} else if (cam->frame[index].buffer.				   flags & V4L2_BUF_FLAG_DONE) {				pr_debug				    ("VIDIOC_QBUF: overwrite done buffer.\n");				cam->frame[index].buffer.flags &=				    ~V4L2_BUF_FLAG_DONE;				cam->frame[index].buffer.flags |=				    V4L2_BUF_FLAG_QUEUED;			}			buf->flags = cam->frame[index].buffer.flags;			spin_unlock_irqrestore(&cam->int_lock, lock_flags);			break;		}		/*!		 * V4l2 VIDIOC_DQBUF ioctl		 */	case VIDIOC_DQBUF:{			struct v4l2_buffer *buf = arg;			retval = mxc_v4l_dqueue(cam, buf);			break;		}		/*!		 * V4l2 VIDIOC_STREAMON ioctl		 */	case VIDIOC_STREAMON:{			cam->capture_on = true;			retval = mxc_streamon(cam);			break;		}		/*!		 * V4l2 VIDIOC_STREAMOFF ioctl		 */	case VIDIOC_STREAMOFF:{			retval = mxc_streamoff(cam);			cam->capture_on = false;			break;		}		/*!		 * V4l2 VIDIOC_G_CTRL ioctl		 */	case VIDIOC_G_CTRL:{			retval = mxc_get_v42l_control(cam, arg);			break;		}		/*!		 * V4l2 VIDIOC_S_CTRL ioctl		 */	case VIDIOC_S_CTRL:{			retval = mxc_set_v42l_control(cam, arg);			break;		}		/*!		 * V4l2 VIDIOC_CROPCAP ioctl		 */	case VIDIOC_CROPCAP:{			struct v4l2_cropcap *cap = arg;			if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&			    cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {				retval = -EINVAL;				break;			}			cap->bounds = cam->crop_bounds;			cap->defrect = cam->crop_defrect;			break;		}		/*!		 * V4l2 VIDIOC_G_CROP ioctl		 */	case VIDIOC_G_CROP:{			struct v4l2_crop *crop = arg;			if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&			    crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {				retval = -EINVAL;				break;			}			crop->c = cam->crop_current;			break;		}		/*!		 * V4l2 VIDIOC_S_CROP ioctl		 */	case VIDIOC_S_CROP:{			struct v4l2_crop *crop = arg;			struct v4l2_rect *b = &cam->crop_bounds;			int i;			if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&			    crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY) {				retval = -EINVAL;				break;			}			crop->c.top = (crop->c.top < b->top) ? b->top			    : crop->c.top;			if (crop->c.top > b->top + b->height)				crop->c.top = b->top + b->height - 1;			if (crop->c.height > b->top + b->height - crop->c.top)				crop->c.height =				    b->top + b->height - crop->c.top;			crop->c.left = (crop->c.left < b->left) ? b->left			    : crop->c.left;			if (crop->c.left > b->left + b->width)				crop->c.left = b->left + b->width - 1;			if (crop->c.width > b->left - crop->c.left + b->width)				crop->c.width =				    b->left - crop->c.left + b->width;			crop->c.width &= ~0x1;			/*			 * MX27 PrP limitation:			 * The right spare space (CSI_FRAME_X_SIZE			 *  - SOURCE_LINE_STRIDE - PICTURE_X_SIZE)) must be			 * multiple of 32.			 * So we tune the crop->c.left value to the closest			 * desired cropping value and meet the PrP requirement.			 */			i = ((b->left + b->width)			     - (crop->c.left + crop->c.width)) % 32;			if (i <= 16) {				if (crop->c.left + crop->c.width + i				    <= b->left + b->width)					crop->c.left += i;				else if (crop->c.left - (32 - i) >= b->left)					crop->c.left -= 32 - i;				else {					retval = -EINVAL;					break;				}			} else {				if (crop->c.left - (32 - i) >= b->left)					crop->c.left -= 32 - i;				else if (crop->c.left + crop->c.width + i					 <= b->left + b->width)					crop->c.left += i;				else {					retval = -EINVAL;					break;				}			}			cam->crop_current = crop->c;			break;		}		/*!		 * V4l2 VIDIOC_OVERLAY ioctl		 */	case VIDIOC_OVERLAY:{			int *on = arg;			if (*on) {				cam->overlay_on = true;				retval = start_preview(cam);			}			if (!*on) {				retval = stop_preview(cam);				cam->overlay_on = false;			}			break;		}		/*!		 * V4l2 VIDIOC_G_FBUF ioctl		 */	case VIDIOC_G_FBUF:{			struct v4l2_framebuffer *fb = arg;			struct fb_var_screeninfo *var;			if (cam->output >= num_registered_fb) {				retval = -EINVAL;				break;			}			var = &registered_fb[cam->output]->var;			cam->v4l2_fb.fmt.width = var->xres;			cam->v4l2_fb.fmt.height = var->yres;			cam->v4l2_fb.fmt.bytesperline =			    var->xres_virtual * var->bits_per_pixel;			cam->v4l2_fb.fmt.colorspace = V4L2_COLORSPACE_SRGB;			*fb = cam->v4l2_fb;			break;		}		/*!		 * V4l2 VIDIOC_S_FBUF ioctl

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品视频1区2区| 欧美不卡在线视频| 日韩视频一区在线观看| 国产无遮挡一区二区三区毛片日本| 欧美韩国日本不卡| 免费在线观看成人| 97久久精品人人澡人人爽| 欧美日韩国产bt| 国产精品毛片久久久久久久| 日韩一区精品视频| 91在线视频网址| 国产精品国产三级国产普通话99| 五月综合激情网| 色综合久久99| 国产精品久久久久久久岛一牛影视| 久久er精品视频| 欧美日韩国产区一| 亚洲午夜日本在线观看| 91女人视频在线观看| 国产视频在线观看一区二区三区 | 日韩网站在线看片你懂的| 亚洲欧美国产77777| 国产成人免费视频一区| 日韩精品中文字幕一区二区三区| 亚洲成人福利片| 在线视频一区二区三区| 亚洲日本免费电影| 成人app软件下载大全免费| 亚洲精品在线免费观看视频| 日本成人在线视频网站| 91精品国产aⅴ一区二区| 亚洲午夜一区二区三区| 91电影在线观看| 亚洲裸体在线观看| 97se亚洲国产综合自在线| 国产精品久久精品日日| 成人综合婷婷国产精品久久 | 色综合视频一区二区三区高清| 26uuu欧美日本| 国产一区二区中文字幕| 久久综合色天天久久综合图片| 青青草一区二区三区| 精品欧美乱码久久久久久1区2区| 国产制服丝袜一区| 久久久国产精品麻豆| 丰满岳乱妇一区二区三区| 中文字幕av一区二区三区高 | 国产一区二区三区不卡在线观看 | 亚洲日本电影在线| 91久久精品国产91性色tv| 亚洲精品你懂的| 欧美精品九九99久久| 免费成人你懂的| 久久你懂得1024| 成人激情小说乱人伦| 亚洲图片你懂的| 精品视频1区2区| 久久国产精品99久久久久久老狼| 精品sm捆绑视频| 91在线观看高清| 亚洲va天堂va国产va久| 欧美第一区第二区| 成人激情图片网| 亚洲第一搞黄网站| 日韩精品一区二区三区在线播放| 国产精品一区二区久激情瑜伽| 亚洲欧洲av一区二区三区久久| 欧美天堂亚洲电影院在线播放| 青青青伊人色综合久久| 国产精品系列在线| 欧美绝品在线观看成人午夜影视| 久久国产精品一区二区| 成人免费小视频| 91麻豆精品国产自产在线观看一区| 国产一区欧美二区| 亚洲第一在线综合网站| 中文字幕精品—区二区四季| 欧美日韩国产另类一区| 国产传媒一区在线| 亚洲123区在线观看| 久久精品亚洲国产奇米99 | 国产成人久久精品77777最新版本| 中文字幕一区二区不卡| 欧美一卡二卡在线| 91视频xxxx| 国产美女精品一区二区三区| 一区二区三区欧美激情| 国产香蕉久久精品综合网| 欧美三级乱人伦电影| 国产精品自在在线| 日本女优在线视频一区二区| 中文字幕亚洲不卡| 欧美精品一区二| 欧美精品日韩综合在线| 91小视频在线免费看| 韩国视频一区二区| 日韩精品亚洲一区二区三区免费| 亚洲欧美在线aaa| 久久婷婷久久一区二区三区| 91麻豆精品国产91久久久更新时间| www.亚洲色图| 免费久久精品视频| 亚洲成在人线在线播放| 成人免费在线播放视频| 欧美国产日产图区| 2014亚洲片线观看视频免费| 欧美精品久久天天躁| 在线视频欧美精品| 色婷婷综合久久久中文字幕| 成人a免费在线看| 国产不卡在线播放| 色婷婷久久久综合中文字幕| 粉嫩蜜臀av国产精品网站| 久久99深爱久久99精品| 日本伊人精品一区二区三区观看方式| 亚洲一区二区三区免费视频| 一区二区三区中文字幕| 一个色在线综合| 亚洲图片自拍偷拍| 五月天一区二区三区| 亚洲大片一区二区三区| 香蕉成人啪国产精品视频综合网 | 久久亚洲一级片| 精品国产青草久久久久福利| 精品少妇一区二区三区在线播放| 日韩欧美国产wwwww| 欧美成人综合网站| 久久在线免费观看| 久久精品免费在线观看| 国产精品久久三区| 亚洲欧美乱综合| 一区二区免费在线| 视频一区视频二区中文字幕| 秋霞电影一区二区| 国产乱子伦一区二区三区国色天香| 久久aⅴ国产欧美74aaa| 国产精品一品二品| av午夜一区麻豆| 欧美日韩精品一区二区天天拍小说| 91精品国产品国语在线不卡| 日韩欧美国产三级| 国产精品久久久久一区| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲成av人片在www色猫咪| 毛片一区二区三区| 成人毛片视频在线观看| 欧美中文字幕一区二区三区 | 国产成人免费9x9x人网站视频| 波多野结衣在线aⅴ中文字幕不卡| 91在线免费看| 欧美日韩综合一区| 精品久久久久久无| 成人欧美一区二区三区小说 | 国产欧美日韩综合| 亚洲蜜臀av乱码久久精品蜜桃| 婷婷综合久久一区二区三区| 国产一区二区三区在线观看精品| 91在线观看污| 欧美www视频| 一区二区三区精品| 国产精品123| 欧美乱妇一区二区三区不卡视频| 久久久久综合网| 偷窥少妇高潮呻吟av久久免费| 成熟亚洲日本毛茸茸凸凹| 91精品国产一区二区三区| 中文字幕第一页久久| 看片的网站亚洲| 91福利区一区二区三区| 国产亚洲一区二区三区在线观看| 亚洲午夜精品网| av电影在线观看一区| 精品欧美乱码久久久久久 | 日本成人在线视频网站| 色综合天天综合| 久久久综合视频| 美女尤物国产一区| 欧美日韩专区在线| 亚洲青青青在线视频| 懂色一区二区三区免费观看| 欧美一级二级三级乱码| 一区二区三区四区视频精品免费| 国产ts人妖一区二区| 精品福利av导航| 日韩av在线播放中文字幕| 91麻豆免费观看| 国产精品视频看| 韩国理伦片一区二区三区在线播放 | 亚洲午夜免费福利视频| 不卡在线观看av| 国产精品色哟哟| 国产一区激情在线| 欧美变态凌虐bdsm| 丝袜亚洲另类丝袜在线| 欧美美女喷水视频| 亚洲专区一二三| 欧美综合一区二区| 亚洲国产你懂的| 欧美日韩国产天堂| 亚洲成a人在线观看|