rk3288 lcdc: add support yuv10 bit fmt
authorhjc <hjc@rock-chips.com>
Tue, 1 Apr 2014 12:46:02 +0000 (20:46 +0800)
committerhjc <hjc@rock-chips.com>
Wed, 2 Apr 2014 04:23:19 +0000 (12:23 +0800)
drivers/video/rockchip/lcdc/rk3288_lcdc.c
drivers/video/rockchip/rk_fb.c
include/linux/rk_fb.h

index c0929692315c1a911b3ff187853b5fd70e6e9656..9dd5724f7e599b90243baa7dda7c061faa344ee6 100755 (executable)
@@ -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);
index 3ca60b665c3e1daf2ba6abbd0ff83ab06d0f90c2..e0b6fcc280224db67639b0d95c447ca4a528e1a7 100755 (executable)
@@ -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;
index c0027f501f5e586558aed7938116f7a2cedbd7b8..2a4589eb53db511867f9d80a7bce91e61bf61bc2 100755 (executable)
@@ -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 {