rk30 fb: 完善 rk_fb_register 框架
authoryxj <yxj@I7-CH.(none)>
Fri, 24 Feb 2012 01:45:58 +0000 (09:45 +0800)
committeryxj <yxj@I7-CH.(none)>
Mon, 27 Feb 2012 09:56:14 +0000 (17:56 +0800)
arch/arm/mach-rk30/board-rk30-sdk.c
drivers/video/rockchip/chips/rk30_lcdc.c
drivers/video/rockchip/chips/rk30_lcdc.h
drivers/video/rockchip/rk_fb.c
drivers/video/rockchip/rk_fb.h

index 80add14938513fa3033ded363dcd28fb1bffdf59..45e40eb37ab87ee9f58dd827edf7382b72b8eb71 100755 (executable)
@@ -300,6 +300,18 @@ static struct resource resource_fb[] = {
                .end   = 0,//RK30_FB0_MEM_SIZE - 1,
                .flags = IORESOURCE_MEM,
        },
+       [1] = {
+               .name  = "ipp buf",  //for rotate
+               .start = 0,
+               .end   = 0,//RK30_FB0_MEM_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [2] = {
+               .name  = "fb2 buf",
+               .start = 0,
+               .end   = 0,//RK30_FB0_MEM_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
 };
 
 static struct platform_device device_fb = {
@@ -387,6 +399,10 @@ static void __init rk30_reserve(void)
 #ifdef CONFIG_FB_ROCKCHIP
        resource_fb[0].start = board_mem_reserve_add("fb0",RK30_FB0_MEM_SIZE);
        resource_fb[0].end = resource_fb[0].start + RK30_FB0_MEM_SIZE - 1;
+       resource_fb[1].start = board_mem_reserve_add("ipp buf",RK30_FB0_MEM_SIZE);
+       resource_fb[1].end = resource_fb[1].start + RK30_FB0_MEM_SIZE - 1;
+       resource_fb[2].start = board_mem_reserve_add("fb2",RK30_FB0_MEM_SIZE);
+       resource_fb[2].end = resource_fb[2].start + RK30_FB0_MEM_SIZE - 1;      
 #endif
        board_mem_reserved();
 }
index a3407598eea94e0c577d0e174641780d80f72cd7..640d6189b36a5e95593b15cae5533f015e98289d 100644 (file)
@@ -34,7 +34,7 @@
 
 
 
-static int dbg_thresd = 0;
+static int dbg_thresd =1;
 #define DBG(x...) do { if(unlikely(dbg_thresd)) printk(KERN_INFO x); } while (0)
 
 
@@ -246,7 +246,7 @@ static int win1_blank(int blank_mode, struct rk30_lcdc_device *lcdc_dev)
        //mcu_refresh(inf);
     return 0;
 }
-static int rk30_lcdc_blank(struct rk_fb_device_driver*fb_drv,int layer_id,int blank_mode)
+static int rk30_lcdc_blank(struct rk_lcdc_device_driver*fb_drv,int layer_id,int blank_mode)
 {
        struct rk30_lcdc_device * lcdc_dev = NULL;
        struct lcdc_info * info = platform_get_drvdata(g_lcdc_pdev);
@@ -316,25 +316,28 @@ static  int win0_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
     LcdWrReg(lcdc_dev, WIN0_DSP_ST, v_DSP_STX(xpos) | v_DSP_STY(ypos));
     LcdWrReg(lcdc_dev, WIN0_DSP_INFO, v_DSP_WIDTH(par->xsize) | v_DSP_HEIGHT(par->ysize));
     LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_YRGB, v_X_SCL_FACTOR(ScaleYrgbX) | v_Y_SCL_FACTOR(ScaleYrgbY));
-       LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_CBR,  v_X_SCL_FACTOR(ScaleCbrX) | v_Y_SCL_FACTOR(ScaleCbrY));
+    LcdWrReg(lcdc_dev, WIN0_SCL_FACTOR_CBR,  v_X_SCL_FACTOR(ScaleCbrX) | v_Y_SCL_FACTOR(ScaleCbrY));
     switch(par->format)
     {
-       case RGB888:  //rgb888
-            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
-                    break;
-       case RGB565:  //rgb565
-            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_YUV_VIRWIDTH(xvir));
-             break;
-       case YUV420:   
-            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO,v_RGB565_VIRWIDTH(xvir));
-             break;
-       default:
-               LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
-            break;
+        case ARGB888:
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_ARGB888_VIRWIDTH(xvir));
+            break;
+        case RGB888:  //rgb888
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
+            break;
+        case RGB565:  //rgb565
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB565_VIRWIDTH(xvir));
+            break;
+        case YUV422:
+        case YUV420:   
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO,v_YUV_VIRWIDTH(xvir));
+            break;
+        default:
+            LcdMskReg(lcdc_dev, WIN0_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
+            break;
     }
 
     LcdWrReg(lcdc_dev, REG_CFG_DONE, 0x01);
-       printk(KERN_INFO "%s>>>>done!\n",__func__);
        
     return 0;
 
@@ -389,16 +392,20 @@ static int win1_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
     LcdMskReg(lcdc_dev, WIN1_COLOR_KEY_CTRL, m_COLORKEY_EN | m_KEYCOLOR, v_COLORKEY_EN(1) | v_KEYCOLOR(0));
        switch(par->format)
     {
-       case RGB888:  //rgb888
-            LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
-                    break;
-       case RGB565:  //rgb565
-            LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_YUV_VIRWIDTH(xvir));
-             break;
-       case YUV420:   
-            LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO,v_RGB565_VIRWIDTH(xvir));
-             break;
-       default:
+       case ARGB888:
+               LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_ARGB888_VIRWIDTH(xvir));
+               break;
+       case RGB888:  //rgb888
+               LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
+               break;
+       case RGB565:  //rgb565
+               LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_RGB565_VIRWIDTH(xvir));
+               break;
+       case YUV422:
+       case YUV420:   
+               LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO,v_YUV_VIRWIDTH(xvir));
+               break;
+       default:
                LcdMskReg(lcdc_dev, WIN1_VIR, m_WORDLO, v_RGB888_VIRWIDTH(xvir));
                break;
     }
@@ -409,7 +416,7 @@ static int win1_set_par(struct rk30_lcdc_device *lcdc_dev,rk_screen *screen,
     return 0;
 }
 
-static int rk30_lcdc_set_par(struct rk_fb_device_driver *fb_drv,int layer_id)
+static int rk30_lcdc_set_par(struct rk_lcdc_device_driver *fb_drv,int layer_id)
 {
        struct rk30_lcdc_device *lcdc_dev=NULL;
        struct layer_par *par = &fb_drv->layer_par[0];
@@ -440,7 +447,7 @@ static int rk30_lcdc_set_par(struct rk_fb_device_driver *fb_drv,int layer_id)
        return 0;
 }
  
-int rk30_lcdc_pan(struct rk_fb_device_driver * dev_drv,int layer_id)
+int rk30_lcdc_pan(struct rk_lcdc_device_driver * dev_drv,int layer_id)
 {
        
     return 0;
@@ -488,7 +495,7 @@ static struct layer_par lcdc1_layer[] = {
        },
 };
 
-static struct rk_fb_device_driver lcdc0_driver = {
+static struct rk_lcdc_device_driver lcdc0_driver = {
        .name                   = "lcdc0",
        .layer_par              = lcdc0_layer,
        .num_layer              = ARRAY_SIZE(lcdc0_layer),
@@ -499,7 +506,7 @@ static struct rk_fb_device_driver lcdc0_driver = {
        .blank         = rk30_lcdc_blank,
        .pan           = rk30_lcdc_pan,
 };
-static struct rk_fb_device_driver lcdc1_driver = {
+static struct rk_lcdc_device_driver lcdc1_driver = {
        .name                   = "lcdc1",
        .layer_par              = lcdc1_layer,
        .num_layer              = ARRAY_SIZE(lcdc1_layer),
index 4e98c106211ff4d3dfc583ed36279fa5b50efbfd..68c6a8adb5305eca4941dff5a7af36a5f19a8c71 100644 (file)
@@ -361,10 +361,11 @@ typedef volatile struct tagLCDC_REG
 #define v_VASP(x) ((x)<<16)
 
 
-
+//LCDC_WINx_VIR ,x is number of words of win0 virtual width
+#define v_ARGB888_VIRWIDTH(x) (x)
 #define v_RGB888_VIRWIDTH(x) (((x*3)>>2)+((x)%3))
-#define v_RGB565_VIRWIDTH(x) ((x)>>1)
-#define v_YUV_VIRWIDTH(x)    ((x)>>1)
+#define v_RGB565_VIRWIDTH(x) (((x)>>1) + ((x%2)?1:0))
+#define v_YUV_VIRWIDTH(x)    (((x)>>2) +((x%4)?1:0))
 
 #define m_ACTWIDTH       (0xffff<<0)
 #define m_ACTHEIGHT      (0xffff<<16)
@@ -444,7 +445,7 @@ typedef volatile struct tagLCDC_REG
 
 #define CalScale(x, y)              (((u32)x*0x1000)/y)
 struct rk30_lcdc_device{
-       struct rk_fb_device_driver *driver;
+       struct rk_lcdc_device_driver *driver;
        /* LCDC reg base address and backup reg */
     LCDC_REG *preg;
     LCDC_REG regbak;
index 5c5a817165342c1d5353e8db002f8bebbaf9436b..33ea664b099169d1d4583b25ebef59f631e8191d 100644 (file)
@@ -73,10 +73,21 @@ static struct rk_fb_rgb def_rgb_16 = {
      transp: { offset: 0,  length: 0, },
 };
 
+int fb0_open(struct fb_info *info, int user)
+{
+  return 0; 
+}
+
+int fb0_release(struct fb_info *info, int user)
+{
+  
+    return 0;
+}
+
 static int fb0_blank(int blank_mode, struct fb_info *info)
 {
        struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
-       struct rk_fb_device_driver *rk_fb_dev_drv = fb_inf->rk_lcdc_device[0];
+       struct rk_lcdc_device_driver *rk_fb_dev_drv = fb_inf->rk_lcdc_device[0];
         fb_inf->rk_lcdc_device[0]->blank(rk_fb_dev_drv,0,blank_mode);
 
     return 0;
@@ -137,7 +148,7 @@ static int fb0_set_par(struct fb_info *info)
        struct rk_fb_inf *inf =  platform_get_drvdata(g_fb_pdev);
        struct fb_var_screeninfo *var = &info->var;
        struct fb_fix_screeninfo *fix = &info->fix;
-       struct rk_fb_device_driver *rk_fb_dev_drv = inf->rk_lcdc_device[0];
+       struct rk_lcdc_device_driver *rk_fb_dev_drv = inf->rk_lcdc_device[0];
        struct layer_par *par = &rk_fb_dev_drv->layer_par[0];
        rk_screen *screen = &rk_fb_dev_drv->screen;
        
@@ -243,6 +254,86 @@ int fb1_release(struct fb_info *info, int user)
   
     return 0;
 }
+static int fb2_blank(int blank_mode, struct fb_info *info)
+{
+       struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+   return 0;
+}
+
+static int fb2_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+    return 0;
+}
+
+static int fb2_set_par(struct fb_info *info)
+{
+ struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+   return 0;
+    return 0;
+}
+
+static int fb2_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+       struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+    return 0;
+}
+
+static int fb2_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
+{
+  struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+    return 0;
+}
+int fb2_open(struct fb_info *info, int user)
+{
+  return 0; 
+}
+
+int fb2_release(struct fb_info *info, int user)
+{
+  
+    return 0;
+}
+
+static int fb3_blank(int blank_mode, struct fb_info *info)
+{
+       struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+   return 0;
+}
+
+static int fb3_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+    return 0;
+}
+
+static int fb3_set_par(struct fb_info *info)
+{
+ struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+   return 0;
+}
+
+static int fb3_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+       struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+    return 0;
+}
+
+static int fb3_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
+{
+  struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
+    return 0;
+}
+int fb3_open(struct fb_info *info, int user)
+{
+  return 0; 
+}
+
+int fb3_release(struct fb_info *info, int user)
+{
+  
+    return 0;
+}
+
 
 static inline unsigned int chan_to_field(unsigned int chan,
                                         struct fb_bitfield *bf)
@@ -277,45 +368,153 @@ static int fb_setcolreg(unsigned regno,
        return 0;
 }
 
-static struct fb_ops fb1_ops = {
-       .owner          = THIS_MODULE,
-       .fb_open    = fb1_open,
-       .fb_release = fb1_release,
-       .fb_check_var   = fb1_check_var,
-       .fb_set_par     = fb1_set_par,
-       .fb_blank       = fb1_blank,
-    .fb_pan_display = fb1_pan_display,
-    .fb_ioctl = fb1_ioctl,
-       .fb_setcolreg   = fb_setcolreg,
-       .fb_fillrect    = cfb_fillrect,
-       .fb_copyarea    = cfb_copyarea,
-       .fb_imageblit   = cfb_imageblit,
+static struct fb_ops fb_ops[] = {
+       [0]={
+               .owner          = THIS_MODULE,
+               .fb_open    = fb0_open,
+               .fb_release = fb0_release,
+               .fb_check_var   = fb0_check_var,
+               .fb_set_par     = fb0_set_par,
+               .fb_blank       = fb0_blank,
+               .fb_pan_display = fb0_pan_display,
+               .fb_ioctl = fb0_ioctl,
+               .fb_setcolreg   = fb_setcolreg,
+               .fb_fillrect    = cfb_fillrect,
+               .fb_copyarea    = cfb_copyarea,
+               .fb_imageblit   = cfb_imageblit,
+       },
+       [1]={
+               .owner          = THIS_MODULE,
+               .fb_open    = fb1_open,
+               .fb_release = fb1_release,
+               .fb_check_var   = fb1_check_var,
+               .fb_set_par     = fb1_set_par,
+               .fb_blank       = fb1_blank,
+               .fb_pan_display = fb1_pan_display,
+               .fb_ioctl = fb1_ioctl,
+               .fb_setcolreg   = fb_setcolreg,
+               .fb_fillrect    = cfb_fillrect,
+               .fb_copyarea    = cfb_copyarea,
+               .fb_imageblit   = cfb_imageblit,        
+       },
+       [2]={
+               .owner          = THIS_MODULE,
+               .fb_open    = fb2_open,
+               .fb_release = fb2_release,
+               .fb_check_var   = fb2_check_var,
+               .fb_set_par     = fb2_set_par,
+               .fb_blank       = fb2_blank,
+               .fb_pan_display = fb2_pan_display,
+               .fb_ioctl = fb2_ioctl,
+               .fb_setcolreg   = fb_setcolreg,
+               .fb_fillrect    = cfb_fillrect,
+               .fb_copyarea    = cfb_copyarea,
+               .fb_imageblit   = cfb_imageblit,
+       },
+       [3]={
+               .owner          = THIS_MODULE,
+               .fb_open    = fb3_open,
+               .fb_release = fb3_release,
+               .fb_check_var   = fb3_check_var,
+               .fb_set_par     = fb3_set_par,
+               .fb_blank       = fb3_blank,
+               .fb_pan_display = fb3_pan_display,
+               .fb_ioctl = fb3_ioctl,
+               .fb_setcolreg   = fb_setcolreg,
+               .fb_fillrect    = cfb_fillrect,
+               .fb_copyarea    = cfb_copyarea,
+               .fb_imageblit   = cfb_imageblit,
+       }
+};
+
+
+
+static struct fb_var_screeninfo def_var = {
+    .red    = {11,5,0},//def_rgb_16.red,
+    .green  = {5,6,0},//def_rgb_16.green,
+    .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)
+    .activate    = FB_ACTIVATE_NOW,
+    .accel_flags = 0,
+    .vmode       = FB_VMODE_NONINTERLACED,
 };
 
-static struct fb_ops fb0_ops = {
-       .owner          = THIS_MODULE,
-       .fb_check_var   = fb0_check_var,
-       .fb_set_par = fb0_set_par,
-       .fb_blank   = fb0_blank,
-       .fb_pan_display = fb0_pan_display,
-    .fb_ioctl = fb0_ioctl,
-       .fb_setcolreg   = fb_setcolreg,
-       .fb_fillrect    = cfb_fillrect,
-       .fb_copyarea    = cfb_copyarea,
-       .fb_imageblit   = cfb_imageblit,
-       //.fb_cursor      = rk29_set_cursor,
+static struct fb_fix_screeninfo def_fix = {
+       .type            = FB_TYPE_PACKED_PIXELS,
+       .type_aux        = 0,
+       .xpanstep        = 1,
+       .ypanstep        = 1,
+       .ywrapstep       = 0,
+       .accel           = FB_ACCEL_NONE,
+       .visual          = FB_VISUAL_TRUECOLOR,
+               
 };
-int rk_fb_register(struct rk_fb_device_driver *fb_device_driver)
+
+static int request_fb_buffer(struct fb_info *fbi,int fb_id)
+{
+       struct resource *res;
+       int ret = 0;
+       switch(fb_id)
+       {
+               case 0:
+                       res = platform_get_resource_byname(g_fb_pdev, IORESOURCE_MEM, "fb0 buf");
+                       if (res == NULL)
+                       {
+                       dev_err(&g_fb_pdev->dev, "failed to get win0 memory \n");
+                       ret = -ENOENT;
+               }
+               fbi->fix.smem_start = res->start;
+               fbi->fix.smem_len = res->end - res->start + 1;
+               fbi->screen_base = ioremap(res->start, fbi->fix.smem_len);
+               memset(fbi->screen_base, 0, fbi->fix.smem_len);
+                       break;
+               #ifdef CONFIG_FB_WORK_IPP
+               case 1:
+                       /* alloc ipp buf for rotate */
+               res = platform_get_resource_byname(g_fb_pdev, IORESOURCE_MEM, "ipp buf");
+                       if (res == NULL)
+               {
+                       dev_err(&g_fb_pdev->dev, "failed to get win1 ipp memory \n");
+                       ret = -ENOENT;
+               }
+               fbi->fix.mmio_start = res->start;
+               fbi->fix.mmio_len = res->end - res->start + 1;
+                       break;
+               #endif
+               case 2:
+                       res = platform_get_resource_byname(g_fb_pdev, IORESOURCE_MEM, "fb2 buf");
+                       if (res == NULL)
+                       {
+                       dev_err(&g_fb_pdev->dev, "failed to get win0 memory \n");
+                       ret = -ENOENT;
+               }
+               fbi->fix.smem_start = res->start;
+               fbi->fix.smem_len = res->end - res->start + 1;
+               fbi->screen_base = ioremap(res->start, fbi->fix.smem_len);
+               memset(fbi->screen_base, 0, fbi->fix.smem_len);
+                   break;
+               default:
+                       break;
+                       
+       }
+       return ret;
+}
+int rk_fb_register(struct rk_lcdc_device_driver *dev_drv)
 {
        struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
-       int i=0;
-       if(NULL==fb_device_driver){
+       struct fb_info *fbi;
+       int i=0,ret = 0;
+       int lcdc_id = 0;
+       int win0_index = 0;
+       if(NULL==dev_drv){
                printk("rk_fb_register lcdc register fail");
                return -ENOENT;
-               }
+       }
        for(i=0;i<RK30_MAX_LCDC_SUPPORT;i++){
                if(NULL==fb_inf->rk_lcdc_device[i]){
-               fb_inf->rk_lcdc_device[i] = fb_device_driver;
+               fb_inf->rk_lcdc_device[i] = dev_drv;
                fb_inf->rk_lcdc_device[i]->id = i;
                fb_inf->num_lcdc++;
                break;
@@ -325,101 +524,58 @@ int rk_fb_register(struct rk_fb_device_driver *fb_device_driver)
                printk("rk_fb_register lcdc out of support %d",i);
                return -ENOENT;
        }
-       printk("%s>>>%s registered\n",__func__,fb_inf->rk_lcdc_device[i]->name);
-       /************fb0 set ***********/
-       fb_inf->fb0->fix.type        = FB_TYPE_PACKED_PIXELS;
-    fb_inf->fb0->fix.type_aux    = 0;
-    fb_inf->fb0->fix.xpanstep    = 1;
-    fb_inf->fb0->fix.ypanstep    = 1;
-    fb_inf->fb0->fix.ywrapstep   = 0;
-    fb_inf->fb0->fix.accel       = FB_ACCEL_NONE;
-    fb_inf->fb0->fix.visual      = FB_VISUAL_TRUECOLOR;
-
-    fb_inf->fb0->var.xres = fb_inf->rk_lcdc_device[0]->screen.x_res;
-    fb_inf->fb0->var.yres = fb_inf->rk_lcdc_device[0]->screen.y_res;
-    fb_inf->fb0->var.bits_per_pixel = 16;
-    //fb_inf->fb0_color_deepth = 0;
-    fb_inf->fb0->var.xres_virtual = fb_inf->rk_lcdc_device[0]->screen.x_res;
-    fb_inf->fb0->var.yres_virtual = fb_inf->rk_lcdc_device[0]->screen.y_res;
-    fb_inf->fb0->var.width = fb_inf->rk_lcdc_device[0]->screen.width;
-    fb_inf->fb0->var.height = fb_inf->rk_lcdc_device[0]->screen.height;
-    fb_inf->fb0->var.pixclock =fb_inf->rk_lcdc_device[0]->pixclock;
-    fb_inf->fb0->var.left_margin = fb_inf->rk_lcdc_device[0]->screen.left_margin;
-    fb_inf->fb0->var.right_margin = fb_inf->rk_lcdc_device[0]->screen.right_margin;
-    fb_inf->fb0->var.upper_margin = fb_inf->rk_lcdc_device[0]->screen.upper_margin;
-    fb_inf->fb0->var.lower_margin = fb_inf->rk_lcdc_device[0]->screen.lower_margin;
-    fb_inf->fb0->var.vsync_len = fb_inf->rk_lcdc_device[0]->screen.vsync_len;
-    fb_inf->fb0->var.hsync_len = fb_inf->rk_lcdc_device[0]->screen.hsync_len;
-    fb_inf->fb0->var.red    = def_rgb_16.red;
-    fb_inf->fb0->var.green  = def_rgb_16.green;
-    fb_inf->fb0->var.blue   = def_rgb_16.blue;
-    fb_inf->fb0->var.transp = def_rgb_16.transp;
-
-    fb_inf->fb0->var.nonstd      = 0;  //win1 format & ypos & xpos (ypos<<20 + xpos<<8 + format)
-    fb_inf->fb0->var.grayscale   = 0;  //win1 transprent mode & value(mode<<8 + value)
-    fb_inf->fb0->var.activate    = FB_ACTIVATE_NOW;
-    fb_inf->fb0->var.accel_flags = 0;
-    fb_inf->fb0->var.vmode       = FB_VMODE_NONINTERLACED;
-
-    fb_inf->fb0->fbops           = &fb0_ops;
-    fb_inf->fb0->flags           = FBINFO_FLAG_DEFAULT;
-    fb_inf->fb0->pseudo_palette  = fb_inf->rk_lcdc_device[0]->layer_par[0].pseudo_pal;
-
-
-       /************fb1 set ****************/
-       fb_inf->fb1->fix.type        = FB_TYPE_PACKED_PIXELS;
-    fb_inf->fb1->fix.type_aux    = 0;
-    fb_inf->fb1->fix.xpanstep    = 1;
-    fb_inf->fb1->fix.ypanstep    = 1;
-    fb_inf->fb1->fix.ywrapstep   = 0;
-    fb_inf->fb1->fix.accel       = FB_ACCEL_NONE;
-    fb_inf->fb1->fix.visual      = FB_VISUAL_TRUECOLOR;
-
-    fb_inf->fb1->var.xres = fb_inf->rk_lcdc_device[0]->screen.x_res;
-    fb_inf->fb1->var.yres = fb_inf->rk_lcdc_device[0]->screen.y_res;
-    fb_inf->fb1->var.bits_per_pixel = 16;
-    //fb_inf->fb1_color_deepth = 0;
-    fb_inf->fb1->var.xres_virtual = fb_inf->rk_lcdc_device[0]->screen.x_res;
-    fb_inf->fb1->var.yres_virtual = fb_inf->rk_lcdc_device[0]->screen.y_res;
-    fb_inf->fb1->var.width = fb_inf->rk_lcdc_device[0]->screen.width;
-    fb_inf->fb1->var.height = fb_inf->rk_lcdc_device[0]->screen.height;
-    //fb_inf->fb1->var.pixclock = div_u64(1000000000000llu, screen.pixclock);
-    fb_inf->fb1->var.left_margin = fb_inf->rk_lcdc_device[0]->screen.left_margin;
-    fb_inf->fb1->var.right_margin = fb_inf->rk_lcdc_device[0]->screen.right_margin;
-    fb_inf->fb1->var.upper_margin = fb_inf->rk_lcdc_device[0]->screen.upper_margin;
-    fb_inf->fb1->var.lower_margin = fb_inf->rk_lcdc_device[0]->screen.lower_margin;
-    fb_inf->fb1->var.vsync_len = fb_inf->rk_lcdc_device[0]->screen.vsync_len;
-    fb_inf->fb1->var.hsync_len = fb_inf->rk_lcdc_device[0]->screen.hsync_len;
-    fb_inf->fb1->var.red    = def_rgb_16.red;
-    fb_inf->fb1->var.green  = def_rgb_16.green;
-    fb_inf->fb1->var.blue   = def_rgb_16.blue;
-    fb_inf->fb1->var.transp = def_rgb_16.transp;
-
-    fb_inf->fb1->var.nonstd      = 0;  //win1 format & ypos & xpos (ypos<<20 + xpos<<8 + format)
-    fb_inf->fb1->var.grayscale   = 0;  //win1 transprent mode & value(mode<<8 + value)
-    fb_inf->fb1->var.activate    = FB_ACTIVATE_NOW;
-    fb_inf->fb1->var.accel_flags = 0;
-    fb_inf->fb1->var.vmode       = FB_VMODE_NONINTERLACED;
-
-    fb_inf->fb1->fbops           = &fb1_ops;
-    fb_inf->fb1->flags           = FBINFO_FLAG_DEFAULT;
-    fb_inf->fb1->pseudo_palette  = fb_inf->rk_lcdc_device[0]->layer_par[0].pseudo_pal;
-    fb_inf->fb1->screen_base     = 0;
-
+       lcdc_id = i;
+       
+       /************fb set,one layer one fb ***********/
+       for(i=0;i<dev_drv->num_layer;i++)
+       {
+               fbi= framebuffer_alloc(0, &g_fb_pdev->dev);
+               if(!fbi)
+               {
+                       dev_err(&g_fb_pdev->dev,">> fb framebuffer_alloc fail!");
+                       fbi = NULL;
+                       ret = -ENOMEM;
+               }
+               fbi->var = def_var;
+               fbi->fix = def_fix;
+               sprintf(fbi->fix.id,"fb%d",fb_inf->num_fb);
+               fbi->var.xres = fb_inf->rk_lcdc_device[lcdc_id]->screen.x_res;
+               fbi->var.yres = fb_inf->rk_lcdc_device[lcdc_id]->screen.y_res;
+               fbi->var.bits_per_pixel = 16;
+               fbi->var.xres_virtual = fb_inf->rk_lcdc_device[lcdc_id]->screen.x_res;
+               fbi->var.yres_virtual = fb_inf->rk_lcdc_device[lcdc_id]->screen.y_res;
+               fbi->var.width = fb_inf->rk_lcdc_device[lcdc_id]->screen.width;
+               fbi->var.height = fb_inf->rk_lcdc_device[lcdc_id]->screen.height;
+               fbi->var.pixclock =fb_inf->rk_lcdc_device[lcdc_id]->pixclock;
+               fbi->var.left_margin = fb_inf->rk_lcdc_device[lcdc_id]->screen.left_margin;
+               fbi->var.right_margin = fb_inf->rk_lcdc_device[lcdc_id]->screen.right_margin;
+               fbi->var.upper_margin = fb_inf->rk_lcdc_device[lcdc_id]->screen.upper_margin;
+               fbi->var.lower_margin = fb_inf->rk_lcdc_device[lcdc_id]->screen.lower_margin;
+               fbi->var.vsync_len = fb_inf->rk_lcdc_device[lcdc_id]->screen.vsync_len;
+               fbi->var.hsync_len = fb_inf->rk_lcdc_device[lcdc_id]->screen.hsync_len;
+               fbi->fbops                       = &fb_ops[fb_inf->num_fb];
+               fbi->flags                       = FBINFO_FLAG_DEFAULT;
+               fbi->pseudo_palette  = fb_inf->rk_lcdc_device[lcdc_id]->layer_par[i].pseudo_pal;
+               request_fb_buffer(fbi,fb_inf->num_fb);
+               fb_inf->fb[fb_inf->num_fb] = fbi;
+               printk("%s>>>>>%s\n",__func__,fb_inf->fb[fb_inf->num_fb]->fix.id);
+               fb_inf->num_fb++;
+               
+       }
 #if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)
-    fb0_set_par(fb_inf->fb0);
-    if (fb_prepare_logo(fb_inf->fb0, FB_ROTATE_UR)) {
+    fb_inf->fb[fb_inf->num_fb-2]->fbops->fb_set_par(fb_inf->fb[fb_inf->num_fb-2]);
+    if(fb_prepare_logo(fb_inf->fb[fb_inf->num_fb-2], FB_ROTATE_UR)) {
         /* Start display and show logo on boot */
-        fb_set_cmap(&fb_inf->fb0->cmap, fb_inf->fb0);
-        fb_show_logo(fb_inf->fb0, FB_ROTATE_UR);
-        fb0_blank(FB_BLANK_UNBLANK, fb_inf->fb0);
+        fb_set_cmap(&fb_inf->fb[fb_inf->num_fb-2]->cmap, fb_inf->fb[fb_inf->num_fb-2]);
+        fb_show_logo(fb_inf->fb[fb_inf->num_fb-2], FB_ROTATE_UR);
+        fb_inf->fb[fb_inf->num_fb-2]->fbops->fb_blank(FB_BLANK_UNBLANK, fb_inf->fb[fb_inf->num_fb-2]);
     }
 #endif
        return 0;
        
        
 }
-int rk_fb_unregister(struct rk_fb_device_driver *fb_device_driver)
+int rk_fb_unregister(struct rk_lcdc_device_driver *fb_device_driver)
 {
 
        struct rk_fb_inf *fb_inf = platform_get_drvdata(g_fb_pdev);
@@ -446,7 +602,6 @@ int rk_fb_unregister(struct rk_fb_device_driver *fb_device_driver)
 
 static int __devinit rk_fb_probe (struct platform_device *pdev)
 {
-       struct resource *res = NULL;
        struct rk_fb_inf *fb_inf        = NULL;
        int ret = 0;
        g_fb_pdev=pdev;
@@ -459,30 +614,6 @@ static int __devinit rk_fb_probe (struct platform_device *pdev)
     }
     memset(fb_inf, 0, sizeof(struct rk_fb_inf));
        platform_set_drvdata(pdev, fb_inf);
-       fb_inf->fb0 = framebuffer_alloc(0, &pdev->dev);
-       if(!fb_inf->fb0){
-               dev_err(&pdev->dev,">> fb0 framebuffer_alloc fail!");
-               fb_inf->fb1 = NULL;
-               ret = -ENOMEM;
-       }
-       strcpy(fb_inf->fb0->fix.id, "fb0");
-       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "fb0 buf");
-    if (res == NULL)
-    {
-        dev_err(&pdev->dev, "failed to get win1 memory \n");
-        ret = -ENOENT;
-    }
-    fb_inf->fb0->fix.smem_start = res->start;
-    fb_inf->fb0->fix.smem_len = res->end - res->start + 1;
-    fb_inf->fb0->screen_base = ioremap(res->start, fb_inf->fb0->fix.smem_len);
-    memset(fb_inf->fb0->screen_base, 0, fb_inf->fb0->fix.smem_len);
-       fb_inf->fb1= framebuffer_alloc(0, &pdev->dev);
-       if(!fb_inf->fb1){
-               dev_err(&pdev->dev,">> fb1 framebuffer_alloc fail!");
-               fb_inf->fb1 = NULL;
-               ret = -ENOMEM;
-       }
-       strcpy(fb_inf->fb1->fix.id, "fb1");
        printk("rk fb probe ok!\n");
     return 0;
 }
index 1721f8558b3187625b97b6ebe3d620d9bbc71540..35159c8979492cad5d28a8133aa16fc5c54e22ef 100644 (file)
 
 #define RK30_MAX_LCDC_SUPPORT  4
 #define RK30_MAX_LAYER_SUPPORT 4
+#define RK_MAX_FB_SUPPORT     4
 
 
 /********************************************************************
-**                            ºê¶¨Òå                                *
+**                          display output format                        *
 ********************************************************************/
-/* ÊäÍùÆÁµÄÊý¾Ý¸ñʽ */
+/* */
 #define OUT_P888            0
-#define OUT_P666            1    //666µÄÆÁ, ½ÓDATA0-17
-#define OUT_P565            2    //565µÄÆÁ, ½ÓDATA0-15
+#define OUT_P666            1    //
+#define OUT_P565            2    //
 #define OUT_S888x           4
 #define OUT_CCIR656         6
 #define OUT_S888            8
 #define OUT_S888DUMY        12
-#define OUT_P16BPP4         24  //Ä£Äⷽʽ,¿ØÖÆÆ÷²¢²»Ö§³Ö
-#define OUT_D888_P666       0x21  //666µÄÆÁ, ½ÓDATA2-7, DATA10-15, DATA18-23
-#define OUT_D888_P565       0x22  //565µÄÆÁ, ½ÓDATA3-7, DATA10-15, DATA19-23
+#define OUT_P16BPP4         24  //
+#define OUT_D888_P666       0x21  //
+#define OUT_D888_P565       0x22  //
 
 enum data_format{
        ARGB888 = 0,
@@ -81,7 +82,7 @@ struct layer_par {
        int id;
 };
 
-struct rk_fb_device_driver{
+struct rk_lcdc_device_driver{
        const char *name;
        int id;
        struct device  *dev;
@@ -93,21 +94,20 @@ struct rk_fb_device_driver{
        int (*ioctl)(unsigned int cmd, unsigned long arg,struct layer_par *layer_par);
        int (*suspend)(struct layer_par *layer_par);
        int (*resume)(struct layer_par *layer_par);
-       int (*blank)(struct rk_fb_device_driver *rk_fb_dev_drv,int layer_id,int blank_mode);
-       int (*set_par)(struct rk_fb_device_driver *rk_fb_dev_drv,int layer_id);
-       int (*pan)(struct rk_fb_device_driver *rk_fb_dev_drv,int layer_id);
+       int (*blank)(struct rk_lcdc_device_driver *rk_fb_dev_drv,int layer_id,int blank_mode);
+       int (*set_par)(struct rk_lcdc_device_driver *rk_fb_dev_drv,int layer_id);
+       int (*pan)(struct rk_lcdc_device_driver *rk_fb_dev_drv,int layer_id);
        
 };
 
 struct rk_fb_inf {
-    struct fb_info *fb1;
-    struct fb_info *fb0;
-
-       struct rk_fb_device_driver *rk_lcdc_device[RK30_MAX_LCDC_SUPPORT];
-       
-       int num_lcdc;
+    struct fb_info *fb[RK_MAX_FB_SUPPORT];
+    int num_fb;
+    
+    struct rk_lcdc_device_driver *rk_lcdc_device[RK30_MAX_LCDC_SUPPORT];
+    int num_lcdc;
 };
-extern int rk_fb_register(struct rk_fb_device_driver *fb_device_driver);
-extern int rk_fb_unregister(struct rk_fb_device_driver *fb_device_driver);
+extern int rk_fb_register(struct rk_lcdc_device_driver *fb_device_driver);
+extern int rk_fb_unregister(struct rk_lcdc_device_driver *fb_device_driver);
 
 #endif