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

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

?? mx27_v4l2_capture.c

?? LINUX下的ov2640驅動程序
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. *//* * The code contained herein is licensed under the GNU General Public * License. You may obtain a copy of the GNU General Public License * Version 2 or later at the following locations: * * http://www.opensource.org/licenses/gpl-license.html * http://www.gnu.org/copyleft/gpl.html *//*! * @file mx27_v4l2_capture.c * * @brief MX27 Video For Linux 2 driver * * @ingroup MXC_V4L2_CAPTURE */#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/slab.h>#include <linux/ctype.h>#include <linux/pagemap.h>#include <linux/vmalloc.h>#include <linux/types.h>#include <linux/fb.h>#include <linux/pci.h>#include <linux/platform_device.h>#include <linux/version.h>#include <media/v4l2-dev.h>#include <asm/io.h>#include <asm/semaphore.h>#include "mxc_v4l2_capture.h"#include "mx27_prp.h"#include "mx27_csi.h"static int csi_mclk_flag_backup;static int video_nr = -1;extern cam_data *g_cam;static int dq_intr_cnt = 0;static int dq_timeout_cnt = 0;static int empty_wq_cnt = 0;/*! * Free frame buffers * * @param cam      Structure cam_data * * * @return status  0 success. */static int mxc_free_frame_buf(cam_data * cam){	int i;	for (i = 0; i < FRAME_NUM; i++) {		if (cam->frame[i].vaddress != 0) {			dma_free_coherent(0,					  cam->frame[i].buffer.length,					  cam->frame[i].vaddress,					  cam->frame[i].paddress);			cam->frame[i].vaddress = 0;		}	}	return 0;
}/*! * Allocate frame buffers * * @param cam      Structure cam_data * * * @param count    int number of buffer need to allocated * * @return status  -0 Successfully allocated a buffer, -ENOBUFS	failed. */static int mxc_allocate_frame_buf(cam_data * cam, int count){	int i;	for (i = 0; i < count; i++) {		cam->frame[i].vaddress = dma_alloc_coherent(0,							    PAGE_ALIGN(cam->v2f.								       fmt.pix.								       sizeimage),							    &cam->frame[i].							    paddress,							    GFP_DMA |							    GFP_KERNEL);		if (cam->frame[i].vaddress == 0) {			pr_debug("mxc_allocate_frame_buf failed.\n");			mxc_free_frame_buf(cam);			return -ENOBUFS;		}		cam->frame[i].buffer.index = i;		cam->frame[i].buffer.flags = V4L2_BUF_FLAG_MAPPED;		cam->frame[i].buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;		cam->frame[i].buffer.length =		    PAGE_ALIGN(cam->v2f.fmt.pix.sizeimage);		cam->frame[i].buffer.memory = V4L2_MEMORY_MMAP;		cam->frame[i].buffer.m.offset = cam->frame[i].paddress;		cam->frame[i].index = i;	}	return 0;}/*! * Free frame buffers status * * @param cam    Structure cam_data * * * @return none */static void mxc_free_frames(cam_data * cam){	int i;	for (i = 0; i < FRAME_NUM; i++) {		cam->frame[i].buffer.flags = V4L2_BUF_FLAG_MAPPED;	}	cam->enc_counter = 0;	cam->skip_frame = 0;	INIT_LIST_HEAD(&cam->ready_q);	INIT_LIST_HEAD(&cam->working_q);	INIT_LIST_HEAD(&cam->done_q);}/*! * Return the buffer status * * @param cam 	   Structure cam_data * * @param buf      Structure v4l2_buffer * * * @return status  0 success, EINVAL failed. */static int mxc_v4l2_buffer_status(cam_data * cam, struct v4l2_buffer *buf){	/* check range */	if (buf->index < 0 || buf->index >= FRAME_NUM) {		pr_debug("mxc_v4l2_buffer_status buffers not allocated\n");		return -EINVAL;	}	memcpy(buf, &(cam->frame[buf->index].buffer), sizeof(*buf));	return 0;}/*! * start the encoder job * * @param cam      structure cam_data * * * @return status  0 Success */static int mxc_streamon(cam_data * cam){	struct mxc_v4l_frame *frame;	int err = 0;	if (!cam)		return -EIO;	if (list_empty(&cam->ready_q)) {		printk(KERN_ERR "mxc_streamon buffer not been queued yet\n");		return -EINVAL;	}	cam->capture_pid = current->pid;	if (cam->enc_enable) {		err = cam->enc_enable(cam);		if (err != 0) {			return err;		}	}	cam->ping_pong_csi = 0;	if (cam->enc_update_eba) {		frame =		    list_entry(cam->ready_q.next, struct mxc_v4l_frame, queue);		list_del(cam->ready_q.next);		list_add_tail(&frame->queue, &cam->working_q);		err = cam->enc_update_eba(frame->paddress, &cam->ping_pong_csi);		frame =		    list_entry(cam->ready_q.next, struct mxc_v4l_frame, queue);		list_del(cam->ready_q.next);		list_add_tail(&frame->queue, &cam->working_q);		err |=		    cam->enc_update_eba(frame->paddress, &cam->ping_pong_csi);	} else {		return -EINVAL;	}	return err;}/*! * Shut down the encoder job * * @param cam      structure cam_data * * * @return status  0 Success */static int mxc_streamoff(cam_data * cam){	int err = 0;	if (!cam)		return -EIO;	if (cam->enc_disable) {		err = cam->enc_disable(cam);	}	mxc_free_frames(cam);	return err;}/*! * Valid whether the palette is supported * * @param palette pixel format * * @return 0 if failed */static inline int valid_mode(u32 palette){	/*	 * MX27 PrP channel 2 supports YUV444, but YUV444 is not	 * defined by V4L2 :(	 */	return ((palette == V4L2_PIX_FMT_YUYV) ||		(palette == V4L2_PIX_FMT_YUV420));}/*! * Valid and adjust the overlay window size, position * * @param cam      structure cam_data * * @param win      struct v4l2_window  * * * @return 0 */static int verify_preview(cam_data * cam, struct v4l2_window *win){	if (cam->output >= num_registered_fb) {		pr_debug("verify_preview No matched.\n");		return -1;	}	cam->overlay_fb = (struct fb_info *)registered_fb[cam->output];	/* TODO: suppose 16bpp, 4 bytes alignment */	win->w.left &= ~0x1;	if (win->w.width + win->w.left > cam->overlay_fb->var.xres)		win->w.width = cam->overlay_fb->var.xres - win->w.left;	if (win->w.height + win->w.top > cam->overlay_fb->var.yres)		win->w.height = cam->overlay_fb->var.yres - win->w.top;	/*	 * TODO: suppose 16bpp. Rounded down to a multiple of 2 pixels for	 * width according to PrP limitations.	 */	if ((cam->rotation == V4L2_MXC_ROTATE_90_RIGHT)	    || (cam->rotation == V4L2_MXC_ROTATE_90_RIGHT_VFLIP)	    || (cam->rotation == V4L2_MXC_ROTATE_90_RIGHT_HFLIP)	    || (cam->rotation == V4L2_MXC_ROTATE_90_LEFT))		win->w.height &= ~0x1;	else		win->w.width &= ~0x1;	return 0;}/*! * start the viewfinder job * * @param cam      structure cam_data * * * @return status  0 Success */static int start_preview(cam_data * cam){	int err = 0;	err = prp_vf_select(cam);	if (err != 0)		return err;	cam->overlay_pid = current->pid;	err = cam->vf_start_sdc(cam);	return err;}/*! * shut down the viewfinder job * * @param cam      structure cam_data * * * @return status  0 Success */static int stop_preview(cam_data * cam){	int err = 0;	err = prp_vf_deselect(cam);	return err;}/*! * V4L2 - mxc_v4l2_g_fmt function * * @param cam         structure cam_data * * * @param f           structure v4l2_format * * * @return  status    0 success, EINVAL failed */static int mxc_v4l2_g_fmt(cam_data * cam, struct v4l2_format *f){	int retval = 0;	switch (f->type) {	case V4L2_BUF_TYPE_VIDEO_CAPTURE:		f->fmt.pix.width = cam->v2f.fmt.pix.width;		f->fmt.pix.height = cam->v2f.fmt.pix.height;		f->fmt.pix.sizeimage = cam->v2f.fmt.pix.sizeimage;		f->fmt.pix.pixelformat = cam->v2f.fmt.pix.pixelformat;		f->fmt.pix.bytesperline = cam->v2f.fmt.pix.bytesperline;		f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;		retval = 0;		break;	case V4L2_BUF_TYPE_VIDEO_OVERLAY:		f->fmt.win = cam->win;		break;	default:		retval = -EINVAL;	}	return retval;}/*! * V4L2 - mxc_v4l2_s_fmt function * * @param cam         structure cam_data * * * @param f           structure v4l2_format * * * @return  status    0 success, EINVAL failed */static int mxc_v4l2_s_fmt(cam_data * cam, struct v4l2_format *f){	int retval = 0;	int size = 0;	int bytesperline = 0;	switch (f->type) {	case V4L2_BUF_TYPE_VIDEO_CAPTURE:		if (!valid_mode(f->fmt.pix.pixelformat)) {			pr_debug("mxc_v4l2_s_fmt: format not supported\n");			retval = -EINVAL;		}		if (cam->rotation != V4L2_MXC_ROTATE_NONE)			pr_debug("mxc_v4l2_s_fmt: capture rotation ignored\n");		switch (f->fmt.pix.pixelformat) {		case V4L2_PIX_FMT_YUYV:			f->fmt.pix.width &= ~0x1;	/* Multiple of 2 */			size = f->fmt.pix.width * f->fmt.pix.height * 2;			bytesperline = f->fmt.pix.width * 2;			break;		case V4L2_PIX_FMT_YUV420:			f->fmt.pix.width &= ~0x7;	/* Multiple of 8 */			f->fmt.pix.height &= ~0x1;	/* Multiple of 2 */			size = f->fmt.pix.width * f->fmt.pix.height * 3 / 2;			bytesperline = f->fmt.pix.width * 3 / 2;			break;		default:			/* Suppose it's YUV444 or 32bpp */			size = f->fmt.pix.width * f->fmt.pix.height * 4;			bytesperline = f->fmt.pix.width * 4;			pr_info("mxc_v4l2_s_fmt: default assume"				" to be YUV444 interleaved.\n");			break;		}		if (f->fmt.pix.bytesperline < bytesperline) {			f->fmt.pix.bytesperline = bytesperline;		} else {			bytesperline = f->fmt.pix.bytesperline;		}		if (f->fmt.pix.sizeimage > size) {			pr_debug("mxc_v4l2_s_fmt: sizeimage bigger than"				 " needed.\n");			size = f->fmt.pix.sizeimage;		}		f->fmt.pix.sizeimage = size;		cam->v2f.fmt.pix.sizeimage = size;		cam->v2f.fmt.pix.bytesperline = bytesperline;		cam->v2f.fmt.pix.width = f->fmt.pix.width;		cam->v2f.fmt.pix.height = f->fmt.pix.height;		cam->v2f.fmt.pix.pixelformat = f->fmt.pix.pixelformat;		retval = 0;		break;	case V4L2_BUF_TYPE_VIDEO_OVERLAY:		retval = verify_preview(cam, &f->fmt.win);		cam->win = f->fmt.win;		break;	default:		retval = -EINVAL;	}	return retval;}/*! * get control param * * @param cam         structure cam_data * * * @param c           structure v4l2_control * * * @return  status    0 success, EINVAL failed */static int mxc_get_v42l_control(cam_data * cam, struct v4l2_control *c){	int status = 0;	switch (c->id) {	case V4L2_CID_HFLIP:		c->value = cam->rotation;		break;	case V4L2_CID_VFLIP:		c->value = cam->rotation;		break;	case V4L2_CID_MXC_ROT:		c->value = cam->rotation;		break;	case V4L2_CID_BRIGHTNESS:		c->value = cam->bright;		break;	case V4L2_CID_HUE:		c->value = cam->hue;		break;	case V4L2_CID_CONTRAST:		c->value = cam->contrast;		break;	case V4L2_CID_SATURATION:		c->value = cam->saturation;		break;	case V4L2_CID_RED_BALANCE:		c->value = cam->red;		break;	case V4L2_CID_BLUE_BALANCE:		c->value = cam->blue;		break;	case V4L2_CID_BLACK_LEVEL:		c->value = cam->ae_mode;		break;	case V4L2_CID_AUTO_WHITE_BALANCE:		c->value = cam->awb_enable;		break;	case V4L2_CID_AUTOGAIN:		c->value = cam->ae_enable;		break;	case V4L2_CID_MXC_FLICKER:		c->value = cam->flicker_ctrl;		break;	default:		status = -EINVAL;	}	return status;}/*! * V4L2 - set_control function * V4L2_CID_MXC_ROT is the extention for rotation/mirroring. * * @param cam         structure cam_data * * * @param c           structure v4l2_control * * * @return  status    0 success, EINVAL failed */static int mxc_set_v42l_control(cam_data * cam, struct v4l2_control *c){	switch (c->id) {	case V4L2_CID_HFLIP:		if (c->value == 1) {			if ((cam->rotation != V4L2_MXC_ROTATE_VERT_FLIP) &&			    (cam->rotation != V4L2_MXC_ROTATE_180))				cam->rotation = V4L2_MXC_ROTATE_HORIZ_FLIP;			else				cam->rotation = V4L2_MXC_ROTATE_180;		} else {			if (cam->rotation == V4L2_MXC_ROTATE_HORIZ_FLIP)				cam->rotation = V4L2_MXC_ROTATE_NONE;			else if (cam->rotation == V4L2_MXC_ROTATE_180)				cam->rotation = V4L2_MXC_ROTATE_VERT_FLIP;		}		break;	case V4L2_CID_VFLIP:		if (c->value == 1) {			if ((cam->rotation != V4L2_MXC_ROTATE_HORIZ_FLIP) &&			    (cam->rotation != V4L2_MXC_ROTATE_180))				cam->rotation = V4L2_MXC_ROTATE_VERT_FLIP;			else				cam->rotation = V4L2_MXC_ROTATE_180;		} else {			if (cam->rotation == V4L2_MXC_ROTATE_VERT_FLIP)				cam->rotation = V4L2_MXC_ROTATE_NONE;			if (cam->rotation == V4L2_MXC_ROTATE_180)				cam->rotation = V4L2_MXC_ROTATE_HORIZ_FLIP;		}		break;	case V4L2_CID_MXC_ROT:		switch (c->value) {		case V4L2_MXC_ROTATE_NONE:		case V4L2_MXC_ROTATE_VERT_FLIP:		case V4L2_MXC_ROTATE_HORIZ_FLIP:		case V4L2_MXC_ROTATE_180:		case V4L2_MXC_ROTATE_90_RIGHT:		case V4L2_MXC_ROTATE_90_RIGHT_VFLIP:		case V4L2_MXC_ROTATE_90_RIGHT_HFLIP:		case V4L2_MXC_ROTATE_90_LEFT:			cam->rotation = c->value;			break;		default:			return -EINVAL;		}		break;	case V4L2_CID_HUE:		cam->hue = c->value;		break;	case V4L2_CID_CONTRAST:		cam->contrast = c->value;		break;	case V4L2_CID_BRIGHTNESS:		cam->bright = c->value;	case V4L2_CID_SATURATION:		cam->saturation = c->value;	case V4L2_CID_RED_BALANCE:		cam->red = c->value;	case V4L2_CID_BLUE_BALANCE:		cam->blue = c->value;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产色综合久久| 在线播放欧美女士性生活| 91精品国产高清一区二区三区蜜臀| 国产欧美一区二区精品忘忧草| 亚洲v日本v欧美v久久精品| 成人免费不卡视频| 日韩精品最新网址| 亚洲成人免费看| 亚洲国产精华液网站w| 男人的天堂久久精品| 在线视频欧美精品| 国产精品白丝在线| 国产精品99久| 精品日韩在线观看| 免费观看日韩av| 欧美午夜精品一区| 亚洲伦理在线免费看| 成人性视频免费网站| 久久免费的精品国产v∧| 日本免费在线视频不卡一不卡二| 欧美性生活久久| 亚洲女人的天堂| 成人高清视频在线| 国产亲近乱来精品视频| 精品一区二区在线看| 日韩视频一区二区| 日韩精品三区四区| 在线播放一区二区三区| 五月综合激情日本mⅴ| 欧美三级日韩在线| 亚洲午夜在线观看视频在线| 91国产成人在线| 樱花影视一区二区| 91国在线观看| 亚洲精品中文在线影院| 91麻豆swag| 亚洲卡通欧美制服中文| 日本韩国欧美三级| 亚洲综合色丁香婷婷六月图片| 91一区在线观看| 亚洲精品一二三四区| 亚洲欧洲精品一区二区三区不卡| 成人午夜电影小说| 国产精品婷婷午夜在线观看| 国产91精品入口| 国产精品久久毛片a| 成人aa视频在线观看| 中文字幕一区二区三区不卡| 91热门视频在线观看| 亚洲色图.com| 欧美午夜不卡视频| 香蕉乱码成人久久天堂爱免费| 欧美日韩三级一区二区| 日韩高清一级片| 欧美成人午夜电影| 国产精品1024| 中文字幕一区二区三区蜜月| 在线观看视频一区二区 | 色天使久久综合网天天| 亚洲精品国产一区二区精华液| 精品视频在线免费| 蜜臀va亚洲va欧美va天堂| 久久综合色播五月| 成+人+亚洲+综合天堂| 一区二区三区在线高清| 5566中文字幕一区二区电影| 久久99热国产| 国产精品美女久久久久av爽李琼 | 强制捆绑调教一区二区| 麻豆91在线播放免费| 2021国产精品久久精品| 成人国产在线观看| 亚洲一区二区黄色| 精品福利视频一区二区三区| 国产风韵犹存在线视精品| 亚洲女厕所小便bbb| 这里是久久伊人| 国产盗摄一区二区三区| 亚洲精品视频在线观看网站| 91精品国产欧美一区二区18| 国产成人在线看| 亚洲一卡二卡三卡四卡无卡久久 | 欧美日韩激情一区二区三区| 蜜桃一区二区三区四区| 国产三级精品三级在线专区| 91福利国产精品| 麻豆久久一区二区| 亚洲视频精选在线| 日韩欧美中文字幕精品| 北条麻妃国产九九精品视频| 日日夜夜精品视频天天综合网| 国产一区二区在线影院| 综合激情网...| 日韩欧美一区二区不卡| 91在线丨porny丨国产| 免费成人小视频| 综合色中文字幕| 精品久久人人做人人爽| 91蝌蚪porny九色| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲精品中文在线| 国产校园另类小说区| 欧美日韩免费不卡视频一区二区三区| 国产一区二区精品久久91| 亚洲一区二区影院| 国产欧美日韩视频一区二区 | 成人做爰69片免费看网站| 亚洲成人精品一区| 国产精品久久久久久久午夜片| 欧美一区二区三区在线观看视频| 99久久精品免费看国产| 久久99精品国产麻豆婷婷| 亚洲影院免费观看| 中文字幕第一区第二区| 蜜桃视频一区二区三区| 亚洲老妇xxxxxx| 国产精品三级视频| 日韩欧美一级在线播放| 欧美三级欧美一级| 99久久国产综合色|国产精品| 激情综合网最新| 婷婷成人综合网| 亚洲最大的成人av| 国产精品色在线| 久久久久青草大香线综合精品| 欧美久久婷婷综合色| 色妹子一区二区| 成人av在线资源网| 国产乱人伦偷精品视频免下载| 日本vs亚洲vs韩国一区三区二区| 亚洲精品va在线观看| 欧美国产1区2区| 久久久99免费| 欧美videos大乳护士334| 777色狠狠一区二区三区| 欧美影院一区二区| 一本大道久久精品懂色aⅴ| 波多野结衣中文字幕一区二区三区| 国产最新精品精品你懂的| 久久精品国产精品亚洲精品| 视频在线观看91| 在线观看日产精品| 色呦呦网站一区| 91亚洲午夜精品久久久久久| 成人免费观看视频| 不卡av在线网| 成人av资源站| 成人av网站在线| 成人精品免费视频| 成人性色生活片| www.亚洲在线| 成人av在线观| 91丨porny丨中文| 一本色道久久综合亚洲aⅴ蜜桃| 97久久精品人人做人人爽50路| 91在线精品一区二区三区| 91在线小视频| 日本韩国精品在线| 在线国产亚洲欧美| 欧美日韩免费不卡视频一区二区三区| 欧美日韩一区二区三区不卡| 欧美日韩视频一区二区| 3atv一区二区三区| 日韩欧美国产一二三区| 精品国产乱码久久久久久1区2区| 精品久久久久久最新网址| 久久人人97超碰com| 欧美国产日韩亚洲一区| 成人精品视频.| 91蜜桃在线免费视频| 日本韩国精品一区二区在线观看| 欧美视频你懂的| 欧美一区二区在线观看| 精品久久久久一区二区国产| 国产午夜精品在线观看| 中文字幕一区二区在线播放| 亚洲精品ww久久久久久p站| 亚洲国产成人av网| 蜜桃精品视频在线| 国产盗摄一区二区三区| 色呦呦国产精品| 337p亚洲精品色噜噜噜| 久久久另类综合| 亚洲日本青草视频在线怡红院| 亚洲高清不卡在线| 久久99精品久久久久久久久久久久| 国产乱码精品一区二区三| 成人手机电影网| 在线一区二区三区| 日韩欧美你懂的| 亚洲国产精品ⅴa在线观看| 亚洲精品少妇30p| 秋霞午夜av一区二区三区| 国产精品18久久久久久久久久久久 | 久久色视频免费观看| 国产精品白丝在线| 欧美一区二区三区免费| 久久精品一区蜜桃臀影院| 亚洲柠檬福利资源导航| 免费高清成人在线|