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 + -
显示快捷键?