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

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

?? mxc_v4l2_output.c

?? LINUX下的ov2640驅動程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
			}			if (ipu_init_channel_buffer(MEM_ROT_PP_MEM,						    IPU_INPUT_BUFFER,						    params.mem_pp_mem.						    out_pixel_fmt, out_width,						    out_height, out_width,						    vout->rotate,						    vout->rot_pp_bufs[0],						    vout->rot_pp_bufs[1], 0,						    0) != 0) {				dev_err(dev,					"Error initializing PP ROT input buffer\n");				return -EINVAL;			}			/* swap width and height */			out_width = vout->crop_current.width;			out_height = vout->crop_current.height;			if (ipu_init_channel_buffer(MEM_ROT_PP_MEM,						    IPU_OUTPUT_BUFFER,						    params.mem_pp_mem.						    out_pixel_fmt, out_width,						    out_height, out_width,						    IPU_ROTATE_NONE,						    vout->display_bufs[0],						    vout->display_bufs[1], 0,						    0) != 0) {				dev_err(dev,					"Error initializing PP output buffer\n");				return -EINVAL;			}			if (ipu_link_channels(vout->post_proc_ch,					      MEM_ROT_PP_MEM) < 0) {				return -EINVAL;			}			ipu_select_buffer(MEM_ROT_PP_MEM, IPU_OUTPUT_BUFFER, 0);			ipu_select_buffer(MEM_ROT_PP_MEM, IPU_OUTPUT_BUFFER, 1);			ipu_enable_channel(MEM_ROT_PP_MEM);			display_input_ch = MEM_ROT_PP_MEM;		} else {			if (ipu_init_channel_buffer(vout->post_proc_ch,						    IPU_OUTPUT_BUFFER,						    params.mem_pp_mem.						    out_pixel_fmt, out_width,						    out_height, out_width,						    vout->rotate,						    vout->display_bufs[0],						    vout->display_bufs[1], 0,						    0) != 0) {				dev_err(dev,					"Error initializing PP output buffer\n");				return -EINVAL;			}		}		if (ipu_link_channels(display_input_ch, vout->display_ch) < 0) {			dev_err(dev, "Error linking ipu channels\n");			return -EINVAL;		}	}	vout->state = STATE_STREAM_PAUSED;	ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, 0);	ipu_select_buffer(vout->post_proc_ch, IPU_INPUT_BUFFER, 1);	if (use_direct_adc == false) {		ipu_select_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, 0);		ipu_select_buffer(vout->post_proc_ch, IPU_OUTPUT_BUFFER, 1);		ipu_enable_channel(vout->post_proc_ch);		ipu_enable_channel(vout->display_ch);	} else {		ipu_enable_channel(vout->post_proc_ch);	}	vout->start_jiffies = jiffies;	dev_dbg(dev,		"streamon: start time = %lu jiffies\n", vout->start_jiffies);	return 0;}/*! * Shut down the voutera * * @param vout      structure vout_data * * * @return status  0 Success */static int mxc_v4l2out_streamoff(vout_data * vout){	int i, retval = 0;	u32 lockflag = 0;	if (!vout)		return -EINVAL;	if (vout->state == STATE_STREAM_OFF) {		return 0;	}	spin_lock_irqsave(&g_lock, lockflag);	del_timer(&vout->output_timer);	if (vout->state == STATE_STREAM_ON) {		vout->state = STATE_STREAM_STOPPING;	}	ipu_disable_irq(IPU_IRQ_PP_IN_EOF);	spin_unlock_irqrestore(&g_lock, lockflag);	if (vout->post_proc_ch == MEM_PP_MEM) {	/* SDC or ADC with Rotation */		ipu_disable_channel(MEM_PP_MEM, true);		if (vout->rotate >= IPU_ROTATE_90_RIGHT) {			ipu_disable_channel(MEM_ROT_PP_MEM, true);			ipu_unlink_channels(MEM_PP_MEM, MEM_ROT_PP_MEM);			ipu_unlink_channels(MEM_ROT_PP_MEM, vout->display_ch);		} else {			ipu_unlink_channels(MEM_PP_MEM, vout->display_ch);		}		ipu_disable_channel(vout->display_ch, true);		ipu_uninit_channel(vout->display_ch);		ipu_uninit_channel(MEM_PP_MEM);		ipu_uninit_channel(MEM_ROT_PP_MEM);	} else {		/* ADC Direct */		ipu_disable_channel(MEM_PP_ADC, true);		ipu_uninit_channel(MEM_PP_ADC);	}	vout->ready_q.head = vout->ready_q.tail = 0;	vout->done_q.head = vout->done_q.tail = 0;	for (i = 0; i < vout->buffer_cnt; i++) {		vout->v4l2_bufs[i].flags = 0;		vout->v4l2_bufs[i].timestamp.tv_sec = 0;		vout->v4l2_bufs[i].timestamp.tv_usec = 0;	}	vout->state = STATE_STREAM_OFF;#ifdef CONFIG_FB_MXC_ASYNC_PANEL	if (vout->cur_disp_output != DISP3) {		mxcfb_set_refresh_mode(registered_fb				       [vout->					output_fb_num[vout->cur_disp_output]],				       MXCFB_REFRESH_PARTIAL, 0);	}#endif	return retval;}/* * Valid whether the palette is supported * * @param palette  V4L2_PIX_FMT_RGB565, V4L2_PIX_FMT_BGR24 or V4L2_PIX_FMT_BGR32 * * @return 1 if supported, 0 if failed */static inline int valid_mode(u32 palette){	return ((palette == V4L2_PIX_FMT_RGB565) ||		(palette == V4L2_PIX_FMT_BGR24) ||		(palette == V4L2_PIX_FMT_RGB24) ||		(palette == V4L2_PIX_FMT_BGR32) ||		(palette == V4L2_PIX_FMT_RGB32) ||		(palette == V4L2_PIX_FMT_YUV422P) ||		(palette == V4L2_PIX_FMT_YUV420));}/* * Returns bits per pixel for given pixel format * * @param pixelformat  V4L2_PIX_FMT_RGB565, V4L2_PIX_FMT_BGR24 or V4L2_PIX_FMT_BGR32 * * @return bits per pixel of pixelformat */static u32 fmt_to_bpp(u32 pixelformat){	u32 bpp;	switch (pixelformat) {	case V4L2_PIX_FMT_RGB565:		bpp = 16;		break;	case V4L2_PIX_FMT_BGR24:	case V4L2_PIX_FMT_RGB24:		bpp = 24;		break;	case V4L2_PIX_FMT_BGR32:	case V4L2_PIX_FMT_RGB32:		bpp = 32;		break;	default:		bpp = 8;		break;	}	return bpp;}/* * V4L2 - Handles VIDIOC_G_FMT Ioctl * * @param vout         structure vout_data * * * @param v4l2_format structure v4l2_format * * * @return  status    0 success, EINVAL failed */static int mxc_v4l2out_g_fmt(vout_data * vout, struct v4l2_format *f){	if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) {		return -EINVAL;	}	*f = vout->v2f;	return 0;}/* * V4L2 - Handles VIDIOC_S_FMT Ioctl * * @param vout         structure vout_data * * * @param v4l2_format structure v4l2_format * * * @return  status    0 success, EINVAL failed */static int mxc_v4l2out_s_fmt(vout_data * vout, struct v4l2_format *f){	int retval = 0;	u32 size = 0;	u32 bytesperline;	if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) {		retval = -EINVAL;		goto err0;	}	if (!valid_mode(f->fmt.pix.pixelformat)) {		dev_err(vout->video_dev->dev, "pixel format not supported\n");		retval = -EINVAL;		goto err0;	}	bytesperline = (f->fmt.pix.width * fmt_to_bpp(f->fmt.pix.pixelformat)) /	    8;	if (f->fmt.pix.bytesperline < bytesperline) {		f->fmt.pix.bytesperline = bytesperline;	} else {		bytesperline = f->fmt.pix.bytesperline;	}	switch (f->fmt.pix.pixelformat) {	case V4L2_PIX_FMT_YUV422P:		/* byteperline for YUV planar formats is for		   Y plane only */		size = bytesperline * f->fmt.pix.height * 2;		break;	case V4L2_PIX_FMT_YUV420:		size = (bytesperline * f->fmt.pix.height * 3) / 2;		break;	default:		size = bytesperline * f->fmt.pix.height;		break;	}	/* Return the actual size of the image to the app */	if (f->fmt.pix.sizeimage < size) {		f->fmt.pix.sizeimage = size;	} else {		size = f->fmt.pix.sizeimage;	}	vout->v2f.fmt.pix = f->fmt.pix;	copy_from_user(&vout->offset, (void *)vout->v2f.fmt.pix.priv,		       sizeof(vout->offset));	retval = 0;      err0:	return retval;}/* * V4L2 - Handles VIDIOC_G_CTRL Ioctl * * @param vout         structure vout_data * * * @param c           structure v4l2_control * * * @return  status    0 success, EINVAL failed */static int mxc_get_v42lout_control(vout_data * vout, struct v4l2_control *c){	switch (c->id) {	case V4L2_CID_HFLIP:		return (vout->rotate & IPU_ROTATE_HORIZ_FLIP) ? 1 : 0;	case V4L2_CID_VFLIP:		return (vout->rotate & IPU_ROTATE_VERT_FLIP) ? 1 : 0;	case (V4L2_CID_PRIVATE_BASE + 1):		return vout->rotate;	default:		return -EINVAL;	}}/* * V4L2 - Handles VIDIOC_S_CTRL Ioctl * * @param vout         structure vout_data * * * @param c           structure v4l2_control * * * @return  status    0 success, EINVAL failed */static int mxc_set_v42lout_control(vout_data * vout, struct v4l2_control *c){	switch (c->id) {	case V4L2_CID_HFLIP:		vout->rotate |= c->value ? IPU_ROTATE_HORIZ_FLIP :		    IPU_ROTATE_NONE;		break;	case V4L2_CID_VFLIP:		vout->rotate |= c->value ? IPU_ROTATE_VERT_FLIP :		    IPU_ROTATE_NONE;		break;	case V4L2_CID_MXC_ROT:		vout->rotate = c->value;		break;	default:		return -EINVAL;	}	return 0;}/*! * V4L2 interface - open function * * @param inode        structure inode * * * @param file         structure file * * * @return  status    0 success, ENODEV invalid device instance, *                    ENODEV timeout, ERESTARTSYS interrupted by user */static int mxc_v4l2out_open(struct inode *inode, struct file *file){	struct video_device *dev = video_devdata(file);	vout_data *vout = video_get_drvdata(dev);	int err;	dq_intr_cnt = 0;	dq_timeout_cnt = 0;	if (!vout) {		return -ENODEV;	}	down(&vout->busy_lock);	err = -EINTR;	if (signal_pending(current))		goto oops;	if (vout->open_count++ == 0) {		ipu_request_irq(IPU_IRQ_PP_IN_EOF,				mxc_v4l2out_pp_in_irq_handler,				0, dev->name, vout);		init_waitqueue_head(&vout->v4l_bufq);		init_timer(&vout->output_timer);		vout->output_timer.function = mxc_v4l2out_timer_handler;		vout->output_timer.data = (unsigned long)vout;		vout->state = STATE_STREAM_OFF;		g_irq_cnt = g_buf_output_cnt = g_buf_q_cnt = g_buf_dq_cnt = 0;	}	file->private_data = dev;	up(&vout->busy_lock);	return 0;      oops:	up(&vout->busy_lock);	return err;}/*! * V4L2 interface - close function * * @param inode    struct inode * * * @param file     struct file * * * @return         0 success */static int mxc_v4l2out_close(struct inode *inode, struct file *file){	struct video_device *dev = file->private_data;	vout_data *vout = video_get_drvdata(dev);	if (--vout->open_count == 0) {		if (vout->state != STATE_STREAM_OFF)			mxc_v4l2out_streamoff(vout);		ipu_free_irq(IPU_IRQ_PP_IN_EOF, vout);		file->private_data = NULL;		mxc_free_buffers(vout->queue_buf_paddr, vout->queue_buf_vaddr,				 vout->buffer_cnt, vout->queue_buf_size);		vout->buffer_cnt = 0;		mxc_free_buffers(vout->display_bufs,				 vout->display_bufs_vaddr, 2,				 vout->sdc_fg_buf_size);		mxc_free_buffers(vout->rot_pp_bufs, vout->rot_pp_bufs_vaddr, 2,				 vout->sdc_fg_buf_size);		/* capture off */		wake_up_interruptible(&vout->v4l_bufq);	}	return 0;}/*! * V4L2 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_v4l2out_do_ioctl(struct inode *inode, struct file *file,		     unsigned int ioctlnr, void *arg){	struct video_device *vdev = file->private_data;	vout_data *vout = video_get_drvdata(vdev);	int retval = 0;	int i = 0;	if (!vout)		return -EBADF;	/* make this _really_ smp-safe */	if (down_interruptible(&vout->busy_lock))		return -EBUSY;	switch (ioctlnr) {	case VIDIOC_QUERYCAP:		{			struct v4l2_capability *cap = arg;			strcpy(cap->driver, "mxc_v4l2_output");			cap->version = 0;			cap->capabilities =			    V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING;			cap->card[0] = '\0';			cap->bus_info[0] = '\0';			retval = 0;			break;		}	case VIDIOC_G_FMT:		{			struct v4l2_format *gf = arg;			retval = mxc_v4l2out_g_fmt(vout, gf);			break;		}	case VIDIOC_S_FMT:		{			struct v4l2_format *sf = arg;			if (vout->state != STATE_STREAM_OFF) {				retval = -EBUSY;				break;			}			retval = mxc_v4l2out_s_fmt(vout, sf);			break;		}	case VIDIOC_REQBUFS:		{			struct v4l2_requestbuffers *req = arg;			if ((req->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) ||			    (req->memory != V4L2_MEMORY_MMAP)) {				dev_dbg(vdev->dev,					"VIDIOC_REQBUFS: incorrect buffer type\n");				retval = -EINVAL;				break;			}			if (req->count == 0)				mxc_v4l2out_streamoff(vout);			if (vout->state == STATE_STREAM_OFF) {				if (vout->queue_buf_paddr[0] != 0) {					mxc_free_buffers(vout->queue_buf_paddr,							 vout->queue_buf_vaddr,							 vout->buffer_cnt,							 vout->queue_buf_size);					dev_dbg(vdev->dev,						"VIDIOC_REQBUFS: freed buffers\n");				}				vout->buffer_cnt = 0;			} else {				dev_dbg(vdev->dev,					"VIDIOC_REQBUFS: Buffer is in use\n");				retval = -EBUSY;				break;			}			if (req->count == 0)				break;			if (req->count < MIN_FRAME_NUM) {				req->count = MIN_FRAME_NUM;			} else if (req->count > MAX_FRAME_NUM) {				req->count = MAX_FRAME_NUM;			}			vout->buffer_cnt = req->count;			vout->queue_buf_size =			    PAGE_ALIGN(vout->v2f.fmt.pix.sizeimage);			retval = mxc_allocate_buffers(vout->queue_buf_paddr,						      vout->queue_buf_vaddr,						      vout->buffer_cnt,						      vout->queue_buf_size);			if (retval < 0)				break;			/* Init buffer queues */			vout->done_q.head = 0;			vout->done_q.tail = 0;			vout->ready_q.head = 0;			vout->ready_q.tail = 0;			for (i = 0; i < vout->buffer_cnt; i++) {				memset(&(vout->v4l2_bufs[i]), 0,				       sizeof(vout->v4l2_bufs[i]));				vout->v4l2_bufs[i].flags = 0;				vout->v4l2_bufs[i].memory = V4L2_MEMORY_MMAP;				vout->v4l2_bufs[i].index = i;				vout->v4l2_bufs[i].type =

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区色| 热久久国产精品| 一区二区在线看| 午夜国产精品一区| 国产精品一二一区| 欧美视频在线观看一区二区| 精品第一国产综合精品aⅴ| 一区二区在线观看免费| 国产乱码一区二区三区| 欧美日韩一区二区三区高清| 国产精品久久综合| 九一九一国产精品| 欧美日韩一级片在线观看| 国产精品美女一区二区| 精品亚洲aⅴ乱码一区二区三区| 在线亚洲欧美专区二区| 国产精品精品国产色婷婷| 麻豆精品国产91久久久久久| 欧美日韩www| 亚洲欧美日韩一区二区三区在线观看| 国产综合色在线视频区| 日韩一区二区精品在线观看| 亚洲va国产天堂va久久en| 99re成人精品视频| 国产精品美女久久久久aⅴ | 欧美私人免费视频| 国产精品盗摄一区二区三区| 国产不卡高清在线观看视频| 精品va天堂亚洲国产| 免费人成网站在线观看欧美高清| 欧美高清激情brazzers| 婷婷六月综合亚洲| 欧美日韩高清一区二区三区| 亚洲国产日韩在线一区模特 | 国内精品久久久久影院薰衣草| 欧美日韩亚洲不卡| 五月婷婷久久综合| 正在播放一区二区| 免费高清不卡av| 欧美videos中文字幕| 成人深夜福利app| 国产日韩欧美精品在线| 国产成人av电影| 国产精品灌醉下药二区| 91女厕偷拍女厕偷拍高清| 亚洲精品一卡二卡| 欧美日韩美少妇| 蜜桃av一区二区三区电影| 欧美xxxx在线观看| 成人免费毛片a| 亚洲欧美视频在线观看| 欧美日韩日本视频| 免费视频一区二区| 国产日韩欧美高清在线| hitomi一区二区三区精品| ●精品国产综合乱码久久久久| 91日韩精品一区| 亚洲成人第一页| 精品久久久久久久久久久久久久久久久| 老司机精品视频一区二区三区| 精品日产卡一卡二卡麻豆| 国产精品911| 亚洲九九爱视频| 日韩一级视频免费观看在线| 国产在线看一区| 亚洲人成电影网站色mp4| 日本韩国欧美一区二区三区| 久久综合综合久久综合| 国产精品久久久久永久免费观看 | 色八戒一区二区三区| 天天综合色天天综合| 国产日韩一级二级三级| 在线观看视频一区二区| 久久se这里有精品| 亚洲女人****多毛耸耸8| 日韩欧美国产综合在线一区二区三区 | 久久欧美一区二区| 色哟哟一区二区在线观看 | 蜜臀精品一区二区三区在线观看 | 国产成人精品综合在线观看| 亚洲伦理在线精品| 精品精品欲导航| 色婷婷国产精品综合在线观看| 日本不卡中文字幕| 亚洲人午夜精品天堂一二香蕉| 日韩欧美一区二区在线视频| 99久久国产综合精品女不卡| 蜜桃精品视频在线观看| 亚洲精品免费播放| 欧美国产一区二区在线观看| 欧美日韩一区二区在线观看 | 91在线国产观看| 国产一区二区影院| 日韩电影一二三区| 亚洲久本草在线中文字幕| 久久久久国产精品免费免费搜索| 欧美视频第二页| 91色综合久久久久婷婷| 高清在线不卡av| 精品一区二区在线免费观看| 亚洲成av人影院| 亚洲黄色录像片| 国产精品乱码人人做人人爱| 26uuu久久综合| 日韩欧美亚洲一区二区| 欧美女孩性生活视频| 欧洲国产伦久久久久久久| 成人av中文字幕| 国产成人精品一区二区三区网站观看 | 中文字幕日韩精品一区| 久久久久国产精品麻豆ai换脸| 日韩无一区二区| 欧美一区二区啪啪| 欧美高清视频www夜色资源网| 欧美私人免费视频| 欧美三级在线看| 欧美日韩高清影院| 欧美日韩亚洲另类| 欧美精品成人一区二区三区四区| 91成人在线观看喷潮| 在线观看av一区二区| 91久久免费观看| 欧美日韩一区二区三区在线看| 在线亚洲免费视频| 欧美日韩一区二区不卡| 欧美精品久久一区二区三区 | 91国偷自产一区二区三区成为亚洲经典 | 不卡的电影网站| av电影在线不卡| 色婷婷激情综合| 欧美日韩国产高清一区| 在线播放中文一区| 欧美不卡在线视频| 国产无遮挡一区二区三区毛片日本| 国产欧美精品国产国产专区| 国产精品激情偷乱一区二区∴| 《视频一区视频二区| 亚洲精品视频观看| 五月婷婷欧美视频| 国内精品免费在线观看| 99久久精品免费| 欧美福利视频一区| 久久久久97国产精华液好用吗| 国产精品久久久久久久久免费桃花| 亚洲人午夜精品天堂一二香蕉| 亚洲综合成人在线视频| 免费在线观看精品| www.爱久久.com| 欧美日韩精品综合在线| 久久网站热最新地址| 亚洲视频狠狠干| 日韩**一区毛片| 成人精品免费视频| 欧美精品三级日韩久久| 久久伊99综合婷婷久久伊| 一区二区三区在线免费播放| 麻豆精品一区二区三区| 91老司机福利 在线| 日韩精品一区二区三区在线| 国产精品麻豆网站| 久久精品免费观看| 91麻豆.com| 久久久亚洲精品一区二区三区| 亚洲精品视频观看| 国产精品伊人色| 欧美日本在线看| 国产精品免费aⅴ片在线观看| 奇米一区二区三区av| 99re成人在线| 久久久久国产精品免费免费搜索| 亚洲亚洲精品在线观看| 粉嫩一区二区三区性色av| 正在播放亚洲一区| 一级做a爱片久久| 国产99精品视频| 日韩美女主播在线视频一区二区三区| 国产精品高潮呻吟久久| 国产一区二区三区免费播放| 欧美日韩午夜在线视频| 中文字幕亚洲在| 国产福利精品一区| 日韩视频在线永久播放| 性做久久久久久免费观看| av不卡免费在线观看| 久久久久一区二区三区四区| 五月天国产精品| 欧美做爰猛烈大尺度电影无法无天| 亚洲女性喷水在线观看一区| 国产福利一区二区三区视频在线| 欧美大片日本大片免费观看| 午夜成人免费电影| 欧美日韩国产不卡| 午夜在线成人av| 欧美色偷偷大香| 亚洲一区在线观看免费观看电影高清| 99精品视频一区二区三区| 国产精品视频一区二区三区不卡| 国产精品一区二区在线看| 久久久五月婷婷| 国产成人精品三级麻豆|