From: yxj Date: Sat, 10 Mar 2012 07:49:28 +0000 (+0800) Subject: rk30 fb: use same macro as android to indicate data format X-Git-Tag: firefly_0821_release~9595^2~56 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=26bfd53c48a5ff02a3c685f6b53b96bead0664c8;p=firefly-linux-kernel-4.4.55.git rk30 fb: use same macro as android to indicate data format --- diff --git a/drivers/video/rockchip/chips/rk30_lcdc.c b/drivers/video/rockchip/chips/rk30_lcdc.c index 7dc160d327f0..1e1a4811a0d3 100644 --- a/drivers/video/rockchip/chips/rk30_lcdc.c +++ b/drivers/video/rockchip/chips/rk30_lcdc.c @@ -304,7 +304,6 @@ static int win0_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen, ScaleCbrY = CalScale(yact, par->ysize); break; default: - printk("un support format!\n"); break; } @@ -381,7 +380,6 @@ static int win1_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen, ScaleCbrY = CalScale(yact, par->ysize); break; default: - printk("%s>>un support format!\n",__func__); break; } diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 2e77ac68ceda..d8d933122a24 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -142,7 +142,7 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd, case FB1_IOCTL_SET_YUV_ADDR: //when in video mode, buff alloc by android if((!strcmp(fix->id,"fb1"))||(!strcmp(fix->id,"fb3"))) { - if (copy_from_user(yuv_phy, arg, 8)) + if (copy_from_user(yuv_phy, argp, 8)) return -EFAULT; info->fix.smem_start = yuv_phy[0]; //four y info->fix.mmio_start = yuv_phy[1]; //four uv @@ -290,7 +290,7 @@ static int rk_fb_set_par(struct fb_info *info) struct layer_par *par = NULL; rk_screen *screen = NULL; int layer_id = 0; - u32 smem_len=0,map_size = 0; + u32 smem_len=0; u32 cblen = 0,crlen = 0; u16 xsize =0,ysize = 0; //winx display window height/width --->LCDC_WINx_DSP_INFO u32 xoffset = var->xoffset; // offset from virtual to visible @@ -299,7 +299,7 @@ static int rk_fb_set_par(struct fb_info *info) u16 ypos = (var->nonstd>>20) & 0xfff; u32 xvir = var->xres_virtual; u32 yvir = var->yres_virtual; - u8 data_format = var->nonstd&0x0f; + u8 data_format = var->nonstd&0xff; if(!strcmp(fix->id,"fb1")){ dev_drv = inf->rk_lcdc_device[0]; @@ -338,49 +338,45 @@ static int rk_fb_set_par(struct fb_info *info) /* calculate y_offset,c_offset,line_length,cblen and crlen */ switch (data_format) { - case 0: // rgb - switch(var->bits_per_pixel) - { - case 16: // rgb565 - par->format =RGB565; - fix->line_length = 2 * xvir; - par->y_offset = (yoffset*xvir + xoffset)*2; - break; - case 32: // rgb888 - if(var->transp.length) //we need ditinguish ARGB888 and RGB888 - par->format = ARGB888; //in some register,they have different configration - else - par->format = RGB888; - fix->line_length = 4 * xvir; - par->y_offset = (yoffset*xvir + xoffset)*4; - break; - default: - return -EINVAL; - } - break; - case 1: // yuv422 - par->format = YUV422; - fix->line_length = xvir; - cblen = crlen = (xvir*yvir)>>1; - par->y_offset = yoffset*xvir + xoffset; - par->c_offset = par->y_offset; - break; - case 2: // YUV420 - par->format = YUV420; - fix->line_length = xvir; - cblen = crlen = (xvir*yvir)>>2; - par->y_offset = yoffset*xvir + xoffset; - par->c_offset = (yoffset>>1)*xvir + xoffset; - break; - case 4: // none - case 5: // yuv444 - par->format = 5; - fix->line_length = xvir<<2; - par->y_offset = yoffset*xvir + xoffset; - par->c_offset = yoffset*2*xvir +(xoffset<<1); - cblen = crlen = (xvir*yvir); - break; - default: + case HAL_PIXEL_FORMAT_RGBA_8888 : // rgb + par->format = ARGB888; + fix->line_length = 4 * xvir; + par->y_offset = (yoffset*xvir + xoffset)*4; + break; + case HAL_PIXEL_FORMAT_RGBX_8888: + case HAL_PIXEL_FORMAT_RGB_888 : + par->format = RGB888; + fix->line_length = 4 * xvir; + par->y_offset = (yoffset*xvir + xoffset)*4; + break; + case HAL_PIXEL_FORMAT_RGB_565: //RGB565 + par->format = RGB565; + fix->line_length = 2 * xvir; + par->y_offset = (yoffset*xvir + xoffset)*2; + break; + case HAL_PIXEL_FORMAT_YCbCr_422_SP : // yuv422 + par->format = YUV422; + fix->line_length = xvir; + cblen = crlen = (xvir*yvir)>>1; + par->y_offset = yoffset*xvir + xoffset; + par->c_offset = par->y_offset; + break; + case HAL_PIXEL_FORMAT_YCrCb_NV12 : // YUV420---uvuvuv + par->format = YUV420; + fix->line_length = xvir; + cblen = crlen = (xvir*yvir)>>2; + par->y_offset = yoffset*xvir + xoffset; + par->c_offset = (yoffset>>1)*xvir + xoffset; + break; + case HAL_PIXEL_FORMAT_YCrCb_444 : // yuv444 + par->format = 5; + fix->line_length = xvir<<2; + par->y_offset = yoffset*xvir + xoffset; + par->c_offset = yoffset*2*xvir +(xoffset<<1); + cblen = crlen = (xvir*yvir); + break; + default: + printk("un supported format:0x%x\n",data_format); return -EINVAL; } @@ -458,8 +454,8 @@ static struct fb_var_screeninfo def_var = { .green = {5,6,0}, .blue = {0,5,0}, .transp = {0,0,0}, - .nonstd = 0, //win1 format & ypos & xpos (ypos<<20 + xpos<<8 + format) - .grayscale = 0, //win1 transprent mode & value(mode<<8 + value) + .nonstd = HAL_PIXEL_FORMAT_RGB_565, //(ypos<<20+xpos<<8+format) format + .grayscale = 0, //(ysize<<20+xsize<<8) .activate = FB_ACTIVATE_NOW, .accel_flags = 0, .vmode = FB_VMODE_NONINTERLACED, diff --git a/drivers/video/rockchip/rk_fb.h b/drivers/video/rockchip/rk_fb.h index 664cf6b1e478..1a7b37d15f7d 100644 --- a/drivers/video/rockchip/rk_fb.h +++ b/drivers/video/rockchip/rk_fb.h @@ -58,6 +58,71 @@ #define OUT_D888_P565 0x22 // +/** + * pixel format definitions,this is copy from android/system/core/include/system/graphics.h + */ + +enum { + HAL_PIXEL_FORMAT_RGBA_8888 = 1, + HAL_PIXEL_FORMAT_RGBX_8888 = 2, + HAL_PIXEL_FORMAT_RGB_888 = 3, + HAL_PIXEL_FORMAT_RGB_565 = 4, + HAL_PIXEL_FORMAT_BGRA_8888 = 5, + HAL_PIXEL_FORMAT_RGBA_5551 = 6, + HAL_PIXEL_FORMAT_RGBA_4444 = 7, + + /* 0x8 - 0xFF range unavailable */ + + /* + * 0x100 - 0x1FF + * + * This range is reserved for pixel formats that are specific to the HAL + * implementation. Implementations can use any value in this range to + * communicate video pixel formats between their HAL modules. These formats + * must not have an alpha channel. Additionally, an EGLimage created from a + * gralloc buffer of one of these formats must be supported for use with the + * GL_OES_EGL_image_external OpenGL ES extension. + */ + + /* + * Android YUV format: + * + * This format is exposed outside of the HAL to software decoders and + * applications. EGLImageKHR must support it in conjunction with the + * OES_EGL_image_external extension. + * + * YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed + * by (W/2) x (H/2) Cr and Cb planes. + * + * This format assumes + * - an even width + * - an even height + * - a horizontal stride multiple of 16 pixels + * - a vertical stride equal to the height + * + * y_size = stride * height + * c_size = ALIGN(stride/2, 16) * height/2 + * size = y_size + c_size * 2 + * cr_offset = y_size + * cb_offset = y_size + c_size + * + */ + HAL_PIXEL_FORMAT_YV12 = 0x32315659, // YCrCb 4:2:0 Planar + + + + /* Legacy formats (deprecated), used by ImageFormat.java */ + HAL_PIXEL_FORMAT_YCbCr_422_SP = 0x10, // NV16 + HAL_PIXEL_FORMAT_YCrCb_420_SP = 0x11, // NV21 + HAL_PIXEL_FORMAT_YCbCr_422_I = 0x14, // YUY2 + HAL_PIXEL_FORMAT_YCrCb_NV12 = 0x20, // YUY2 + HAL_PIXEL_FORMAT_YCrCb_NV12_VIDEO = 0x21, // YUY2 + HAL_PIXEL_FORMAT_YCrCb_444 = 0x22, //yuv444 + + +}; + + //display data format enum data_format{ ARGB888 = 0,