display.c

来自「omap3 linux 2.6 用nocc去除了冗余代码」· C语言 代码 · 共 2,061 行 · 第 1/5 页

C
2,061
字号
}void omap2_disp_start_video_layer(int ltype){	int bytesperpixel = 0, gfx_format, v, overlay_opt_enable = 0;	int gfx_posX, gfx_posY, vid_posX, vid_posY;	int gfx_sizeX, gfx_sizeY, vid_sizeX, vid_sizeY;	int screen_width, screen_height;	int X, Y, skip_val;	int gfx_pix_inc, gfx_row_inc;	int  overlay_opt_delta = 0;	gfx_format = dispc_reg_in(DISPC_GFX_ATTRIBUTES);	switch (gfx_format & DISPC_GFX_ATTRIBUTES_GFXFORMAT) {		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_BITMAP1:		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_BITMAP2:		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_BITMAP4:		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_BITMAP8:			bytesperpixel = 1;			break;		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_RGB12:		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_RGB16:			bytesperpixel = 2;			break;		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_RGB24:		default:			bytesperpixel = 4;			break;	}        if (ltype == OMAP2_VIDEO1) v = 0;        else if (ltype == OMAP2_VIDEO2) v = 1;        else return;	if (omap2_disp_get_output_dev(ltype) == OMAP2_OUTPUT_TV) {		if(is_sil_rev_less_than(OMAP3430_REV_ES2_0)){			if (!(dispc_reg_in(DISPC_CONFIG) & 						DISPC_CONFIG_TCKDIGENABLE))				overlay_opt_enable = 1;		} else {			if ((!(dispc_reg_in(DISPC_CONFIG) & 					DISPC_CONFIG_TCKDIGENABLE)) && 					(!(dispc_reg_in(DISPC_CONFIG) & 					DISPC_CONFIG_TVALPHAENABLE)))				overlay_opt_enable = 1;		}	} else {		/* if not enabled transparency enable overlay optimization */		if(is_sil_rev_less_than(OMAP3430_REV_ES2_0)){			if (!(dispc_reg_in(DISPC_CONFIG) & 						DISPC_CONFIG_TCKLCDENABLE))				overlay_opt_enable = 1;		} else {			if ((!(dispc_reg_in(DISPC_CONFIG) & 					DISPC_CONFIG_TCKLCDENABLE)) && 					(!(dispc_reg_in(DISPC_CONFIG) & 					DISPC_CONFIG_LCDALPHAENABLE)))				overlay_opt_enable = 1;		}	}	/** if GFX pipeline enabled and no transparency enabled	 * check for overlapping of GFX and Video pipelines to	 * enable overlay optimization	 */	if ((dispc_reg_in(DISPC_GFX_ATTRIBUTES) & DISPC_GFX_ATTRIBUTES_ENABLE) 			&& overlay_opt_enable && (ltype == OMAP2_VIDEO1)) {		gfx_posX = (dispc_reg_in(DISPC_GFX_POSITION) & 				DISPC_GFX_POSITION_GFXPOSX) >> 			DISPC_GFX_POSITION_GFXPOSX_SHIFT;		gfx_posY = (dispc_reg_in(DISPC_GFX_POSITION) & 				DISPC_GFX_POSITION_GFXPOSY) >> 			DISPC_GFX_POSITION_GFXPOSY_SHIFT;		gfx_sizeX = (dispc_reg_in(DISPC_GFX_SIZE) & 				DISPC_GFX_SIZE_GFXSIZEX) >> 			DISPC_GFX_SIZE_GFXSIZEX_SHIFT;		gfx_sizeY = (dispc_reg_in(DISPC_GFX_SIZE) & 				DISPC_GFX_SIZE_GFXSIZEY) >> 			DISPC_GFX_SIZE_GFXSIZEY_SHIFT;		vid_posX = (dispc_reg_in(DISPC_VID_POSITION(v)) & 				DISPC_VID_POSITION_VIDPOSX) >> 			DISPC_VID_POSITION_VIDPOSX_SHIFT;		vid_posY = (dispc_reg_in(DISPC_VID_POSITION(v)) & 				DISPC_VID_POSITION_VIDPOSY) >> 			DISPC_VID_POSITION_VIDPOSY_SHIFT;		vid_sizeX = ((dispc_reg_in(DISPC_VID_SIZE(v)) & 					DISPC_VID_SIZE_VIDSIZEX) >> 				DISPC_VID_SIZE_VIDSIZEX_SHIFT) + 1;		vid_sizeY = ((dispc_reg_in(DISPC_VID_SIZE(v)) & 					DISPC_VID_SIZE_VIDSIZEY) >> 				DISPC_VID_SIZE_VIDSIZEY_SHIFT) + 1;		gfx_pix_inc = dispc_reg_in(DISPC_GFX_PIXEL_INC);		gfx_row_inc =  dispc_reg_in(DISPC_GFX_ROW_INC);		omap2_disp_get_panel_size(omap2_disp_get_output_dev(ltype), 				&screen_width, &screen_height);		if (((gfx_posX + gfx_sizeX) <= vid_posX) || 				((gfx_posY + gfx_sizeY) <= vid_posY)) {			overlay_opt_enable = 0;		}	} else {		overlay_opt_enable = 0;	}	/* Enable overlay optimization */	if (overlay_opt_enable) {		X = vid_sizeX;		if ((vid_posX == 0) && (gfx_sizeX <= (vid_posX + vid_sizeX))) {			X = gfx_sizeX + 1;			Y = vid_sizeY + 1;			skip_val = Y * ((X - 1) * (gfx_pix_inc - 1 + 					bytesperpixel) + (gfx_row_inc - 1 + 					bytesperpixel));			goto skip;		}		if ((vid_posX + vid_sizeX) >= gfx_sizeX) {			X = gfx_sizeX - vid_posX + 1;		}		if ((vid_posX == 0) || (gfx_sizeX <= (vid_posX + vid_sizeX))) {			overlay_opt_delta = 0;		} else {			overlay_opt_delta = 1;		}		skip_val = (X * (gfx_pix_inc + bytesperpixel - 1) + 				overlay_opt_delta);skip:           /*dispc_reg_out(DISPC_GFX_WINDOW_SKIP,skip_val);		dispc_reg_merge(DISPC_CONTROL, 				DISPC_CONTROL_OVERLAYOPTIMIZATION,				DISPC_CONTROL_OVERLAYOPTIMIZATION);*/		;;	}	/* Enable the Video layer and set the Go Bit */	omap2_disp_enable_layer(ltype);}/* Flip the video overlay framebuffer.  The video overlay window may initially * be either enabled or disabled.  The overlay window will be enabled by this * routine.  fb_base_phys is the physical base address of the framebuffer for * the video overlay.  The address programmed into the base address register of * the video overlay window is calculated based on the cropped size and the full * size of the overlay framebuffer. */voidomap2_disp_start_vlayer(int ltype, struct v4l2_pix_format *pix,			struct v4l2_rect *crop, struct v4l2_window *win, 			unsigned long fb_base_phys,			int rotation_deg, int mirroring){	unsigned long cropped_base_phys;	int v, ps = 2,temp_ps=2,vr_ps = 1;	int offset=0, ctop=0, cleft=0, line_length=0;	int overlay_opt_delta, overlay_opt_enable = 0;	int gfx_posX, gfx_posY, vid_posX, vid_posY;	int gfx_sizeX, gfx_sizeY, vid_sizeX, vid_sizeY;	int screen_width, screen_height;	int bytesperpixel;	int X, Y, skip_val;	int gfx_pix_inc, gfx_row_inc;	u32 gfx_format;	int flicker_filter = 0;	gfx_format = dispc_reg_in(DISPC_GFX_ATTRIBUTES);	if ((omap2_disp_get_output_dev(ltype) == OMAP2_OUTPUT_TV) &&			((win->w.width == crop->width) && (win->w.height == crop->height)))		flicker_filter = 1;	switch (gfx_format & DISPC_GFX_ATTRIBUTES_GFXFORMAT) {		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_BITMAP1:		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_BITMAP2:		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_BITMAP4:		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_BITMAP8:			bytesperpixel = 1;			break;		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_RGB12:		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_RGB16:			bytesperpixel = 2;			break;		case DISPC_GFX_ATTRIBUTES_GFXFORMAT_RGB24:		default:			bytesperpixel = 4;			break;	}	if (ltype == OMAP2_VIDEO1) v = 0;	else if (ltype == OMAP2_VIDEO2) v = 1;	else return;	/*	 * If pixel format is YUV then PS = 4, for RGB16 PS = 2 RGB24 Unpack PS =4	 */	if (V4L2_PIX_FMT_YUYV == pix->pixelformat ||			V4L2_PIX_FMT_UYVY == pix->pixelformat) {		if (rotation_deg >= 0 || mirroring == 1) {			/* 			 * ps    - Actual pixel size for YUYV/UYVY for VRFB/Mirroring is 4 bytes			 * vr_ps - Virtually pixel size for YUYV/UYVY  is 2 bytes			 */			ps    = 4;			vr_ps = 2;		}		else			ps = 2; /* otherwise the pixel size is 2 byte */	}	else if(V4L2_PIX_FMT_RGB32 == pix->pixelformat) ps = 4;	else if(V4L2_PIX_FMT_RGB24 == pix->pixelformat) ps = 3;	/*	 * If rotation is selected then compute the rotation parameters	 */	if (rotation_deg >= 0) {		line_length = MAX_PIXELS_PER_LINE;		ctop  = (pix->height - crop->height) - crop->top;		cleft = (pix->width - crop->width) - crop->left;	}	else {		line_length = pix->width;	}	switch (rotation_deg) {		case 90: 			offset = (omap2_disp_get_vrfb_offset(pix->width,ps,SIDE_H) - (pix->width/vr_ps)) * ps * line_length;			temp_ps = ps/vr_ps;			if (mirroring == 0) {				cropped_base_phys = fb_base_phys + offset +					line_length * temp_ps * cleft + crop->top * temp_ps;			}			else{				cropped_base_phys =					fb_base_phys + offset +					line_length * temp_ps * cleft + crop->top * temp_ps +					(line_length * ( (crop->width/(vr_ps)) - 1) * ps);			}			break;		case 180:			offset = (omap2_disp_get_vrfb_offset(pix->height,ps,SIDE_H) - pix->height) * ps * line_length +				(omap2_disp_get_vrfb_offset(pix->width,ps,SIDE_W) - (pix->width/vr_ps)) * ps;			if (mirroring == 0) {				cropped_base_phys = fb_base_phys + offset +					(line_length * ps * ctop) + (cleft/vr_ps) * ps;			}			else {				cropped_base_phys =					fb_base_phys + offset + (line_length * ps * ctop) +					(cleft/vr_ps) * ps +					(line_length * (crop->height - 1) * ps);			}			break;		case 270:			offset = (omap2_disp_get_vrfb_offset(pix->height,ps,SIDE_W) - pix->height) * ps;			temp_ps = ps/vr_ps;			if (mirroring == 0) {				cropped_base_phys = fb_base_phys + offset +					line_length * temp_ps * crop->left + ctop * ps;			}			else {				cropped_base_phys =					fb_base_phys + offset + line_length * temp_ps * crop->left +					ctop * ps +					(line_length * ( (crop->width/vr_ps) - 1) * ps);			}			break;		case 0:			if (mirroring == 0) {				cropped_base_phys = fb_base_phys					+ (line_length * ps) * crop->top + (crop->left/vr_ps) * ps;			}			else {				cropped_base_phys =					fb_base_phys + (line_length * ps) * crop->top +					(crop->left/vr_ps) * ps +					(line_length * (crop->height - 1) * ps);			}			break;		default:			if (mirroring == 0) {				cropped_base_phys = fb_base_phys					+ line_length * ps * crop->top + crop->left * ps;			}			else {				cropped_base_phys = fb_base_phys					+ (line_length * ps * crop->top) / vr_ps +					(crop->left * ps) / vr_ps +					((crop->width / vr_ps) - 1) * ps;			}			break;	}	/* 	 * We store the information in the layer structure for : If user 	 * dynamically switches the pipeline from LCD to TV or vice versa 	 * we should have the necessary configurations for the output device 	 * (LCD/TV)	 */	/*	 * For LCD BA0 and BA1 are same	 */	layer[ltype].dma[0].ba0 = cropped_base_phys;	layer[ltype].dma[0].ba1 = cropped_base_phys;	/*	 * Store BA0 BA1 for TV, BA1 points to the alternate row	 */	layer[ltype].dma[1].ba0 = cropped_base_phys;	if (flicker_filter == 1){		layer[ltype].dma[1].ba1 = cropped_base_phys;	} else if(rotation_deg >= 0){		if(mirroring == 1)			layer[ltype].dma[1].ba1 = cropped_base_phys - line_length * ps;		else			layer[ltype].dma[1].ba1 = cropped_base_phys + line_length * ps;	} else {		if (mirroring == 1)			layer[ltype].dma[1].ba1 = cropped_base_phys + line_length * ps/vr_ps;		else			layer[ltype].dma[1].ba1 = cropped_base_phys + line_length * ps;	}	/* If output path is set to TV */	if (omap2_disp_get_output_dev(ltype) == OMAP2_OUTPUT_TV) {		dispc_reg_out(DISPC_VID_BA0(v), cropped_base_phys);		if(flicker_filter == 1){			dispc_reg_out(DISPC_VID_BA1(v), cropped_base_phys);		} else {			if(rotation_deg >= 0){				if(mirroring == 1)					dispc_reg_out(DISPC_VID_BA1(v),	cropped_base_phys - 							line_length * ps);				else					dispc_reg_out(DISPC_VID_BA1(v),	cropped_base_phys + 							line_length * ps);			}			else{				if(mirroring ==1)					dispc_reg_out(DISPC_VID_BA1(v),	cropped_base_phys + 							line_length * ps/vr_ps);				else					dispc_reg_out(DISPC_VID_BA1(v),	cropped_base_phys + 							line_length * ps);			}			}		dispc_reg_merge(DISPC_VID_ATTRIBUTES(v),				DISPC_VID_ATTRIBUTES_ENABLE,				DISPC_VID_ATTRIBUTES_ENABLE);		dispc_reg_merge(DISPC_CONTROL, DISPC_CONTROL_GODIGITAL,				DISPC_CONTROL_GODIGITAL);		/* if not enabled transparency and alpha blending enable overlay optimization */		if(is_sil_rev_less_than(OMAP3430_REV_ES2_0)){			if (!(dispc_reg_in(DISPC_CONFIG) & DISPC_CONFIG_TCKDIGENABLE))				overlay_opt_enable = 1;		}		else {			if ((!(dispc_reg_in(DISPC_CONFIG) & DISPC_CONFIG_TCKDIGENABLE)) && (!(dispc_reg_in(DISPC_CONFIG) & DISPC_CONFIG_TVALPHAENABLE)))				overlay_opt_enable = 1;		}	}	/* If output path is set to LCD */	else {		dispc_reg_out(DISPC_VID_BA0(v), cropped_base_phys);		dispc_reg_out(DISPC_VID_BA1(v), cropped_base_phys);		dispc_reg_merge(DISPC_VID_ATTRIBUTES(v),				DISPC_VID_ATTRIBUTES_ENABLE,				DISPC_VID_ATTRIBUTES_ENABLE);		dispc_reg_merge(DISPC_CONTROL, DISPC_CONTROL_GOLCD,				DISPC_CONTROL_GOLCD);		/* if not enabled transparency enable overlay optimization */		if(is_sil_rev_less_than(OMAP3430_REV_ES2_0)){			if (!(dispc_reg_in(DISPC_CONFIG) & DISPC_CONFIG_TCKLCDENABLE))				overlay_opt_enable = 1;		}		else {				if ((!(dispc_reg_in(DISPC_CONFIG) & DISPC_CONFIG_TCKLCDENABLE)) && (!(dispc_reg_in(DISPC_CONFIG) & DISPC_CONFIG_LCDALPHAENABLE)))				overlay_opt_enable = 1;		}	}	/** if GFX pipeline enabled and no transparency enabled	 * check for overlapping of GFX and Video pipelines to	 * enable overlay optimization	 */	if ((dispc_reg_in(DISPC_GFX_ATTRIBUTES) & DISPC_GFX_ATTRIBUTES_ENABLE	) && overlay_opt_enable && (ltype == OMAP2_VIDEO1)) {		gfx_posX = (dispc_reg_in(DISPC_GFX_POSITION) & DISPC_GFX_POSITION_GFXPOSX) >> DISPC_GFX_POSITION_GFXPOSX_SHIFT;		gfx_posY = (dispc_reg_in(DISPC_GFX_POSITION) & DISPC_GFX_POSITION_GFXPOSY) >> DISPC_GFX_POSITION_GFXPOSY_SHIFT;		gfx_sizeX = (dispc_reg_in(DISPC_GFX_SIZE) & DISPC_GFX_SIZE_GFXSIZEX) >> DISPC_GFX_SIZE_GFXSIZEX_SHIFT;		gfx_sizeY = (dispc_reg_in(DISPC_GFX_SIZE) & DISPC_GFX_SIZE_GFXSIZEY) >> DISPC_GFX_SIZE_GFXSIZEY_SHIFT;		vid_posX = (dispc_reg_in(DISPC_VID_POSITION(v)) & DISPC_VID_POSITION_VIDPOSX) >> DISPC_VID_POSITION_VIDPOSX_SHIFT;		vid_posY = (dispc_reg_in(DISPC_VID_POSITION(v)) & DISPC_VID_POSITION_VIDPOSY) >> DISPC_VID_POSITION_VIDPOSY_SHIFT;		vid_sizeX = ((dispc_reg_in(DISPC_VID_SIZE(v)) & DISPC_VID_SIZE_VIDSIZEX) >> DISPC_VID_SIZE_VIDSIZEX_SHIFT) + 1;		vid_sizeY = ((dispc_reg_in(DISPC_VID_SIZE(v)) & DISPC_VID_SIZE_VIDSIZEY) >> DISPC_VID_SIZE_VIDSIZEY_SHIFT) + 1;		gfx_pix_inc = dispc_reg_in(DISPC_GFX_PIXEL_INC);		gfx_row_inc =  dispc_reg_in(DISPC_GFX_ROW_INC);		omap2_disp_get_panel_size(omap2_disp_get_output_dev(ltype), &screen_width, &screen_height);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?