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

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

?? mx27_prpsw.c

?? LINUX下的ov2640驅(qū)動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
		cam->rot_vf_buf_size[i] =		    cam->win.w.width * cam->win.w.height * 2;		cam->rot_vf_bufs_vaddr[i] =		    dma_alloc_coherent(0, cam->rot_vf_buf_size[i],				       &cam->rot_vf_bufs[i],				       GFP_DMA | GFP_KERNEL);		if (!cam->rot_vf_bufs_vaddr[i]) {			pr_debug("Failed to alloc memory for vf rotation.\n");			prp_rot_mem_free(cam);			return -1;		}		g_vaddr_rotbuf[i] =		    ioremap_cached(cam->rot_vf_bufs[i],				   cam->rot_vf_buf_size[i]);		if (!g_vaddr_rotbuf[i]) {			pr_debug			    ("Failed to ioremap_cached() for rotation buffer.\n");			prp_rot_mem_free(cam);			return -1;		}	}	return 0;}/*! * @brief Free intermedaite memory for overlay rotation/mirroring. * @param cam	Pointer to cam_data structure * @return	Zero on success, others on failure */static void prp_rot_mem_free(cam_data * cam){	int i;	for (i = 0; i < 2; i++) {		if (cam->rot_vf_bufs_vaddr[i]) {			dma_free_coherent(0,					  cam->rot_vf_buf_size[i],					  cam->rot_vf_bufs_vaddr[i],					  cam->rot_vf_bufs[i]);		}		cam->rot_vf_bufs[i] = 0;		cam->rot_vf_bufs_vaddr[i] = 0;		cam->rot_vf_buf_size[i] = 0;		if (g_vaddr_rotbuf[i]) {			iounmap(g_vaddr_rotbuf[i]);			g_vaddr_rotbuf[i] = 0;		}	}}/*! * @brief Start overlay (view finder). * @param private	Pointer to cam_data structure * @return		Zero on success, others on failure */static int prp_vf_start(void *private){	cam_data *cam = (cam_data *) private;	if (cam->v4l2_fb.flags == V4L2_FBUF_FLAG_OVERLAY) {		prp_vf_mem_free(cam);		if (prp_vf_mem_alloc(cam)) {			pr_info("Error to allocate vf buffer\n");			return -ENOMEM;		}	}	if (cam->rotation != V4L2_MXC_ROTATE_NONE) {		prp_rot_mem_free(cam);		if (prp_rot_mem_alloc(cam)) {			pr_info("Error to allocate rotation buffer\n");			prp_vf_mem_free(cam);			return -ENOMEM;		}	}	if (prp_v4l2_cfg(&g_prp_cfg, cam)) {		prp_vf_mem_free(cam);		prp_rot_mem_free(cam);		return -1;	}	csi_enable_mclk(CSI_MCLK_VF, true, true);	prphw_reset();	if (prphw_cfg(&g_prp_cfg)) {		prp_vf_mem_free(cam);		prp_rot_mem_free(cam);		return -1;	}	g_vfbuf = g_rotbuf = 0;	tasklet_init(&prp_vf_tasklet, rotation, (unsigned long)private);	prphw_enable(cam->capture_on ? (PRP_CHANNEL_1 | PRP_CHANNEL_2)		     : PRP_CHANNEL_1);	return 0;}/*! * @brief Stop overlay (view finder). * @param private	Pointer to cam_data structure * @return		Zero on success, others on failure */static int prp_vf_stop(void *private){	cam_data *cam = (cam_data *) private;	prphw_disable(PRP_CHANNEL_1);	csi_enable_mclk(CSI_MCLK_VF, false, false);	tasklet_kill(&prp_vf_tasklet);	if (cam->v4l2_fb.flags == V4L2_FBUF_FLAG_OVERLAY) {		struct fb_gwinfo gwinfo;		/* Disable graphic window */		gwinfo.enabled = 0;		mx2_gw_set(&gwinfo);		prp_vf_mem_free(cam);	}	prp_rot_mem_free(cam);	if (g_vaddr_fb) {		iounmap(g_vaddr_fb);		g_vaddr_fb = 0;	}	return 0;}/*! * @brief Setup overlay functions. * @param private	Pointer to cam_data structure * @return		Zero on success, others on failure */int prp_vf_select(void *private){	int ret = 0;	cam_data *cam = (cam_data *) private;	if (cam) {		cam->vf_start_sdc = prp_vf_start;		cam->vf_stop_sdc = prp_vf_stop;		cam->overlay_active = false;	} else		ret = -EIO;	return ret;}/*! * @brief Uninstall overlay functions. * @param private	Pointer to cam_data structure * @return		Zero on success, others on failure */int prp_vf_deselect(void *private){	int ret = 0;	cam_data *cam = (cam_data *) private;	ret = prp_vf_stop(private);	if (cam) {		cam->vf_start_sdc = NULL;		cam->vf_stop_sdc = NULL;	}	return ret;}/*! * @brief Start still picture capture. * @param private	Pointer to cam_data structure * @return		Zero on success, others on failure */static int prp_still_start(void *private){	cam_data *cam = (cam_data *) private;	g_still_on = 1;	g_prp_cfg.ch2_ptr = (unsigned int)cam->still_buf;	g_prp_cfg.ch2_ptr2 = 0;	if (prp_v4l2_cfg(&g_prp_cfg, cam))		return -1;	csi_enable_mclk(CSI_MCLK_RAW, true, true);	prphw_reset();	if (prphw_cfg(&g_prp_cfg)) {		g_still_on = 0;		return -1;	}	prphw_enable(cam->overlay_on ? (PRP_CHANNEL_1 | PRP_CHANNEL_2)		     : PRP_CHANNEL_2);	return 0;}/*! * @brief Stop still picture capture. * @param private	Pointer to cam_data structure * @return		Zero on success, others on failure */static int prp_still_stop(void *private){	prphw_disable(PRP_CHANNEL_2);	csi_enable_mclk(CSI_MCLK_RAW, false, false);	g_still_on = 0;	return 0;}/*! * @brief Setup functions for still picture capture. * @param private	Pointer to cam_data structure * @return		Zero on success, others on failure */int prp_still_select(void *private){	cam_data *cam = (cam_data *) private;	if (cam) {		cam->csi_start = prp_still_start;		cam->csi_stop = prp_still_stop;	}	return 0;}/*! * @brief Uninstall functions for still picture capture. * @param private	Pointer to cam_data structure * @return		Zero on success, others on failure */int prp_still_deselect(void *private){	cam_data *cam = (cam_data *) private;	int err = 0;	err = prp_still_stop(cam);	if (cam) {		cam->csi_start = NULL;		cam->csi_stop = NULL;	}	return err;}/*! * @brief Perform software rotation or mirroring * @param private	Argument passed to the tasklet */static void rotation(unsigned long private){	char *src, *dst;	int width, height, s_stride, d_stride;	int size;	cam_data *cam = (cam_data *) private;	src = g_vaddr_rotbuf[g_rotbuf];	size = cam->rot_vf_buf_size[g_rotbuf];	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)) {		width = cam->win.w.height;		height = cam->win.w.width;		s_stride = cam->win.w.height << 1;	} else {		width = cam->win.w.width;		height = cam->win.w.height;		s_stride = cam->win.w.width << 1;	}	if (cam->v4l2_fb.flags == V4L2_FBUF_FLAG_OVERLAY) {		dst = g_vaddr_vfbuf[g_vfbuf];		d_stride = cam->win.w.width << 1;	} else {		/* The destination is the framebuffer */		struct fb_info *fb = cam->overlay_fb;		if (!fb)			return;		dst = g_vaddr_fb;		dst += cam->win.w.top * fb->var.xres_virtual		    * (fb->var.bits_per_pixel >> 3)		    + cam->win.w.left * (fb->var.bits_per_pixel >> 3);		d_stride = fb->var.xres_virtual << 1;	}	/*	 * Invalidate the data in cache before performing the SW rotaion	 * or mirroring in case the image size is less than QVGA. For image	 * larger than QVGA it is not invalidated becase the invalidation	 * will consume much time while we don't see any artifacts on the	 * output if we don't perform invalidation for them.	 * Similarly we don't flush the data after SW rotation/mirroring.	 */	if (size < 320 * 240 * 2)		consistent_sync(src, size, DMA_FROM_DEVICE);	switch (cam->rotation) {	case V4L2_MXC_ROTATE_VERT_FLIP:		opl_vmirror_u16(src, s_stride, width, height, dst, d_stride);		break;	case V4L2_MXC_ROTATE_HORIZ_FLIP:		opl_hmirror_u16(src, s_stride, width, height, dst, d_stride);		break;	case V4L2_MXC_ROTATE_180:		opl_rotate180_u16(src, s_stride, width, height, dst, d_stride);		break;	case V4L2_MXC_ROTATE_90_RIGHT:		opl_rotate90_u16(src, s_stride, width, height, dst, d_stride);		break;	case V4L2_MXC_ROTATE_90_RIGHT_VFLIP:		opl_rotate90_vmirror_u16(src, s_stride, width, height, dst,					 d_stride);		break;	case V4L2_MXC_ROTATE_90_RIGHT_HFLIP:		/* ROTATE_90_RIGHT_HFLIP = ROTATE_270_RIGHT_VFLIP */		opl_rotate270_vmirror_u16(src, s_stride, width, height, dst,					  d_stride);		break;	case V4L2_MXC_ROTATE_90_LEFT:		opl_rotate270_u16(src, s_stride, width, height, dst, d_stride);		break;	default:		return;	}	/* Config and display the graphic window */	if (cam->v4l2_fb.flags == V4L2_FBUF_FLAG_OVERLAY) {		struct fb_gwinfo gwinfo;		gwinfo.enabled = 1;		gwinfo.alpha_value = 255;		gwinfo.ck_enabled = 0;		gwinfo.xpos = cam->win.w.left;		gwinfo.ypos = cam->win.w.top;		gwinfo.xres = cam->win.w.width;		gwinfo.yres = cam->win.w.height;		gwinfo.xres_virtual = cam->win.w.width;		gwinfo.vs_reversed = 0;		gwinfo.base = (unsigned long)cam->vf_bufs[g_vfbuf];		mx2_gw_set(&gwinfo);		g_vfbuf = g_vfbuf ? 0 : 1;	}}/* * @brief Check if the resize ratio is supported based on the input and output *        dimension * @param	input	input dimension * @param	output	output dimension * @return	output dimension (should equal the parameter *output*) * 		-1 on failure */static int check_simple(scale_t * scale, int input, int output, int ch){	unsigned short int_out;	/* PrP internel width or height */	unsigned short orig_out = output;	if (prp_scale(scale, input, output, input, &orig_out, &int_out, ch))		return -1;	/* resize failed */	else		return int_out;}/*! * @brief Check if the resize ratio is supported by PrP channel 1 * @param cfg	Pointer to emma_prp_cfg structure * @return	Zero on success, others on failure */static int prp_resize_check_ch1(emma_prp_cfg * cfg){	int in_w, in_h, ch1_w, ch1_h, ch2_w, ch2_h, w, h;	scale_t *pscale = &cfg->scale[0];	/* Ch1 width resize coeff */	if (cfg->ch1_pix == PRP_PIX1_UNUSED)		return 0;	in_w = cfg->in_width;	in_h = cfg->in_height;	ch1_w = cfg->ch1_width;	ch1_h = cfg->ch1_height;	ch2_w = cfg->ch2_width;	ch2_h = cfg->ch2_height;	/*	 * For channel 1, try parallel resize first. If the resize	 * ratio is not exactly supported, try cascade resize. If it	 * still fails, use parallel resize but with rounded value.	 */	w = check_simple(pscale, in_w, ch1_w, PRP_CHANNEL_1);	h = check_simple(pscale + 1, in_h, ch1_h, PRP_CHANNEL_1);	if ((in_w <= ch1_w * MAX_TBL) && (in_h <= MAX_TBL * ch1_h))		goto exit_parallel;	if (cfg->ch2_pix != PRP_PIX2_UNUSED) {		/*		 * Channel 2 is already used. The pscale is still pointing		 * to ch1 resize coeff for temporary use.		 */		if ((ch2_w * MAX_TBL <= ch1_w) && (ch2_h * MAX_TBL <= ch1_h)) {			w = check_simple(pscale, ch2_w, ch1_w, PRP_CHANNEL_1);			h = check_simple(pscale + 1, ch2_h, ch1_h,					 PRP_CHANNEL_1);			goto exit_cascade;		}	} else {		/*		 * Try cascade resize for width, width is multiple of 2.		 * Channel 2 is not used. So we have more values to pick		 * for channel 2 resize.		 */		if (in_w * MAX_TBL > ch1_w) {			for (w = in_w / 2; w > ch1_w; w /= 2) {				/* Ch1 width resize */				if (check_simple				    (pscale, w, ch1_w, PRP_CHANNEL_1) < 0)					continue;				/* Ch2 width resize */				ch2_w =				    check_simple(pscale + 2, in_w, w,						 PRP_CHANNEL_1);				if (ch2_w < 0) {					w = in_w / MAX_TBL;					continue;				}				check_simple(pscale, ch2_w, ch1_w,					     PRP_CHANNEL_1);				break;			}		} else {			w = check_simple(pscale, in_w, ch1_w, PRP_CHANNEL_1);			ch2_w = check_simple(pscale + 2, w, w, PRP_CHANNEL_1);		}		if (ch2_w >= ch1_w) {			if (in_h * MAX_TBL > ch1_h) {				/* try cascade resize for height */				for (h = in_h / 2; h > ch1_h; h /= 2) {					/* Ch2 height resize */					if (check_simple					    (pscale + 1, h, ch1_h,					     PRP_CHANNEL_1) < 0)						continue;					/* Ch1 height resize */					ch2_h =					    check_simple(pscale + 3, in_h, h,							 PRP_CHANNEL_1);					if (ch2_w < 0) {						h = in_h / MAX_TBL;						continue;					}					check_simple(pscale + 1, ch2_h, ch1_h,						     PRP_CHANNEL_1);					break;				}			} else {				h = check_simple(pscale + 1, in_h, ch1_h,						 PRP_CHANNEL_1);				ch2_h =				    check_simple(pscale + 3, h, h,						 PRP_CHANNEL_1);			}			goto exit_cascade;		}	}	pr_debug("Ch1 resize error.\n");	return -1;      exit_parallel:	cfg->ch1_scale.algo |= PRP_ALGO_BYPASS;	pr_debug("ch1 parallel resize.\n");	pr_debug("original width = %d internel width = %d\n", ch1_w, w);	pr_debug("original height = %d internel height = %d\n", ch1_h, h);	return 0;      exit_cascade:	cfg->ch1_scale.algo &= ~PRP_ALGO_BYPASS;	pr_debug("ch1 cascade resize.\n");	pr_debug("[width] in : ch2 : ch1=%d : %d : %d\n", in_w, ch2_w, ch1_w);	pr_debug("[height] in : ch2 : ch1=%d : %d : %d\n", in_h, ch2_h, ch1_h);	return 0;}/*! * @brief Check if the resize ratio is supported by PrP channel 2 * @param cfg	Pointer to emma_prp_cfg structure * @return	Zero on success, others on failure */static int prp_resize_check_ch2(emma_prp_cfg * cfg){	int w, h;	scale_t *pscale = &cfg->scale[2];	/* Ch2 width resize coeff */	if (cfg->ch2_pix == PRP_PIX2_UNUSED)		return 0;	w = check_simple(pscale, cfg->in_width, cfg->ch2_width, PRP_CHANNEL_2);	h = check_simple(pscale + 1, cfg->in_height, cfg->ch2_height,			 PRP_CHANNEL_2);	if ((w != -1) && (h != -1)) {		pr_debug("Ch2 resize.\n");		pr_debug("Original width = %d internel width = %d\n",			 cfg->ch2_width, w);		pr_debug("Original height = %d internel height = %d\n",			 cfg->ch2_height, h);		return 0;	} else {		pr_debug("Ch2 resize error.\n");		return -1;	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区三区的国产在线播放| 国产清纯在线一区二区www| 亚洲黄网站在线观看| 91免费精品国自产拍在线不卡| 中文字幕一区二区三区视频| av在线免费不卡| 亚洲人亚洲人成电影网站色| 欧美亚洲另类激情小说| 日韩激情av在线| 欧美电影免费观看高清完整版在线| 精品综合久久久久久8888| 久久婷婷色综合| av一区二区不卡| 亚洲国产精品一区二区www| 欧美二区三区的天堂| 久久99精品久久久| 亚洲视频资源在线| 欧美日韩国产首页| 久久99精品国产.久久久久久| 中文字幕av资源一区| 在线视频国内自拍亚洲视频| 日本中文在线一区| 国产日韩欧美一区二区三区综合| 91蝌蚪porny| 午夜在线成人av| 欧美高清在线视频| 欧美巨大另类极品videosbest | 欧美一区二区精美| 国产大片一区二区| 亚洲综合激情另类小说区| 日韩欧美123| 色妹子一区二区| 激情综合色丁香一区二区| 亚洲激情男女视频| 日韩欧美亚洲另类制服综合在线| 99久久久久久| 久久9热精品视频| 亚洲夂夂婷婷色拍ww47| 久久久久久一二三区| 91蝌蚪porny成人天涯| 国产盗摄女厕一区二区三区 | 久久激情五月激情| 亚洲欧美aⅴ...| 日韩欧美美女一区二区三区| 9色porny自拍视频一区二区| 亚洲图片欧美综合| 国产精品天天看| 日韩视频一区二区三区在线播放 | 国产一区二区不卡在线| 亚洲综合色成人| 国产精品免费丝袜| 欧美刺激午夜性久久久久久久| 日本高清成人免费播放| 懂色中文一区二区在线播放| 蜜桃视频一区二区| 亚洲成人先锋电影| 亚洲精品高清在线| 亚洲欧洲精品一区二区三区不卡| 精品成人在线观看| 在线综合视频播放| 欧美性感一区二区三区| 97成人超碰视| 99国产精品久| 91网站最新地址| 成人自拍视频在线| 高清国产一区二区| 国产精品一级在线| 国产麻豆9l精品三级站| 久久爱www久久做| 久久成人免费日本黄色| 蜜臀av亚洲一区中文字幕| 日韩中文字幕亚洲一区二区va在线 | 亚洲一区二区精品视频| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 亚洲视频一区在线观看| 中文字幕不卡一区| 亚洲欧洲精品成人久久奇米网| 亚洲国产成人一区二区三区| 国产精品污污网站在线观看| 欧美激情在线一区二区| 国产精品国产三级国产aⅴ原创| 国产精品免费久久| 亚洲免费观看视频| 亚洲精品久久久蜜桃| 一区二区高清免费观看影视大全| 亚洲色图欧美在线| 一区二区三区鲁丝不卡| 亚洲图片欧美视频| 奇米影视在线99精品| 韩国av一区二区三区在线观看| 国产精品一区2区| 丁香婷婷综合五月| 色婷婷av久久久久久久| 欧美伊人久久大香线蕉综合69| 欧美久久一二区| 日韩欧美在线影院| 国产嫩草影院久久久久| 亚洲色图19p| 三级不卡在线观看| 国产一区二区三区久久久| 成人av动漫网站| 日本精品视频一区二区| 日韩一区国产二区欧美三区| 久久久99精品免费观看不卡| 国产精品白丝在线| 图片区小说区国产精品视频| 国产精品一区二区在线观看不卡| 成人av影视在线观看| 欧美视频在线观看一区| 久久天天做天天爱综合色| 国产精品免费视频一区| 三级久久三级久久久| 成人午夜看片网址| 欧美日韩一级二级三级| 国产午夜亚洲精品羞羞网站| 中文字幕亚洲欧美在线不卡| 婷婷激情综合网| 成人午夜在线播放| 6080亚洲精品一区二区| 国产精品国产三级国产aⅴ原创 | 亚洲欧美乱综合| 成人中文字幕电影| 色综合天天天天做夜夜夜夜做| 欧美日韩国产123区| 国产亚洲欧美在线| 午夜免费欧美电影| 成人h精品动漫一区二区三区| 欧美三级视频在线播放| 国产精品视频一二三| 日韩精品一二三四| 99精品热视频| 欧美sm极限捆绑bd| 亚洲国产日韩一级| 99精品欧美一区二区蜜桃免费| 欧美高清精品3d| 国产精品国产三级国产aⅴ原创 | 国产成人免费视频| 欧美理论电影在线| 亚洲欧美一区二区三区国产精品 | 蜜臀精品一区二区三区在线观看 | 亚洲亚洲人成综合网络| 国产成人av一区二区三区在线 | 日韩精品一区二区三区在线观看 | 国产午夜精品一区二区三区四区| 亚洲一区在线播放| 97成人超碰视| 国产精品网友自拍| 国产经典欧美精品| 欧美电影免费观看高清完整版在线 | 国产精品美女久久久久aⅴ| 麻豆精品蜜桃视频网站| 欧美日韩国产另类不卡| 伊人色综合久久天天| 97se亚洲国产综合自在线 | 亚洲欧美激情小说另类| 久久69国产一区二区蜜臀| 欧美军同video69gay| 亚洲bt欧美bt精品| 欧美色综合天天久久综合精品| 综合电影一区二区三区| 成人国产精品免费网站| 久久久久久久网| 国产精品香蕉一区二区三区| 久久久www免费人成精品| 久久99精品一区二区三区三区| 91在线码无精品| 亚洲欧洲日韩女同| 91美女片黄在线观看| 成人欧美一区二区三区黑人麻豆| 99久久国产综合精品女不卡| 国产精品嫩草99a| 一本在线高清不卡dvd| 日韩美女视频19| 91国偷自产一区二区三区观看| 亚洲一级二级在线| 911精品国产一区二区在线| 视频一区二区中文字幕| 日韩一区二区三区电影| 免费高清不卡av| 久久精品视频免费| www.亚洲精品| 亚洲午夜精品久久久久久久久| 欧美日韩和欧美的一区二区| 婷婷激情综合网| 欧美精品一区男女天堂| 大胆欧美人体老妇| 亚洲综合在线免费观看| 91官网在线观看| 日韩激情av在线| 国产日产亚洲精品系列| 成人高清免费在线播放| 一区二区不卡在线播放| 777奇米四色成人影色区| 狠狠色伊人亚洲综合成人| 国产精品久久久久久久久搜平片 | 亚洲已满18点击进入久久| 在线欧美日韩国产| 免费成人性网站| 国产精品欧美久久久久无广告| 欧美中文字幕一二三区视频|