X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fvideo%2Fcfb_console.c;h=f54802052ed54e5bb562509f877f7ac21a5ed435;hb=daab59ac05d8fd1092e34a4c695ac265ae700141;hp=a653bb4168551b78272f8f4f6ee087d63c7fec4b;hpb=fc9b0b80435cda721fbdbe507c9e4f388b0ea62b;p=oweals%2Fu-boot.git diff --git a/drivers/video/cfb_console.c b/drivers/video/cfb_console.c index a653bb4168..f54802052e 100644 --- a/drivers/video/cfb_console.c +++ b/drivers/video/cfb_console.c @@ -15,8 +15,10 @@ * logo can be placed in the upper left corner and additional board * information strings (that normally goes to serial port) can be drawn. * - * The console driver can use the standard PC keyboard interface (i8042) - * for character input. Character output goes to a memory mapped video + * The console driver can use a keyboard interface for character input + * but this is deprecated. Only rk51 uses it. + * + * Character output goes to a memory-mapped video * framebuffer with little or big-endian organisation. * With environment setting 'console=serial' the console i/o can be * forced to serial port. @@ -25,7 +27,6 @@ * * (for SMI LynxE graphic chip) * - * CONFIG_VIDEO_SMI_LYNXEM - use graphic driver for SMI 710,712,810 * VIDEO_FB_LITTLE_ENDIAN - framebuffer organisation default: big endian * VIDEO_HW_RECTFILL - graphic driver supports hardware rectangle fill * VIDEO_HW_BITBLT - graphic driver supports hardware bit blt @@ -38,18 +39,10 @@ * VIDEO_DATA_FORMAT - graphical data format GDF * VIDEO_FB_ADRS - start of video memory * - * CONFIG_I8042_KBD - AT Keyboard driver for i8042 * VIDEO_KBD_INIT_FCT - init function for keyboard * VIDEO_TSTC_FCT - keyboard_tstc function * VIDEO_GETC_FCT - keyboard_getc function * - * CONFIG_CONSOLE_CURSOR - on/off drawing cursor is done with - * delay loop in VIDEO_TSTC_FCT (i8042) - * - * 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. * Use CONFIG_SPLASH_SCREEN_ALIGN with * environment variable "splashpos" to place @@ -65,44 +58,20 @@ * info); * that fills a info buffer at i=row. * s.a: board/eltec/bab7xx. - * CONFIG_VGA_AS_SINGLE_DEVICE - If set the framebuffer device will be - * initialized as an output only device. - * The Keyboard driver will not be - * set-up. This may be used, if you have - * no or more than one Keyboard devices - * (USB Keyboard, AT Keyboard). * * CONFIG_VIDEO_SW_CURSOR: - Draws a cursor after the last * character. No blinking is provided. * Uses the macros CURSOR_SET and * CURSOR_OFF. - * - * CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability - * of the graphic chip. Uses the macro - * CURSOR_SET. ATTENTION: If booting an - * OS, the display driver must disable - * the hardware register of the graphic - * chip. Otherwise a blinking field is - * displayed. */ #include +#include #include #include +#include #include -/* - * Console device defines with SMI graphic - * Any other graphic must change this section - */ - -#ifdef CONFIG_VIDEO_SMI_LYNXEM - -#define VIDEO_FB_LITTLE_ENDIAN -#define VIDEO_HW_RECTFILL -#define VIDEO_HW_BITBLT -#endif - /* * Defines for the CT69000 driver */ @@ -113,29 +82,7 @@ #define VIDEO_HW_BITBLT #endif -/* - * Defines for the SED13806 driver - */ -#ifdef CONFIG_VIDEO_SED13806 - -#ifndef CONFIG_TOTAL5200 -#define VIDEO_FB_LITTLE_ENDIAN -#endif -#define VIDEO_HW_RECTFILL -#define VIDEO_HW_BITBLT -#endif - -/* - * Defines for the SED13806 driver - */ -#ifdef CONFIG_VIDEO_SM501 - -#ifdef CONFIG_HH405 -#define VIDEO_FB_LITTLE_ENDIAN -#endif -#endif - -#ifdef CONFIG_VIDEO_MXS +#if defined(CONFIG_VIDEO_MXS) #define VIDEO_FB_16BPP_WORD_SWAP #endif @@ -176,19 +123,6 @@ #define VIDEO_DATA_FORMAT (pGD->gdfIndex) #define VIDEO_FB_ADRS (pGD->frameAdrs) -/* - * Console device defines with i8042 keyboard controller - * Any other keyboard controller must change this section - */ - -#ifdef CONFIG_I8042_KBD -#include - -#define VIDEO_KBD_INIT_FCT i8042_kbd_init() -#define VIDEO_TSTC_FCT i8042_tstc -#define VIDEO_GETC_FCT i8042_getc -#endif - /* * Console device */ @@ -208,62 +142,20 @@ #include #endif -/* - * Cursor definition: - * 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. - * CONFIG_VIDEO_HW_CURSOR: Uses the hardware cursor capability of the - * graphic chip. Uses the macro CURSOR_SET. - * ATTENTION: If booting an OS, the display driver - * must disable the hardware register of the graphic - * chip. Otherwise a blinking field is displayed - */ -#if !defined(CONFIG_CONSOLE_CURSOR) && \ - !defined(CONFIG_VIDEO_SW_CURSOR) && \ - !defined(CONFIG_VIDEO_HW_CURSOR) +#if !defined(CONFIG_VIDEO_SW_CURSOR) /* no Cursor defined */ #define CURSOR_ON #define CURSOR_OFF #define CURSOR_SET #endif -#if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR) -#if defined(CURSOR_ON) || \ - (defined(CONFIG_CONSOLE_CURSOR) && defined(CONFIG_VIDEO_SW_CURSOR)) -#error only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \ - or CONFIG_VIDEO_HW_CURSOR can be defined -#endif +#if defined(CONFIG_VIDEO_SW_CURSOR) void console_cursor(int state); #define CURSOR_ON console_cursor(1) #define CURSOR_OFF console_cursor(0) #define CURSOR_SET video_set_cursor() -#endif /* CONFIG_CONSOLE_CURSOR || CONFIG_VIDEO_SW_CURSOR */ - -#ifdef CONFIG_CONSOLE_CURSOR -#ifndef CONFIG_CONSOLE_TIME -#error CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME -#endif -#ifndef CONFIG_I8042_KBD -#warning Cursor drawing on/off needs timer function s.a. drivers/input/i8042.c -#endif -#endif /* CONFIG_CONSOLE_CURSOR */ - - -#ifdef CONFIG_VIDEO_HW_CURSOR -#ifdef CURSOR_ON -#error only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \ - or CONFIG_VIDEO_HW_CURSOR can be defined -#endif -#define CURSOR_ON -#define CURSOR_OFF -#define CURSOR_SET video_set_hw_cursor(console_col * VIDEO_FONT_WIDTH, \ - (console_row * VIDEO_FONT_HEIGHT) + video_logo_height) -#endif /* CONFIG_VIDEO_HW_CURSOR */ +#endif /* CONFIG_VIDEO_SW_CURSOR */ #ifdef CONFIG_VIDEO_LOGO #ifdef CONFIG_VIDEO_BMP_LOGO @@ -295,9 +187,10 @@ void console_cursor(int state); #define VIDEO_COLS VIDEO_VISIBLE_COLS #define VIDEO_ROWS VIDEO_VISIBLE_ROWS -#define VIDEO_SIZE (VIDEO_ROWS*VIDEO_COLS*VIDEO_PIXEL_SIZE) -#define VIDEO_PIX_BLOCKS (VIDEO_SIZE >> 2) -#define VIDEO_LINE_LEN (VIDEO_COLS*VIDEO_PIXEL_SIZE) +#ifndef VIDEO_LINE_LEN +#define VIDEO_LINE_LEN (VIDEO_COLS * VIDEO_PIXEL_SIZE) +#endif +#define VIDEO_SIZE (VIDEO_ROWS * VIDEO_LINE_LEN) #define VIDEO_BURST_LEN (VIDEO_COLS/8) #ifdef CONFIG_VIDEO_LOGO @@ -312,7 +205,11 @@ void console_cursor(int state); #define CONSOLE_ROW_SECOND (video_console_address + CONSOLE_ROW_SIZE) #define CONSOLE_ROW_LAST (video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE) #define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS) -#define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE) + +/* By default we scroll by a single line */ +#ifndef CONFIG_CONSOLE_SCROLL_LINES +#define CONFIG_CONSOLE_SCROLL_LINES 1 +#endif /* Macros */ #ifdef VIDEO_FB_LITTLE_ENDIAN @@ -339,16 +236,6 @@ void console_cursor(int state); #endif #endif -#ifdef CONFIG_CONSOLE_EXTRA_INFO -/* - * setup a board string: type, speed, etc. - * - * line_number: location to place info string beside logo - * info: buffer for info string - */ -extern void video_get_info_str(int line_number, char *info); -#endif - DECLARE_GLOBAL_DATA_PTR; /* Locals */ @@ -633,7 +520,7 @@ static void video_putchar(int xx, int yy, unsigned char c) video_drawchars(xx, yy + video_logo_height, &c, 1); } -#if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR) +#if defined(CONFIG_VIDEO_SW_CURSOR) static void video_set_cursor(void) { if (cursor_state) @@ -658,27 +545,6 @@ static void video_invertchar(int xx, int yy) void console_cursor(int state) { -#ifdef CONFIG_CONSOLE_TIME - struct rtc_time tm; - char info[16]; - - /* time update only if cursor is on (faster scroll) */ - if (state) { - rtc_get(&tm); - - sprintf(info, " %02d:%02d:%02d ", tm.tm_hour, tm.tm_min, - tm.tm_sec); - video_drawstring(VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, - VIDEO_INFO_Y, (uchar *) info); - - sprintf(info, "%02d.%02d.%04d", tm.tm_mday, tm.tm_mon, - tm.tm_year); - video_drawstring(VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, - VIDEO_INFO_Y + 1 * VIDEO_FONT_HEIGHT, - (uchar *) info); - } -#endif - if (cursor_state != state) { if (cursor_state) { /* turn off the cursor */ @@ -753,26 +619,33 @@ static void console_clear_line(int line, int begin, int end) static void console_scrollup(void) { + const int rows = CONFIG_CONSOLE_SCROLL_LINES; + int i; + /* copy up rows ignoring the first one */ #ifdef VIDEO_HW_BITBLT video_hw_bitblt(VIDEO_PIXEL_SIZE, /* bytes per pixel */ 0, /* source pos x */ video_logo_height + - VIDEO_FONT_HEIGHT, /* source pos y */ + VIDEO_FONT_HEIGHT * rows, /* source pos y */ 0, /* dest pos x */ video_logo_height, /* dest pos y */ VIDEO_VISIBLE_COLS, /* frame width */ VIDEO_VISIBLE_ROWS - video_logo_height - - VIDEO_FONT_HEIGHT /* frame height */ + - VIDEO_FONT_HEIGHT * rows /* frame height */ ); #else - memcpyl(CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND, - CONSOLE_SCROLL_SIZE >> 2); + memcpyl(CONSOLE_ROW_FIRST, CONSOLE_ROW_FIRST + rows * CONSOLE_ROW_SIZE, + (CONSOLE_SIZE - CONSOLE_ROW_SIZE * rows) >> 2); #endif /* clear the last one */ - console_clear_line(CONSOLE_ROWS - 1, 0, CONSOLE_COLS - 1); + for (i = 1; i <= rows; i++) + console_clear_line(CONSOLE_ROWS - i, 0, CONSOLE_COLS - 1); + + /* Decrement row number */ + console_row -= rows; } static void console_back(void) @@ -884,9 +757,6 @@ static void console_newline(int n) if (console_row >= CONSOLE_ROWS) { /* Scroll everything up */ console_scrollup(); - - /* Decrement row number */ - console_row = CONSOLE_ROWS - 1; } } @@ -944,7 +814,7 @@ static void parse_putc(const char c) CURSOR_SET; } -static void video_putc(struct stdio_dev *dev, const char c) +static void cfb_video_putc(struct stdio_dev *dev, const char c) { #ifdef CONFIG_CFB_CONSOLE_ANSI int i; @@ -1158,7 +1028,7 @@ static void video_putc(struct stdio_dev *dev, const char c) flush_cache(VIDEO_FB_ADRS, VIDEO_SIZE); } -static void video_puts(struct stdio_dev *dev, const char *s) +static void cfb_video_puts(struct stdio_dev *dev, const char *s) { int flush = cfb_do_flush_cache; int count = strlen(s); @@ -1167,7 +1037,7 @@ static void video_puts(struct stdio_dev *dev, const char *s) cfb_do_flush_cache = 0; while (count--) - video_putc(dev, *s++); + cfb_video_putc(dev, *s++); if (flush) { cfb_do_flush_cache = flush; @@ -1209,8 +1079,8 @@ __weak void video_set_lut(unsigned int index, unsigned char r, } #define FILL_32BIT_X888RGB(r,g,b) { \ - *(unsigned long *)fb = \ - SWAP32((unsigned long)(((r<<16) | \ + *(u32 *)fb = \ + SWAP32((unsigned int)(((r<<16) | \ (g<<8) | \ b))); \ fb += 4; \ @@ -1291,7 +1161,7 @@ static void draw_bitmap(uchar **fb, uchar *bm, struct palette *p, break; case GDF_32BIT_X888RGB: for (i = 0; i < cnt; i++) { - *(unsigned long *) addr = p[bm[*off]].ce.dw; + *(u32 *) addr = p[bm[*off]].ce.dw; addr += 4; } break; @@ -1299,7 +1169,7 @@ static void draw_bitmap(uchar **fb, uchar *bm, struct palette *p, *fb = (uchar *) addr; /* return modified address */ } -static int display_rle8_bitmap(bmp_image_t *img, int xoff, int yoff, +static int display_rle8_bitmap(struct bmp_image *img, int xoff, int yoff, int width, int height) { unsigned char *bm; @@ -1308,9 +1178,9 @@ static int display_rle8_bitmap(bmp_image_t *img, int xoff, int yoff, int decode = 1; int x, y, bpp, i, ncolors; struct palette p[256]; - bmp_color_table_entry_t cte; + struct bmp_color_table_entry cte; int green_shift, red_off; - int limit = VIDEO_COLS * VIDEO_ROWS; + int limit = (VIDEO_LINE_LEN / VIDEO_PIXEL_SIZE) * VIDEO_ROWS; int pixels = 0; x = 0; @@ -1318,7 +1188,8 @@ static int display_rle8_bitmap(bmp_image_t *img, int xoff, int yoff, ncolors = __le32_to_cpu(img->header.colors_used); bpp = VIDEO_PIXEL_SIZE; fbp = (unsigned char *) ((unsigned int) video_fb_address + - (((y + yoff) * VIDEO_COLS) + xoff) * bpp); + (y + yoff) * VIDEO_LINE_LEN + + xoff * bpp); bm = (uchar *) img + __le32_to_cpu(img->header.data_offset); @@ -1372,8 +1243,8 @@ static int display_rle8_bitmap(bmp_image_t *img, int xoff, int yoff, y--; fbp = (unsigned char *) ((unsigned int) video_fb_address + - (((y + yoff) * VIDEO_COLS) + - xoff) * bpp); + (y + yoff) * VIDEO_LINE_LEN + + xoff * bpp); continue; case 1: /* end of bitmap data marker */ @@ -1385,8 +1256,8 @@ static int display_rle8_bitmap(bmp_image_t *img, int xoff, int yoff, y -= bm[3]; fbp = (unsigned char *) ((unsigned int) video_fb_address + - (((y + yoff) * VIDEO_COLS) + - x + xoff) * bpp); + (y + yoff) * VIDEO_LINE_LEN + + xoff * bpp); bm += 4; break; default: @@ -1451,13 +1322,13 @@ int video_display_bitmap(ulong bmp_image, int x, int y) { ushort xcount, ycount; uchar *fb; - bmp_image_t *bmp = (bmp_image_t *) bmp_image; + struct bmp_image *bmp = (struct bmp_image *)bmp_image; uchar *bmap; ushort padded_line; unsigned long width, height, bpp; unsigned colors; unsigned long compression; - bmp_color_table_entry_t cte; + struct bmp_color_table_entry cte; #ifdef CONFIG_VIDEO_BMP_GZIP unsigned char *dst = NULL; @@ -1499,7 +1370,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y) /* * Set addr to decompressed image */ - bmp = (bmp_image_t *)(dst+2); + bmp = (struct bmp_image *)(dst+2); if (!((bmp->header.signature[0] == 'B') && (bmp->header.signature[1] == 'M'))) { @@ -1565,7 +1436,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y) bmap = (uchar *) bmp + le32_to_cpu(bmp->header.data_offset); fb = (uchar *) (video_fb_address + - ((y + height - 1) * VIDEO_COLS * VIDEO_PIXEL_SIZE) + + ((y + height - 1) * VIDEO_LINE_LEN) + x * VIDEO_PIXEL_SIZE); #ifdef CONFIG_VIDEO_BMP_RLE8 @@ -1601,7 +1472,7 @@ int video_display_bitmap(ulong bmp_image, int x, int y) cte.blue); } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * + fb -= VIDEO_LINE_LEN + width * VIDEO_PIXEL_SIZE; } break; @@ -1632,8 +1503,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) *fb++ = *bmap++; } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; case GDF__8BIT_332RGB: @@ -1646,8 +1517,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) cte.blue); } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; case GDF_15BIT_555RGB: @@ -1670,8 +1541,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) #endif } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; case GDF_16BIT_565RGB: @@ -1684,8 +1555,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) cte.blue); } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; case GDF_32BIT_X888RGB: @@ -1698,8 +1569,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) cte.blue); } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; case GDF_24BIT_888RGB: @@ -1712,8 +1583,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) cte.blue); } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; } @@ -1732,8 +1603,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) bmap += 3; } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; case GDF_15BIT_555RGB: @@ -1755,8 +1626,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) bmap += 3; } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; case GDF_16BIT_565RGB: @@ -1769,8 +1640,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) bmap += 3; } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; case GDF_32BIT_X888RGB: @@ -1783,8 +1654,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) bmap += 3; } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; case GDF_24BIT_888RGB: @@ -1797,8 +1668,8 @@ int video_display_bitmap(ulong bmp_image, int x, int y) bmap += 3; } bmap += padded_line; - fb -= (VIDEO_VISIBLE_COLS + width) * - VIDEO_PIXEL_SIZE; + fb -= VIDEO_LINE_LEN + width * + VIDEO_PIXEL_SIZE; } break; default: @@ -1830,20 +1701,16 @@ int video_display_bitmap(ulong bmp_image, int x, int y) static int video_logo_xpos; static int video_logo_ypos; -static void plot_logo_or_black(void *screen, int width, int x, int y, \ - int black); +static void plot_logo_or_black(void *screen, int x, int y, int black); -static void logo_plot(void *screen, int width, int x, int y) +static void logo_plot(void *screen, int x, int y) { - plot_logo_or_black(screen, width, x, y, 0); + plot_logo_or_black(screen, x, y, 0); } static void logo_black(void) { - plot_logo_or_black(video_fb_address, \ - VIDEO_COLS, \ - video_logo_xpos, \ - video_logo_ypos, \ + plot_logo_or_black(video_fb_address, video_logo_xpos, video_logo_ypos, 1); } @@ -1862,11 +1729,11 @@ U_BOOT_CMD( " " ); -static void plot_logo_or_black(void *screen, int width, int x, int y, int black) +static void plot_logo_or_black(void *screen, int x, int y, int black) { int xcount, i; - int skip = (width - VIDEO_LOGO_WIDTH) * VIDEO_PIXEL_SIZE; + int skip = VIDEO_LINE_LEN - VIDEO_LOGO_WIDTH * VIDEO_PIXEL_SIZE; int ycount = video_logo_height; unsigned char r, g, b, *logo_red, *logo_blue, *logo_green; unsigned char *source; @@ -1884,7 +1751,7 @@ static void plot_logo_or_black(void *screen, int width, int x, int y, int black) y = max(0, (int)(VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT + y + 1)); #endif /* CONFIG_SPLASH_SCREEN_ALIGN */ - dest = (unsigned char *)screen + (y * width + x) * VIDEO_PIXEL_SIZE; + dest = (unsigned char *)screen + y * VIDEO_LINE_LEN + x * VIDEO_PIXEL_SIZE; #ifdef CONFIG_VIDEO_BMP_LOGO source = bmp_logo_bitmap; @@ -1958,8 +1825,8 @@ static void plot_logo_or_black(void *screen, int width, int x, int y, int black) (b >> 3))); break; case GDF_32BIT_X888RGB: - *(unsigned long *) dest = - SWAP32((unsigned long) ( + *(u32 *) dest = + SWAP32((u32) ( (r << 16) | (g << 8) | b)); @@ -1991,17 +1858,19 @@ static void plot_logo_or_black(void *screen, int width, int x, int y, int black) static void *video_logo(void) { char info[128]; - int space, len; __maybe_unused int y_off = 0; __maybe_unused ulong addr; __maybe_unused char *s; + __maybe_unused int len, ret, space; splash_get_pos(&video_logo_xpos, &video_logo_ypos); #ifdef CONFIG_SPLASH_SCREEN s = getenv("splashimage"); if (s != NULL) { - splash_screen_prepare(); + ret = splash_screen_prepare(); + if (ret < 0) + return video_fb_address; addr = simple_strtoul(s, NULL, 16); if (video_display_bitmap(addr, @@ -2013,8 +1882,7 @@ static void *video_logo(void) } #endif /* CONFIG_SPLASH_SCREEN */ - logo_plot(video_fb_address, VIDEO_COLS, - video_logo_xpos, video_logo_ypos); + logo_plot(video_fb_address, video_logo_xpos, video_logo_ypos); #ifdef CONFIG_SPLASH_SCREEN_ALIGN /* @@ -2041,6 +1909,7 @@ static void *video_logo(void) sprintf(info, " %s", version_string); +#ifndef CONFIG_HIDE_LOGO_VERSION space = (VIDEO_LINE_LEN / 2 - VIDEO_INFO_X) / VIDEO_FONT_WIDTH; len = strlen(info); @@ -2089,6 +1958,7 @@ static void *video_logo(void) } } } +#endif #endif return (video_fb_address + video_logo_height * VIDEO_LINE_LEN); @@ -2098,7 +1968,7 @@ static void *video_logo(void) static int cfb_fb_is_in_dram(void) { bd_t *bd = gd->bd; -#if defined(CONFIG_ARM) || defined(CONFIG_AVR32) || defined(COFNIG_NDS32) || \ +#if defined(CONFIG_ARM) || defined(CONFIG_NDS32) || \ defined(CONFIG_SANDBOX) || defined(CONFIG_X86) ulong start, end; int i; @@ -2136,7 +2006,7 @@ void video_clear(void) #endif } -static int video_init(void) +static int cfg_video_init(void) { unsigned char color8; @@ -2145,79 +2015,78 @@ static int video_init(void) return -1; video_fb_address = (void *) VIDEO_FB_ADRS; -#ifdef CONFIG_VIDEO_HW_CURSOR - video_init_hw_cursor(VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT); -#endif cfb_do_flush_cache = cfb_fb_is_in_dram() && dcache_status(); /* Init drawing pats */ switch (VIDEO_DATA_FORMAT) { case GDF__8BIT_INDEX: - video_set_lut(0x01, CONSOLE_FG_COL, CONSOLE_FG_COL, - CONSOLE_FG_COL); - video_set_lut(0x00, CONSOLE_BG_COL, CONSOLE_BG_COL, - CONSOLE_BG_COL); + video_set_lut(0x01, CONFIG_SYS_CONSOLE_FG_COL, + CONFIG_SYS_CONSOLE_FG_COL, + CONFIG_SYS_CONSOLE_FG_COL); + video_set_lut(0x00, CONFIG_SYS_CONSOLE_BG_COL, + CONFIG_SYS_CONSOLE_BG_COL, + CONFIG_SYS_CONSOLE_BG_COL); fgx = 0x01010101; bgx = 0x00000000; break; case GDF__8BIT_332RGB: - color8 = ((CONSOLE_FG_COL & 0xe0) | - ((CONSOLE_FG_COL >> 3) & 0x1c) | - CONSOLE_FG_COL >> 6); + color8 = ((CONFIG_SYS_CONSOLE_FG_COL & 0xe0) | + ((CONFIG_SYS_CONSOLE_FG_COL >> 3) & 0x1c) | + CONFIG_SYS_CONSOLE_FG_COL >> 6); fgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8; - color8 = ((CONSOLE_BG_COL & 0xe0) | - ((CONSOLE_BG_COL >> 3) & 0x1c) | - CONSOLE_BG_COL >> 6); + color8 = ((CONFIG_SYS_CONSOLE_BG_COL & 0xe0) | + ((CONFIG_SYS_CONSOLE_BG_COL >> 3) & 0x1c) | + CONFIG_SYS_CONSOLE_BG_COL >> 6); bgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8; break; case GDF_15BIT_555RGB: - fgx = (((CONSOLE_FG_COL >> 3) << 26) | - ((CONSOLE_FG_COL >> 3) << 21) | - ((CONSOLE_FG_COL >> 3) << 16) | - ((CONSOLE_FG_COL >> 3) << 10) | - ((CONSOLE_FG_COL >> 3) << 5) | - (CONSOLE_FG_COL >> 3)); - bgx = (((CONSOLE_BG_COL >> 3) << 26) | - ((CONSOLE_BG_COL >> 3) << 21) | - ((CONSOLE_BG_COL >> 3) << 16) | - ((CONSOLE_BG_COL >> 3) << 10) | - ((CONSOLE_BG_COL >> 3) << 5) | - (CONSOLE_BG_COL >> 3)); + fgx = (((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 26) | + ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 21) | + ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 16) | + ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 10) | + ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 5) | + (CONFIG_SYS_CONSOLE_FG_COL >> 3)); + bgx = (((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 26) | + ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 21) | + ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 16) | + ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 10) | + ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 5) | + (CONFIG_SYS_CONSOLE_BG_COL >> 3)); break; case GDF_16BIT_565RGB: - fgx = (((CONSOLE_FG_COL >> 3) << 27) | - ((CONSOLE_FG_COL >> 2) << 21) | - ((CONSOLE_FG_COL >> 3) << 16) | - ((CONSOLE_FG_COL >> 3) << 11) | - ((CONSOLE_FG_COL >> 2) << 5) | - (CONSOLE_FG_COL >> 3)); - bgx = (((CONSOLE_BG_COL >> 3) << 27) | - ((CONSOLE_BG_COL >> 2) << 21) | - ((CONSOLE_BG_COL >> 3) << 16) | - ((CONSOLE_BG_COL >> 3) << 11) | - ((CONSOLE_BG_COL >> 2) << 5) | - (CONSOLE_BG_COL >> 3)); + fgx = (((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 27) | + ((CONFIG_SYS_CONSOLE_FG_COL >> 2) << 21) | + ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 16) | + ((CONFIG_SYS_CONSOLE_FG_COL >> 3) << 11) | + ((CONFIG_SYS_CONSOLE_FG_COL >> 2) << 5) | + (CONFIG_SYS_CONSOLE_FG_COL >> 3)); + bgx = (((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 27) | + ((CONFIG_SYS_CONSOLE_BG_COL >> 2) << 21) | + ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 16) | + ((CONFIG_SYS_CONSOLE_BG_COL >> 3) << 11) | + ((CONFIG_SYS_CONSOLE_BG_COL >> 2) << 5) | + (CONFIG_SYS_CONSOLE_BG_COL >> 3)); break; case GDF_32BIT_X888RGB: - fgx = (CONSOLE_FG_COL << 16) | - (CONSOLE_FG_COL << 8) | - CONSOLE_FG_COL; - bgx = (CONSOLE_BG_COL << 16) | - (CONSOLE_BG_COL << 8) | - CONSOLE_BG_COL; + fgx = (CONFIG_SYS_CONSOLE_FG_COL << 16) | + (CONFIG_SYS_CONSOLE_FG_COL << 8) | + CONFIG_SYS_CONSOLE_FG_COL; + bgx = (CONFIG_SYS_CONSOLE_BG_COL << 16) | + (CONFIG_SYS_CONSOLE_BG_COL << 8) | + CONFIG_SYS_CONSOLE_BG_COL; break; case GDF_24BIT_888RGB: - fgx = (CONSOLE_FG_COL << 24) | - (CONSOLE_FG_COL << 16) | - (CONSOLE_FG_COL << 8) | - CONSOLE_FG_COL; - bgx = (CONSOLE_BG_COL << 24) | - (CONSOLE_BG_COL << 16) | - (CONSOLE_BG_COL << 8) | - CONSOLE_BG_COL; + fgx = (CONFIG_SYS_CONSOLE_FG_COL << 24) | + (CONFIG_SYS_CONSOLE_FG_COL << 16) | + (CONFIG_SYS_CONSOLE_FG_COL << 8) | + CONFIG_SYS_CONSOLE_FG_COL; + bgx = (CONFIG_SYS_CONSOLE_BG_COL << 24) | + (CONFIG_SYS_CONSOLE_BG_COL << 16) | + (CONFIG_SYS_CONSOLE_BG_COL << 8) | + CONFIG_SYS_CONSOLE_BG_COL; break; } eorx = fgx ^ bgx; @@ -2254,41 +2123,51 @@ __weak int board_video_skip(void) int drv_video_init(void) { - int skip_dev_init; struct stdio_dev console_dev; + bool have_keyboard; + bool __maybe_unused keyboard_ok = false; /* Check if video initialization should be skipped */ if (board_video_skip()) return 0; /* Init video chip - returns with framebuffer cleared */ - skip_dev_init = (video_init() == -1); + if (cfg_video_init() == -1) + return 0; if (board_cfb_skip()) return 0; +#if defined(CONFIG_VGA_AS_SINGLE_DEVICE) + have_keyboard = false; +#elif defined(CONFIG_OF_CONTROL) + have_keyboard = !fdtdec_get_config_bool(gd->fdt_blob, + "u-boot,no-keyboard"); +#else + have_keyboard = true; +#endif + if (have_keyboard) { + debug("KBD: Keyboard init ...\n"); #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE) - debug("KBD: Keyboard init ...\n"); - skip_dev_init |= (VIDEO_KBD_INIT_FCT == -1); + keyboard_ok = !(VIDEO_KBD_INIT_FCT == -1); #endif - - if (skip_dev_init) - return 0; + } /* Init vga device */ memset(&console_dev, 0, sizeof(console_dev)); strcpy(console_dev.name, "vga"); - console_dev.ext = DEV_EXT_VIDEO; /* Video extensions */ - console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM; - console_dev.putc = video_putc; /* 'putc' function */ - console_dev.puts = video_puts; /* 'puts' function */ + console_dev.flags = DEV_FLAGS_OUTPUT; + console_dev.putc = cfb_video_putc; /* 'putc' function */ + console_dev.puts = cfb_video_puts; /* 'puts' function */ #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE) - /* Also init console device */ - console_dev.flags |= DEV_FLAGS_INPUT; - console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */ - console_dev.getc = VIDEO_GETC_FCT; /* 'getc' function */ -#endif /* CONFIG_VGA_AS_SINGLE_DEVICE */ + if (have_keyboard && keyboard_ok) { + /* Also init console device */ + console_dev.flags |= DEV_FLAGS_INPUT; + console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */ + console_dev.getc = VIDEO_GETC_FCT; /* 'getc' function */ + } +#endif if (stdio_register(&console_dev) != 0) return 0;