1352d2591SJean-Christophe PLAGNIOL-VILLARD /* 2352d2591SJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2002 ELTEC Elektronik AG 3352d2591SJean-Christophe PLAGNIOL-VILLARD * Frank Gottschling <fgottschling@eltec.de> 4352d2591SJean-Christophe PLAGNIOL-VILLARD * 5352d2591SJean-Christophe PLAGNIOL-VILLARD * See file CREDITS for list of people who contributed to this 6352d2591SJean-Christophe PLAGNIOL-VILLARD * project. 7352d2591SJean-Christophe PLAGNIOL-VILLARD * 8352d2591SJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or 9352d2591SJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as 10352d2591SJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of 11352d2591SJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version. 12352d2591SJean-Christophe PLAGNIOL-VILLARD * 13352d2591SJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 14352d2591SJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 15352d2591SJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16352d2591SJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 17352d2591SJean-Christophe PLAGNIOL-VILLARD * 18352d2591SJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 19352d2591SJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 20352d2591SJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21352d2591SJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA 22352d2591SJean-Christophe PLAGNIOL-VILLARD */ 23352d2591SJean-Christophe PLAGNIOL-VILLARD 24352d2591SJean-Christophe PLAGNIOL-VILLARD /* 25352d2591SJean-Christophe PLAGNIOL-VILLARD * cfb_console.c 26352d2591SJean-Christophe PLAGNIOL-VILLARD * 27352d2591SJean-Christophe PLAGNIOL-VILLARD * Color Framebuffer Console driver for 8/15/16/24/32 bits per pixel. 28352d2591SJean-Christophe PLAGNIOL-VILLARD * 29352d2591SJean-Christophe PLAGNIOL-VILLARD * At the moment only the 8x16 font is tested and the font fore- and 30352d2591SJean-Christophe PLAGNIOL-VILLARD * background color is limited to black/white/gray colors. The Linux 31352d2591SJean-Christophe PLAGNIOL-VILLARD * logo can be placed in the upper left corner and additional board 3264e40d72SWolfgang Denk * information strings (that normally goes to serial port) can be drawn. 33352d2591SJean-Christophe PLAGNIOL-VILLARD * 34352d2591SJean-Christophe PLAGNIOL-VILLARD * The console driver can use the standard PC keyboard interface (i8042) 35352d2591SJean-Christophe PLAGNIOL-VILLARD * for character input. Character output goes to a memory mapped video 36352d2591SJean-Christophe PLAGNIOL-VILLARD * framebuffer with little or big-endian organisation. 37352d2591SJean-Christophe PLAGNIOL-VILLARD * With environment setting 'console=serial' the console i/o can be 38352d2591SJean-Christophe PLAGNIOL-VILLARD * forced to serial port. 3964e40d72SWolfgang Denk * 4064e40d72SWolfgang Denk * The driver uses graphic specific defines/parameters/functions: 4164e40d72SWolfgang Denk * 4264e40d72SWolfgang Denk * (for SMI LynxE graphic chip) 4364e40d72SWolfgang Denk * 4464e40d72SWolfgang Denk * CONFIG_VIDEO_SMI_LYNXEM - use graphic driver for SMI 710,712,810 4564e40d72SWolfgang Denk * VIDEO_FB_LITTLE_ENDIAN - framebuffer organisation default: big endian 4664e40d72SWolfgang Denk * VIDEO_HW_RECTFILL - graphic driver supports hardware rectangle fill 4764e40d72SWolfgang Denk * VIDEO_HW_BITBLT - graphic driver supports hardware bit blt 4864e40d72SWolfgang Denk * 4964e40d72SWolfgang Denk * Console Parameters are set by graphic drivers global struct: 5064e40d72SWolfgang Denk * 5164e40d72SWolfgang Denk * VIDEO_VISIBLE_COLS - x resolution 5264e40d72SWolfgang Denk * VIDEO_VISIBLE_ROWS - y resolution 5364e40d72SWolfgang Denk * VIDEO_PIXEL_SIZE - storage size in byte per pixel 5464e40d72SWolfgang Denk * VIDEO_DATA_FORMAT - graphical data format GDF 5564e40d72SWolfgang Denk * VIDEO_FB_ADRS - start of video memory 5664e40d72SWolfgang Denk * 5764e40d72SWolfgang Denk * CONFIG_I8042_KBD - AT Keyboard driver for i8042 5864e40d72SWolfgang Denk * VIDEO_KBD_INIT_FCT - init function for keyboard 5964e40d72SWolfgang Denk * VIDEO_TSTC_FCT - keyboard_tstc function 6064e40d72SWolfgang Denk * VIDEO_GETC_FCT - keyboard_getc function 6164e40d72SWolfgang Denk * 6264e40d72SWolfgang Denk * CONFIG_CONSOLE_CURSOR - on/off drawing cursor is done with 6364e40d72SWolfgang Denk * delay loop in VIDEO_TSTC_FCT (i8042) 6464e40d72SWolfgang Denk * 6564e40d72SWolfgang Denk * CONFIG_SYS_CONSOLE_BLINK_COUNT - value for delay loop - blink rate 6664e40d72SWolfgang Denk * CONFIG_CONSOLE_TIME - display time/date in upper right 6764e40d72SWolfgang Denk * corner, needs CONFIG_CMD_DATE and 6864e40d72SWolfgang Denk * CONFIG_CONSOLE_CURSOR 6964e40d72SWolfgang Denk * CONFIG_VIDEO_LOGO - display Linux Logo in upper left corner 7064e40d72SWolfgang Denk * CONFIG_VIDEO_BMP_LOGO - use bmp_logo instead of linux_logo 7164e40d72SWolfgang Denk * CONFIG_CONSOLE_EXTRA_INFO - display additional board information 7264e40d72SWolfgang Denk * strings that normaly goes to serial 7364e40d72SWolfgang Denk * port. This define requires a board 7464e40d72SWolfgang Denk * specific function: 7564e40d72SWolfgang Denk * video_drawstring (VIDEO_INFO_X, 7664e40d72SWolfgang Denk * VIDEO_INFO_Y + i*VIDEO_FONT_HEIGHT, 7764e40d72SWolfgang Denk * info); 7864e40d72SWolfgang Denk * that fills a info buffer at i=row. 7964e40d72SWolfgang Denk * s.a: board/eltec/bab7xx. 8064e40d72SWolfgang Denk * CONFIG_VGA_AS_SINGLE_DEVICE - If set the framebuffer device will be 8164e40d72SWolfgang Denk * initialized as an output only device. 8264e40d72SWolfgang Denk * The Keyboard driver will not be 8364e40d72SWolfgang Denk * set-up. This may be used, if you have 8464e40d72SWolfgang Denk * no or more than one Keyboard devices 8564e40d72SWolfgang Denk * (USB Keyboard, AT Keyboard). 8664e40d72SWolfgang Denk * 8764e40d72SWolfgang Denk * CONFIG_VIDEO_SW_CURSOR: - Draws a cursor after the last 8864e40d72SWolfgang Denk * character. No blinking is provided. 8964e40d72SWolfgang Denk * Uses the macros CURSOR_SET and 9064e40d72SWolfgang Denk * CURSOR_OFF. 9164e40d72SWolfgang Denk * 9264e40d72SWolfgang Denk * CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability 9364e40d72SWolfgang Denk * of the graphic chip. Uses the macro 9464e40d72SWolfgang Denk * CURSOR_SET. ATTENTION: If booting an 9564e40d72SWolfgang Denk * OS, the display driver must disable 9664e40d72SWolfgang Denk * the hardware register of the graphic 9764e40d72SWolfgang Denk * chip. Otherwise a blinking field is 9864e40d72SWolfgang Denk * displayed. 99352d2591SJean-Christophe PLAGNIOL-VILLARD */ 100352d2591SJean-Christophe PLAGNIOL-VILLARD 101352d2591SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 10209c2e90cSAndreas Bießmann #include <version.h> 103352d2591SJean-Christophe PLAGNIOL-VILLARD #include <malloc.h> 104352d2591SJean-Christophe PLAGNIOL-VILLARD 10564e40d72SWolfgang Denk /* 10664e40d72SWolfgang Denk * Console device defines with SMI graphic 10764e40d72SWolfgang Denk * Any other graphic must change this section 10864e40d72SWolfgang Denk */ 109352d2591SJean-Christophe PLAGNIOL-VILLARD 110352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SMI_LYNXEM 111352d2591SJean-Christophe PLAGNIOL-VILLARD 112352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 113352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 114352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 115352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 116352d2591SJean-Christophe PLAGNIOL-VILLARD 11764e40d72SWolfgang Denk /* 11864e40d72SWolfgang Denk * Defines for the CT69000 driver 11964e40d72SWolfgang Denk */ 120352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_CT69000 121352d2591SJean-Christophe PLAGNIOL-VILLARD 122352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 123352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 124352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 125352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 126352d2591SJean-Christophe PLAGNIOL-VILLARD 12764e40d72SWolfgang Denk /* 12864e40d72SWolfgang Denk * Defines for the SED13806 driver 12964e40d72SWolfgang Denk */ 130352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SED13806 131352d2591SJean-Christophe PLAGNIOL-VILLARD 132352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_TOTAL5200 133352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 134352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 135352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 136352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 137352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 138352d2591SJean-Christophe PLAGNIOL-VILLARD 13964e40d72SWolfgang Denk /* 14064e40d72SWolfgang Denk * Defines for the SED13806 driver 14164e40d72SWolfgang Denk */ 142352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SM501 143352d2591SJean-Christophe PLAGNIOL-VILLARD 144352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_HH405 145352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 146352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 147352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 148352d2591SJean-Christophe PLAGNIOL-VILLARD 14964e40d72SWolfgang Denk /* 15064e40d72SWolfgang Denk * Defines for the MB862xx driver 15164e40d72SWolfgang Denk */ 152bed53753SAnatolij Gustschin #ifdef CONFIG_VIDEO_MB862xx 153bed53753SAnatolij Gustschin 154bed53753SAnatolij Gustschin #ifdef CONFIG_VIDEO_CORALP 155bed53753SAnatolij Gustschin #define VIDEO_FB_LITTLE_ENDIAN 156bed53753SAnatolij Gustschin #endif 1575d16ca87SAnatolij Gustschin #ifdef CONFIG_VIDEO_MB862xx_ACCEL 158bed53753SAnatolij Gustschin #define VIDEO_HW_RECTFILL 159bed53753SAnatolij Gustschin #define VIDEO_HW_BITBLT 160bed53753SAnatolij Gustschin #endif 1615d16ca87SAnatolij Gustschin #endif 162bed53753SAnatolij Gustschin 16364e40d72SWolfgang Denk /* 16464e40d72SWolfgang Denk * Include video_fb.h after definitions of VIDEO_HW_RECTFILL etc. 16564e40d72SWolfgang Denk */ 166352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_fb.h> 167352d2591SJean-Christophe PLAGNIOL-VILLARD 16864e40d72SWolfgang Denk /* 16964e40d72SWolfgang Denk * some Macros 17064e40d72SWolfgang Denk */ 171352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_COLS (pGD->winSizeX) 172352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_ROWS (pGD->winSizeY) 173352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIXEL_SIZE (pGD->gdfBytesPP) 174352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_DATA_FORMAT (pGD->gdfIndex) 175352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_ADRS (pGD->frameAdrs) 176352d2591SJean-Christophe PLAGNIOL-VILLARD 17764e40d72SWolfgang Denk /* 17864e40d72SWolfgang Denk * Console device defines with i8042 keyboard controller 17964e40d72SWolfgang Denk * Any other keyboard controller must change this section 18064e40d72SWolfgang Denk */ 181352d2591SJean-Christophe PLAGNIOL-VILLARD 182352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_I8042_KBD 183352d2591SJean-Christophe PLAGNIOL-VILLARD #include <i8042.h> 184352d2591SJean-Christophe PLAGNIOL-VILLARD 185352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_KBD_INIT_FCT i8042_kbd_init() 186352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_TSTC_FCT i8042_tstc 187352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_GETC_FCT i8042_getc 188352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 189352d2591SJean-Christophe PLAGNIOL-VILLARD 19064e40d72SWolfgang Denk /* 19164e40d72SWolfgang Denk * Console device 19264e40d72SWolfgang Denk */ 193352d2591SJean-Christophe PLAGNIOL-VILLARD 194352d2591SJean-Christophe PLAGNIOL-VILLARD #include <version.h> 195352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux/types.h> 19652cb4d4fSJean-Christophe PLAGNIOL-VILLARD #include <stdio_dev.h> 197352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_font.h> 198352d2591SJean-Christophe PLAGNIOL-VILLARD 199352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_DATE) 200352d2591SJean-Christophe PLAGNIOL-VILLARD #include <rtc.h> 201352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 202352d2591SJean-Christophe PLAGNIOL-VILLARD 203352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) 204352d2591SJean-Christophe PLAGNIOL-VILLARD #include <watchdog.h> 205352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_layout.h> 2061ca298ceSMatthias Weisser 2071ca298ceSMatthias Weisser #ifdef CONFIG_SPLASH_SCREEN_ALIGN 2081ca298ceSMatthias Weisser #define BMP_ALIGN_CENTER 0x7FFF 2091ca298ceSMatthias Weisser #endif 2101ca298ceSMatthias Weisser 211352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 212352d2591SJean-Christophe PLAGNIOL-VILLARD 21364e40d72SWolfgang Denk /* 21464e40d72SWolfgang Denk * Cursor definition: 21564e40d72SWolfgang Denk * CONFIG_CONSOLE_CURSOR: Uses a timer function (see drivers/input/i8042.c) 21664e40d72SWolfgang Denk * to let the cursor blink. Uses the macros 21764e40d72SWolfgang Denk * CURSOR_OFF and CURSOR_ON. 21864e40d72SWolfgang Denk * CONFIG_VIDEO_SW_CURSOR: Draws a cursor after the last character. No 21964e40d72SWolfgang Denk * blinking is provided. Uses the macros CURSOR_SET 22064e40d72SWolfgang Denk * and CURSOR_OFF. 22164e40d72SWolfgang Denk * CONFIG_VIDEO_HW_CURSOR: Uses the hardware cursor capability of the 22264e40d72SWolfgang Denk * graphic chip. Uses the macro CURSOR_SET. 22364e40d72SWolfgang Denk * ATTENTION: If booting an OS, the display driver 22464e40d72SWolfgang Denk * must disable the hardware register of the graphic 22564e40d72SWolfgang Denk * chip. Otherwise a blinking field is displayed 22664e40d72SWolfgang Denk */ 227352d2591SJean-Christophe PLAGNIOL-VILLARD #if !defined(CONFIG_CONSOLE_CURSOR) && \ 228352d2591SJean-Christophe PLAGNIOL-VILLARD !defined(CONFIG_VIDEO_SW_CURSOR) && \ 229352d2591SJean-Christophe PLAGNIOL-VILLARD !defined(CONFIG_VIDEO_HW_CURSOR) 230352d2591SJean-Christophe PLAGNIOL-VILLARD /* no Cursor defined */ 231352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 232352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF 233352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET 234352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 235352d2591SJean-Christophe PLAGNIOL-VILLARD 236352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 237352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 23864e40d72SWolfgang Denk #error only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \ 23964e40d72SWolfgang Denk or CONFIG_VIDEO_HW_CURSOR can be defined 240352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 241352d2591SJean-Christophe PLAGNIOL-VILLARD void console_cursor(int state); 24264e40d72SWolfgang Denk 24365618636STimur Tabi #define CURSOR_ON console_cursor(1) 24465618636STimur Tabi #define CURSOR_OFF console_cursor(0) 245352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET 246352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_I8042_KBD 2477817cb20SMarcel Ziswiler #warning Cursor drawing on/off needs timer function s.a. drivers/input/i8042.c 248352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 249352d2591SJean-Christophe PLAGNIOL-VILLARD #else 250352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_TIME 251352d2591SJean-Christophe PLAGNIOL-VILLARD #error CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME 252352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 253352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_CONSOLE_CURSOR */ 254352d2591SJean-Christophe PLAGNIOL-VILLARD 255352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SW_CURSOR 256352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 25764e40d72SWolfgang Denk #error only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \ 25864e40d72SWolfgang Denk or CONFIG_VIDEO_HW_CURSOR can be defined 259352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 260352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 261352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\ 26265618636STimur Tabi console_row * VIDEO_FONT_HEIGHT, ' ') 26365618636STimur Tabi #define CURSOR_SET video_set_cursor() 264352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_SW_CURSOR */ 265352d2591SJean-Christophe PLAGNIOL-VILLARD 266352d2591SJean-Christophe PLAGNIOL-VILLARD 267352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR 268352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 26964e40d72SWolfgang Denk #error only one of CONFIG_CONSOLE_CURSOR, CONFIG_VIDEO_SW_CURSOR, \ 27064e40d72SWolfgang Denk or CONFIG_VIDEO_HW_CURSOR can be defined 271352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 272352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 273352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF 274352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET video_set_hw_cursor(console_col * VIDEO_FONT_WIDTH, \ 27565618636STimur Tabi (console_row * VIDEO_FONT_HEIGHT) + video_logo_height) 276352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_HW_CURSOR */ 277352d2591SJean-Christophe PLAGNIOL-VILLARD 278352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 279352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 280352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_logo.h> 281352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH BMP_LOGO_WIDTH 282352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT BMP_LOGO_HEIGHT 283352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET BMP_LOGO_OFFSET 284352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS BMP_LOGO_COLORS 285352d2591SJean-Christophe PLAGNIOL-VILLARD 286352d2591SJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_VIDEO_BMP_LOGO */ 287352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_WIDTH 80 288352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_HEIGHT 80 289352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_COLORS 214 290352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_LUT_OFFSET 0x20 291352d2591SJean-Christophe PLAGNIOL-VILLARD #define __initdata 292352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux_logo.h> 293352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH LINUX_LOGO_WIDTH 294352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT LINUX_LOGO_HEIGHT 295352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET LINUX_LOGO_LUT_OFFSET 296352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS LINUX_LOGO_COLORS 297352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_BMP_LOGO */ 298352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_X (VIDEO_LOGO_WIDTH) 299352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_Y (VIDEO_FONT_HEIGHT/2) 300352d2591SJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_VIDEO_LOGO */ 301352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH 0 302352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT 0 303352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_LOGO */ 304352d2591SJean-Christophe PLAGNIOL-VILLARD 305352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_COLS VIDEO_VISIBLE_COLS 306352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_ROWS VIDEO_VISIBLE_ROWS 307352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_SIZE (VIDEO_ROWS*VIDEO_COLS*VIDEO_PIXEL_SIZE) 308352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIX_BLOCKS (VIDEO_SIZE >> 2) 309352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LINE_LEN (VIDEO_COLS*VIDEO_PIXEL_SIZE) 310352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_BURST_LEN (VIDEO_COLS/8) 311352d2591SJean-Christophe PLAGNIOL-VILLARD 312352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 313be129aa7SMatthias Weisser #define CONSOLE_ROWS ((VIDEO_ROWS - video_logo_height) / VIDEO_FONT_HEIGHT) 314352d2591SJean-Christophe PLAGNIOL-VILLARD #else 315352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROWS (VIDEO_ROWS / VIDEO_FONT_HEIGHT) 316352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 317352d2591SJean-Christophe PLAGNIOL-VILLARD 318352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_COLS (VIDEO_COLS / VIDEO_FONT_WIDTH) 319352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * VIDEO_LINE_LEN) 320352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_FIRST (video_console_address) 321352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SECOND (video_console_address + CONSOLE_ROW_SIZE) 322352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_LAST (video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE) 323352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS) 324352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE) 325352d2591SJean-Christophe PLAGNIOL-VILLARD 326352d2591SJean-Christophe PLAGNIOL-VILLARD /* Macros */ 327352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 32864e40d72SWolfgang Denk #define SWAP16(x) ((((x) & 0x00ff) << 8) | \ 32964e40d72SWolfgang Denk ((x) >> 8) \ 33064e40d72SWolfgang Denk ) 33164e40d72SWolfgang Denk #define SWAP32(x) ((((x) & 0x000000ff) << 24) | \ 33264e40d72SWolfgang Denk (((x) & 0x0000ff00) << 8) | \ 33364e40d72SWolfgang Denk (((x) & 0x00ff0000) >> 8) | \ 33464e40d72SWolfgang Denk (((x) & 0xff000000) >> 24) \ 33564e40d72SWolfgang Denk ) 33664e40d72SWolfgang Denk #define SHORTSWAP32(x) ((((x) & 0x000000ff) << 8) | \ 33764e40d72SWolfgang Denk (((x) & 0x0000ff00) >> 8) | \ 33864e40d72SWolfgang Denk (((x) & 0x00ff0000) << 8) | \ 33964e40d72SWolfgang Denk (((x) & 0xff000000) >> 8) \ 34064e40d72SWolfgang Denk ) 341352d2591SJean-Christophe PLAGNIOL-VILLARD #else 342352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP16(x) (x) 343352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP32(x) (x) 344229b6dceSWolfgang Grandegger #if defined(VIDEO_FB_16BPP_WORD_SWAP) 345bed53753SAnatolij Gustschin #define SHORTSWAP32(x) (((x) >> 16) | ((x) << 16)) 346cc347801SAndrew Dyer #else 347cc347801SAndrew Dyer #define SHORTSWAP32(x) (x) 348bed53753SAnatolij Gustschin #endif 349352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 350352d2591SJean-Christophe PLAGNIOL-VILLARD 351352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO 35264e40d72SWolfgang Denk /* 35364e40d72SWolfgang Denk * setup a board string: type, speed, etc. 35464e40d72SWolfgang Denk * 35564e40d72SWolfgang Denk * line_number: location to place info string beside logo 35664e40d72SWolfgang Denk * info: buffer for info string 35764e40d72SWolfgang Denk */ 35864e40d72SWolfgang Denk extern void video_get_info_str(int line_number, char *info); 359352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 360352d2591SJean-Christophe PLAGNIOL-VILLARD 361352d2591SJean-Christophe PLAGNIOL-VILLARD /* Locals */ 362352d2591SJean-Christophe PLAGNIOL-VILLARD static GraphicDevice *pGD; /* Pointer to Graphic array */ 363352d2591SJean-Christophe PLAGNIOL-VILLARD 364352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_fb_address; /* frame buffer address */ 365352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_console_address; /* console buffer start address */ 366352d2591SJean-Christophe PLAGNIOL-VILLARD 367be129aa7SMatthias Weisser static int video_logo_height = VIDEO_LOGO_HEIGHT; 368be129aa7SMatthias Weisser 369352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_col = 0; /* cursor col */ 370352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_row = 0; /* cursor row */ 371352d2591SJean-Christophe PLAGNIOL-VILLARD 372352d2591SJean-Christophe PLAGNIOL-VILLARD static u32 eorx, fgx, bgx; /* color pats */ 373352d2591SJean-Christophe PLAGNIOL-VILLARD 374352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table8[] = { 375352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff, 376352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff, 377352d2591SJean-Christophe PLAGNIOL-VILLARD 0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff, 37864e40d72SWolfgang Denk 0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff 37964e40d72SWolfgang Denk }; 380352d2591SJean-Christophe PLAGNIOL-VILLARD 381352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table15[] = { 38264e40d72SWolfgang Denk 0x00000000, 0x00007fff, 0x7fff0000, 0x7fff7fff 38364e40d72SWolfgang Denk }; 384352d2591SJean-Christophe PLAGNIOL-VILLARD 385352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table16[] = { 38664e40d72SWolfgang Denk 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff 38764e40d72SWolfgang Denk }; 388352d2591SJean-Christophe PLAGNIOL-VILLARD 389352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table24[16][3] = { 390352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00000000, 0x00000000}, 391352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00000000, 0x00ffffff}, 392352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x0000ffff, 0xff000000}, 393352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x0000ffff, 0xffffffff}, 394352d2591SJean-Christophe PLAGNIOL-VILLARD {0x000000ff, 0xffff0000, 0x00000000}, 395352d2591SJean-Christophe PLAGNIOL-VILLARD {0x000000ff, 0xffff0000, 0x00ffffff}, 396352d2591SJean-Christophe PLAGNIOL-VILLARD {0x000000ff, 0xffffffff, 0xff000000}, 397352d2591SJean-Christophe PLAGNIOL-VILLARD {0x000000ff, 0xffffffff, 0xffffffff}, 398352d2591SJean-Christophe PLAGNIOL-VILLARD {0xffffff00, 0x00000000, 0x00000000}, 399352d2591SJean-Christophe PLAGNIOL-VILLARD {0xffffff00, 0x00000000, 0x00ffffff}, 400352d2591SJean-Christophe PLAGNIOL-VILLARD {0xffffff00, 0x0000ffff, 0xff000000}, 401352d2591SJean-Christophe PLAGNIOL-VILLARD {0xffffff00, 0x0000ffff, 0xffffffff}, 402352d2591SJean-Christophe PLAGNIOL-VILLARD {0xffffffff, 0xffff0000, 0x00000000}, 403352d2591SJean-Christophe PLAGNIOL-VILLARD {0xffffffff, 0xffff0000, 0x00ffffff}, 404352d2591SJean-Christophe PLAGNIOL-VILLARD {0xffffffff, 0xffffffff, 0xff000000}, 40564e40d72SWolfgang Denk {0xffffffff, 0xffffffff, 0xffffffff} 40664e40d72SWolfgang Denk }; 407352d2591SJean-Christophe PLAGNIOL-VILLARD 408352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table32[16][4] = { 409352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00000000, 0x00000000, 0x00000000}, 410352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00000000, 0x00000000, 0x00ffffff}, 411352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00000000, 0x00ffffff, 0x00000000}, 412352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00000000, 0x00ffffff, 0x00ffffff}, 413352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00ffffff, 0x00000000, 0x00000000}, 414352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff}, 415352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00ffffff, 0x00ffffff, 0x00000000}, 416352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00000000, 0x00ffffff, 0x00ffffff, 0x00ffffff}, 417352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00ffffff, 0x00000000, 0x00000000, 0x00000000}, 418352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00ffffff, 0x00000000, 0x00000000, 0x00ffffff}, 419352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000}, 420352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00ffffff, 0x00000000, 0x00ffffff, 0x00ffffff}, 421352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00ffffff, 0x00ffffff, 0x00000000, 0x00000000}, 422352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00ffffff, 0x00ffffff, 0x00000000, 0x00ffffff}, 423352d2591SJean-Christophe PLAGNIOL-VILLARD {0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00000000}, 42464e40d72SWolfgang Denk {0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff} 42564e40d72SWolfgang Denk }; 426352d2591SJean-Christophe PLAGNIOL-VILLARD 427352d2591SJean-Christophe PLAGNIOL-VILLARD 428352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_drawchars(int xx, int yy, unsigned char *s, int count) 429352d2591SJean-Christophe PLAGNIOL-VILLARD { 430352d2591SJean-Christophe PLAGNIOL-VILLARD u8 *cdat, *dest, *dest0; 431352d2591SJean-Christophe PLAGNIOL-VILLARD int rows, offset, c; 432352d2591SJean-Christophe PLAGNIOL-VILLARD 433352d2591SJean-Christophe PLAGNIOL-VILLARD offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE; 434352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 = video_fb_address + offset; 435352d2591SJean-Christophe PLAGNIOL-VILLARD 436352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 437352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 438352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 439352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 440352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 441352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 442352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 44364e40d72SWolfgang Denk rows--; dest += VIDEO_LINE_LEN) { 444352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 445352d2591SJean-Christophe PLAGNIOL-VILLARD 44664e40d72SWolfgang Denk ((u32 *) dest)[0] = 44764e40d72SWolfgang Denk (video_font_draw_table8[bits >> 4] & 44864e40d72SWolfgang Denk eorx) ^ bgx; 44964e40d72SWolfgang Denk ((u32 *) dest)[1] = 45064e40d72SWolfgang Denk (video_font_draw_table8[bits & 15] & 45164e40d72SWolfgang Denk eorx) ^ bgx; 452352d2591SJean-Christophe PLAGNIOL-VILLARD } 453352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 454352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 455352d2591SJean-Christophe PLAGNIOL-VILLARD } 456352d2591SJean-Christophe PLAGNIOL-VILLARD break; 457352d2591SJean-Christophe PLAGNIOL-VILLARD 458352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 459352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 460352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 461352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 462352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 46364e40d72SWolfgang Denk rows--; dest += VIDEO_LINE_LEN) { 464352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 465352d2591SJean-Christophe PLAGNIOL-VILLARD 46664e40d72SWolfgang Denk ((u32 *) dest)[0] = 46764e40d72SWolfgang Denk SHORTSWAP32((video_font_draw_table15 46864e40d72SWolfgang Denk [bits >> 6] & eorx) ^ 46964e40d72SWolfgang Denk bgx); 47064e40d72SWolfgang Denk ((u32 *) dest)[1] = 47164e40d72SWolfgang Denk SHORTSWAP32((video_font_draw_table15 47264e40d72SWolfgang Denk [bits >> 4 & 3] & eorx) ^ 47364e40d72SWolfgang Denk bgx); 47464e40d72SWolfgang Denk ((u32 *) dest)[2] = 47564e40d72SWolfgang Denk SHORTSWAP32((video_font_draw_table15 47664e40d72SWolfgang Denk [bits >> 2 & 3] & eorx) ^ 47764e40d72SWolfgang Denk bgx); 47864e40d72SWolfgang Denk ((u32 *) dest)[3] = 47964e40d72SWolfgang Denk SHORTSWAP32((video_font_draw_table15 48064e40d72SWolfgang Denk [bits & 3] & eorx) ^ 48164e40d72SWolfgang Denk bgx); 482352d2591SJean-Christophe PLAGNIOL-VILLARD } 483352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 484352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 485352d2591SJean-Christophe PLAGNIOL-VILLARD } 486352d2591SJean-Christophe PLAGNIOL-VILLARD break; 487352d2591SJean-Christophe PLAGNIOL-VILLARD 488352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 489352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 490352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 491352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 492352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 49364e40d72SWolfgang Denk rows--; dest += VIDEO_LINE_LEN) { 494352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 495352d2591SJean-Christophe PLAGNIOL-VILLARD 49664e40d72SWolfgang Denk ((u32 *) dest)[0] = 49764e40d72SWolfgang Denk SHORTSWAP32((video_font_draw_table16 49864e40d72SWolfgang Denk [bits >> 6] & eorx) ^ 49964e40d72SWolfgang Denk bgx); 50064e40d72SWolfgang Denk ((u32 *) dest)[1] = 50164e40d72SWolfgang Denk SHORTSWAP32((video_font_draw_table16 50264e40d72SWolfgang Denk [bits >> 4 & 3] & eorx) ^ 50364e40d72SWolfgang Denk bgx); 50464e40d72SWolfgang Denk ((u32 *) dest)[2] = 50564e40d72SWolfgang Denk SHORTSWAP32((video_font_draw_table16 50664e40d72SWolfgang Denk [bits >> 2 & 3] & eorx) ^ 50764e40d72SWolfgang Denk bgx); 50864e40d72SWolfgang Denk ((u32 *) dest)[3] = 50964e40d72SWolfgang Denk SHORTSWAP32((video_font_draw_table16 51064e40d72SWolfgang Denk [bits & 3] & eorx) ^ 51164e40d72SWolfgang Denk bgx); 512352d2591SJean-Christophe PLAGNIOL-VILLARD } 513352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 514352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 515352d2591SJean-Christophe PLAGNIOL-VILLARD } 516352d2591SJean-Christophe PLAGNIOL-VILLARD break; 517352d2591SJean-Christophe PLAGNIOL-VILLARD 518352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 519352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 520352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 521352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 522352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 52364e40d72SWolfgang Denk rows--; dest += VIDEO_LINE_LEN) { 524352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 525352d2591SJean-Christophe PLAGNIOL-VILLARD 52664e40d72SWolfgang Denk ((u32 *) dest)[0] = 52764e40d72SWolfgang Denk SWAP32((video_font_draw_table32 52864e40d72SWolfgang Denk [bits >> 4][0] & eorx) ^ bgx); 52964e40d72SWolfgang Denk ((u32 *) dest)[1] = 53064e40d72SWolfgang Denk SWAP32((video_font_draw_table32 53164e40d72SWolfgang Denk [bits >> 4][1] & eorx) ^ bgx); 53264e40d72SWolfgang Denk ((u32 *) dest)[2] = 53364e40d72SWolfgang Denk SWAP32((video_font_draw_table32 53464e40d72SWolfgang Denk [bits >> 4][2] & eorx) ^ bgx); 53564e40d72SWolfgang Denk ((u32 *) dest)[3] = 53664e40d72SWolfgang Denk SWAP32((video_font_draw_table32 53764e40d72SWolfgang Denk [bits >> 4][3] & eorx) ^ bgx); 53864e40d72SWolfgang Denk ((u32 *) dest)[4] = 53964e40d72SWolfgang Denk SWAP32((video_font_draw_table32 54064e40d72SWolfgang Denk [bits & 15][0] & eorx) ^ bgx); 54164e40d72SWolfgang Denk ((u32 *) dest)[5] = 54264e40d72SWolfgang Denk SWAP32((video_font_draw_table32 54364e40d72SWolfgang Denk [bits & 15][1] & eorx) ^ bgx); 54464e40d72SWolfgang Denk ((u32 *) dest)[6] = 54564e40d72SWolfgang Denk SWAP32((video_font_draw_table32 54664e40d72SWolfgang Denk [bits & 15][2] & eorx) ^ bgx); 54764e40d72SWolfgang Denk ((u32 *) dest)[7] = 54864e40d72SWolfgang Denk SWAP32((video_font_draw_table32 54964e40d72SWolfgang Denk [bits & 15][3] & eorx) ^ bgx); 550352d2591SJean-Christophe PLAGNIOL-VILLARD } 551352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 552352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 553352d2591SJean-Christophe PLAGNIOL-VILLARD } 554352d2591SJean-Christophe PLAGNIOL-VILLARD break; 555352d2591SJean-Christophe PLAGNIOL-VILLARD 556352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 557352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 558352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 559352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 560352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 56164e40d72SWolfgang Denk rows--; dest += VIDEO_LINE_LEN) { 562352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 563352d2591SJean-Christophe PLAGNIOL-VILLARD 56464e40d72SWolfgang Denk ((u32 *) dest)[0] = 56564e40d72SWolfgang Denk (video_font_draw_table24[bits >> 4][0] 56664e40d72SWolfgang Denk & eorx) ^ bgx; 56764e40d72SWolfgang Denk ((u32 *) dest)[1] = 56864e40d72SWolfgang Denk (video_font_draw_table24[bits >> 4][1] 56964e40d72SWolfgang Denk & eorx) ^ bgx; 57064e40d72SWolfgang Denk ((u32 *) dest)[2] = 57164e40d72SWolfgang Denk (video_font_draw_table24[bits >> 4][2] 57264e40d72SWolfgang Denk & eorx) ^ bgx; 57364e40d72SWolfgang Denk ((u32 *) dest)[3] = 57464e40d72SWolfgang Denk (video_font_draw_table24[bits & 15][0] 57564e40d72SWolfgang Denk & eorx) ^ bgx; 57664e40d72SWolfgang Denk ((u32 *) dest)[4] = 57764e40d72SWolfgang Denk (video_font_draw_table24[bits & 15][1] 57864e40d72SWolfgang Denk & eorx) ^ bgx; 57964e40d72SWolfgang Denk ((u32 *) dest)[5] = 58064e40d72SWolfgang Denk (video_font_draw_table24[bits & 15][2] 58164e40d72SWolfgang Denk & eorx) ^ bgx; 582352d2591SJean-Christophe PLAGNIOL-VILLARD } 583352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 584352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 585352d2591SJean-Christophe PLAGNIOL-VILLARD } 586352d2591SJean-Christophe PLAGNIOL-VILLARD break; 587352d2591SJean-Christophe PLAGNIOL-VILLARD } 588352d2591SJean-Christophe PLAGNIOL-VILLARD } 589352d2591SJean-Christophe PLAGNIOL-VILLARD 590352d2591SJean-Christophe PLAGNIOL-VILLARD static inline void video_drawstring(int xx, int yy, unsigned char *s) 591352d2591SJean-Christophe PLAGNIOL-VILLARD { 592352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawchars(xx, yy, s, strlen((char *) s)); 593352d2591SJean-Christophe PLAGNIOL-VILLARD } 594352d2591SJean-Christophe PLAGNIOL-VILLARD 595352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_putchar(int xx, int yy, unsigned char c) 596352d2591SJean-Christophe PLAGNIOL-VILLARD { 597be129aa7SMatthias Weisser video_drawchars(xx, yy + video_logo_height, &c, 1); 598352d2591SJean-Christophe PLAGNIOL-VILLARD } 599352d2591SJean-Christophe PLAGNIOL-VILLARD 600352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR) 601352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_set_cursor(void) 602352d2591SJean-Christophe PLAGNIOL-VILLARD { 603352d2591SJean-Christophe PLAGNIOL-VILLARD /* swap drawing colors */ 604352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx; 605352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = bgx; 606352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = eorx; 607352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 608352d2591SJean-Christophe PLAGNIOL-VILLARD /* draw cursor */ 609352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar(console_col * VIDEO_FONT_WIDTH, 61064e40d72SWolfgang Denk console_row * VIDEO_FONT_HEIGHT, ' '); 611352d2591SJean-Christophe PLAGNIOL-VILLARD /* restore drawing colors */ 612352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx; 613352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = bgx; 614352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = eorx; 615352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 616352d2591SJean-Christophe PLAGNIOL-VILLARD } 617352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 61864e40d72SWolfgang Denk 619352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 620352d2591SJean-Christophe PLAGNIOL-VILLARD void console_cursor(int state) 621352d2591SJean-Christophe PLAGNIOL-VILLARD { 622352d2591SJean-Christophe PLAGNIOL-VILLARD static int last_state = 0; 623352d2591SJean-Christophe PLAGNIOL-VILLARD 624352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_TIME 625352d2591SJean-Christophe PLAGNIOL-VILLARD struct rtc_time tm; 626352d2591SJean-Christophe PLAGNIOL-VILLARD char info[16]; 627352d2591SJean-Christophe PLAGNIOL-VILLARD 628352d2591SJean-Christophe PLAGNIOL-VILLARD /* time update only if cursor is on (faster scroll) */ 629352d2591SJean-Christophe PLAGNIOL-VILLARD if (state) { 630352d2591SJean-Christophe PLAGNIOL-VILLARD rtc_get(&tm); 631352d2591SJean-Christophe PLAGNIOL-VILLARD 632352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf(info, " %02d:%02d:%02d ", tm.tm_hour, tm.tm_min, 633352d2591SJean-Christophe PLAGNIOL-VILLARD tm.tm_sec); 634352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring(VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, 635352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y, (uchar *) info); 636352d2591SJean-Christophe PLAGNIOL-VILLARD 637352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf(info, "%02d.%02d.%04d", tm.tm_mday, tm.tm_mon, 638352d2591SJean-Christophe PLAGNIOL-VILLARD tm.tm_year); 639352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring(VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, 64064e40d72SWolfgang Denk VIDEO_INFO_Y + 1 * VIDEO_FONT_HEIGHT, 64164e40d72SWolfgang Denk (uchar *) info); 642352d2591SJean-Christophe PLAGNIOL-VILLARD } 643352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 644352d2591SJean-Christophe PLAGNIOL-VILLARD 645352d2591SJean-Christophe PLAGNIOL-VILLARD if (state && (last_state != state)) { 646352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_cursor(); 647352d2591SJean-Christophe PLAGNIOL-VILLARD } 648352d2591SJean-Christophe PLAGNIOL-VILLARD 649352d2591SJean-Christophe PLAGNIOL-VILLARD if (!state && (last_state != state)) { 650352d2591SJean-Christophe PLAGNIOL-VILLARD /* clear cursor */ 651352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar(console_col * VIDEO_FONT_WIDTH, 65264e40d72SWolfgang Denk console_row * VIDEO_FONT_HEIGHT, ' '); 653352d2591SJean-Christophe PLAGNIOL-VILLARD } 654352d2591SJean-Christophe PLAGNIOL-VILLARD 655352d2591SJean-Christophe PLAGNIOL-VILLARD last_state = state; 656352d2591SJean-Christophe PLAGNIOL-VILLARD } 657352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 658352d2591SJean-Christophe PLAGNIOL-VILLARD 659352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_RECTFILL 660352d2591SJean-Christophe PLAGNIOL-VILLARD static void memsetl(int *p, int c, int v) 661352d2591SJean-Christophe PLAGNIOL-VILLARD { 662352d2591SJean-Christophe PLAGNIOL-VILLARD while (c--) 663352d2591SJean-Christophe PLAGNIOL-VILLARD *(p++) = v; 664352d2591SJean-Christophe PLAGNIOL-VILLARD } 665352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 666352d2591SJean-Christophe PLAGNIOL-VILLARD 667352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_BITBLT 668352d2591SJean-Christophe PLAGNIOL-VILLARD static void memcpyl(int *d, int *s, int c) 669352d2591SJean-Christophe PLAGNIOL-VILLARD { 670352d2591SJean-Christophe PLAGNIOL-VILLARD while (c--) 671352d2591SJean-Christophe PLAGNIOL-VILLARD *(d++) = *(s++); 672352d2591SJean-Christophe PLAGNIOL-VILLARD } 673352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 674352d2591SJean-Christophe PLAGNIOL-VILLARD 675352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_scrollup(void) 676352d2591SJean-Christophe PLAGNIOL-VILLARD { 677352d2591SJean-Christophe PLAGNIOL-VILLARD /* copy up rows ignoring the first one */ 678352d2591SJean-Christophe PLAGNIOL-VILLARD 679352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_BITBLT 680352d2591SJean-Christophe PLAGNIOL-VILLARD video_hw_bitblt(VIDEO_PIXEL_SIZE, /* bytes per pixel */ 681352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* source pos x */ 68264e40d72SWolfgang Denk video_logo_height + 68364e40d72SWolfgang Denk VIDEO_FONT_HEIGHT, /* source pos y */ 684352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* dest pos x */ 685be129aa7SMatthias Weisser video_logo_height, /* dest pos y */ 686352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS, /* frame width */ 68764e40d72SWolfgang Denk VIDEO_VISIBLE_ROWS 68864e40d72SWolfgang Denk - video_logo_height 68964e40d72SWolfgang Denk - VIDEO_FONT_HEIGHT /* frame height */ 690352d2591SJean-Christophe PLAGNIOL-VILLARD ); 691352d2591SJean-Christophe PLAGNIOL-VILLARD #else 692352d2591SJean-Christophe PLAGNIOL-VILLARD memcpyl(CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND, 693352d2591SJean-Christophe PLAGNIOL-VILLARD CONSOLE_SCROLL_SIZE >> 2); 694352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 695352d2591SJean-Christophe PLAGNIOL-VILLARD 696352d2591SJean-Christophe PLAGNIOL-VILLARD /* clear the last one */ 697352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_RECTFILL 698352d2591SJean-Christophe PLAGNIOL-VILLARD video_hw_rectfill(VIDEO_PIXEL_SIZE, /* bytes per pixel */ 699352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* dest pos x */ 70064e40d72SWolfgang Denk VIDEO_VISIBLE_ROWS 70164e40d72SWolfgang Denk - VIDEO_FONT_HEIGHT, /* dest pos y */ 702352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS, /* frame width */ 703352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_FONT_HEIGHT, /* frame height */ 704352d2591SJean-Christophe PLAGNIOL-VILLARD CONSOLE_BG_COL /* fill color */ 705352d2591SJean-Christophe PLAGNIOL-VILLARD ); 706352d2591SJean-Christophe PLAGNIOL-VILLARD #else 707352d2591SJean-Christophe PLAGNIOL-VILLARD memsetl(CONSOLE_ROW_LAST, CONSOLE_ROW_SIZE >> 2, CONSOLE_BG_COL); 708352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 709352d2591SJean-Christophe PLAGNIOL-VILLARD } 710352d2591SJean-Christophe PLAGNIOL-VILLARD 711352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_back(void) 712352d2591SJean-Christophe PLAGNIOL-VILLARD { 71365618636STimur Tabi CURSOR_OFF; 71465618636STimur Tabi console_col--; 715352d2591SJean-Christophe PLAGNIOL-VILLARD 716352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_col < 0) { 717352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = CONSOLE_COLS - 1; 718352d2591SJean-Christophe PLAGNIOL-VILLARD console_row--; 719352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_row < 0) 720352d2591SJean-Christophe PLAGNIOL-VILLARD console_row = 0; 721352d2591SJean-Christophe PLAGNIOL-VILLARD } 722352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar(console_col * VIDEO_FONT_WIDTH, 72364e40d72SWolfgang Denk console_row * VIDEO_FONT_HEIGHT, ' '); 724352d2591SJean-Christophe PLAGNIOL-VILLARD } 725352d2591SJean-Christophe PLAGNIOL-VILLARD 726352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_newline(void) 727352d2591SJean-Christophe PLAGNIOL-VILLARD { 72820c450efSAnatolij Gustschin /* Check if last character in the line was just drawn. If so, cursor was 72920c450efSAnatolij Gustschin overwriten and need not to be cleared. Cursor clearing without this 73020c450efSAnatolij Gustschin check causes overwriting the 1st character of the line if line lenght 73120c450efSAnatolij Gustschin is >= CONSOLE_COLS 73220c450efSAnatolij Gustschin */ 73320c450efSAnatolij Gustschin if (console_col < CONSOLE_COLS) 73465618636STimur Tabi CURSOR_OFF; 73520c450efSAnatolij Gustschin console_row++; 736352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = 0; 737352d2591SJean-Christophe PLAGNIOL-VILLARD 738352d2591SJean-Christophe PLAGNIOL-VILLARD /* Check if we need to scroll the terminal */ 739352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_row >= CONSOLE_ROWS) { 740352d2591SJean-Christophe PLAGNIOL-VILLARD /* Scroll everything up */ 741352d2591SJean-Christophe PLAGNIOL-VILLARD console_scrollup(); 742352d2591SJean-Christophe PLAGNIOL-VILLARD 743352d2591SJean-Christophe PLAGNIOL-VILLARD /* Decrement row number */ 744352d2591SJean-Christophe PLAGNIOL-VILLARD console_row--; 745352d2591SJean-Christophe PLAGNIOL-VILLARD } 746352d2591SJean-Christophe PLAGNIOL-VILLARD } 747352d2591SJean-Christophe PLAGNIOL-VILLARD 74820c450efSAnatolij Gustschin static void console_cr(void) 74920c450efSAnatolij Gustschin { 75065618636STimur Tabi CURSOR_OFF; 75165618636STimur Tabi console_col = 0; 75220c450efSAnatolij Gustschin } 75320c450efSAnatolij Gustschin 754352d2591SJean-Christophe PLAGNIOL-VILLARD void video_putc(const char c) 755352d2591SJean-Christophe PLAGNIOL-VILLARD { 75620c450efSAnatolij Gustschin static int nl = 1; 75720c450efSAnatolij Gustschin 758352d2591SJean-Christophe PLAGNIOL-VILLARD switch (c) { 75920c450efSAnatolij Gustschin case 13: /* back to first column */ 76020c450efSAnatolij Gustschin console_cr(); 761352d2591SJean-Christophe PLAGNIOL-VILLARD break; 762352d2591SJean-Christophe PLAGNIOL-VILLARD 763352d2591SJean-Christophe PLAGNIOL-VILLARD case '\n': /* next line */ 76420c450efSAnatolij Gustschin if (console_col || (!console_col && nl)) 765352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline(); 76620c450efSAnatolij Gustschin nl = 1; 767352d2591SJean-Christophe PLAGNIOL-VILLARD break; 768352d2591SJean-Christophe PLAGNIOL-VILLARD 769352d2591SJean-Christophe PLAGNIOL-VILLARD case 9: /* tab 8 */ 77065618636STimur Tabi CURSOR_OFF; 77165618636STimur Tabi console_col |= 0x0008; 772352d2591SJean-Christophe PLAGNIOL-VILLARD console_col &= ~0x0007; 773352d2591SJean-Christophe PLAGNIOL-VILLARD 774352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_col >= CONSOLE_COLS) 775352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline(); 776352d2591SJean-Christophe PLAGNIOL-VILLARD break; 777352d2591SJean-Christophe PLAGNIOL-VILLARD 778352d2591SJean-Christophe PLAGNIOL-VILLARD case 8: /* backspace */ 779352d2591SJean-Christophe PLAGNIOL-VILLARD console_back(); 780352d2591SJean-Christophe PLAGNIOL-VILLARD break; 781352d2591SJean-Christophe PLAGNIOL-VILLARD 782352d2591SJean-Christophe PLAGNIOL-VILLARD default: /* draw the char */ 783352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar(console_col * VIDEO_FONT_WIDTH, 78464e40d72SWolfgang Denk console_row * VIDEO_FONT_HEIGHT, c); 785352d2591SJean-Christophe PLAGNIOL-VILLARD console_col++; 786352d2591SJean-Christophe PLAGNIOL-VILLARD 787352d2591SJean-Christophe PLAGNIOL-VILLARD /* check for newline */ 78820c450efSAnatolij Gustschin if (console_col >= CONSOLE_COLS) { 789352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline(); 79020c450efSAnatolij Gustschin nl = 0; 79120c450efSAnatolij Gustschin } 792352d2591SJean-Christophe PLAGNIOL-VILLARD } 79365618636STimur Tabi CURSOR_SET; 79465618636STimur Tabi } 795352d2591SJean-Christophe PLAGNIOL-VILLARD 796352d2591SJean-Christophe PLAGNIOL-VILLARD void video_puts(const char *s) 797352d2591SJean-Christophe PLAGNIOL-VILLARD { 798352d2591SJean-Christophe PLAGNIOL-VILLARD int count = strlen(s); 799352d2591SJean-Christophe PLAGNIOL-VILLARD 800352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) 801352d2591SJean-Christophe PLAGNIOL-VILLARD video_putc(*s++); 802352d2591SJean-Christophe PLAGNIOL-VILLARD } 803352d2591SJean-Christophe PLAGNIOL-VILLARD 80410543820SAnatolij Gustschin /* 80510543820SAnatolij Gustschin * Do not enforce drivers (or board code) to provide empty 80610543820SAnatolij Gustschin * video_set_lut() if they do not support 8 bpp format. 80710543820SAnatolij Gustschin * Implement weak default function instead. 80810543820SAnatolij Gustschin */ 80910543820SAnatolij Gustschin void __video_set_lut(unsigned int index, unsigned char r, 81010543820SAnatolij Gustschin unsigned char g, unsigned char b) 81110543820SAnatolij Gustschin { 81210543820SAnatolij Gustschin } 81364e40d72SWolfgang Denk 81410543820SAnatolij Gustschin void video_set_lut(unsigned int, unsigned char, unsigned char, unsigned char) 81510543820SAnatolij Gustschin __attribute__ ((weak, alias("__video_set_lut"))); 81610543820SAnatolij Gustschin 817352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) 818352d2591SJean-Christophe PLAGNIOL-VILLARD 819352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_8BIT_332RGB(r,g,b) { \ 820352d2591SJean-Christophe PLAGNIOL-VILLARD *fb = ((r>>5)<<5) | ((g>>5)<<2) | (b>>6); \ 821352d2591SJean-Christophe PLAGNIOL-VILLARD fb ++; \ 822352d2591SJean-Christophe PLAGNIOL-VILLARD } 823352d2591SJean-Christophe PLAGNIOL-VILLARD 824352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_15BIT_555RGB(r,g,b) { \ 82564e40d72SWolfgang Denk *(unsigned short *)fb = \ 82664e40d72SWolfgang Denk SWAP16((unsigned short)(((r>>3)<<10) | \ 82764e40d72SWolfgang Denk ((g>>3)<<5) | \ 82864e40d72SWolfgang Denk (b>>3))); \ 829352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 2; \ 830352d2591SJean-Christophe PLAGNIOL-VILLARD } 831352d2591SJean-Christophe PLAGNIOL-VILLARD 832352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_16BIT_565RGB(r,g,b) { \ 83364e40d72SWolfgang Denk *(unsigned short *)fb = \ 83464e40d72SWolfgang Denk SWAP16((unsigned short)((((r)>>3)<<11)| \ 83564e40d72SWolfgang Denk (((g)>>2)<<5) | \ 83664e40d72SWolfgang Denk ((b)>>3))); \ 837352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 2; \ 838352d2591SJean-Christophe PLAGNIOL-VILLARD } 839352d2591SJean-Christophe PLAGNIOL-VILLARD 840352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_32BIT_X888RGB(r,g,b) { \ 84164e40d72SWolfgang Denk *(unsigned long *)fb = \ 84264e40d72SWolfgang Denk SWAP32((unsigned long)(((r<<16) | \ 84364e40d72SWolfgang Denk (g<<8) | \ 84464e40d72SWolfgang Denk b))); \ 845352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 4; \ 846352d2591SJean-Christophe PLAGNIOL-VILLARD } 847352d2591SJean-Christophe PLAGNIOL-VILLARD 848352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 849352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) { \ 850352d2591SJean-Christophe PLAGNIOL-VILLARD fb[0] = b; \ 851352d2591SJean-Christophe PLAGNIOL-VILLARD fb[1] = g; \ 852352d2591SJean-Christophe PLAGNIOL-VILLARD fb[2] = r; \ 853352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 3; \ 854352d2591SJean-Christophe PLAGNIOL-VILLARD } 855352d2591SJean-Christophe PLAGNIOL-VILLARD #else 856352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) { \ 857352d2591SJean-Christophe PLAGNIOL-VILLARD fb[0] = r; \ 858352d2591SJean-Christophe PLAGNIOL-VILLARD fb[1] = g; \ 859352d2591SJean-Christophe PLAGNIOL-VILLARD fb[2] = b; \ 860352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 3; \ 861352d2591SJean-Christophe PLAGNIOL-VILLARD } 862352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 863352d2591SJean-Christophe PLAGNIOL-VILLARD 864e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 86564e40d72SWolfgang Denk static inline void fill_555rgb_pswap(uchar *fb, int x, u8 r, u8 g, u8 b) 866e84d568fSAnatolij Gustschin { 867e84d568fSAnatolij Gustschin ushort *dst = (ushort *) fb; 868e84d568fSAnatolij Gustschin ushort color = (ushort) (((r >> 3) << 10) | 869e84d568fSAnatolij Gustschin ((g >> 3) << 5) | 870e84d568fSAnatolij Gustschin (b >> 3)); 871e84d568fSAnatolij Gustschin if (x & 1) 872e84d568fSAnatolij Gustschin *(--dst) = color; 873e84d568fSAnatolij Gustschin else 874e84d568fSAnatolij Gustschin *(++dst) = color; 875e84d568fSAnatolij Gustschin } 876e84d568fSAnatolij Gustschin #endif 877352d2591SJean-Christophe PLAGNIOL-VILLARD 878352d2591SJean-Christophe PLAGNIOL-VILLARD /* 879d5011762SAnatolij Gustschin * RLE8 bitmap support 880d5011762SAnatolij Gustschin */ 881d5011762SAnatolij Gustschin 882d5011762SAnatolij Gustschin #ifdef CONFIG_VIDEO_BMP_RLE8 883d5011762SAnatolij Gustschin /* Pre-calculated color table entry */ 884d5011762SAnatolij Gustschin struct palette { 885d5011762SAnatolij Gustschin union { 886d5011762SAnatolij Gustschin unsigned short w; /* word */ 887d5011762SAnatolij Gustschin unsigned int dw; /* double word */ 888d5011762SAnatolij Gustschin } ce; /* color entry */ 889d5011762SAnatolij Gustschin }; 890d5011762SAnatolij Gustschin 891d5011762SAnatolij Gustschin /* 892d5011762SAnatolij Gustschin * Helper to draw encoded/unencoded run. 893d5011762SAnatolij Gustschin */ 894d5011762SAnatolij Gustschin static void draw_bitmap(uchar **fb, uchar *bm, struct palette *p, 895d5011762SAnatolij Gustschin int cnt, int enc) 896d5011762SAnatolij Gustschin { 897d5011762SAnatolij Gustschin ulong addr = (ulong) *fb; 898d5011762SAnatolij Gustschin int *off; 899d5011762SAnatolij Gustschin int enc_off = 1; 900d5011762SAnatolij Gustschin int i; 901d5011762SAnatolij Gustschin 902d5011762SAnatolij Gustschin /* 903d5011762SAnatolij Gustschin * Setup offset of the color index in the bitmap. 904d5011762SAnatolij Gustschin * Color index of encoded run is at offset 1. 905d5011762SAnatolij Gustschin */ 906d5011762SAnatolij Gustschin off = enc ? &enc_off : &i; 907d5011762SAnatolij Gustschin 908d5011762SAnatolij Gustschin switch (VIDEO_DATA_FORMAT) { 909d5011762SAnatolij Gustschin case GDF__8BIT_INDEX: 910d5011762SAnatolij Gustschin for (i = 0; i < cnt; i++) 911d5011762SAnatolij Gustschin *(unsigned char *) addr++ = bm[*off]; 912d5011762SAnatolij Gustschin break; 913d5011762SAnatolij Gustschin case GDF_15BIT_555RGB: 914d5011762SAnatolij Gustschin case GDF_16BIT_565RGB: 915d5011762SAnatolij Gustschin /* differences handled while pre-calculating palette */ 916d5011762SAnatolij Gustschin for (i = 0; i < cnt; i++) { 917d5011762SAnatolij Gustschin *(unsigned short *) addr = p[bm[*off]].ce.w; 918d5011762SAnatolij Gustschin addr += 2; 919d5011762SAnatolij Gustschin } 920d5011762SAnatolij Gustschin break; 921d5011762SAnatolij Gustschin case GDF_32BIT_X888RGB: 922d5011762SAnatolij Gustschin for (i = 0; i < cnt; i++) { 923d5011762SAnatolij Gustschin *(unsigned long *) addr = p[bm[*off]].ce.dw; 924d5011762SAnatolij Gustschin addr += 4; 925d5011762SAnatolij Gustschin } 926d5011762SAnatolij Gustschin break; 927d5011762SAnatolij Gustschin } 928d5011762SAnatolij Gustschin *fb = (uchar *) addr; /* return modified address */ 929d5011762SAnatolij Gustschin } 930d5011762SAnatolij Gustschin 931d5011762SAnatolij Gustschin static int display_rle8_bitmap(bmp_image_t *img, int xoff, int yoff, 932d5011762SAnatolij Gustschin int width, int height) 933d5011762SAnatolij Gustschin { 934d5011762SAnatolij Gustschin unsigned char *bm; 935d5011762SAnatolij Gustschin unsigned char *fbp; 936d5011762SAnatolij Gustschin unsigned int cnt, runlen; 937d5011762SAnatolij Gustschin int decode = 1; 938d5011762SAnatolij Gustschin int x, y, bpp, i, ncolors; 939d5011762SAnatolij Gustschin struct palette p[256]; 940d5011762SAnatolij Gustschin bmp_color_table_entry_t cte; 941d5011762SAnatolij Gustschin int green_shift, red_off; 94274446b63SAnatolij Gustschin int limit = VIDEO_COLS * VIDEO_ROWS; 94374446b63SAnatolij Gustschin int pixels = 0; 944d5011762SAnatolij Gustschin 945d5011762SAnatolij Gustschin x = 0; 946d5011762SAnatolij Gustschin y = __le32_to_cpu(img->header.height) - 1; 947d5011762SAnatolij Gustschin ncolors = __le32_to_cpu(img->header.colors_used); 948d5011762SAnatolij Gustschin bpp = VIDEO_PIXEL_SIZE; 949d5011762SAnatolij Gustschin fbp = (unsigned char *) ((unsigned int) video_fb_address + 950d5011762SAnatolij Gustschin (((y + yoff) * VIDEO_COLS) + xoff) * bpp); 951d5011762SAnatolij Gustschin 952d5011762SAnatolij Gustschin bm = (uchar *) img + __le32_to_cpu(img->header.data_offset); 953d5011762SAnatolij Gustschin 954d5011762SAnatolij Gustschin /* pre-calculate and setup palette */ 955d5011762SAnatolij Gustschin switch (VIDEO_DATA_FORMAT) { 956d5011762SAnatolij Gustschin case GDF__8BIT_INDEX: 957d5011762SAnatolij Gustschin for (i = 0; i < ncolors; i++) { 958d5011762SAnatolij Gustschin cte = img->color_table[i]; 959d5011762SAnatolij Gustschin video_set_lut(i, cte.red, cte.green, cte.blue); 960d5011762SAnatolij Gustschin } 961d5011762SAnatolij Gustschin break; 962d5011762SAnatolij Gustschin case GDF_15BIT_555RGB: 963d5011762SAnatolij Gustschin case GDF_16BIT_565RGB: 964d5011762SAnatolij Gustschin if (VIDEO_DATA_FORMAT == GDF_15BIT_555RGB) { 965d5011762SAnatolij Gustschin green_shift = 3; 966d5011762SAnatolij Gustschin red_off = 10; 967d5011762SAnatolij Gustschin } else { 968d5011762SAnatolij Gustschin green_shift = 2; 969d5011762SAnatolij Gustschin red_off = 11; 970d5011762SAnatolij Gustschin } 971d5011762SAnatolij Gustschin for (i = 0; i < ncolors; i++) { 972d5011762SAnatolij Gustschin cte = img->color_table[i]; 973d5011762SAnatolij Gustschin p[i].ce.w = SWAP16((unsigned short) 974d5011762SAnatolij Gustschin (((cte.red >> 3) << red_off) | 975d5011762SAnatolij Gustschin ((cte.green >> green_shift) << 5) | 976d5011762SAnatolij Gustschin cte.blue >> 3)); 977d5011762SAnatolij Gustschin } 978d5011762SAnatolij Gustschin break; 979d5011762SAnatolij Gustschin case GDF_32BIT_X888RGB: 980d5011762SAnatolij Gustschin for (i = 0; i < ncolors; i++) { 981d5011762SAnatolij Gustschin cte = img->color_table[i]; 98264e40d72SWolfgang Denk p[i].ce.dw = SWAP32((cte.red << 16) | 98364e40d72SWolfgang Denk (cte.green << 8) | 984d5011762SAnatolij Gustschin cte.blue); 985d5011762SAnatolij Gustschin } 986d5011762SAnatolij Gustschin break; 987d5011762SAnatolij Gustschin default: 988d5011762SAnatolij Gustschin printf("RLE Bitmap unsupported in video mode 0x%x\n", 989d5011762SAnatolij Gustschin VIDEO_DATA_FORMAT); 990d5011762SAnatolij Gustschin return -1; 991d5011762SAnatolij Gustschin } 992d5011762SAnatolij Gustschin 993d5011762SAnatolij Gustschin while (decode) { 994d5011762SAnatolij Gustschin switch (bm[0]) { 995d5011762SAnatolij Gustschin case 0: 996d5011762SAnatolij Gustschin switch (bm[1]) { 997d5011762SAnatolij Gustschin case 0: 998d5011762SAnatolij Gustschin /* scan line end marker */ 999d5011762SAnatolij Gustschin bm += 2; 1000d5011762SAnatolij Gustschin x = 0; 1001d5011762SAnatolij Gustschin y--; 1002d5011762SAnatolij Gustschin fbp = (unsigned char *) 1003d5011762SAnatolij Gustschin ((unsigned int) video_fb_address + 1004d5011762SAnatolij Gustschin (((y + yoff) * VIDEO_COLS) + 1005d5011762SAnatolij Gustschin xoff) * bpp); 1006d5011762SAnatolij Gustschin continue; 1007d5011762SAnatolij Gustschin case 1: 1008d5011762SAnatolij Gustschin /* end of bitmap data marker */ 1009d5011762SAnatolij Gustschin decode = 0; 1010d5011762SAnatolij Gustschin break; 1011d5011762SAnatolij Gustschin case 2: 1012d5011762SAnatolij Gustschin /* run offset marker */ 1013d5011762SAnatolij Gustschin x += bm[2]; 1014d5011762SAnatolij Gustschin y -= bm[3]; 1015d5011762SAnatolij Gustschin fbp = (unsigned char *) 1016d5011762SAnatolij Gustschin ((unsigned int) video_fb_address + 1017d5011762SAnatolij Gustschin (((y + yoff) * VIDEO_COLS) + 1018d5011762SAnatolij Gustschin x + xoff) * bpp); 1019d5011762SAnatolij Gustschin bm += 4; 1020d5011762SAnatolij Gustschin break; 1021d5011762SAnatolij Gustschin default: 1022d5011762SAnatolij Gustschin /* unencoded run */ 1023d5011762SAnatolij Gustschin cnt = bm[1]; 1024d5011762SAnatolij Gustschin runlen = cnt; 102574446b63SAnatolij Gustschin pixels += cnt; 102674446b63SAnatolij Gustschin if (pixels > limit) 102774446b63SAnatolij Gustschin goto error; 102874446b63SAnatolij Gustschin 1029d5011762SAnatolij Gustschin bm += 2; 1030d5011762SAnatolij Gustschin if (y < height) { 1031d5011762SAnatolij Gustschin if (x >= width) { 1032d5011762SAnatolij Gustschin x += runlen; 1033d5011762SAnatolij Gustschin goto next_run; 1034d5011762SAnatolij Gustschin } 1035d5011762SAnatolij Gustschin if (x + runlen > width) 1036d5011762SAnatolij Gustschin cnt = width - x; 1037d5011762SAnatolij Gustschin draw_bitmap(&fbp, bm, p, cnt, 0); 1038d5011762SAnatolij Gustschin x += runlen; 1039d5011762SAnatolij Gustschin } 1040d5011762SAnatolij Gustschin next_run: 1041d5011762SAnatolij Gustschin bm += runlen; 1042d5011762SAnatolij Gustschin if (runlen & 1) 1043d5011762SAnatolij Gustschin bm++; /* 0 padding if length is odd */ 1044d5011762SAnatolij Gustschin } 1045d5011762SAnatolij Gustschin break; 1046d5011762SAnatolij Gustschin default: 1047d5011762SAnatolij Gustschin /* encoded run */ 1048d5011762SAnatolij Gustschin cnt = bm[0]; 1049d5011762SAnatolij Gustschin runlen = cnt; 105074446b63SAnatolij Gustschin pixels += cnt; 105174446b63SAnatolij Gustschin if (pixels > limit) 105274446b63SAnatolij Gustschin goto error; 105374446b63SAnatolij Gustschin 105474446b63SAnatolij Gustschin if (y < height) { /* only draw into visible area */ 1055d5011762SAnatolij Gustschin if (x >= width) { 1056d5011762SAnatolij Gustschin x += runlen; 1057d5011762SAnatolij Gustschin bm += 2; 1058d5011762SAnatolij Gustschin continue; 1059d5011762SAnatolij Gustschin } 1060d5011762SAnatolij Gustschin if (x + runlen > width) 1061d5011762SAnatolij Gustschin cnt = width - x; 1062d5011762SAnatolij Gustschin draw_bitmap(&fbp, bm, p, cnt, 1); 1063d5011762SAnatolij Gustschin x += runlen; 1064d5011762SAnatolij Gustschin } 1065d5011762SAnatolij Gustschin bm += 2; 1066d5011762SAnatolij Gustschin break; 1067d5011762SAnatolij Gustschin } 1068d5011762SAnatolij Gustschin } 1069d5011762SAnatolij Gustschin return 0; 107074446b63SAnatolij Gustschin error: 107174446b63SAnatolij Gustschin printf("Error: Too much encoded pixel data, validate your bitmap\n"); 107274446b63SAnatolij Gustschin return -1; 1073d5011762SAnatolij Gustschin } 1074d5011762SAnatolij Gustschin #endif 1075d5011762SAnatolij Gustschin 1076d5011762SAnatolij Gustschin /* 1077352d2591SJean-Christophe PLAGNIOL-VILLARD * Display the BMP file located at address bmp_image. 1078352d2591SJean-Christophe PLAGNIOL-VILLARD */ 1079352d2591SJean-Christophe PLAGNIOL-VILLARD int video_display_bitmap(ulong bmp_image, int x, int y) 1080352d2591SJean-Christophe PLAGNIOL-VILLARD { 1081352d2591SJean-Christophe PLAGNIOL-VILLARD ushort xcount, ycount; 1082352d2591SJean-Christophe PLAGNIOL-VILLARD uchar *fb; 1083352d2591SJean-Christophe PLAGNIOL-VILLARD bmp_image_t *bmp = (bmp_image_t *) bmp_image; 1084352d2591SJean-Christophe PLAGNIOL-VILLARD uchar *bmap; 1085352d2591SJean-Christophe PLAGNIOL-VILLARD ushort padded_line; 1086352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned long width, height, bpp; 1087352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned colors; 1088352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned long compression; 1089352d2591SJean-Christophe PLAGNIOL-VILLARD bmp_color_table_entry_t cte; 109064e40d72SWolfgang Denk 1091352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 1092352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *dst = NULL; 1093352d2591SJean-Christophe PLAGNIOL-VILLARD ulong len; 1094352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1095352d2591SJean-Christophe PLAGNIOL-VILLARD 1096352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1097352d2591SJean-Christophe PLAGNIOL-VILLARD 1098352d2591SJean-Christophe PLAGNIOL-VILLARD if (!((bmp->header.signature[0] == 'B') && 1099352d2591SJean-Christophe PLAGNIOL-VILLARD (bmp->header.signature[1] == 'M'))) { 1100352d2591SJean-Christophe PLAGNIOL-VILLARD 1101352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 1102352d2591SJean-Christophe PLAGNIOL-VILLARD /* 1103352d2591SJean-Christophe PLAGNIOL-VILLARD * Could be a gzipped bmp image, try to decrompress... 1104352d2591SJean-Christophe PLAGNIOL-VILLARD */ 11056d0f6bcfSJean-Christophe PLAGNIOL-VILLARD len = CONFIG_SYS_VIDEO_LOGO_MAX_SIZE; 11066d0f6bcfSJean-Christophe PLAGNIOL-VILLARD dst = malloc(CONFIG_SYS_VIDEO_LOGO_MAX_SIZE); 1107352d2591SJean-Christophe PLAGNIOL-VILLARD if (dst == NULL) { 1108352d2591SJean-Christophe PLAGNIOL-VILLARD printf("Error: malloc in gunzip failed!\n"); 110964e40d72SWolfgang Denk return 1; 1110352d2591SJean-Christophe PLAGNIOL-VILLARD } 111164e40d72SWolfgang Denk if (gunzip(dst, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE, 111264e40d72SWolfgang Denk (uchar *) bmp_image, 111364e40d72SWolfgang Denk &len) != 0) { 111464e40d72SWolfgang Denk printf("Error: no valid bmp or bmp.gz image at %lx\n", 111564e40d72SWolfgang Denk bmp_image); 1116352d2591SJean-Christophe PLAGNIOL-VILLARD free(dst); 1117352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 1118352d2591SJean-Christophe PLAGNIOL-VILLARD } 11196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (len == CONFIG_SYS_VIDEO_LOGO_MAX_SIZE) { 112064e40d72SWolfgang Denk printf("Image could be truncated " 112164e40d72SWolfgang Denk "(increase CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)!\n"); 1122352d2591SJean-Christophe PLAGNIOL-VILLARD } 1123352d2591SJean-Christophe PLAGNIOL-VILLARD 1124352d2591SJean-Christophe PLAGNIOL-VILLARD /* 1125352d2591SJean-Christophe PLAGNIOL-VILLARD * Set addr to decompressed image 1126352d2591SJean-Christophe PLAGNIOL-VILLARD */ 1127352d2591SJean-Christophe PLAGNIOL-VILLARD bmp = (bmp_image_t *) dst; 1128352d2591SJean-Christophe PLAGNIOL-VILLARD 1129352d2591SJean-Christophe PLAGNIOL-VILLARD if (!((bmp->header.signature[0] == 'B') && 1130352d2591SJean-Christophe PLAGNIOL-VILLARD (bmp->header.signature[1] == 'M'))) { 113164e40d72SWolfgang Denk printf("Error: no valid bmp.gz image at %lx\n", 113264e40d72SWolfgang Denk bmp_image); 1133a49e0d17SMatthias Fuchs free(dst); 1134352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 1135352d2591SJean-Christophe PLAGNIOL-VILLARD } 1136352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1137352d2591SJean-Christophe PLAGNIOL-VILLARD printf("Error: no valid bmp image at %lx\n", bmp_image); 1138352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 1139352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_BMP_GZIP */ 1140352d2591SJean-Christophe PLAGNIOL-VILLARD } 1141352d2591SJean-Christophe PLAGNIOL-VILLARD 1142352d2591SJean-Christophe PLAGNIOL-VILLARD width = le32_to_cpu(bmp->header.width); 1143352d2591SJean-Christophe PLAGNIOL-VILLARD height = le32_to_cpu(bmp->header.height); 1144352d2591SJean-Christophe PLAGNIOL-VILLARD bpp = le16_to_cpu(bmp->header.bit_count); 1145352d2591SJean-Christophe PLAGNIOL-VILLARD colors = le32_to_cpu(bmp->header.colors_used); 1146352d2591SJean-Christophe PLAGNIOL-VILLARD compression = le32_to_cpu(bmp->header.compression); 1147352d2591SJean-Christophe PLAGNIOL-VILLARD 1148352d2591SJean-Christophe PLAGNIOL-VILLARD debug("Display-bmp: %d x %d with %d colors\n", 1149352d2591SJean-Christophe PLAGNIOL-VILLARD width, height, colors); 1150352d2591SJean-Christophe PLAGNIOL-VILLARD 1151d5011762SAnatolij Gustschin if (compression != BMP_BI_RGB 1152d5011762SAnatolij Gustschin #ifdef CONFIG_VIDEO_BMP_RLE8 1153d5011762SAnatolij Gustschin && compression != BMP_BI_RLE8 1154d5011762SAnatolij Gustschin #endif 1155d5011762SAnatolij Gustschin ) { 1156352d2591SJean-Christophe PLAGNIOL-VILLARD printf("Error: compression type %ld not supported\n", 1157352d2591SJean-Christophe PLAGNIOL-VILLARD compression); 1158a49e0d17SMatthias Fuchs #ifdef CONFIG_VIDEO_BMP_GZIP 1159a49e0d17SMatthias Fuchs if (dst) 1160a49e0d17SMatthias Fuchs free(dst); 1161a49e0d17SMatthias Fuchs #endif 1162352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 1163352d2591SJean-Christophe PLAGNIOL-VILLARD } 1164352d2591SJean-Christophe PLAGNIOL-VILLARD 1165352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3; 1166352d2591SJean-Christophe PLAGNIOL-VILLARD 11671ca298ceSMatthias Weisser #ifdef CONFIG_SPLASH_SCREEN_ALIGN 11681ca298ceSMatthias Weisser if (x == BMP_ALIGN_CENTER) 11691ca298ceSMatthias Weisser x = max(0, (VIDEO_VISIBLE_COLS - width) / 2); 11701ca298ceSMatthias Weisser else if (x < 0) 11711ca298ceSMatthias Weisser x = max(0, VIDEO_VISIBLE_COLS - width + x + 1); 11721ca298ceSMatthias Weisser 11731ca298ceSMatthias Weisser if (y == BMP_ALIGN_CENTER) 11741ca298ceSMatthias Weisser y = max(0, (VIDEO_VISIBLE_ROWS - height) / 2); 11751ca298ceSMatthias Weisser else if (y < 0) 11761ca298ceSMatthias Weisser y = max(0, VIDEO_VISIBLE_ROWS - height + y + 1); 11771ca298ceSMatthias Weisser #endif /* CONFIG_SPLASH_SCREEN_ALIGN */ 11781ca298ceSMatthias Weisser 1179352d2591SJean-Christophe PLAGNIOL-VILLARD if ((x + width) > VIDEO_VISIBLE_COLS) 1180352d2591SJean-Christophe PLAGNIOL-VILLARD width = VIDEO_VISIBLE_COLS - x; 1181352d2591SJean-Christophe PLAGNIOL-VILLARD if ((y + height) > VIDEO_VISIBLE_ROWS) 1182352d2591SJean-Christophe PLAGNIOL-VILLARD height = VIDEO_VISIBLE_ROWS - y; 1183352d2591SJean-Christophe PLAGNIOL-VILLARD 1184352d2591SJean-Christophe PLAGNIOL-VILLARD bmap = (uchar *) bmp + le32_to_cpu(bmp->header.data_offset); 1185352d2591SJean-Christophe PLAGNIOL-VILLARD fb = (uchar *) (video_fb_address + 1186352d2591SJean-Christophe PLAGNIOL-VILLARD ((y + height - 1) * VIDEO_COLS * VIDEO_PIXEL_SIZE) + 1187352d2591SJean-Christophe PLAGNIOL-VILLARD x * VIDEO_PIXEL_SIZE); 1188352d2591SJean-Christophe PLAGNIOL-VILLARD 1189d5011762SAnatolij Gustschin #ifdef CONFIG_VIDEO_BMP_RLE8 1190d5011762SAnatolij Gustschin if (compression == BMP_BI_RLE8) { 119164e40d72SWolfgang Denk return display_rle8_bitmap(bmp, x, y, width, height); 1192d5011762SAnatolij Gustschin } 1193d5011762SAnatolij Gustschin #endif 1194d5011762SAnatolij Gustschin 119568f6618bSTimur Tabi /* We handle only 4, 8, or 24 bpp bitmaps */ 1196352d2591SJean-Christophe PLAGNIOL-VILLARD switch (le16_to_cpu(bmp->header.bit_count)) { 119768f6618bSTimur Tabi case 4: 119868f6618bSTimur Tabi padded_line -= width / 2; 119968f6618bSTimur Tabi ycount = height; 120068f6618bSTimur Tabi 120168f6618bSTimur Tabi switch (VIDEO_DATA_FORMAT) { 120268f6618bSTimur Tabi case GDF_32BIT_X888RGB: 120368f6618bSTimur Tabi while (ycount--) { 120468f6618bSTimur Tabi WATCHDOG_RESET(); 120568f6618bSTimur Tabi /* 120668f6618bSTimur Tabi * Don't assume that 'width' is an 120768f6618bSTimur Tabi * even number 120868f6618bSTimur Tabi */ 120968f6618bSTimur Tabi for (xcount = 0; xcount < width; xcount++) { 121068f6618bSTimur Tabi uchar idx; 121168f6618bSTimur Tabi 121268f6618bSTimur Tabi if (xcount & 1) { 121368f6618bSTimur Tabi idx = *bmap & 0xF; 121468f6618bSTimur Tabi bmap++; 121568f6618bSTimur Tabi } else 121668f6618bSTimur Tabi idx = *bmap >> 4; 121768f6618bSTimur Tabi cte = bmp->color_table[idx]; 121868f6618bSTimur Tabi FILL_32BIT_X888RGB(cte.red, cte.green, 121968f6618bSTimur Tabi cte.blue); 122068f6618bSTimur Tabi } 122168f6618bSTimur Tabi bmap += padded_line; 122268f6618bSTimur Tabi fb -= (VIDEO_VISIBLE_COLS + width) * 122368f6618bSTimur Tabi VIDEO_PIXEL_SIZE; 122468f6618bSTimur Tabi } 122568f6618bSTimur Tabi break; 122668f6618bSTimur Tabi default: 122768f6618bSTimur Tabi puts("4bpp bitmap unsupported with current " 122868f6618bSTimur Tabi "video mode\n"); 122968f6618bSTimur Tabi break; 123068f6618bSTimur Tabi } 123168f6618bSTimur Tabi break; 123268f6618bSTimur Tabi 1233352d2591SJean-Christophe PLAGNIOL-VILLARD case 8: 1234352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line -= width; 1235352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) { 1236352d2591SJean-Christophe PLAGNIOL-VILLARD /* Copy colormap */ 1237352d2591SJean-Christophe PLAGNIOL-VILLARD for (xcount = 0; xcount < colors; ++xcount) { 1238352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[xcount]; 123964e40d72SWolfgang Denk video_set_lut(xcount, cte.red, cte.green, 124064e40d72SWolfgang Denk cte.blue); 1241352d2591SJean-Christophe PLAGNIOL-VILLARD } 1242352d2591SJean-Christophe PLAGNIOL-VILLARD } 1243352d2591SJean-Christophe PLAGNIOL-VILLARD ycount = height; 1244352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1245352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 1246352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1247352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1248352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1249352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1250352d2591SJean-Christophe PLAGNIOL-VILLARD *fb++ = *bmap++; 1251352d2591SJean-Christophe PLAGNIOL-VILLARD } 1252352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 125364e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 125464e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1255352d2591SJean-Christophe PLAGNIOL-VILLARD } 1256352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1257352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 1258352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1259352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1260352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1261352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1262352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 126364e40d72SWolfgang Denk FILL_8BIT_332RGB(cte.red, cte.green, 126464e40d72SWolfgang Denk cte.blue); 1265352d2591SJean-Christophe PLAGNIOL-VILLARD } 1266352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 126764e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 126864e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1269352d2591SJean-Christophe PLAGNIOL-VILLARD } 1270352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1271352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1272352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1273e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1274e84d568fSAnatolij Gustschin int xpos = x; 1275e84d568fSAnatolij Gustschin #endif 1276352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1277352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1278352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1279352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 1280cc347801SAndrew Dyer #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1281e84d568fSAnatolij Gustschin fill_555rgb_pswap(fb, xpos++, cte.red, 128264e40d72SWolfgang Denk cte.green, 128364e40d72SWolfgang Denk cte.blue); 1284e84d568fSAnatolij Gustschin fb += 2; 1285cc347801SAndrew Dyer #else 128664e40d72SWolfgang Denk FILL_15BIT_555RGB(cte.red, cte.green, 128764e40d72SWolfgang Denk cte.blue); 1288e84d568fSAnatolij Gustschin #endif 1289352d2591SJean-Christophe PLAGNIOL-VILLARD } 1290352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 129164e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 129264e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1293352d2591SJean-Christophe PLAGNIOL-VILLARD } 1294352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1295352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1296352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1297352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1298352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1299352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1300352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 130164e40d72SWolfgang Denk FILL_16BIT_565RGB(cte.red, cte.green, 130264e40d72SWolfgang Denk cte.blue); 1303352d2591SJean-Christophe PLAGNIOL-VILLARD } 1304352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 130564e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 130664e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1307352d2591SJean-Christophe PLAGNIOL-VILLARD } 1308352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1309352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1310352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1311352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1312352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1313352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1314352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 131564e40d72SWolfgang Denk FILL_32BIT_X888RGB(cte.red, cte.green, 131664e40d72SWolfgang Denk cte.blue); 1317352d2591SJean-Christophe PLAGNIOL-VILLARD } 1318352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 131964e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 132064e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1321352d2591SJean-Christophe PLAGNIOL-VILLARD } 1322352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1323352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1324352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1325352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1326352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1327352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1328352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 132964e40d72SWolfgang Denk FILL_24BIT_888RGB(cte.red, cte.green, 133064e40d72SWolfgang Denk cte.blue); 1331352d2591SJean-Christophe PLAGNIOL-VILLARD } 1332352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 133364e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 133464e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1335352d2591SJean-Christophe PLAGNIOL-VILLARD } 1336352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1337352d2591SJean-Christophe PLAGNIOL-VILLARD } 1338352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1339352d2591SJean-Christophe PLAGNIOL-VILLARD case 24: 1340352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line -= 3 * width; 1341352d2591SJean-Christophe PLAGNIOL-VILLARD ycount = height; 1342352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1343352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 1344352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1345352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1346352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1347352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 134864e40d72SWolfgang Denk FILL_8BIT_332RGB(bmap[2], bmap[1], 134964e40d72SWolfgang Denk bmap[0]); 1350352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1351352d2591SJean-Christophe PLAGNIOL-VILLARD } 1352352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 135364e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 135464e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1355352d2591SJean-Christophe PLAGNIOL-VILLARD } 1356352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1357352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1358352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1359e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1360e84d568fSAnatolij Gustschin int xpos = x; 1361e84d568fSAnatolij Gustschin #endif 1362352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1363352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1364352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1365cc347801SAndrew Dyer #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1366e84d568fSAnatolij Gustschin fill_555rgb_pswap(fb, xpos++, bmap[2], 1367e84d568fSAnatolij Gustschin bmap[1], bmap[0]); 1368e84d568fSAnatolij Gustschin fb += 2; 1369cc347801SAndrew Dyer #else 137064e40d72SWolfgang Denk FILL_15BIT_555RGB(bmap[2], bmap[1], 137164e40d72SWolfgang Denk bmap[0]); 1372e84d568fSAnatolij Gustschin #endif 1373352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1374352d2591SJean-Christophe PLAGNIOL-VILLARD } 1375352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 137664e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 137764e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1378352d2591SJean-Christophe PLAGNIOL-VILLARD } 1379352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1380352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1381352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1382352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1383352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1384352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 138564e40d72SWolfgang Denk FILL_16BIT_565RGB(bmap[2], bmap[1], 138664e40d72SWolfgang Denk bmap[0]); 1387352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1388352d2591SJean-Christophe PLAGNIOL-VILLARD } 1389352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 139064e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 139164e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1392352d2591SJean-Christophe PLAGNIOL-VILLARD } 1393352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1394352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1395352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1396352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1397352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1398352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 139964e40d72SWolfgang Denk FILL_32BIT_X888RGB(bmap[2], bmap[1], 140064e40d72SWolfgang Denk bmap[0]); 1401352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1402352d2591SJean-Christophe PLAGNIOL-VILLARD } 1403352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 140464e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 140564e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1406352d2591SJean-Christophe PLAGNIOL-VILLARD } 1407352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1408352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1409352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1410352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET(); 1411352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1412352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 141364e40d72SWolfgang Denk FILL_24BIT_888RGB(bmap[2], bmap[1], 141464e40d72SWolfgang Denk bmap[0]); 1415352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1416352d2591SJean-Christophe PLAGNIOL-VILLARD } 1417352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 141864e40d72SWolfgang Denk fb -= (VIDEO_VISIBLE_COLS + width) * 141964e40d72SWolfgang Denk VIDEO_PIXEL_SIZE; 1420352d2591SJean-Christophe PLAGNIOL-VILLARD } 1421352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1422352d2591SJean-Christophe PLAGNIOL-VILLARD default: 142364e40d72SWolfgang Denk printf("Error: 24 bits/pixel bitmap incompatible " 142464e40d72SWolfgang Denk "with current video mode\n"); 1425352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1426352d2591SJean-Christophe PLAGNIOL-VILLARD } 1427352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1428352d2591SJean-Christophe PLAGNIOL-VILLARD default: 1429352d2591SJean-Christophe PLAGNIOL-VILLARD printf("Error: %d bit/pixel bitmaps not supported by U-Boot\n", 1430352d2591SJean-Christophe PLAGNIOL-VILLARD le16_to_cpu(bmp->header.bit_count)); 1431352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1432352d2591SJean-Christophe PLAGNIOL-VILLARD } 1433352d2591SJean-Christophe PLAGNIOL-VILLARD 1434352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 1435352d2591SJean-Christophe PLAGNIOL-VILLARD if (dst) { 1436352d2591SJean-Christophe PLAGNIOL-VILLARD free(dst); 1437352d2591SJean-Christophe PLAGNIOL-VILLARD } 1438352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1439352d2591SJean-Christophe PLAGNIOL-VILLARD 1440352d2591SJean-Christophe PLAGNIOL-VILLARD return (0); 1441352d2591SJean-Christophe PLAGNIOL-VILLARD } 1442352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1443352d2591SJean-Christophe PLAGNIOL-VILLARD 1444352d2591SJean-Christophe PLAGNIOL-VILLARD 1445352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 1446352d2591SJean-Christophe PLAGNIOL-VILLARD void logo_plot(void *screen, int width, int x, int y) 1447352d2591SJean-Christophe PLAGNIOL-VILLARD { 1448352d2591SJean-Christophe PLAGNIOL-VILLARD 1449352d2591SJean-Christophe PLAGNIOL-VILLARD int xcount, i; 1450352d2591SJean-Christophe PLAGNIOL-VILLARD int skip = (width - VIDEO_LOGO_WIDTH) * VIDEO_PIXEL_SIZE; 1451be129aa7SMatthias Weisser int ycount = video_logo_height; 1452352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char r, g, b, *logo_red, *logo_blue, *logo_green; 1453352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *source; 1454d9015f6aSAnatolij Gustschin unsigned char *dest = (unsigned char *) screen + 145564e40d72SWolfgang Denk ((y * width * VIDEO_PIXEL_SIZE) + x * VIDEO_PIXEL_SIZE); 1456352d2591SJean-Christophe PLAGNIOL-VILLARD 1457352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 1458352d2591SJean-Christophe PLAGNIOL-VILLARD source = bmp_logo_bitmap; 1459352d2591SJean-Christophe PLAGNIOL-VILLARD 1460352d2591SJean-Christophe PLAGNIOL-VILLARD /* Allocate temporary space for computing colormap */ 1461352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red = malloc(BMP_LOGO_COLORS); 1462352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green = malloc(BMP_LOGO_COLORS); 1463352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue = malloc(BMP_LOGO_COLORS); 1464352d2591SJean-Christophe PLAGNIOL-VILLARD /* Compute color map */ 1465352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < VIDEO_LOGO_COLORS; i++) { 1466352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4; 1467352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green[i] = (bmp_logo_palette[i] & 0x00f0); 1468352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4; 1469352d2591SJean-Christophe PLAGNIOL-VILLARD } 1470352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1471352d2591SJean-Christophe PLAGNIOL-VILLARD source = linux_logo; 1472352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red = linux_logo_red; 1473352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green = linux_logo_green; 1474352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue = linux_logo_blue; 1475352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1476352d2591SJean-Christophe PLAGNIOL-VILLARD 1477352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) { 1478352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < VIDEO_LOGO_COLORS; i++) { 1479352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut(i + VIDEO_LOGO_LUT_OFFSET, 148064e40d72SWolfgang Denk logo_red[i], logo_green[i], 148164e40d72SWolfgang Denk logo_blue[i]); 1482352d2591SJean-Christophe PLAGNIOL-VILLARD } 1483352d2591SJean-Christophe PLAGNIOL-VILLARD } 1484352d2591SJean-Christophe PLAGNIOL-VILLARD 1485352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1486e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1487e84d568fSAnatolij Gustschin int xpos = x; 1488e84d568fSAnatolij Gustschin #endif 1489352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = VIDEO_LOGO_WIDTH; 1490352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1491352d2591SJean-Christophe PLAGNIOL-VILLARD r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET]; 1492352d2591SJean-Christophe PLAGNIOL-VILLARD g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET]; 1493352d2591SJean-Christophe PLAGNIOL-VILLARD b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET]; 1494352d2591SJean-Christophe PLAGNIOL-VILLARD 1495352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1496352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 1497352d2591SJean-Christophe PLAGNIOL-VILLARD *dest = *source; 1498352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1499352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 150064e40d72SWolfgang Denk *dest = ((r >> 5) << 5) | 150164e40d72SWolfgang Denk ((g >> 5) << 2) | 150264e40d72SWolfgang Denk (b >> 6); 1503352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1504352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1505cc347801SAndrew Dyer #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1506cc347801SAndrew Dyer fill_555rgb_pswap(dest, xpos++, r, g, b); 1507cc347801SAndrew Dyer #else 1508352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *) dest = 150964e40d72SWolfgang Denk SWAP16((unsigned short) ( 151064e40d72SWolfgang Denk ((r >> 3) << 10) | 151164e40d72SWolfgang Denk ((g >> 3) << 5) | 151264e40d72SWolfgang Denk (b >> 3))); 1513bed53753SAnatolij Gustschin #endif 1514352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1515352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1516352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *) dest = 151764e40d72SWolfgang Denk SWAP16((unsigned short) ( 151864e40d72SWolfgang Denk ((r >> 3) << 11) | 151964e40d72SWolfgang Denk ((g >> 2) << 5) | 152064e40d72SWolfgang Denk (b >> 3))); 1521352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1522352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1523352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned long *) dest = 152464e40d72SWolfgang Denk SWAP32((unsigned long) ( 152564e40d72SWolfgang Denk (r << 16) | 152664e40d72SWolfgang Denk (g << 8) | 152764e40d72SWolfgang Denk b)); 1528352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1529352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1530352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 1531352d2591SJean-Christophe PLAGNIOL-VILLARD dest[0] = b; 1532352d2591SJean-Christophe PLAGNIOL-VILLARD dest[1] = g; 1533352d2591SJean-Christophe PLAGNIOL-VILLARD dest[2] = r; 1534352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1535352d2591SJean-Christophe PLAGNIOL-VILLARD dest[0] = r; 1536352d2591SJean-Christophe PLAGNIOL-VILLARD dest[1] = g; 1537352d2591SJean-Christophe PLAGNIOL-VILLARD dest[2] = b; 1538352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1539352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1540352d2591SJean-Christophe PLAGNIOL-VILLARD } 1541352d2591SJean-Christophe PLAGNIOL-VILLARD source++; 1542352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_PIXEL_SIZE; 1543352d2591SJean-Christophe PLAGNIOL-VILLARD } 1544352d2591SJean-Christophe PLAGNIOL-VILLARD dest += skip; 1545352d2591SJean-Christophe PLAGNIOL-VILLARD } 1546352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 1547352d2591SJean-Christophe PLAGNIOL-VILLARD free(logo_red); 1548352d2591SJean-Christophe PLAGNIOL-VILLARD free(logo_green); 1549352d2591SJean-Christophe PLAGNIOL-VILLARD free(logo_blue); 1550352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1551352d2591SJean-Christophe PLAGNIOL-VILLARD } 1552352d2591SJean-Christophe PLAGNIOL-VILLARD 1553352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_logo(void) 1554352d2591SJean-Christophe PLAGNIOL-VILLARD { 1555352d2591SJean-Christophe PLAGNIOL-VILLARD char info[128]; 15563dcbe628SAnatolij Gustschin int space, len, y_off = 0; 1557352d2591SJean-Christophe PLAGNIOL-VILLARD 1558352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SPLASH_SCREEN 1559352d2591SJean-Christophe PLAGNIOL-VILLARD char *s; 1560352d2591SJean-Christophe PLAGNIOL-VILLARD ulong addr; 1561352d2591SJean-Christophe PLAGNIOL-VILLARD 1562352d2591SJean-Christophe PLAGNIOL-VILLARD if ((s = getenv("splashimage")) != NULL) { 15631ca298ceSMatthias Weisser int x = 0, y = 0; 1564352d2591SJean-Christophe PLAGNIOL-VILLARD 15651ca298ceSMatthias Weisser addr = simple_strtoul(s, NULL, 16); 15661ca298ceSMatthias Weisser #ifdef CONFIG_SPLASH_SCREEN_ALIGN 15671ca298ceSMatthias Weisser if ((s = getenv("splashpos")) != NULL) { 15681ca298ceSMatthias Weisser if (s[0] == 'm') 15691ca298ceSMatthias Weisser x = BMP_ALIGN_CENTER; 15701ca298ceSMatthias Weisser else 15711ca298ceSMatthias Weisser x = simple_strtol(s, NULL, 0); 15721ca298ceSMatthias Weisser 15731ca298ceSMatthias Weisser if ((s = strchr(s + 1, ',')) != NULL) { 15741ca298ceSMatthias Weisser if (s[1] == 'm') 15751ca298ceSMatthias Weisser y = BMP_ALIGN_CENTER; 15761ca298ceSMatthias Weisser else 15771ca298ceSMatthias Weisser y = simple_strtol(s + 1, NULL, 0); 15781ca298ceSMatthias Weisser } 15791ca298ceSMatthias Weisser } 15801ca298ceSMatthias Weisser #endif /* CONFIG_SPLASH_SCREEN_ALIGN */ 15811ca298ceSMatthias Weisser 15821ca298ceSMatthias Weisser if (video_display_bitmap(addr, x, y) == 0) { 1583be129aa7SMatthias Weisser video_logo_height = 0; 1584352d2591SJean-Christophe PLAGNIOL-VILLARD return ((void *) (video_fb_address)); 1585352d2591SJean-Christophe PLAGNIOL-VILLARD } 1586352d2591SJean-Christophe PLAGNIOL-VILLARD } 1587352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_SPLASH_SCREEN */ 1588352d2591SJean-Christophe PLAGNIOL-VILLARD 1589352d2591SJean-Christophe PLAGNIOL-VILLARD logo_plot(video_fb_address, VIDEO_COLS, 0, 0); 1590352d2591SJean-Christophe PLAGNIOL-VILLARD 1591ce0f709bSAndreas Bießmann sprintf(info, " %s", version_string); 15923dcbe628SAnatolij Gustschin 15933dcbe628SAnatolij Gustschin space = (VIDEO_LINE_LEN / 2 - VIDEO_INFO_X) / VIDEO_FONT_WIDTH; 15943dcbe628SAnatolij Gustschin len = strlen(info); 15953dcbe628SAnatolij Gustschin 15963dcbe628SAnatolij Gustschin if (len > space) { 15973dcbe628SAnatolij Gustschin video_drawchars(VIDEO_INFO_X, VIDEO_INFO_Y, 15983dcbe628SAnatolij Gustschin (uchar *) info, space); 15993dcbe628SAnatolij Gustschin video_drawchars(VIDEO_INFO_X + VIDEO_FONT_WIDTH, 16003dcbe628SAnatolij Gustschin VIDEO_INFO_Y + VIDEO_FONT_HEIGHT, 16013dcbe628SAnatolij Gustschin (uchar *) info + space, len - space); 16023dcbe628SAnatolij Gustschin y_off = 1; 16033dcbe628SAnatolij Gustschin } else 1604352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring(VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *) info); 1605352d2591SJean-Christophe PLAGNIOL-VILLARD 1606352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO 1607352d2591SJean-Christophe PLAGNIOL-VILLARD { 160864e40d72SWolfgang Denk int i, n = 160964e40d72SWolfgang Denk ((video_logo_height - 161064e40d72SWolfgang Denk VIDEO_FONT_HEIGHT) / VIDEO_FONT_HEIGHT); 1611352d2591SJean-Christophe PLAGNIOL-VILLARD 1612352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 1; i < n; i++) { 1613352d2591SJean-Christophe PLAGNIOL-VILLARD video_get_info_str(i, info); 16143dcbe628SAnatolij Gustschin if (!*info) 16153dcbe628SAnatolij Gustschin continue; 16163dcbe628SAnatolij Gustschin 16173dcbe628SAnatolij Gustschin len = strlen(info); 16183dcbe628SAnatolij Gustschin if (len > space) { 16193dcbe628SAnatolij Gustschin video_drawchars(VIDEO_INFO_X, 16203dcbe628SAnatolij Gustschin VIDEO_INFO_Y + 162164e40d72SWolfgang Denk (i + y_off) * 162264e40d72SWolfgang Denk VIDEO_FONT_HEIGHT, 16233dcbe628SAnatolij Gustschin (uchar *) info, space); 16243dcbe628SAnatolij Gustschin y_off++; 162564e40d72SWolfgang Denk video_drawchars(VIDEO_INFO_X + 162664e40d72SWolfgang Denk VIDEO_FONT_WIDTH, 16273dcbe628SAnatolij Gustschin VIDEO_INFO_Y + 162864e40d72SWolfgang Denk (i + y_off) * 162964e40d72SWolfgang Denk VIDEO_FONT_HEIGHT, 16303dcbe628SAnatolij Gustschin (uchar *) info + space, 16313dcbe628SAnatolij Gustschin len - space); 16323dcbe628SAnatolij Gustschin } else { 1633352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring(VIDEO_INFO_X, 16343dcbe628SAnatolij Gustschin VIDEO_INFO_Y + 163564e40d72SWolfgang Denk (i + y_off) * 163664e40d72SWolfgang Denk VIDEO_FONT_HEIGHT, 1637352d2591SJean-Christophe PLAGNIOL-VILLARD (uchar *) info); 1638352d2591SJean-Christophe PLAGNIOL-VILLARD } 1639352d2591SJean-Christophe PLAGNIOL-VILLARD } 16403dcbe628SAnatolij Gustschin } 1641352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1642352d2591SJean-Christophe PLAGNIOL-VILLARD 1643be129aa7SMatthias Weisser return (video_fb_address + video_logo_height * VIDEO_LINE_LEN); 1644352d2591SJean-Christophe PLAGNIOL-VILLARD } 1645352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1646352d2591SJean-Christophe PLAGNIOL-VILLARD 1647352d2591SJean-Christophe PLAGNIOL-VILLARD static int video_init(void) 1648352d2591SJean-Christophe PLAGNIOL-VILLARD { 1649352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char color8; 1650352d2591SJean-Christophe PLAGNIOL-VILLARD 1651352d2591SJean-Christophe PLAGNIOL-VILLARD if ((pGD = video_hw_init()) == NULL) 1652352d2591SJean-Christophe PLAGNIOL-VILLARD return -1; 1653352d2591SJean-Christophe PLAGNIOL-VILLARD 1654352d2591SJean-Christophe PLAGNIOL-VILLARD video_fb_address = (void *) VIDEO_FB_ADRS; 1655352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR 1656352d2591SJean-Christophe PLAGNIOL-VILLARD video_init_hw_cursor(VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT); 1657352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1658352d2591SJean-Christophe PLAGNIOL-VILLARD 1659352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init drawing pats */ 1660352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1661352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 166264e40d72SWolfgang Denk video_set_lut(0x01, CONSOLE_FG_COL, CONSOLE_FG_COL, 166364e40d72SWolfgang Denk CONSOLE_FG_COL); 166464e40d72SWolfgang Denk video_set_lut(0x00, CONSOLE_BG_COL, CONSOLE_BG_COL, 166564e40d72SWolfgang Denk CONSOLE_BG_COL); 1666352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = 0x01010101; 1667352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = 0x00000000; 1668352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1669352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 1670352d2591SJean-Christophe PLAGNIOL-VILLARD color8 = ((CONSOLE_FG_COL & 0xe0) | 167164e40d72SWolfgang Denk ((CONSOLE_FG_COL >> 3) & 0x1c) | 167264e40d72SWolfgang Denk CONSOLE_FG_COL >> 6); 167364e40d72SWolfgang Denk fgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | 167464e40d72SWolfgang Denk color8; 1675352d2591SJean-Christophe PLAGNIOL-VILLARD color8 = ((CONSOLE_BG_COL & 0xe0) | 167664e40d72SWolfgang Denk ((CONSOLE_BG_COL >> 3) & 0x1c) | 167764e40d72SWolfgang Denk CONSOLE_BG_COL >> 6); 167864e40d72SWolfgang Denk bgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | 167964e40d72SWolfgang Denk color8; 1680352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1681352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1682352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (((CONSOLE_FG_COL >> 3) << 26) | 168364e40d72SWolfgang Denk ((CONSOLE_FG_COL >> 3) << 21) | 168464e40d72SWolfgang Denk ((CONSOLE_FG_COL >> 3) << 16) | 168564e40d72SWolfgang Denk ((CONSOLE_FG_COL >> 3) << 10) | 168664e40d72SWolfgang Denk ((CONSOLE_FG_COL >> 3) << 5) | 1687352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL >> 3)); 1688352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (((CONSOLE_BG_COL >> 3) << 26) | 168964e40d72SWolfgang Denk ((CONSOLE_BG_COL >> 3) << 21) | 169064e40d72SWolfgang Denk ((CONSOLE_BG_COL >> 3) << 16) | 169164e40d72SWolfgang Denk ((CONSOLE_BG_COL >> 3) << 10) | 169264e40d72SWolfgang Denk ((CONSOLE_BG_COL >> 3) << 5) | 1693352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL >> 3)); 1694352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1695352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1696352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (((CONSOLE_FG_COL >> 3) << 27) | 169764e40d72SWolfgang Denk ((CONSOLE_FG_COL >> 2) << 21) | 169864e40d72SWolfgang Denk ((CONSOLE_FG_COL >> 3) << 16) | 169964e40d72SWolfgang Denk ((CONSOLE_FG_COL >> 3) << 11) | 170064e40d72SWolfgang Denk ((CONSOLE_FG_COL >> 2) << 5) | 1701352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL >> 3)); 1702352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (((CONSOLE_BG_COL >> 3) << 27) | 170364e40d72SWolfgang Denk ((CONSOLE_BG_COL >> 2) << 21) | 170464e40d72SWolfgang Denk ((CONSOLE_BG_COL >> 3) << 16) | 170564e40d72SWolfgang Denk ((CONSOLE_BG_COL >> 3) << 11) | 170664e40d72SWolfgang Denk ((CONSOLE_BG_COL >> 2) << 5) | 1707352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL >> 3)); 1708352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1709352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 171064e40d72SWolfgang Denk fgx = (CONSOLE_FG_COL << 16) | 171164e40d72SWolfgang Denk (CONSOLE_FG_COL << 8) | 171264e40d72SWolfgang Denk CONSOLE_FG_COL; 171364e40d72SWolfgang Denk bgx = (CONSOLE_BG_COL << 16) | 171464e40d72SWolfgang Denk (CONSOLE_BG_COL << 8) | 171564e40d72SWolfgang Denk CONSOLE_BG_COL; 1716352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1717352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 171864e40d72SWolfgang Denk fgx = (CONSOLE_FG_COL << 24) | 171964e40d72SWolfgang Denk (CONSOLE_FG_COL << 16) | 172064e40d72SWolfgang Denk (CONSOLE_FG_COL << 8) | 172164e40d72SWolfgang Denk CONSOLE_FG_COL; 172264e40d72SWolfgang Denk bgx = (CONSOLE_BG_COL << 24) | 172364e40d72SWolfgang Denk (CONSOLE_BG_COL << 16) | 172464e40d72SWolfgang Denk (CONSOLE_BG_COL << 8) | 172564e40d72SWolfgang Denk CONSOLE_BG_COL; 1726352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1727352d2591SJean-Christophe PLAGNIOL-VILLARD } 1728352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 1729352d2591SJean-Christophe PLAGNIOL-VILLARD 1730352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 1731352d2591SJean-Christophe PLAGNIOL-VILLARD /* Plot the logo and get start point of console */ 1732*72c65f6fSWolfgang Denk debug("Video: Drawing the logo ...\n"); 1733352d2591SJean-Christophe PLAGNIOL-VILLARD video_console_address = video_logo(); 1734352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1735352d2591SJean-Christophe PLAGNIOL-VILLARD video_console_address = video_fb_address; 1736352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1737352d2591SJean-Christophe PLAGNIOL-VILLARD 1738352d2591SJean-Christophe PLAGNIOL-VILLARD /* Initialize the console */ 1739352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = 0; 1740352d2591SJean-Christophe PLAGNIOL-VILLARD console_row = 0; 1741352d2591SJean-Christophe PLAGNIOL-VILLARD 1742352d2591SJean-Christophe PLAGNIOL-VILLARD return 0; 1743352d2591SJean-Christophe PLAGNIOL-VILLARD } 1744352d2591SJean-Christophe PLAGNIOL-VILLARD 17456cc7ba9eSWolfgang Denk /* 17466cc7ba9eSWolfgang Denk * Implement a weak default function for boards that optionally 17476cc7ba9eSWolfgang Denk * need to skip the video initialization. 17486cc7ba9eSWolfgang Denk */ 17496cc7ba9eSWolfgang Denk int __board_video_skip(void) 17506cc7ba9eSWolfgang Denk { 17516cc7ba9eSWolfgang Denk /* As default, don't skip test */ 17526cc7ba9eSWolfgang Denk return 0; 17536cc7ba9eSWolfgang Denk } 175464e40d72SWolfgang Denk 175564e40d72SWolfgang Denk int board_video_skip(void) 175664e40d72SWolfgang Denk __attribute__ ((weak, alias("__board_video_skip"))); 17576cc7ba9eSWolfgang Denk 1758352d2591SJean-Christophe PLAGNIOL-VILLARD int drv_video_init(void) 1759352d2591SJean-Christophe PLAGNIOL-VILLARD { 1760352d2591SJean-Christophe PLAGNIOL-VILLARD int skip_dev_init; 176152cb4d4fSJean-Christophe PLAGNIOL-VILLARD struct stdio_dev console_dev; 1762352d2591SJean-Christophe PLAGNIOL-VILLARD 17636cc7ba9eSWolfgang Denk /* Check if video initialization should be skipped */ 17646cc7ba9eSWolfgang Denk if (board_video_skip()) 17656cc7ba9eSWolfgang Denk return 0; 17666cc7ba9eSWolfgang Denk 1767352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init video chip - returns with framebuffer cleared */ 1768f62f6469SWolfgang Denk skip_dev_init = (video_init() == -1); 1769352d2591SJean-Christophe PLAGNIOL-VILLARD 1770f62f6469SWolfgang Denk #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE) 1771*72c65f6fSWolfgang Denk debug("KBD: Keyboard init ...\n"); 1772f62f6469SWolfgang Denk skip_dev_init |= (VIDEO_KBD_INIT_FCT == -1); 1773f62f6469SWolfgang Denk #endif 1774f62f6469SWolfgang Denk 1775f62f6469SWolfgang Denk if (skip_dev_init) 1776f62f6469SWolfgang Denk return 0; 1777f62f6469SWolfgang Denk 1778352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init vga device */ 1779352d2591SJean-Christophe PLAGNIOL-VILLARD memset(&console_dev, 0, sizeof(console_dev)); 1780352d2591SJean-Christophe PLAGNIOL-VILLARD strcpy(console_dev.name, "vga"); 1781352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.ext = DEV_EXT_VIDEO; /* Video extensions */ 1782352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM; 1783352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.putc = video_putc; /* 'putc' function */ 1784352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.puts = video_puts; /* 'puts' function */ 1785352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.tstc = NULL; /* 'tstc' function */ 1786352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.getc = NULL; /* 'getc' function */ 1787352d2591SJean-Christophe PLAGNIOL-VILLARD 1788f62f6469SWolfgang Denk #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE) 1789f62f6469SWolfgang Denk /* Also init console device */ 1790f62f6469SWolfgang Denk console_dev.flags |= DEV_FLAGS_INPUT; 1791352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */ 1792352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.getc = VIDEO_GETC_FCT; /* 'getc' function */ 1793352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VGA_AS_SINGLE_DEVICE */ 1794f62f6469SWolfgang Denk 179552cb4d4fSJean-Christophe PLAGNIOL-VILLARD if (stdio_register(&console_dev) != 0) 1796352d2591SJean-Christophe PLAGNIOL-VILLARD return 0; 1797f62f6469SWolfgang Denk 1798f62f6469SWolfgang Denk /* Return success */ 1799f62f6469SWolfgang Denk return 1; 1800352d2591SJean-Christophe PLAGNIOL-VILLARD } 1801