X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fvideo%2Fcfb_console.c;h=779aa4b53e49da3b7eea4814dce0feeef9d48f14;hb=ece444b42b71eb5bce34a24ec584573b3c8c4a98;hp=bcf877194e0fdbc5b08514f017c33de8e7decf19;hpb=74ac5facb988fc488a707db228b177ead63a6541;p=oweals%2Fu-boot.git diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c index bcf877194e..779aa4b53e 100644 --- a/drivers/video/cfb_console.c +++ b/drivers/video/cfb_console.c @@ -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 -#ifdef CONFIG_CFB_CONSOLE - #include /*****************************************************************************/ @@ -140,6 +138,18 @@ CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability of the #endif #endif +/*****************************************************************************/ +/* Defines for the MB862xx driver */ +/*****************************************************************************/ +#ifdef CONFIG_VIDEO_MB862xx + +#ifdef CONFIG_VIDEO_CORALP +#define VIDEO_FB_LITTLE_ENDIAN +#endif +#define VIDEO_HW_RECTFILL +#define VIDEO_HW_BITBLT +#endif + /*****************************************************************************/ /* Include video_fb.h after definitions of VIDEO_HW_RECTFILL etc */ /*****************************************************************************/ @@ -187,9 +197,9 @@ CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability of the /*****************************************************************************/ /* Cursor definition: */ -/* CONFIG_CONSOLE_CURSOR: Uses a timer function (see drivers/i8042.c) to */ -/* let the cursor blink. Uses the macros CURSOR_OFF */ -/* and CURSOR_ON. */ +/* CONFIG_CONSOLE_CURSOR: Uses a timer function (see drivers/input/i8042.c) */ +/* to let the cursor blink. Uses the macros */ +/* CURSOR_OFF and CURSOR_ON. */ /* CONFIG_VIDEO_SW_CURSOR: Draws a cursor after the last character. No */ /* blinking is provided. Uses the macros CURSOR_SET */ /* and CURSOR_OFF. */ @@ -217,7 +227,7 @@ void console_cursor (int state); #define CURSOR_OFF console_cursor(0); #define CURSOR_SET #ifndef CONFIG_I8042_KBD -#warning Cursor drawing on/off needs timer function s.a. drivers/i8042.c +#warning Cursor drawing on/off needs timer function s.a. drivers/input/i8042.c #endif #else #ifdef CONFIG_CONSOLE_TIME @@ -304,8 +314,12 @@ 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) >> 16) | ((x) << 16) ) +#else #define SHORTSWAP32(x) (x) #endif +#endif #if defined(DEBUG) || defined(DEBUG_CFB_CONSOLE) #define PRINTD(x) printf(x) @@ -647,7 +661,14 @@ static void console_back (void) static void console_newline (void) { - CURSOR_OFF console_row++; + /* Check if last character in the line was just drawn. If so, cursor was + overwriten and need not to be cleared. Cursor clearing without this + check causes overwriting the 1st character of the line if line lenght + is >= CONSOLE_COLS + */ + if (console_col < CONSOLE_COLS) + CURSOR_OFF + console_row++; console_col = 0; /* Check if we need to scroll the terminal */ @@ -660,16 +681,26 @@ static void console_newline (void) } } +static void console_cr (void) +{ + CURSOR_OFF console_col = 0; +} + /*****************************************************************************/ void video_putc (const char c) { + static int nl = 1; + switch (c) { - case 13: /* ignore */ + case 13: /* back to first column */ + console_cr (); break; case '\n': /* next line */ - console_newline (); + if (console_col || (!console_col && nl)) + console_newline (); + nl = 1; break; case 9: /* tab 8 */ @@ -691,8 +722,10 @@ void video_putc (const char c) console_col++; /* check for newline */ - if (console_col >= CONSOLE_COLS) + if (console_col >= CONSOLE_COLS) { console_newline (); + nl = 0; + } } CURSOR_SET} @@ -747,6 +780,20 @@ void video_puts (const char *s) } #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. @@ -777,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"); } /* @@ -800,6 +847,7 @@ int video_display_bitmap (ulong bmp_image, int x, int y) if (!((bmp->header.signature[0] == 'B') && (bmp->header.signature[1] == 'M'))) { printf ("Error: no valid bmp.gz image at %lx\n", bmp_image); + free(dst); return 1; } #else @@ -820,6 +868,10 @@ int video_display_bitmap (ulong bmp_image, int x, int y) if (compression != BMP_BI_RGB) { printf ("Error: compression type %ld not supported\n", compression); +#ifdef CONFIG_VIDEO_BMP_GZIP + if (dst) + free(dst); +#endif return 1; } @@ -873,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; @@ -939,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; @@ -1017,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; @@ -1047,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]; @@ -1061,8 +1136,12 @@ 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) + fill_555rgb_pswap (dest, xpos++, r, g, b); +#else *(unsigned short *) dest = SWAP16 ((unsigned short) (((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3))); +#endif break; case GDF_16BIT_565RGB: *(unsigned short *) dest = @@ -1271,4 +1350,3 @@ int drv_video_init (void) /* No console dev available */ return 0; } -#endif /* CONFIG_CFB_CONSOLE */