]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/video/cfb_console.c
Merge branch 'master' of git://git.denx.de/u-boot-cfi-flash
[karo-tx-uboot.git] / drivers / video / cfb_console.c
index 68b9861d41ff9042c2db8c76665f789e3be5b829..5ee2314f3cd5e83c05bb8c3c53cedb08a8018c7b 100644 (file)
@@ -61,7 +61,7 @@
 
  CONFIG_CONSOLE_CURSOR      - on/off drawing cursor is done with delay
                               loop in VIDEO_TSTC_FCT (i8042)
- CFG_CONSOLE_BLINK_COUNT     - value for delay loop - blink rate
+ CONFIG_SYS_CONSOLE_BLINK_COUNT     - value for delay loop - blink rate
  CONFIG_CONSOLE_TIME        - display time/date in upper right corner,
                               needs CONFIG_CMD_DATE and CONFIG_CONSOLE_CURSOR
  CONFIG_VIDEO_LOGO          - display Linux Logo in upper left corner
@@ -92,8 +92,6 @@ CONFIG_VIDEO_HW_CURSOR:            - Uses the hardware cursor capability of the
 
 #include <common.h>
 
-#ifdef CONFIG_CFB_CONSOLE
-
 #include <malloc.h>
 
 /*****************************************************************************/
@@ -316,10 +314,10 @@ void      console_cursor (int state);
 #else
 #define SWAP16(x)       (x)
 #define SWAP32(x)       (x)
-#if !defined(VIDEO_FB_16BPP_PIXEL_SWAP)
-#define SHORTSWAP32(x)  (x)
-#else
+#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
 #define SHORTSWAP32(x)  ( ((x) >> 16) | ((x) << 16) )
+#else
+#define SHORTSWAP32(x)  (x)
 #endif
 #endif
 
@@ -751,24 +749,10 @@ void video_puts (const char *s)
        fb ++;                                          \
 }
 
-#if !defined(VIDEO_FB_16BPP_PIXEL_SWAP)
 #define FILL_15BIT_555RGB(r,g,b) {                     \
        *(unsigned short *)fb = SWAP16((unsigned short)(((r>>3)<<10) | ((g>>3)<<5) | (b>>3))); \
        fb += 2;                                        \
 }
-#else
-static int tgl;
-static unsigned short p0;
-#define FILL_15BIT_555RGB(r,g,b) {                     \
-       if (!tgl++) {                                   \
-               p0 = SWAP16((unsigned short)(((r>>3)<<10) | ((g>>3)<<5) | (b>>3))); \
-       } else {                                        \
-               tgl=0;                                  \
-               *(unsigned long *)(fb-2) = (SWAP16((unsigned short)(((r>>3)<<10) | ((g>>3)<<5) | (b>>3)))<<16) | p0; \
-       }                                               \
-       fb += 2;                                        \
-}
-#endif
 
 #define FILL_16BIT_565RGB(r,g,b) {                     \
        *(unsigned short *)fb = SWAP16((unsigned short)((((r)>>3)<<11) | (((g)>>2)<<5) | ((b)>>3))); \
@@ -796,6 +780,20 @@ static unsigned short p0;
 }
 #endif
 
+#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
+static void inline fill_555rgb_pswap(uchar *fb, int x,
+                                    u8 r, u8 g, u8 b)
+{
+       ushort *dst = (ushort *)fb;
+       ushort color = (ushort)(((r >> 3) << 10) |
+                               ((g >> 3) << 5) |
+                               (b >> 3));
+       if (x & 1)
+               *(--dst) = color;
+       else
+               *(++dst) = color;
+}
+#endif
 
 /*
  * Display the BMP file located at address bmp_image.
@@ -826,19 +824,19 @@ int video_display_bitmap (ulong bmp_image, int x, int y)
                /*
                 * Could be a gzipped bmp image, try to decrompress...
                 */
-               len = CFG_VIDEO_LOGO_MAX_SIZE;
-               dst = malloc(CFG_VIDEO_LOGO_MAX_SIZE);
+               len = CONFIG_SYS_VIDEO_LOGO_MAX_SIZE;
+               dst = malloc(CONFIG_SYS_VIDEO_LOGO_MAX_SIZE);
                if (dst == NULL) {
                        printf("Error: malloc in gunzip failed!\n");
                        return(1);
                }
-               if (gunzip(dst, CFG_VIDEO_LOGO_MAX_SIZE, (uchar *)bmp_image, &len) != 0) {
+               if (gunzip(dst, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE, (uchar *)bmp_image, &len) != 0) {
                        printf ("Error: no valid bmp or bmp.gz image at %lx\n", bmp_image);
                        free(dst);
                        return 1;
                }
-               if (len == CFG_VIDEO_LOGO_MAX_SIZE) {
-                       printf("Image could be truncated (increase CFG_VIDEO_LOGO_MAX_SIZE)!\n");
+               if (len == CONFIG_SYS_VIDEO_LOGO_MAX_SIZE) {
+                       printf("Image could be truncated (increase CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)!\n");
                }
 
                /*
@@ -927,11 +925,20 @@ int video_display_bitmap (ulong bmp_image, int x, int y)
                        break;
                case GDF_15BIT_555RGB:
                        while (ycount--) {
+#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
+                               int xpos = x;
+#endif
                                WATCHDOG_RESET ();
                                xcount = width;
                                while (xcount--) {
                                        cte = bmp->color_table[*bmap++];
+#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
+                                       fill_555rgb_pswap (fb, xpos++, cte.red,
+                                                          cte.green, cte.blue);
+                                       fb += 2;
+#else
                                        FILL_15BIT_555RGB (cte.red, cte.green, cte.blue);
+#endif
                                }
                                bmap += padded_line;
                                fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
@@ -993,10 +1000,19 @@ int video_display_bitmap (ulong bmp_image, int x, int y)
                        break;
                case GDF_15BIT_555RGB:
                        while (ycount--) {
+#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
+                               int xpos = x;
+#endif
                                WATCHDOG_RESET ();
                                xcount = width;
                                while (xcount--) {
+#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
+                                       fill_555rgb_pswap (fb, xpos++, bmap[2],
+                                                          bmap[1], bmap[0]);
+                                       fb += 2;
+#else
                                        FILL_15BIT_555RGB (bmap[2], bmap[1], bmap[0]);
+#endif
                                        bmap += 3;
                                }
                                bmap += padded_line;
@@ -1071,7 +1087,9 @@ void logo_plot (void *screen, int width, int x, int y)
        int ycount = VIDEO_LOGO_HEIGHT;
        unsigned char r, g, b, *logo_red, *logo_blue, *logo_green;
        unsigned char *source;
-       unsigned char *dest = (unsigned char *)screen + ((y * width * VIDEO_PIXEL_SIZE) + x);
+       unsigned char *dest = (unsigned char *)screen +
+                             ((y * width * VIDEO_PIXEL_SIZE) +
+                              x * VIDEO_PIXEL_SIZE);
 
 #ifdef CONFIG_VIDEO_BMP_LOGO
        source = bmp_logo_bitmap;
@@ -1101,6 +1119,9 @@ void logo_plot (void *screen, int width, int x, int y)
        }
 
        while (ycount--) {
+#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
+               int xpos = x;
+#endif
                xcount = VIDEO_LOGO_WIDTH;
                while (xcount--) {
                        r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET];
@@ -1115,19 +1136,11 @@ void logo_plot (void *screen, int width, int x, int y)
                                *dest = ((r >> 5) << 5) | ((g >> 5) << 2) | (b >> 6);
                                break;
                        case GDF_15BIT_555RGB:
-#if !defined(VIDEO_FB_16BPP_PIXEL_SWAP)
+#if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
+                               fill_555rgb_pswap (dest, xpos++, r, g, b);
+#else
                                *(unsigned short *) dest =
                                        SWAP16 ((unsigned short) (((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3)));
-#else
-                               {
-                                       if (!tgl++) {
-                                               p0 = SWAP16 ((unsigned short) (((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3)));
-                                       } else {
-                                               *(unsigned long *)(dest-2) =
-                                                       (SWAP16 ((unsigned short) (((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3)))<<16) | p0;
-                                               tgl=0;
-                                       }
-                               }
 #endif
                                break;
                        case GDF_16BIT_565RGB:
@@ -1168,6 +1181,7 @@ static void *video_logo (void)
 {
        char info[128];
        extern char version_string;
+       int space, len, y_off = 0;
 
 #ifdef CONFIG_SPLASH_SCREEN
        char *s;
@@ -1185,7 +1199,19 @@ static void *video_logo (void)
        logo_plot (video_fb_address, VIDEO_COLS, 0, 0);
 
        sprintf (info, " %s", &version_string);
-       video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *)info);
+
+       space = (VIDEO_LINE_LEN / 2 - VIDEO_INFO_X) / VIDEO_FONT_WIDTH;
+       len = strlen(info);
+
+       if (len > space) {
+               video_drawchars (VIDEO_INFO_X, VIDEO_INFO_Y,
+                                (uchar *)info, space);
+               video_drawchars (VIDEO_INFO_X + VIDEO_FONT_WIDTH,
+                                VIDEO_INFO_Y + VIDEO_FONT_HEIGHT,
+                                (uchar *)info + space, len - space);
+               y_off = 1;
+       } else
+               video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *)info);
 
 #ifdef CONFIG_CONSOLE_EXTRA_INFO
        {
@@ -1193,10 +1219,27 @@ static void *video_logo (void)
 
                for (i = 1; i < n; i++) {
                        video_get_info_str (i, info);
-                       if (*info)
+                       if (!*info)
+                               continue;
+
+                       len = strlen(info);
+                       if (len > space) {
+                               video_drawchars (VIDEO_INFO_X,
+                                                VIDEO_INFO_Y +
+                                                (i + y_off) * VIDEO_FONT_HEIGHT,
+                                                (uchar *)info, space);
+                               y_off++;
+                               video_drawchars (VIDEO_INFO_X + VIDEO_FONT_WIDTH,
+                                                VIDEO_INFO_Y +
+                                                (i + y_off) * VIDEO_FONT_HEIGHT,
+                                                (uchar *)info + space,
+                                                len - space);
+                       } else {
                                video_drawstring (VIDEO_INFO_X,
-                                                 VIDEO_INFO_Y + i * VIDEO_FONT_HEIGHT,
+                                                 VIDEO_INFO_Y +
+                                                 (i + y_off) * VIDEO_FONT_HEIGHT,
                                                  (uchar *)info);
+                       }
                }
        }
 #endif
@@ -1337,4 +1380,3 @@ int drv_video_init (void)
        /* No console dev available */
        return 0;
 }
-#endif /* CONFIG_CFB_CONSOLE */