From: hjc Date: Tue, 1 Apr 2014 12:46:02 +0000 (+0800) Subject: rk3288 lcdc: add support yuv10 bit fmt X-Git-Tag: firefly_0821_release~5644 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=6df3c2758156010f25e10c998e59a79924d2d04e;p=firefly-linux-kernel-4.4.55.git rk3288 lcdc: add support yuv10 bit fmt --- diff --git a/drivers/video/rockchip/lcdc/rk3288_lcdc.c b/drivers/video/rockchip/lcdc/rk3288_lcdc.c index c0929692315c..9dd5724f7e59 100755 --- a/drivers/video/rockchip/lcdc/rk3288_lcdc.c +++ b/drivers/video/rockchip/lcdc/rk3288_lcdc.c @@ -1369,18 +1369,21 @@ static int rk3288_lcdc_cal_scl_fac(struct rk_lcdc_win *win) /*cbcr scl mode*/ switch (win->format) { case YUV422: + case YUV422_A: cbcr_srcW = srcW/2; cbcr_dstW = dstW; cbcr_srcH = srcH; cbcr_dstH = dstH; break; case YUV420: + case YUV420_A: cbcr_srcW = srcW/2; cbcr_dstW = dstW; cbcr_srcH = srcH/2; cbcr_dstH = dstH; break; case YUV444: + case YUV444_A: cbcr_srcW = srcW; cbcr_dstW = dstW; cbcr_srcH = srcH; @@ -1417,7 +1420,7 @@ static int rk3288_lcdc_cal_scl_fac(struct rk_lcdc_win *win) win->cbr_hor_scl_mode,win->cbr_ver_scl_mode); /*line buffer mode*/ - if((win->format == YUV422) || (win->format == YUV420)){ + if((win->format == YUV422) || (win->format == YUV420) || (win->format == YUV422_A) || (win->format == YUV420_A)){ if(win->cbr_hor_scl_mode == SCALE_DOWN){ if(cbcr_dstW > 3840){ pr_err("ERROR cbcr_dst_width exceeds 3840\n"); @@ -1751,13 +1754,27 @@ static int win0_set_par(struct lcdc_device *lcdc_dev, fmt_cfg = 5; win->swap_rb = 0; break; - case YUV420: + case YUV420: fmt_cfg = 4; win->swap_rb = 0; break; - case YUV444: + case YUV444: fmt_cfg = 6; - win->swap_rb = 0; + win->swap_rb = 0; + case YUV422_A: + fmt_cfg = 5; + win->swap_rb = 0; + win->fmt_10 = 1; + break; + case YUV420_A: + fmt_cfg = 4; + win->swap_rb = 0; + win->fmt_10 = 1; + break; + case YUV444_A: + fmt_cfg = 6; + win->swap_rb = 0; + win->fmt_10 = 1; break; default: dev_err(lcdc_dev->driver.dev, "%s:un supported format!\n", @@ -1770,7 +1787,7 @@ static int win0_set_par(struct lcdc_device *lcdc_dev, xact = win->area[0].xact; yact = win->area[0].yact; xvir = win->area[0].xvir; - yvir = win->area[0].xvir; + yvir = win->area[0].yvir; } rk3288_win_0_1_reg_update(&lcdc_dev->driver,0); spin_unlock(&lcdc_dev->reg_lock); @@ -1826,6 +1843,21 @@ static int win1_set_par(struct lcdc_device *lcdc_dev, fmt_cfg = 6; win->swap_rb = 0; break; + case YUV422_A: + fmt_cfg = 5; + win->swap_rb = 0; + win->fmt_10 = 1; + break; + case YUV420_A: + fmt_cfg = 4; + win->swap_rb = 0; + win->fmt_10 = 1; + break; + case YUV444_A: + fmt_cfg = 6; + win->swap_rb = 0; + win->fmt_10 = 1; + break; default: dev_err(lcdc_dev->driver.dev, "%s:un supported format!\n", __func__); @@ -1837,7 +1869,7 @@ static int win1_set_par(struct lcdc_device *lcdc_dev, xact = win->area[0].xact; yact = win->area[0].yact; xvir = win->area[0].xvir; - yvir = win->area[0].xvir; + yvir = win->area[0].yvir; } rk3288_win_0_1_reg_update(&lcdc_dev->driver,1); spin_unlock(&lcdc_dev->reg_lock); diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index 3ca60b665c3e..e0b6fcc28022 100755 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -138,6 +138,11 @@ int rk_fb_pixel_width(int data_format) case YUV444: pixel_width = 1*8; break; + case YUV422_A: + case YUV420_A: + case YUV444_A: + pixel_width = 10; + break; default: printk(KERN_WARNING "%s:un supported format:0x%x\n", __func__,data_format); @@ -175,6 +180,15 @@ static int rk_fb_data_fmt(int data_format,int bits_per_pixel) case HAL_PIXEL_FORMAT_YCrCb_444: // yuv444 fb_data_fmt = YUV444; break; + case HAL_PIXEL_FORMAT_YCrCb_NV12_10: // yuv444 + fb_data_fmt = YUV420_A; + break; + case HAL_PIXEL_FORMAT_YCbCr_422_SP_10: // yuv444 + fb_data_fmt = YUV422_A; + break; + case HAL_PIXEL_FORMAT_YCrCb_420_SP_10: // yuv444 + fb_data_fmt = YUV444_A; + break; default: printk(KERN_WARNING "%s:un supported format:0x%x\n", __func__,data_format); @@ -444,6 +458,15 @@ char *get_format_string(enum data_format format, char *fmt) case YUV444: strcpy(fmt, "YUV444"); break; + case YUV420_A: + strcpy(fmt, "YUV420_A"); + break; + case YUV422_A: + strcpy(fmt, "YUV422_A"); + break; + case YUV444_A: + strcpy(fmt, "YUV444_A"); + break; case XRGB888: strcpy(fmt, "XRGB888"); break; @@ -801,8 +824,6 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info u32 stride,uv_stride; u32 stride_32bit_1; u32 stride_32bit_2; - u32 stride_128bit_1; - u32 stride_128bit_2; u16 uv_x_off,uv_y_off,uv_y_act; u8 is_pic_yuv=0; @@ -822,8 +843,6 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info } pixel_width = rk_fb_pixel_width(win->format); vir_width_bit = pixel_width * xvir; - stride_128bit_1 = ((vir_width_bit + 127) & (~127))/8; //pixel_width = byte_num *8 - stride_128bit_2 = ((vir_width_bit*2 + 127) & (~127))/8; //pixel_width = byte_num *8 stride_32bit_1 = ((vir_width_bit + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 stride_32bit_2 = ((vir_width_bit*2 + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 @@ -832,6 +851,7 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info switch (win->format){ case YUV422: + case YUV422_A: is_pic_yuv = 1; stride = stride_32bit_1; uv_stride = stride_32bit_1>> 1 ;// @@ -841,6 +861,7 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info uv_y_act = win->area[0].yact>>1; break; case YUV420://420sp + case YUV420_A: is_pic_yuv = 1; stride = stride_32bit_1; uv_stride = stride_32bit_1; @@ -850,6 +871,7 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info uv_y_act = win->area[0].yact>>1; break; case YUV444: + case YUV444_A: is_pic_yuv = 1; stride = stride_32bit_1; uv_stride = stride_32bit_2; @@ -902,7 +924,7 @@ static int rk_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info win->area[0].smem_start = fix->smem_start; - win->area[0].cbr_start = fix->smem_start + xvir * yvir; + win->area[0].cbr_start = fix->mmio_start;//fix->smem_start + xvir * yvir; win->state=1; win->area[0].state=1; win->area_num = 1; @@ -1375,8 +1397,6 @@ static int rk_fb_set_win_buffer(struct fb_info *info, #endif vir_width_bit = pixel_width * xvir; - stride_128bit_1 = ((vir_width_bit + 127) & (~127))/8; //pixel_width = byte_num *8 - stride_128bit_2 = ((vir_width_bit*2 + 127) & (~127))/8; //pixel_width = byte_num *8 stride_32bit_1 = ((vir_width_bit + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 stride_32bit_2 = ((vir_width_bit*2 + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 @@ -1410,6 +1430,7 @@ static int rk_fb_set_win_buffer(struct fb_info *info, } switch (fb_data_fmt) { case YUV422: + case YUV422_A: is_pic_yuv = 1; stride = stride_32bit_1; uv_stride = stride_32bit_1>> 1 ;// @@ -1419,6 +1440,7 @@ static int rk_fb_set_win_buffer(struct fb_info *info, uv_y_act = win_par->area_par[0].yact>>1; break; case YUV420://420sp + case YUV420_A: is_pic_yuv = 1; stride = stride_32bit_1; uv_stride = stride_32bit_1; @@ -1428,6 +1450,7 @@ static int rk_fb_set_win_buffer(struct fb_info *info, uv_y_act = win_par->area_par[0].yact>>1; break; case YUV444: + case YUV444_A: is_pic_yuv = 1; stride = stride_32bit_1; uv_stride = stride_32bit_2; @@ -1985,8 +2008,6 @@ if (rk_fb->disp_mode != DUAL) { fb_data_fmt = rk_fb_data_fmt(data_format,var->bits_per_pixel); pixel_width = rk_fb_pixel_width(fb_data_fmt); vir_width_bit = pixel_width * xvir; - stride_128bit_1 = ((vir_width_bit + 127) & (~127))/8; //pixel_width = byte_num *8 - stride_128bit_2 = ((vir_width_bit*2 + 127) & (~127))/8; //pixel_width = byte_num *8 stride_32bit_1 = ((vir_width_bit + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 stride_32bit_2 = ((vir_width_bit*2 + 31 ) & (~31 ))/8; //pixel_width = byte_num *8 @@ -1994,6 +2015,7 @@ if (rk_fb->disp_mode != DUAL) { fix->line_length = stride; switch (fb_data_fmt){ case YUV422: + case YUV422_A: is_pic_yuv = 1; stride = stride_32bit_1; uv_stride = stride_32bit_1>> 1 ;// @@ -2004,6 +2026,7 @@ if (rk_fb->disp_mode != DUAL) { uv_y_act = win->area[0].yact>>1; break; case YUV420://420sp + case YUV420_A: is_pic_yuv = 1; stride = stride_32bit_1; uv_stride = stride_32bit_1; @@ -2014,6 +2037,7 @@ if (rk_fb->disp_mode != DUAL) { uv_y_act = win->area[0].yact>>1; break; case YUV444: + case YUV444_A: is_pic_yuv = 1; stride = stride_32bit_1; uv_stride = stride_32bit_2; diff --git a/include/linux/rk_fb.h b/include/linux/rk_fb.h index c0027f501f5e..2a4589eb53db 100755 --- a/include/linux/rk_fb.h +++ b/include/linux/rk_fb.h @@ -166,8 +166,13 @@ enum { 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 - HAL_PIXEL_FORMAT_H265 = 0x23, //yuv444 + + HAL_PIXEL_FORMAT_YCrCb_NV12_10 = 0x22, // YUV420_1obit + HAL_PIXEL_FORMAT_YCbCr_422_SP_10 = 0x23, // YUV422_1obit + HAL_PIXEL_FORMAT_YCrCb_420_SP_10 = 0x24, //YUV444_1obit + + HAL_PIXEL_FORMAT_YCrCb_444 = 0x25, //yuv444 + }; @@ -182,6 +187,9 @@ enum data_format { XRGB888, XBGR888, ABGR888, + YUV420_A = 10, + YUV422_A, + YUV444_A, }; enum fb_win_map_order {