Merge branch 'master' of git://git.denx.de/u-boot-video
authorTom Rini <trini@ti.com>
Tue, 25 Sep 2012 23:18:22 +0000 (16:18 -0700)
committerTom Rini <trini@ti.com>
Tue, 25 Sep 2012 23:18:22 +0000 (16:18 -0700)
board/mcc200/lcd.c
common/lcd.c
drivers/video/fsl_diu_fb.c

index d8f754c..893f4b7 100644 (file)
@@ -21,6 +21,7 @@
 #include <common.h>
 #include <lcd.h>
 #include <mpc5xxx.h>
+#include <malloc.h>
 
 #ifdef CONFIG_LCD
 
@@ -210,4 +211,23 @@ void show_progress (int size, int tot)
 }
 
 #endif
+
+int bmp_display(ulong addr, int x, int y)
+{
+       int ret;
+       bmp_image_t *bmp = (bmp_image_t *)addr;
+
+       if (!bmp) {
+               printf("There is no valid bmp file at the given address\n");
+               return 1;
+       }
+
+       ret = lcd_display_bitmap((ulong)bmp, x, y);
+
+       if ((unsigned long)bmp != addr)
+               free(bmp);
+
+       return ret;
+}
+
 #endif /* CONFIG_LCD */
index 506a138..b6be800 100644 (file)
@@ -498,23 +498,43 @@ static int lcd_getbgcolor(void)
 /************************************************************************/
 /* ** Chipset depending Bitmap / Logo stuff...                          */
 /************************************************************************/
+static inline ushort *configuration_get_cmap(void)
+{
+#if defined CONFIG_CPU_PXA
+       struct pxafb_info *fbi = &panel_info.pxa;
+       return (ushort *)fbi->palette;
+#elif defined(CONFIG_MPC823)
+       immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
+       cpm8xx_t *cp = &(immr->im_cpm);
+       return (ushort *)&(cp->lcd_cmap[255 * sizeof(ushort)]);
+#elif defined(CONFIG_ATMEL_LCD)
+       return (ushort *)(panel_info.mmio + ATMEL_LCDC_LUT(0));
+#elif !defined(CONFIG_ATMEL_HLCD) && !defined(CONFIG_EXYNOS_FB)
+       return panel_info.cmap;
+#else
+#if defined(CONFIG_LCD_LOGO)
+       return bmp_logo_palette;
+#else
+       return NULL;
+#endif
+#endif
+}
+
 #ifdef CONFIG_LCD_LOGO
 void bitmap_plot(int x, int y)
 {
 #ifdef CONFIG_ATMEL_LCD
-       uint *cmap;
+       uint *cmap = (uint *)bmp_logo_palette;
 #else
-       ushort *cmap;
+       ushort *cmap = (ushort *)bmp_logo_palette;
 #endif
        ushort i, j;
        uchar *bmap;
        uchar *fb;
        ushort *fb16;
-#if defined(CONFIG_CPU_PXA)
-       struct pxafb_info *fbi = &panel_info.pxa;
-#elif defined(CONFIG_MPC823)
-       volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
-       volatile cpm8xx_t *cp = &(immr->im_cpm);
+#if defined(CONFIG_MPC823)
+       immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
+       cpm8xx_t *cp = &(immr->im_cpm);
 #endif
 
        debug("Logo: width %d  height %d  colors %d  cmap %d\n",
@@ -525,20 +545,17 @@ void bitmap_plot(int x, int y)
        fb   = (uchar *)(lcd_base + y * lcd_line_length + x);
 
        if (NBITS(panel_info.vl_bpix) < 12) {
-               /* Leave room for default color map */
-#if defined(CONFIG_CPU_PXA)
-               cmap = (ushort *) fbi->palette;
-#elif defined(CONFIG_MPC823)
+               /* Leave room for default color map
+                * default case: generic system with no cmap (most likely 16bpp)
+                * cmap was set to the source palette, so no change is done.
+                * This avoids even more ifdefs in the next stanza
+                */
+#if defined(CONFIG_MPC823)
                cmap = (ushort *) &(cp->lcd_cmap[BMP_LOGO_OFFSET * sizeof(ushort)]);
 #elif defined(CONFIG_ATMEL_LCD)
-               cmap = (uint *) (panel_info.mmio + ATMEL_LCDC_LUT(0));
+               cmap = (uint *)configuration_get_cmap();
 #else
-               /*
-                * default case: generic system with no cmap (most likely 16bpp)
-                * We set cmap to the source palette, so no change is done.
-                * This avoids even more ifdef in the next stanza
-                */
-               cmap = bmp_logo_palette;
+               cmap = configuration_get_cmap();
 #endif
 
                WATCHDOG_RESET();
@@ -607,7 +624,46 @@ static inline void bitmap_plot(int x, int y) {}
 
 #ifdef CONFIG_SPLASH_SCREEN_ALIGN
 #define BMP_ALIGN_CENTER       0x7FFF
+
+static void splash_align_axis(int *axis, unsigned long panel_size,
+                                       unsigned long picture_size)
+{
+       unsigned long panel_picture_delta = panel_size - picture_size;
+       unsigned long axis_alignment;
+
+       if (*axis == BMP_ALIGN_CENTER)
+               axis_alignment = panel_picture_delta / 2;
+       else if (*axis < 0)
+               axis_alignment = panel_picture_delta + *axis + 1;
+       else
+               return;
+
+       *axis = max(0, axis_alignment);
+}
+#endif
+
+#if defined(CONFIG_MPC823) || defined(CONFIG_MCC200)
+#define FB_PUT_BYTE(fb, from) *(fb)++ = (255 - *(from)++)
+#else
+#define FB_PUT_BYTE(fb, from) *(fb)++ = *(from)++
+#endif
+
+#if defined(CONFIG_BMP_16BPP)
+#if defined(CONFIG_ATMEL_LCD_BGR555)
+static inline void fb_put_word(uchar **fb, uchar **from)
+{
+       *(*fb)++ = (((*from)[0] & 0x1f) << 2) | ((*from)[1] & 0x03);
+       *(*fb)++ = ((*from)[0] & 0xe0) | (((*from)[1] & 0x7c) >> 2);
+       *from += 2;
+}
+#else
+static inline void fb_put_word(uchar **fb, uchar **from)
+{
+       *(*fb)++ = *(*from)++;
+       *(*fb)++ = *(*from)++;
+}
 #endif
+#endif /* CONFIG_BMP_16BPP */
 
 int lcd_display_bitmap(ulong bmp_image, int x, int y)
 {
@@ -623,14 +679,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
        unsigned long width, height, byte_width;
        unsigned long pwidth = panel_info.vl_col;
        unsigned colors, bpix, bmp_bpix;
-#if defined(CONFIG_CPU_PXA)
-       struct pxafb_info *fbi = &panel_info.pxa;
-#elif defined(CONFIG_MPC823)
-       volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
-       volatile cpm8xx_t *cp = &(immr->im_cpm);
-#endif
 
-       if (!((bmp->header.signature[0] == 'B') &&
+       if (!bmp || !((bmp->header.signature[0] == 'B') &&
                (bmp->header.signature[1] == 'M'))) {
                printf("Error: no valid bmp image at %lx\n", bmp_image);
 
@@ -666,14 +716,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
 #if !defined(CONFIG_MCC200)
        /* MCC200 LCD doesn't need CMAP, supports 1bpp b&w only */
        if (bmp_bpix == 8) {
-#if defined(CONFIG_CPU_PXA)
-               cmap = (ushort *)fbi->palette;
-#elif defined(CONFIG_MPC823)
-               cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]);
-#elif !defined(CONFIG_ATMEL_LCD) && !defined(CONFIG_EXYNOS_FB)
-               cmap = panel_info.cmap;
-#endif
-
+               cmap = configuration_get_cmap();
                cmap_base = cmap;
 
                /* Set color map */
@@ -722,15 +765,8 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
        padded_line = (width&0x3) ? ((width&~0x3)+4) : (width);
 
 #ifdef CONFIG_SPLASH_SCREEN_ALIGN
-       if (x == BMP_ALIGN_CENTER)
-               x = max(0, (pwidth - width) / 2);
-       else if (x < 0)
-               x = max(0, pwidth - width + x + 1);
-
-       if (y == BMP_ALIGN_CENTER)
-               y = max(0, (panel_info.vl_row - height) / 2);
-       else if (y < 0)
-               y = max(0, panel_info.vl_row - height + y + 1);
+       splash_align_axis(&x, pwidth, width);
+       splash_align_axis(&y, panel_info.vl_row, height);
 #endif /* CONFIG_SPLASH_SCREEN_ALIGN */
 
        if ((x + width) > pwidth)
@@ -754,11 +790,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
                        WATCHDOG_RESET();
                        for (j = 0; j < width; j++) {
                                if (bpix != 16) {
-#if defined(CONFIG_CPU_PXA) || defined(CONFIG_ATMEL_LCD)
-                                       *(fb++) = *(bmap++);
-#elif defined(CONFIG_MPC823) || defined(CONFIG_MCC200)
-                                       *(fb++) = 255 - *(bmap++);
-#endif
+                                       FB_PUT_BYTE(fb, bmap);
                                } else {
                                        *(uint16_t *)fb = cmap_base[*(bmap++)];
                                        fb += sizeof(uint16_t) / sizeof(*fb);
@@ -773,18 +805,9 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
        case 16:
                for (i = 0; i < height; ++i) {
                        WATCHDOG_RESET();
-                       for (j = 0; j < width; j++) {
-#if defined(CONFIG_ATMEL_LCD_BGR555)
-                               *(fb++) = ((bmap[0] & 0x1f) << 2) |
-                                       (bmap[1] & 0x03);
-                               *(fb++) = (bmap[0] & 0xe0) |
-                                       ((bmap[1] & 0x7c) >> 2);
-                               bmap += 2;
-#else
-                               *(fb++) = *(bmap++);
-                               *(fb++) = *(bmap++);
-#endif
-                       }
+                       for (j = 0; j < width; j++)
+                               fb_put_word(&fb, &bmap);
+
                        bmap += (padded_line - width) * 2;
                        fb   -= (width * 2 + lcd_line_length);
                }
@@ -842,17 +865,7 @@ static void *lcd_logo(void)
                }
 #endif /* CONFIG_SPLASH_SCREEN_ALIGN */
 
-#ifdef CONFIG_VIDEO_BMP_GZIP
-               bmp_image_t *bmp = (bmp_image_t *)addr;
-               unsigned long len;
-
-               if (!((bmp->header.signature[0] == 'B') &&
-                       (bmp->header.signature[1] == 'M'))) {
-                       addr = (ulong)gunzip_bmp(addr, &len);
-               }
-#endif
-
-               if (lcd_display_bitmap(addr, x, y) == 0)
+               if (bmp_display(addr, x, y) == 0)
                        return (void *)lcd_base;
        }
 #endif /* CONFIG_SPLASH_SCREEN */
index 648ffa3..a98cb67 100644 (file)
@@ -271,7 +271,6 @@ int fsl_diu_init(u16 xres, u16 yres, u32 pixel_format, int gamma_fix)
        struct diu *hw = (struct diu *)CONFIG_SYS_DIU_ADDR;
        u8 *gamma_table_base;
        unsigned int i, j;
-       struct diu_ad *dummy_ad;
        struct diu_addr gamma;
        struct diu_addr cursor;
 
@@ -302,14 +301,6 @@ int fsl_diu_init(u16 xres, u16 yres, u32 pixel_format, int gamma_fix)
                return -1;
        }
 
-       /* The AD struct for the dummy framebuffer and the FB itself */
-       dummy_ad = allocate_fb(2, 4, 4, NULL);
-       if (!dummy_ad) {
-               printf("DIU:   Out of memory\n");
-               return -1;
-       }
-       dummy_ad->pix_fmt = 0x88883316;
-
        /* read mode info */
        info.var.xres = fsl_diu_mode_db->xres;
        info.var.yres = fsl_diu_mode_db->yres;
@@ -376,10 +367,7 @@ int fsl_diu_init(u16 xres, u16 yres, u32 pixel_format, int gamma_fix)
        out_be32(&hw->gamma, gamma.paddr);
        out_be32(&hw->cursor, cursor.paddr);
        out_be32(&hw->bgnd, 0x007F7F7F);
-       out_be32(&hw->bgnd_wb, 0);
        out_be32(&hw->disp_size, info.var.yres << 16 | info.var.xres);
-       out_be32(&hw->wb_size, 0);
-       out_be32(&hw->wb_mem_addr, 0);
        out_be32(&hw->hsyn_para, info.var.left_margin << 22 |
                        info.var.hsync_len << 11 |
                        info.var.right_margin);
@@ -388,18 +376,13 @@ int fsl_diu_init(u16 xres, u16 yres, u32 pixel_format, int gamma_fix)
                        info.var.vsync_len << 11 |
                        info.var.lower_margin);
 
-       out_be32(&hw->syn_pol, 0);
-       out_be32(&hw->thresholds, 0x00037800);
-       out_be32(&hw->int_status, 0);
-       out_be32(&hw->int_mask, 0);
-       out_be32(&hw->plut, 0x01F5F666);
        /* Pixel Clock configuration */
        diu_set_pixel_clock(info.var.pixclock);
 
        /* Set the frame buffers */
        out_be32(&hw->desc[0], virt_to_phys(ad));
-       out_be32(&hw->desc[1], virt_to_phys(dummy_ad));
-       out_be32(&hw->desc[2], virt_to_phys(dummy_ad));
+       out_be32(&hw->desc[1], 0);
+       out_be32(&hw->desc[2], 0);
 
        /* Enable the DIU, set display to all three planes */
        out_be32(&hw->diu_mode, 1);