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 32352d2591SJean-Christophe PLAGNIOL-VILLARD * information strings (that normaly goes to serial port) can be drawed. 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. 39352d2591SJean-Christophe PLAGNIOL-VILLARD 40352d2591SJean-Christophe PLAGNIOL-VILLARD The driver uses graphic specific defines/parameters/functions: 41352d2591SJean-Christophe PLAGNIOL-VILLARD 42352d2591SJean-Christophe PLAGNIOL-VILLARD (for SMI LynxE graphic chip) 43352d2591SJean-Christophe PLAGNIOL-VILLARD 44352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_SMI_LYNXEM - use graphic driver for SMI 710,712,810 45352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_FB_LITTLE_ENDIAN - framebuffer organisation default: big endian 46352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_HW_RECTFILL - graphic driver supports hardware rectangle fill 47352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_HW_BITBLT - graphic driver supports hardware bit blt 48352d2591SJean-Christophe PLAGNIOL-VILLARD 49352d2591SJean-Christophe PLAGNIOL-VILLARD Console Parameters are set by graphic drivers global struct: 50352d2591SJean-Christophe PLAGNIOL-VILLARD 51352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS - x resolution 52352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_ROWS - y resolution 53352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_PIXEL_SIZE - storage size in byte per pixel 54352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_DATA_FORMAT - graphical data format GDF 55352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_FB_ADRS - start of video memory 56352d2591SJean-Christophe PLAGNIOL-VILLARD 57352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_I8042_KBD - AT Keyboard driver for i8042 58352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_KBD_INIT_FCT - init function for keyboard 59352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_TSTC_FCT - keyboard_tstc function 60352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_GETC_FCT - keyboard_getc function 61352d2591SJean-Christophe PLAGNIOL-VILLARD 62352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_CONSOLE_CURSOR - on/off drawing cursor is done with delay 63352d2591SJean-Christophe PLAGNIOL-VILLARD loop in VIDEO_TSTC_FCT (i8042) 646d0f6bcfSJean-Christophe PLAGNIOL-VILLARD CONFIG_SYS_CONSOLE_BLINK_COUNT - value for delay loop - blink rate 65352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_CONSOLE_TIME - display time/date in upper right corner, 66352d2591SJean-Christophe PLAGNIOL-VILLARD needs CONFIG_CMD_DATE and CONFIG_CONSOLE_CURSOR 67352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_LOGO - display Linux Logo in upper left corner 68352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_BMP_LOGO - use bmp_logo instead of linux_logo 69352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_CONSOLE_EXTRA_INFO - display additional board information strings 70352d2591SJean-Christophe PLAGNIOL-VILLARD that normaly goes to serial port. This define 71352d2591SJean-Christophe PLAGNIOL-VILLARD requires a board specific function: 72352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_INFO_X, 73352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y + i*VIDEO_FONT_HEIGHT, 74352d2591SJean-Christophe PLAGNIOL-VILLARD info); 75352d2591SJean-Christophe PLAGNIOL-VILLARD that fills a info buffer at i=row. 76352d2591SJean-Christophe PLAGNIOL-VILLARD s.a: board/eltec/bab7xx. 77352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VGA_AS_SINGLE_DEVICE - If set the framebuffer device will be initialised 78352d2591SJean-Christophe PLAGNIOL-VILLARD as an output only device. The Keyboard driver 79352d2591SJean-Christophe PLAGNIOL-VILLARD will not be set-up. This may be used, if you 80352d2591SJean-Christophe PLAGNIOL-VILLARD have none or more than one Keyboard devices 81352d2591SJean-Christophe PLAGNIOL-VILLARD (USB Keyboard, AT Keyboard). 82352d2591SJean-Christophe PLAGNIOL-VILLARD 83352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_SW_CURSOR: - Draws a cursor after the last character. No 84352d2591SJean-Christophe PLAGNIOL-VILLARD blinking is provided. Uses the macros CURSOR_SET 85352d2591SJean-Christophe PLAGNIOL-VILLARD and CURSOR_OFF. 86352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability of the 87352d2591SJean-Christophe PLAGNIOL-VILLARD graphic chip. Uses the macro CURSOR_SET. 88352d2591SJean-Christophe PLAGNIOL-VILLARD ATTENTION: If booting an OS, the display driver 89352d2591SJean-Christophe PLAGNIOL-VILLARD must disable the hardware register of the graphic 90352d2591SJean-Christophe PLAGNIOL-VILLARD chip. Otherwise a blinking field is displayed 91352d2591SJean-Christophe PLAGNIOL-VILLARD */ 92352d2591SJean-Christophe PLAGNIOL-VILLARD 93352d2591SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 94352d2591SJean-Christophe PLAGNIOL-VILLARD 95352d2591SJean-Christophe PLAGNIOL-VILLARD #include <malloc.h> 96352d2591SJean-Christophe PLAGNIOL-VILLARD 97352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 98352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device defines with SMI graphic */ 99352d2591SJean-Christophe PLAGNIOL-VILLARD /* Any other graphic must change this section */ 100352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 101352d2591SJean-Christophe PLAGNIOL-VILLARD 102352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SMI_LYNXEM 103352d2591SJean-Christophe PLAGNIOL-VILLARD 104352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 105352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 106352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 107352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 108352d2591SJean-Christophe PLAGNIOL-VILLARD 109352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 110352d2591SJean-Christophe PLAGNIOL-VILLARD /* Defines for the CT69000 driver */ 111352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 112352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_CT69000 113352d2591SJean-Christophe PLAGNIOL-VILLARD 114352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 115352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 116352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 117352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 118352d2591SJean-Christophe PLAGNIOL-VILLARD 119352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 120352d2591SJean-Christophe PLAGNIOL-VILLARD /* Defines for the SED13806 driver */ 121352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 122352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SED13806 123352d2591SJean-Christophe PLAGNIOL-VILLARD 124352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_TOTAL5200 125352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 126352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 127352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 128352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 129352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 130352d2591SJean-Christophe PLAGNIOL-VILLARD 131352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 132352d2591SJean-Christophe PLAGNIOL-VILLARD /* Defines for the SED13806 driver */ 133352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 134352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SM501 135352d2591SJean-Christophe PLAGNIOL-VILLARD 136352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_HH405 137352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 138352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 139352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 140352d2591SJean-Christophe PLAGNIOL-VILLARD 141352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 142bed53753SAnatolij Gustschin /* Defines for the MB862xx driver */ 143bed53753SAnatolij Gustschin /*****************************************************************************/ 144bed53753SAnatolij Gustschin #ifdef CONFIG_VIDEO_MB862xx 145bed53753SAnatolij Gustschin 146bed53753SAnatolij Gustschin #ifdef CONFIG_VIDEO_CORALP 147bed53753SAnatolij Gustschin #define VIDEO_FB_LITTLE_ENDIAN 148bed53753SAnatolij Gustschin #endif 149bed53753SAnatolij Gustschin #define VIDEO_HW_RECTFILL 150bed53753SAnatolij Gustschin #define VIDEO_HW_BITBLT 151bed53753SAnatolij Gustschin #endif 152bed53753SAnatolij Gustschin 153bed53753SAnatolij Gustschin /*****************************************************************************/ 154352d2591SJean-Christophe PLAGNIOL-VILLARD /* Include video_fb.h after definitions of VIDEO_HW_RECTFILL etc */ 155352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 156352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_fb.h> 157352d2591SJean-Christophe PLAGNIOL-VILLARD 158352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 159352d2591SJean-Christophe PLAGNIOL-VILLARD /* some Macros */ 160352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 161352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_COLS (pGD->winSizeX) 162352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_ROWS (pGD->winSizeY) 163352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIXEL_SIZE (pGD->gdfBytesPP) 164352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_DATA_FORMAT (pGD->gdfIndex) 165352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_ADRS (pGD->frameAdrs) 166352d2591SJean-Christophe PLAGNIOL-VILLARD 167352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 168352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device defines with i8042 keyboard controller */ 169352d2591SJean-Christophe PLAGNIOL-VILLARD /* Any other keyboard controller must change this section */ 170352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 171352d2591SJean-Christophe PLAGNIOL-VILLARD 172352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_I8042_KBD 173352d2591SJean-Christophe PLAGNIOL-VILLARD #include <i8042.h> 174352d2591SJean-Christophe PLAGNIOL-VILLARD 175352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_KBD_INIT_FCT i8042_kbd_init() 176352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_TSTC_FCT i8042_tstc 177352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_GETC_FCT i8042_getc 178352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 179352d2591SJean-Christophe PLAGNIOL-VILLARD 180352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 181352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device */ 182352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 183352d2591SJean-Christophe PLAGNIOL-VILLARD 184352d2591SJean-Christophe PLAGNIOL-VILLARD #include <version.h> 185352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux/types.h> 186352d2591SJean-Christophe PLAGNIOL-VILLARD #include <devices.h> 187352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_font.h> 188352d2591SJean-Christophe PLAGNIOL-VILLARD 189352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_DATE) 190352d2591SJean-Christophe PLAGNIOL-VILLARD #include <rtc.h> 191352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 192352d2591SJean-Christophe PLAGNIOL-VILLARD 193352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) 194352d2591SJean-Christophe PLAGNIOL-VILLARD #include <watchdog.h> 195352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_layout.h> 196352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 197352d2591SJean-Christophe PLAGNIOL-VILLARD 198352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 199352d2591SJean-Christophe PLAGNIOL-VILLARD /* Cursor definition: */ 2007817cb20SMarcel Ziswiler /* CONFIG_CONSOLE_CURSOR: Uses a timer function (see drivers/input/i8042.c) */ 2017817cb20SMarcel Ziswiler /* to let the cursor blink. Uses the macros */ 2027817cb20SMarcel Ziswiler /* CURSOR_OFF and CURSOR_ON. */ 203352d2591SJean-Christophe PLAGNIOL-VILLARD /* CONFIG_VIDEO_SW_CURSOR: Draws a cursor after the last character. No */ 204352d2591SJean-Christophe PLAGNIOL-VILLARD /* blinking is provided. Uses the macros CURSOR_SET */ 205352d2591SJean-Christophe PLAGNIOL-VILLARD /* and CURSOR_OFF. */ 206352d2591SJean-Christophe PLAGNIOL-VILLARD /* CONFIG_VIDEO_HW_CURSOR: Uses the hardware cursor capability of the */ 207352d2591SJean-Christophe PLAGNIOL-VILLARD /* graphic chip. Uses the macro CURSOR_SET. */ 208352d2591SJean-Christophe PLAGNIOL-VILLARD /* ATTENTION: If booting an OS, the display driver */ 209352d2591SJean-Christophe PLAGNIOL-VILLARD /* must disable the hardware register of the graphic */ 210352d2591SJean-Christophe PLAGNIOL-VILLARD /* chip. Otherwise a blinking field is displayed */ 211352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 212352d2591SJean-Christophe PLAGNIOL-VILLARD #if !defined(CONFIG_CONSOLE_CURSOR) && \ 213352d2591SJean-Christophe PLAGNIOL-VILLARD !defined(CONFIG_VIDEO_SW_CURSOR) && \ 214352d2591SJean-Christophe PLAGNIOL-VILLARD !defined(CONFIG_VIDEO_HW_CURSOR) 215352d2591SJean-Christophe PLAGNIOL-VILLARD /* no Cursor defined */ 216352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 217352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF 218352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET 219352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 220352d2591SJean-Christophe PLAGNIOL-VILLARD 221352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 222352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 223352d2591SJean-Christophe PLAGNIOL-VILLARD #error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined 224352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 225352d2591SJean-Christophe PLAGNIOL-VILLARD void console_cursor (int state); 226352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON console_cursor(1); 227352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF console_cursor(0); 228352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET 229352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_I8042_KBD 2307817cb20SMarcel Ziswiler #warning Cursor drawing on/off needs timer function s.a. drivers/input/i8042.c 231352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 232352d2591SJean-Christophe PLAGNIOL-VILLARD #else 233352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_TIME 234352d2591SJean-Christophe PLAGNIOL-VILLARD #error CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME 235352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 236352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_CONSOLE_CURSOR */ 237352d2591SJean-Christophe PLAGNIOL-VILLARD 238352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SW_CURSOR 239352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 240352d2591SJean-Christophe PLAGNIOL-VILLARD #error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined 241352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 242352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 243352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\ 244352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, ' '); 245352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET video_set_cursor(); 246352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_SW_CURSOR */ 247352d2591SJean-Christophe PLAGNIOL-VILLARD 248352d2591SJean-Christophe PLAGNIOL-VILLARD 249352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR 250352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 251352d2591SJean-Christophe PLAGNIOL-VILLARD #error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined 252352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 253352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 254352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF 255352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET video_set_hw_cursor(console_col * VIDEO_FONT_WIDTH, \ 256352d2591SJean-Christophe PLAGNIOL-VILLARD (console_row * VIDEO_FONT_HEIGHT) + VIDEO_LOGO_HEIGHT); 257352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_HW_CURSOR */ 258352d2591SJean-Christophe PLAGNIOL-VILLARD 259352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 260352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 261352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_logo.h> 262352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH BMP_LOGO_WIDTH 263352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT BMP_LOGO_HEIGHT 264352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET BMP_LOGO_OFFSET 265352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS BMP_LOGO_COLORS 266352d2591SJean-Christophe PLAGNIOL-VILLARD 267352d2591SJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_VIDEO_BMP_LOGO */ 268352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_WIDTH 80 269352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_HEIGHT 80 270352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_COLORS 214 271352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_LUT_OFFSET 0x20 272352d2591SJean-Christophe PLAGNIOL-VILLARD #define __initdata 273352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux_logo.h> 274352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH LINUX_LOGO_WIDTH 275352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT LINUX_LOGO_HEIGHT 276352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET LINUX_LOGO_LUT_OFFSET 277352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS LINUX_LOGO_COLORS 278352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_BMP_LOGO */ 279352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_X (VIDEO_LOGO_WIDTH) 280352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_Y (VIDEO_FONT_HEIGHT/2) 281352d2591SJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_VIDEO_LOGO */ 282352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH 0 283352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT 0 284352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_LOGO */ 285352d2591SJean-Christophe PLAGNIOL-VILLARD 286352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_COLS VIDEO_VISIBLE_COLS 287352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_ROWS VIDEO_VISIBLE_ROWS 288352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_SIZE (VIDEO_ROWS*VIDEO_COLS*VIDEO_PIXEL_SIZE) 289352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIX_BLOCKS (VIDEO_SIZE >> 2) 290352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LINE_LEN (VIDEO_COLS*VIDEO_PIXEL_SIZE) 291352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_BURST_LEN (VIDEO_COLS/8) 292352d2591SJean-Christophe PLAGNIOL-VILLARD 293352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 294352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROWS ((VIDEO_ROWS - VIDEO_LOGO_HEIGHT) / VIDEO_FONT_HEIGHT) 295352d2591SJean-Christophe PLAGNIOL-VILLARD #else 296352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROWS (VIDEO_ROWS / VIDEO_FONT_HEIGHT) 297352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 298352d2591SJean-Christophe PLAGNIOL-VILLARD 299352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_COLS (VIDEO_COLS / VIDEO_FONT_WIDTH) 300352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * VIDEO_LINE_LEN) 301352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_FIRST (video_console_address) 302352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SECOND (video_console_address + CONSOLE_ROW_SIZE) 303352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_LAST (video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE) 304352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS) 305352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE) 306352d2591SJean-Christophe PLAGNIOL-VILLARD 307352d2591SJean-Christophe PLAGNIOL-VILLARD /* Macros */ 308352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 309352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP16(x) ((((x) & 0x00ff) << 8) | ( (x) >> 8)) 310352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP32(x) ((((x) & 0x000000ff) << 24) | (((x) & 0x0000ff00) << 8)|\ 311352d2591SJean-Christophe PLAGNIOL-VILLARD (((x) & 0x00ff0000) >> 8) | (((x) & 0xff000000) >> 24) ) 312352d2591SJean-Christophe PLAGNIOL-VILLARD #define SHORTSWAP32(x) ((((x) & 0x000000ff) << 8) | (((x) & 0x0000ff00) >> 8)|\ 313352d2591SJean-Christophe PLAGNIOL-VILLARD (((x) & 0x00ff0000) << 8) | (((x) & 0xff000000) >> 8) ) 314352d2591SJean-Christophe PLAGNIOL-VILLARD #else 315352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP16(x) (x) 316352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP32(x) (x) 317cc347801SAndrew Dyer #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 318bed53753SAnatolij Gustschin #define SHORTSWAP32(x) ( ((x) >> 16) | ((x) << 16) ) 319cc347801SAndrew Dyer #else 320cc347801SAndrew Dyer #define SHORTSWAP32(x) (x) 321bed53753SAnatolij Gustschin #endif 322352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 323352d2591SJean-Christophe PLAGNIOL-VILLARD 324352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(DEBUG) || defined(DEBUG_CFB_CONSOLE) 325352d2591SJean-Christophe PLAGNIOL-VILLARD #define PRINTD(x) printf(x) 326352d2591SJean-Christophe PLAGNIOL-VILLARD #else 327352d2591SJean-Christophe PLAGNIOL-VILLARD #define PRINTD(x) 328352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 329352d2591SJean-Christophe PLAGNIOL-VILLARD 330352d2591SJean-Christophe PLAGNIOL-VILLARD 331352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO 332352d2591SJean-Christophe PLAGNIOL-VILLARD extern void video_get_info_str ( /* setup a board string: type, speed, etc. */ 333352d2591SJean-Christophe PLAGNIOL-VILLARD int line_number, /* location to place info string beside logo */ 334352d2591SJean-Christophe PLAGNIOL-VILLARD char *info /* buffer for info string */ 335352d2591SJean-Christophe PLAGNIOL-VILLARD ); 336352d2591SJean-Christophe PLAGNIOL-VILLARD 337352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 338352d2591SJean-Christophe PLAGNIOL-VILLARD 339352d2591SJean-Christophe PLAGNIOL-VILLARD /* Locals */ 340352d2591SJean-Christophe PLAGNIOL-VILLARD static GraphicDevice *pGD; /* Pointer to Graphic array */ 341352d2591SJean-Christophe PLAGNIOL-VILLARD 342352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_fb_address; /* frame buffer address */ 343352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_console_address; /* console buffer start address */ 344352d2591SJean-Christophe PLAGNIOL-VILLARD 345352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_col = 0; /* cursor col */ 346352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_row = 0; /* cursor row */ 347352d2591SJean-Christophe PLAGNIOL-VILLARD 348352d2591SJean-Christophe PLAGNIOL-VILLARD static u32 eorx, fgx, bgx; /* color pats */ 349352d2591SJean-Christophe PLAGNIOL-VILLARD 350352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table8[] = { 351352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff, 352352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff, 353352d2591SJean-Christophe PLAGNIOL-VILLARD 0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff, 354352d2591SJean-Christophe PLAGNIOL-VILLARD 0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff }; 355352d2591SJean-Christophe PLAGNIOL-VILLARD 356352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table15[] = { 357352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x00007fff, 0x7fff0000, 0x7fff7fff }; 358352d2591SJean-Christophe PLAGNIOL-VILLARD 359352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table16[] = { 360352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff }; 361352d2591SJean-Christophe PLAGNIOL-VILLARD 362352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table24[16][3] = { 363352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00000000 }, 364352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00ffffff }, 365352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x0000ffff, 0xff000000 }, 366352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x0000ffff, 0xffffffff }, 367352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffff0000, 0x00000000 }, 368352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffff0000, 0x00ffffff }, 369352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffffffff, 0xff000000 }, 370352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffffffff, 0xffffffff }, 371352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x00000000, 0x00000000 }, 372352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x00000000, 0x00ffffff }, 373352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x0000ffff, 0xff000000 }, 374352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x0000ffff, 0xffffffff }, 375352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffff0000, 0x00000000 }, 376352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffff0000, 0x00ffffff }, 377352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffffffff, 0xff000000 }, 378352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffffffff, 0xffffffff } }; 379352d2591SJean-Christophe PLAGNIOL-VILLARD 380352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table32[16][4] = { 381352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, 382352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00000000, 0x00ffffff }, 383352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00ffffff, 0x00000000 }, 384352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00ffffff, 0x00ffffff }, 385352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00000000, 0x00000000 }, 386352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff }, 387352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00000000 }, 388352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00ffffff }, 389352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00000000, 0x00000000 }, 390352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00000000, 0x00ffffff }, 391352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000 }, 392352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00ffffff }, 393352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00000000 }, 394352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00ffffff }, 395352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00000000 }, 396352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff } }; 397352d2591SJean-Christophe PLAGNIOL-VILLARD 398352d2591SJean-Christophe PLAGNIOL-VILLARD 399352d2591SJean-Christophe PLAGNIOL-VILLARD int gunzip(void *, int, unsigned char *, unsigned long *); 400352d2591SJean-Christophe PLAGNIOL-VILLARD 401352d2591SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 402352d2591SJean-Christophe PLAGNIOL-VILLARD 403352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_drawchars (int xx, int yy, unsigned char *s, int count) 404352d2591SJean-Christophe PLAGNIOL-VILLARD { 405352d2591SJean-Christophe PLAGNIOL-VILLARD u8 *cdat, *dest, *dest0; 406352d2591SJean-Christophe PLAGNIOL-VILLARD int rows, offset, c; 407352d2591SJean-Christophe PLAGNIOL-VILLARD 408352d2591SJean-Christophe PLAGNIOL-VILLARD offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE; 409352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 = video_fb_address + offset; 410352d2591SJean-Christophe PLAGNIOL-VILLARD 411352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 412352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 413352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 414352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 415352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 416352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 417352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 418352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 419352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 420352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 421352d2591SJean-Christophe PLAGNIOL-VILLARD 422352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = (video_font_draw_table8[bits >> 4] & eorx) ^ bgx; 423352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = (video_font_draw_table8[bits & 15] & eorx) ^ bgx; 424352d2591SJean-Christophe PLAGNIOL-VILLARD } 425352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 426352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 427352d2591SJean-Christophe PLAGNIOL-VILLARD } 428352d2591SJean-Christophe PLAGNIOL-VILLARD break; 429352d2591SJean-Christophe PLAGNIOL-VILLARD 430352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 431352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 432352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 433352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 434352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 435352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 436352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 437352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 438352d2591SJean-Christophe PLAGNIOL-VILLARD 439352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 6] & eorx) ^ bgx); 440352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 4 & 3] & eorx) ^ bgx); 441352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 2 & 3] & eorx) ^ bgx); 442352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = SHORTSWAP32 ((video_font_draw_table15 [bits & 3] & eorx) ^ bgx); 443352d2591SJean-Christophe PLAGNIOL-VILLARD } 444352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 445352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 446352d2591SJean-Christophe PLAGNIOL-VILLARD } 447352d2591SJean-Christophe PLAGNIOL-VILLARD break; 448352d2591SJean-Christophe PLAGNIOL-VILLARD 449352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 450352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 451352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 452352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 453352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 454352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 455352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 456352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 457352d2591SJean-Christophe PLAGNIOL-VILLARD 458352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 6] & eorx) ^ bgx); 459352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 4 & 3] & eorx) ^ bgx); 460352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 2 & 3] & eorx) ^ bgx); 461352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = SHORTSWAP32 ((video_font_draw_table16 [bits & 3] & eorx) ^ bgx); 462352d2591SJean-Christophe PLAGNIOL-VILLARD } 463352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 464352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 465352d2591SJean-Christophe PLAGNIOL-VILLARD } 466352d2591SJean-Christophe PLAGNIOL-VILLARD break; 467352d2591SJean-Christophe PLAGNIOL-VILLARD 468352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 469352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 470352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 471352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 472352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 473352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 474352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 475352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 476352d2591SJean-Christophe PLAGNIOL-VILLARD 477352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = SWAP32 ((video_font_draw_table32 [bits >> 4][0] & eorx) ^ bgx); 478352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = SWAP32 ((video_font_draw_table32 [bits >> 4][1] & eorx) ^ bgx); 479352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = SWAP32 ((video_font_draw_table32 [bits >> 4][2] & eorx) ^ bgx); 480352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = SWAP32 ((video_font_draw_table32 [bits >> 4][3] & eorx) ^ bgx); 481352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[4] = SWAP32 ((video_font_draw_table32 [bits & 15][0] & eorx) ^ bgx); 482352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[5] = SWAP32 ((video_font_draw_table32 [bits & 15][1] & eorx) ^ bgx); 483352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[6] = SWAP32 ((video_font_draw_table32 [bits & 15][2] & eorx) ^ bgx); 484352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[7] = SWAP32 ((video_font_draw_table32 [bits & 15][3] & eorx) ^ bgx); 485352d2591SJean-Christophe PLAGNIOL-VILLARD } 486352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 487352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 488352d2591SJean-Christophe PLAGNIOL-VILLARD } 489352d2591SJean-Christophe PLAGNIOL-VILLARD break; 490352d2591SJean-Christophe PLAGNIOL-VILLARD 491352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 492352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 493352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 494352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 495352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 496352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 497352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 498352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 499352d2591SJean-Christophe PLAGNIOL-VILLARD 500352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = (video_font_draw_table24[bits >> 4][0] & eorx) ^ bgx; 501352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = (video_font_draw_table24[bits >> 4][1] & eorx) ^ bgx; 502352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = (video_font_draw_table24[bits >> 4][2] & eorx) ^ bgx; 503352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = (video_font_draw_table24[bits & 15][0] & eorx) ^ bgx; 504352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[4] = (video_font_draw_table24[bits & 15][1] & eorx) ^ bgx; 505352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[5] = (video_font_draw_table24[bits & 15][2] & eorx) ^ bgx; 506352d2591SJean-Christophe PLAGNIOL-VILLARD } 507352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 508352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 509352d2591SJean-Christophe PLAGNIOL-VILLARD } 510352d2591SJean-Christophe PLAGNIOL-VILLARD break; 511352d2591SJean-Christophe PLAGNIOL-VILLARD } 512352d2591SJean-Christophe PLAGNIOL-VILLARD } 513352d2591SJean-Christophe PLAGNIOL-VILLARD 514352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 515352d2591SJean-Christophe PLAGNIOL-VILLARD 516352d2591SJean-Christophe PLAGNIOL-VILLARD static inline void video_drawstring (int xx, int yy, unsigned char *s) 517352d2591SJean-Christophe PLAGNIOL-VILLARD { 518352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawchars (xx, yy, s, strlen ((char *)s)); 519352d2591SJean-Christophe PLAGNIOL-VILLARD } 520352d2591SJean-Christophe PLAGNIOL-VILLARD 521352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 522352d2591SJean-Christophe PLAGNIOL-VILLARD 523352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_putchar (int xx, int yy, unsigned char c) 524352d2591SJean-Christophe PLAGNIOL-VILLARD { 525352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawchars (xx, yy + VIDEO_LOGO_HEIGHT, &c, 1); 526352d2591SJean-Christophe PLAGNIOL-VILLARD } 527352d2591SJean-Christophe PLAGNIOL-VILLARD 528352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 529352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR) 530352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_set_cursor (void) 531352d2591SJean-Christophe PLAGNIOL-VILLARD { 532352d2591SJean-Christophe PLAGNIOL-VILLARD /* swap drawing colors */ 533352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx; 534352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = bgx; 535352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = eorx; 536352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 537352d2591SJean-Christophe PLAGNIOL-VILLARD /* draw cursor */ 538352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 539352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 540352d2591SJean-Christophe PLAGNIOL-VILLARD ' '); 541352d2591SJean-Christophe PLAGNIOL-VILLARD /* restore drawing colors */ 542352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx; 543352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = bgx; 544352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = eorx; 545352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 546352d2591SJean-Christophe PLAGNIOL-VILLARD } 547352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 548352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 549352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 550352d2591SJean-Christophe PLAGNIOL-VILLARD void console_cursor (int state) 551352d2591SJean-Christophe PLAGNIOL-VILLARD { 552352d2591SJean-Christophe PLAGNIOL-VILLARD static int last_state = 0; 553352d2591SJean-Christophe PLAGNIOL-VILLARD 554352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_TIME 555352d2591SJean-Christophe PLAGNIOL-VILLARD struct rtc_time tm; 556352d2591SJean-Christophe PLAGNIOL-VILLARD char info[16]; 557352d2591SJean-Christophe PLAGNIOL-VILLARD 558352d2591SJean-Christophe PLAGNIOL-VILLARD /* time update only if cursor is on (faster scroll) */ 559352d2591SJean-Christophe PLAGNIOL-VILLARD if (state) { 560352d2591SJean-Christophe PLAGNIOL-VILLARD rtc_get (&tm); 561352d2591SJean-Christophe PLAGNIOL-VILLARD 562352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf (info, " %02d:%02d:%02d ", tm.tm_hour, tm.tm_min, 563352d2591SJean-Christophe PLAGNIOL-VILLARD tm.tm_sec); 564352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, 565352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y, (uchar *)info); 566352d2591SJean-Christophe PLAGNIOL-VILLARD 567352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf (info, "%02d.%02d.%04d", tm.tm_mday, tm.tm_mon, 568352d2591SJean-Christophe PLAGNIOL-VILLARD tm.tm_year); 569352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, 570352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y + 1 * VIDEO_FONT_HEIGHT, (uchar *)info); 571352d2591SJean-Christophe PLAGNIOL-VILLARD } 572352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 573352d2591SJean-Christophe PLAGNIOL-VILLARD 574352d2591SJean-Christophe PLAGNIOL-VILLARD if (state && (last_state != state)) { 575352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_cursor (); 576352d2591SJean-Christophe PLAGNIOL-VILLARD } 577352d2591SJean-Christophe PLAGNIOL-VILLARD 578352d2591SJean-Christophe PLAGNIOL-VILLARD if (!state && (last_state != state)) { 579352d2591SJean-Christophe PLAGNIOL-VILLARD /* clear cursor */ 580352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 581352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 582352d2591SJean-Christophe PLAGNIOL-VILLARD ' '); 583352d2591SJean-Christophe PLAGNIOL-VILLARD } 584352d2591SJean-Christophe PLAGNIOL-VILLARD 585352d2591SJean-Christophe PLAGNIOL-VILLARD last_state = state; 586352d2591SJean-Christophe PLAGNIOL-VILLARD } 587352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 588352d2591SJean-Christophe PLAGNIOL-VILLARD 589352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 590352d2591SJean-Christophe PLAGNIOL-VILLARD 591352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_RECTFILL 592352d2591SJean-Christophe PLAGNIOL-VILLARD static void memsetl (int *p, int c, int v) 593352d2591SJean-Christophe PLAGNIOL-VILLARD { 594352d2591SJean-Christophe PLAGNIOL-VILLARD while (c--) 595352d2591SJean-Christophe PLAGNIOL-VILLARD *(p++) = v; 596352d2591SJean-Christophe PLAGNIOL-VILLARD } 597352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 598352d2591SJean-Christophe PLAGNIOL-VILLARD 599352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 600352d2591SJean-Christophe PLAGNIOL-VILLARD 601352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_BITBLT 602352d2591SJean-Christophe PLAGNIOL-VILLARD static void memcpyl (int *d, int *s, int c) 603352d2591SJean-Christophe PLAGNIOL-VILLARD { 604352d2591SJean-Christophe PLAGNIOL-VILLARD while (c--) 605352d2591SJean-Christophe PLAGNIOL-VILLARD *(d++) = *(s++); 606352d2591SJean-Christophe PLAGNIOL-VILLARD } 607352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 608352d2591SJean-Christophe PLAGNIOL-VILLARD 609352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 610352d2591SJean-Christophe PLAGNIOL-VILLARD 611352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_scrollup (void) 612352d2591SJean-Christophe PLAGNIOL-VILLARD { 613352d2591SJean-Christophe PLAGNIOL-VILLARD /* copy up rows ignoring the first one */ 614352d2591SJean-Christophe PLAGNIOL-VILLARD 615352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_BITBLT 616352d2591SJean-Christophe PLAGNIOL-VILLARD video_hw_bitblt (VIDEO_PIXEL_SIZE, /* bytes per pixel */ 617352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* source pos x */ 618352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_LOGO_HEIGHT + VIDEO_FONT_HEIGHT, /* source pos y */ 619352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* dest pos x */ 620352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_LOGO_HEIGHT, /* dest pos y */ 621352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS, /* frame width */ 622352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT /* frame height */ 623352d2591SJean-Christophe PLAGNIOL-VILLARD ); 624352d2591SJean-Christophe PLAGNIOL-VILLARD #else 625352d2591SJean-Christophe PLAGNIOL-VILLARD memcpyl (CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND, 626352d2591SJean-Christophe PLAGNIOL-VILLARD CONSOLE_SCROLL_SIZE >> 2); 627352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 628352d2591SJean-Christophe PLAGNIOL-VILLARD 629352d2591SJean-Christophe PLAGNIOL-VILLARD /* clear the last one */ 630352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_RECTFILL 631352d2591SJean-Christophe PLAGNIOL-VILLARD video_hw_rectfill (VIDEO_PIXEL_SIZE, /* bytes per pixel */ 632352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* dest pos x */ 633352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_ROWS - VIDEO_FONT_HEIGHT, /* dest pos y */ 634352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS, /* frame width */ 635352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_FONT_HEIGHT, /* frame height */ 636352d2591SJean-Christophe PLAGNIOL-VILLARD CONSOLE_BG_COL /* fill color */ 637352d2591SJean-Christophe PLAGNIOL-VILLARD ); 638352d2591SJean-Christophe PLAGNIOL-VILLARD #else 639352d2591SJean-Christophe PLAGNIOL-VILLARD memsetl (CONSOLE_ROW_LAST, CONSOLE_ROW_SIZE >> 2, CONSOLE_BG_COL); 640352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 641352d2591SJean-Christophe PLAGNIOL-VILLARD } 642352d2591SJean-Christophe PLAGNIOL-VILLARD 643352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 644352d2591SJean-Christophe PLAGNIOL-VILLARD 645352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_back (void) 646352d2591SJean-Christophe PLAGNIOL-VILLARD { 647352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_OFF console_col--; 648352d2591SJean-Christophe PLAGNIOL-VILLARD 649352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_col < 0) { 650352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = CONSOLE_COLS - 1; 651352d2591SJean-Christophe PLAGNIOL-VILLARD console_row--; 652352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_row < 0) 653352d2591SJean-Christophe PLAGNIOL-VILLARD console_row = 0; 654352d2591SJean-Christophe PLAGNIOL-VILLARD } 655352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 656352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 657352d2591SJean-Christophe PLAGNIOL-VILLARD ' '); 658352d2591SJean-Christophe PLAGNIOL-VILLARD } 659352d2591SJean-Christophe PLAGNIOL-VILLARD 660352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 661352d2591SJean-Christophe PLAGNIOL-VILLARD 662352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_newline (void) 663352d2591SJean-Christophe PLAGNIOL-VILLARD { 66420c450efSAnatolij Gustschin /* Check if last character in the line was just drawn. If so, cursor was 66520c450efSAnatolij Gustschin overwriten and need not to be cleared. Cursor clearing without this 66620c450efSAnatolij Gustschin check causes overwriting the 1st character of the line if line lenght 66720c450efSAnatolij Gustschin is >= CONSOLE_COLS 66820c450efSAnatolij Gustschin */ 66920c450efSAnatolij Gustschin if (console_col < CONSOLE_COLS) 67020c450efSAnatolij Gustschin CURSOR_OFF 67120c450efSAnatolij Gustschin console_row++; 672352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = 0; 673352d2591SJean-Christophe PLAGNIOL-VILLARD 674352d2591SJean-Christophe PLAGNIOL-VILLARD /* Check if we need to scroll the terminal */ 675352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_row >= CONSOLE_ROWS) { 676352d2591SJean-Christophe PLAGNIOL-VILLARD /* Scroll everything up */ 677352d2591SJean-Christophe PLAGNIOL-VILLARD console_scrollup (); 678352d2591SJean-Christophe PLAGNIOL-VILLARD 679352d2591SJean-Christophe PLAGNIOL-VILLARD /* Decrement row number */ 680352d2591SJean-Christophe PLAGNIOL-VILLARD console_row--; 681352d2591SJean-Christophe PLAGNIOL-VILLARD } 682352d2591SJean-Christophe PLAGNIOL-VILLARD } 683352d2591SJean-Christophe PLAGNIOL-VILLARD 68420c450efSAnatolij Gustschin static void console_cr (void) 68520c450efSAnatolij Gustschin { 68620c450efSAnatolij Gustschin CURSOR_OFF console_col = 0; 68720c450efSAnatolij Gustschin } 68820c450efSAnatolij Gustschin 689352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 690352d2591SJean-Christophe PLAGNIOL-VILLARD 691352d2591SJean-Christophe PLAGNIOL-VILLARD void video_putc (const char c) 692352d2591SJean-Christophe PLAGNIOL-VILLARD { 69320c450efSAnatolij Gustschin static int nl = 1; 69420c450efSAnatolij Gustschin 695352d2591SJean-Christophe PLAGNIOL-VILLARD switch (c) { 69620c450efSAnatolij Gustschin case 13: /* back to first column */ 69720c450efSAnatolij Gustschin console_cr (); 698352d2591SJean-Christophe PLAGNIOL-VILLARD break; 699352d2591SJean-Christophe PLAGNIOL-VILLARD 700352d2591SJean-Christophe PLAGNIOL-VILLARD case '\n': /* next line */ 70120c450efSAnatolij Gustschin if (console_col || (!console_col && nl)) 702352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline (); 70320c450efSAnatolij Gustschin nl = 1; 704352d2591SJean-Christophe PLAGNIOL-VILLARD break; 705352d2591SJean-Christophe PLAGNIOL-VILLARD 706352d2591SJean-Christophe PLAGNIOL-VILLARD case 9: /* tab 8 */ 707352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_OFF console_col |= 0x0008; 708352d2591SJean-Christophe PLAGNIOL-VILLARD console_col &= ~0x0007; 709352d2591SJean-Christophe PLAGNIOL-VILLARD 710352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_col >= CONSOLE_COLS) 711352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline (); 712352d2591SJean-Christophe PLAGNIOL-VILLARD break; 713352d2591SJean-Christophe PLAGNIOL-VILLARD 714352d2591SJean-Christophe PLAGNIOL-VILLARD case 8: /* backspace */ 715352d2591SJean-Christophe PLAGNIOL-VILLARD console_back (); 716352d2591SJean-Christophe PLAGNIOL-VILLARD break; 717352d2591SJean-Christophe PLAGNIOL-VILLARD 718352d2591SJean-Christophe PLAGNIOL-VILLARD default: /* draw the char */ 719352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 720352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 721352d2591SJean-Christophe PLAGNIOL-VILLARD c); 722352d2591SJean-Christophe PLAGNIOL-VILLARD console_col++; 723352d2591SJean-Christophe PLAGNIOL-VILLARD 724352d2591SJean-Christophe PLAGNIOL-VILLARD /* check for newline */ 72520c450efSAnatolij Gustschin if (console_col >= CONSOLE_COLS) { 726352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline (); 72720c450efSAnatolij Gustschin nl = 0; 72820c450efSAnatolij Gustschin } 729352d2591SJean-Christophe PLAGNIOL-VILLARD } 730352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_SET} 731352d2591SJean-Christophe PLAGNIOL-VILLARD 732352d2591SJean-Christophe PLAGNIOL-VILLARD 733352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 734352d2591SJean-Christophe PLAGNIOL-VILLARD 735352d2591SJean-Christophe PLAGNIOL-VILLARD void video_puts (const char *s) 736352d2591SJean-Christophe PLAGNIOL-VILLARD { 737352d2591SJean-Christophe PLAGNIOL-VILLARD int count = strlen (s); 738352d2591SJean-Christophe PLAGNIOL-VILLARD 739352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) 740352d2591SJean-Christophe PLAGNIOL-VILLARD video_putc (*s++); 741352d2591SJean-Christophe PLAGNIOL-VILLARD } 742352d2591SJean-Christophe PLAGNIOL-VILLARD 743352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 744352d2591SJean-Christophe PLAGNIOL-VILLARD 745352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) 746352d2591SJean-Christophe PLAGNIOL-VILLARD 747352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_8BIT_332RGB(r,g,b) { \ 748352d2591SJean-Christophe PLAGNIOL-VILLARD *fb = ((r>>5)<<5) | ((g>>5)<<2) | (b>>6); \ 749352d2591SJean-Christophe PLAGNIOL-VILLARD fb ++; \ 750352d2591SJean-Christophe PLAGNIOL-VILLARD } 751352d2591SJean-Christophe PLAGNIOL-VILLARD 752352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_15BIT_555RGB(r,g,b) { \ 753352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *)fb = SWAP16((unsigned short)(((r>>3)<<10) | ((g>>3)<<5) | (b>>3))); \ 754352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 2; \ 755352d2591SJean-Christophe PLAGNIOL-VILLARD } 756352d2591SJean-Christophe PLAGNIOL-VILLARD 757352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_16BIT_565RGB(r,g,b) { \ 758352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *)fb = SWAP16((unsigned short)((((r)>>3)<<11) | (((g)>>2)<<5) | ((b)>>3))); \ 759352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 2; \ 760352d2591SJean-Christophe PLAGNIOL-VILLARD } 761352d2591SJean-Christophe PLAGNIOL-VILLARD 762352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_32BIT_X888RGB(r,g,b) { \ 763352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned long *)fb = SWAP32((unsigned long)(((r<<16) | (g<<8) | b))); \ 764352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 4; \ 765352d2591SJean-Christophe PLAGNIOL-VILLARD } 766352d2591SJean-Christophe PLAGNIOL-VILLARD 767352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 768352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) { \ 769352d2591SJean-Christophe PLAGNIOL-VILLARD fb[0] = b; \ 770352d2591SJean-Christophe PLAGNIOL-VILLARD fb[1] = g; \ 771352d2591SJean-Christophe PLAGNIOL-VILLARD fb[2] = r; \ 772352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 3; \ 773352d2591SJean-Christophe PLAGNIOL-VILLARD } 774352d2591SJean-Christophe PLAGNIOL-VILLARD #else 775352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) { \ 776352d2591SJean-Christophe PLAGNIOL-VILLARD fb[0] = r; \ 777352d2591SJean-Christophe PLAGNIOL-VILLARD fb[1] = g; \ 778352d2591SJean-Christophe PLAGNIOL-VILLARD fb[2] = b; \ 779352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 3; \ 780352d2591SJean-Christophe PLAGNIOL-VILLARD } 781352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 782352d2591SJean-Christophe PLAGNIOL-VILLARD 783e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 784e84d568fSAnatolij Gustschin static void inline fill_555rgb_pswap(uchar *fb, int x, 785e84d568fSAnatolij Gustschin u8 r, u8 g, u8 b) 786e84d568fSAnatolij Gustschin { 787e84d568fSAnatolij Gustschin ushort *dst = (ushort *)fb; 788e84d568fSAnatolij Gustschin ushort color = (ushort)(((r >> 3) << 10) | 789e84d568fSAnatolij Gustschin ((g >> 3) << 5) | 790e84d568fSAnatolij Gustschin (b >> 3)); 791e84d568fSAnatolij Gustschin if (x & 1) 792e84d568fSAnatolij Gustschin *(--dst) = color; 793e84d568fSAnatolij Gustschin else 794e84d568fSAnatolij Gustschin *(++dst) = color; 795e84d568fSAnatolij Gustschin } 796e84d568fSAnatolij Gustschin #endif 797352d2591SJean-Christophe PLAGNIOL-VILLARD 798352d2591SJean-Christophe PLAGNIOL-VILLARD /* 799352d2591SJean-Christophe PLAGNIOL-VILLARD * Display the BMP file located at address bmp_image. 800352d2591SJean-Christophe PLAGNIOL-VILLARD * Only uncompressed 801352d2591SJean-Christophe PLAGNIOL-VILLARD */ 802352d2591SJean-Christophe PLAGNIOL-VILLARD int video_display_bitmap (ulong bmp_image, int x, int y) 803352d2591SJean-Christophe PLAGNIOL-VILLARD { 804352d2591SJean-Christophe PLAGNIOL-VILLARD ushort xcount, ycount; 805352d2591SJean-Christophe PLAGNIOL-VILLARD uchar *fb; 806352d2591SJean-Christophe PLAGNIOL-VILLARD bmp_image_t *bmp = (bmp_image_t *) bmp_image; 807352d2591SJean-Christophe PLAGNIOL-VILLARD uchar *bmap; 808352d2591SJean-Christophe PLAGNIOL-VILLARD ushort padded_line; 809352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned long width, height, bpp; 810352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned colors; 811352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned long compression; 812352d2591SJean-Christophe PLAGNIOL-VILLARD bmp_color_table_entry_t cte; 813352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 814352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *dst = NULL; 815352d2591SJean-Christophe PLAGNIOL-VILLARD ulong len; 816352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 817352d2591SJean-Christophe PLAGNIOL-VILLARD 818352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 819352d2591SJean-Christophe PLAGNIOL-VILLARD 820352d2591SJean-Christophe PLAGNIOL-VILLARD if (!((bmp->header.signature[0] == 'B') && 821352d2591SJean-Christophe PLAGNIOL-VILLARD (bmp->header.signature[1] == 'M'))) { 822352d2591SJean-Christophe PLAGNIOL-VILLARD 823352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 824352d2591SJean-Christophe PLAGNIOL-VILLARD /* 825352d2591SJean-Christophe PLAGNIOL-VILLARD * Could be a gzipped bmp image, try to decrompress... 826352d2591SJean-Christophe PLAGNIOL-VILLARD */ 8276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD len = CONFIG_SYS_VIDEO_LOGO_MAX_SIZE; 8286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD dst = malloc(CONFIG_SYS_VIDEO_LOGO_MAX_SIZE); 829352d2591SJean-Christophe PLAGNIOL-VILLARD if (dst == NULL) { 830352d2591SJean-Christophe PLAGNIOL-VILLARD printf("Error: malloc in gunzip failed!\n"); 831352d2591SJean-Christophe PLAGNIOL-VILLARD return(1); 832352d2591SJean-Christophe PLAGNIOL-VILLARD } 8336d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (gunzip(dst, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE, (uchar *)bmp_image, &len) != 0) { 834352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: no valid bmp or bmp.gz image at %lx\n", bmp_image); 835352d2591SJean-Christophe PLAGNIOL-VILLARD free(dst); 836352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 837352d2591SJean-Christophe PLAGNIOL-VILLARD } 8386d0f6bcfSJean-Christophe PLAGNIOL-VILLARD if (len == CONFIG_SYS_VIDEO_LOGO_MAX_SIZE) { 8396d0f6bcfSJean-Christophe PLAGNIOL-VILLARD printf("Image could be truncated (increase CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)!\n"); 840352d2591SJean-Christophe PLAGNIOL-VILLARD } 841352d2591SJean-Christophe PLAGNIOL-VILLARD 842352d2591SJean-Christophe PLAGNIOL-VILLARD /* 843352d2591SJean-Christophe PLAGNIOL-VILLARD * Set addr to decompressed image 844352d2591SJean-Christophe PLAGNIOL-VILLARD */ 845352d2591SJean-Christophe PLAGNIOL-VILLARD bmp = (bmp_image_t *)dst; 846352d2591SJean-Christophe PLAGNIOL-VILLARD 847352d2591SJean-Christophe PLAGNIOL-VILLARD if (!((bmp->header.signature[0] == 'B') && 848352d2591SJean-Christophe PLAGNIOL-VILLARD (bmp->header.signature[1] == 'M'))) { 849352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: no valid bmp.gz image at %lx\n", bmp_image); 850a49e0d17SMatthias Fuchs free(dst); 851352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 852352d2591SJean-Christophe PLAGNIOL-VILLARD } 853352d2591SJean-Christophe PLAGNIOL-VILLARD #else 854352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: no valid bmp image at %lx\n", bmp_image); 855352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 856352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_BMP_GZIP */ 857352d2591SJean-Christophe PLAGNIOL-VILLARD } 858352d2591SJean-Christophe PLAGNIOL-VILLARD 859352d2591SJean-Christophe PLAGNIOL-VILLARD width = le32_to_cpu (bmp->header.width); 860352d2591SJean-Christophe PLAGNIOL-VILLARD height = le32_to_cpu (bmp->header.height); 861352d2591SJean-Christophe PLAGNIOL-VILLARD bpp = le16_to_cpu (bmp->header.bit_count); 862352d2591SJean-Christophe PLAGNIOL-VILLARD colors = le32_to_cpu (bmp->header.colors_used); 863352d2591SJean-Christophe PLAGNIOL-VILLARD compression = le32_to_cpu (bmp->header.compression); 864352d2591SJean-Christophe PLAGNIOL-VILLARD 865352d2591SJean-Christophe PLAGNIOL-VILLARD debug ("Display-bmp: %d x %d with %d colors\n", 866352d2591SJean-Christophe PLAGNIOL-VILLARD width, height, colors); 867352d2591SJean-Christophe PLAGNIOL-VILLARD 868352d2591SJean-Christophe PLAGNIOL-VILLARD if (compression != BMP_BI_RGB) { 869352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: compression type %ld not supported\n", 870352d2591SJean-Christophe PLAGNIOL-VILLARD compression); 871a49e0d17SMatthias Fuchs #ifdef CONFIG_VIDEO_BMP_GZIP 872a49e0d17SMatthias Fuchs if (dst) 873a49e0d17SMatthias Fuchs free(dst); 874a49e0d17SMatthias Fuchs #endif 875352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 876352d2591SJean-Christophe PLAGNIOL-VILLARD } 877352d2591SJean-Christophe PLAGNIOL-VILLARD 878352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3; 879352d2591SJean-Christophe PLAGNIOL-VILLARD 880352d2591SJean-Christophe PLAGNIOL-VILLARD if ((x + width) > VIDEO_VISIBLE_COLS) 881352d2591SJean-Christophe PLAGNIOL-VILLARD width = VIDEO_VISIBLE_COLS - x; 882352d2591SJean-Christophe PLAGNIOL-VILLARD if ((y + height) > VIDEO_VISIBLE_ROWS) 883352d2591SJean-Christophe PLAGNIOL-VILLARD height = VIDEO_VISIBLE_ROWS - y; 884352d2591SJean-Christophe PLAGNIOL-VILLARD 885352d2591SJean-Christophe PLAGNIOL-VILLARD bmap = (uchar *) bmp + le32_to_cpu (bmp->header.data_offset); 886352d2591SJean-Christophe PLAGNIOL-VILLARD fb = (uchar *) (video_fb_address + 887352d2591SJean-Christophe PLAGNIOL-VILLARD ((y + height - 1) * VIDEO_COLS * VIDEO_PIXEL_SIZE) + 888352d2591SJean-Christophe PLAGNIOL-VILLARD x * VIDEO_PIXEL_SIZE); 889352d2591SJean-Christophe PLAGNIOL-VILLARD 890352d2591SJean-Christophe PLAGNIOL-VILLARD /* We handle only 8bpp or 24 bpp bitmap */ 891352d2591SJean-Christophe PLAGNIOL-VILLARD switch (le16_to_cpu (bmp->header.bit_count)) { 892352d2591SJean-Christophe PLAGNIOL-VILLARD case 8: 893352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line -= width; 894352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) { 895352d2591SJean-Christophe PLAGNIOL-VILLARD /* Copy colormap */ 896352d2591SJean-Christophe PLAGNIOL-VILLARD for (xcount = 0; xcount < colors; ++xcount) { 897352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[xcount]; 898352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (xcount, cte.red, cte.green, cte.blue); 899352d2591SJean-Christophe PLAGNIOL-VILLARD } 900352d2591SJean-Christophe PLAGNIOL-VILLARD } 901352d2591SJean-Christophe PLAGNIOL-VILLARD ycount = height; 902352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 903352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 904352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 905352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 906352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 907352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 908352d2591SJean-Christophe PLAGNIOL-VILLARD *fb++ = *bmap++; 909352d2591SJean-Christophe PLAGNIOL-VILLARD } 910352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 911352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 912352d2591SJean-Christophe PLAGNIOL-VILLARD } 913352d2591SJean-Christophe PLAGNIOL-VILLARD break; 914352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 915352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 916352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 917352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 918352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 919352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 920352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_8BIT_332RGB (cte.red, cte.green, cte.blue); 921352d2591SJean-Christophe PLAGNIOL-VILLARD } 922352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 923352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 924352d2591SJean-Christophe PLAGNIOL-VILLARD } 925352d2591SJean-Christophe PLAGNIOL-VILLARD break; 926352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 927352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 928e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 929e84d568fSAnatolij Gustschin int xpos = x; 930e84d568fSAnatolij Gustschin #endif 931352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 932352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 933352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 934352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 935cc347801SAndrew Dyer #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 936e84d568fSAnatolij Gustschin fill_555rgb_pswap (fb, xpos++, cte.red, 937e84d568fSAnatolij Gustschin cte.green, cte.blue); 938e84d568fSAnatolij Gustschin fb += 2; 939cc347801SAndrew Dyer #else 940cc347801SAndrew Dyer FILL_15BIT_555RGB (cte.red, cte.green, cte.blue); 941e84d568fSAnatolij Gustschin #endif 942352d2591SJean-Christophe PLAGNIOL-VILLARD } 943352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 944352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 945352d2591SJean-Christophe PLAGNIOL-VILLARD } 946352d2591SJean-Christophe PLAGNIOL-VILLARD break; 947352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 948352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 949352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 950352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 951352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 952352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 953352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_16BIT_565RGB (cte.red, cte.green, cte.blue); 954352d2591SJean-Christophe PLAGNIOL-VILLARD } 955352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 956352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 957352d2591SJean-Christophe PLAGNIOL-VILLARD } 958352d2591SJean-Christophe PLAGNIOL-VILLARD break; 959352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 960352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 961352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 962352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 963352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 964352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 965352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_32BIT_X888RGB (cte.red, cte.green, cte.blue); 966352d2591SJean-Christophe PLAGNIOL-VILLARD } 967352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 968352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 969352d2591SJean-Christophe PLAGNIOL-VILLARD } 970352d2591SJean-Christophe PLAGNIOL-VILLARD break; 971352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 972352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 973352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 974352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 975352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 976352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 977352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_24BIT_888RGB (cte.red, cte.green, cte.blue); 978352d2591SJean-Christophe PLAGNIOL-VILLARD } 979352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 980352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 981352d2591SJean-Christophe PLAGNIOL-VILLARD } 982352d2591SJean-Christophe PLAGNIOL-VILLARD break; 983352d2591SJean-Christophe PLAGNIOL-VILLARD } 984352d2591SJean-Christophe PLAGNIOL-VILLARD break; 985352d2591SJean-Christophe PLAGNIOL-VILLARD case 24: 986352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line -= 3 * width; 987352d2591SJean-Christophe PLAGNIOL-VILLARD ycount = height; 988352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 989352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 990352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 991352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 992352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 993352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 994352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_8BIT_332RGB (bmap[2], bmap[1], bmap[0]); 995352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 996352d2591SJean-Christophe PLAGNIOL-VILLARD } 997352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 998352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 999352d2591SJean-Christophe PLAGNIOL-VILLARD } 1000352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1001352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1002352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1003e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1004e84d568fSAnatolij Gustschin int xpos = x; 1005e84d568fSAnatolij Gustschin #endif 1006352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 1007352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1008352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1009cc347801SAndrew Dyer #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1010e84d568fSAnatolij Gustschin fill_555rgb_pswap (fb, xpos++, bmap[2], 1011e84d568fSAnatolij Gustschin bmap[1], bmap[0]); 1012e84d568fSAnatolij Gustschin fb += 2; 1013cc347801SAndrew Dyer #else 1014cc347801SAndrew Dyer FILL_15BIT_555RGB (bmap[2], bmap[1], bmap[0]); 1015e84d568fSAnatolij Gustschin #endif 1016352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1017352d2591SJean-Christophe PLAGNIOL-VILLARD } 1018352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 1019352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 1020352d2591SJean-Christophe PLAGNIOL-VILLARD } 1021352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1022352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1023352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1024352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 1025352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1026352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1027352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_16BIT_565RGB (bmap[2], bmap[1], bmap[0]); 1028352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1029352d2591SJean-Christophe PLAGNIOL-VILLARD } 1030352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 1031352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 1032352d2591SJean-Christophe PLAGNIOL-VILLARD } 1033352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1034352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1035352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1036352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 1037352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1038352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1039352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_32BIT_X888RGB (bmap[2], bmap[1], bmap[0]); 1040352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1041352d2591SJean-Christophe PLAGNIOL-VILLARD } 1042352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 1043352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 1044352d2591SJean-Christophe PLAGNIOL-VILLARD } 1045352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1046352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1047352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1048352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 1049352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 1050352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1051352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_24BIT_888RGB (bmap[2], bmap[1], bmap[0]); 1052352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1053352d2591SJean-Christophe PLAGNIOL-VILLARD } 1054352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 1055352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 1056352d2591SJean-Christophe PLAGNIOL-VILLARD } 1057352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1058352d2591SJean-Christophe PLAGNIOL-VILLARD default: 1059352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: 24 bits/pixel bitmap incompatible with current video mode\n"); 1060352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1061352d2591SJean-Christophe PLAGNIOL-VILLARD } 1062352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1063352d2591SJean-Christophe PLAGNIOL-VILLARD default: 1064352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: %d bit/pixel bitmaps not supported by U-Boot\n", 1065352d2591SJean-Christophe PLAGNIOL-VILLARD le16_to_cpu (bmp->header.bit_count)); 1066352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1067352d2591SJean-Christophe PLAGNIOL-VILLARD } 1068352d2591SJean-Christophe PLAGNIOL-VILLARD 1069352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 1070352d2591SJean-Christophe PLAGNIOL-VILLARD if (dst) { 1071352d2591SJean-Christophe PLAGNIOL-VILLARD free(dst); 1072352d2591SJean-Christophe PLAGNIOL-VILLARD } 1073352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1074352d2591SJean-Christophe PLAGNIOL-VILLARD 1075352d2591SJean-Christophe PLAGNIOL-VILLARD return (0); 1076352d2591SJean-Christophe PLAGNIOL-VILLARD } 1077352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1078352d2591SJean-Christophe PLAGNIOL-VILLARD 1079352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1080352d2591SJean-Christophe PLAGNIOL-VILLARD 1081352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 1082352d2591SJean-Christophe PLAGNIOL-VILLARD void logo_plot (void *screen, int width, int x, int y) 1083352d2591SJean-Christophe PLAGNIOL-VILLARD { 1084352d2591SJean-Christophe PLAGNIOL-VILLARD 1085352d2591SJean-Christophe PLAGNIOL-VILLARD int xcount, i; 1086352d2591SJean-Christophe PLAGNIOL-VILLARD int skip = (width - VIDEO_LOGO_WIDTH) * VIDEO_PIXEL_SIZE; 1087352d2591SJean-Christophe PLAGNIOL-VILLARD int ycount = VIDEO_LOGO_HEIGHT; 1088352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char r, g, b, *logo_red, *logo_blue, *logo_green; 1089352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *source; 1090d9015f6aSAnatolij Gustschin unsigned char *dest = (unsigned char *)screen + 1091d9015f6aSAnatolij Gustschin ((y * width * VIDEO_PIXEL_SIZE) + 1092d9015f6aSAnatolij Gustschin x * VIDEO_PIXEL_SIZE); 1093352d2591SJean-Christophe PLAGNIOL-VILLARD 1094352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 1095352d2591SJean-Christophe PLAGNIOL-VILLARD source = bmp_logo_bitmap; 1096352d2591SJean-Christophe PLAGNIOL-VILLARD 1097352d2591SJean-Christophe PLAGNIOL-VILLARD /* Allocate temporary space for computing colormap */ 1098352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red = malloc (BMP_LOGO_COLORS); 1099352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green = malloc (BMP_LOGO_COLORS); 1100352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue = malloc (BMP_LOGO_COLORS); 1101352d2591SJean-Christophe PLAGNIOL-VILLARD /* Compute color map */ 1102352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < VIDEO_LOGO_COLORS; i++) { 1103352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4; 1104352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green[i] = (bmp_logo_palette[i] & 0x00f0); 1105352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4; 1106352d2591SJean-Christophe PLAGNIOL-VILLARD } 1107352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1108352d2591SJean-Christophe PLAGNIOL-VILLARD source = linux_logo; 1109352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red = linux_logo_red; 1110352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green = linux_logo_green; 1111352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue = linux_logo_blue; 1112352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1113352d2591SJean-Christophe PLAGNIOL-VILLARD 1114352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) { 1115352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < VIDEO_LOGO_COLORS; i++) { 1116352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (i + VIDEO_LOGO_LUT_OFFSET, 1117352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red[i], logo_green[i], logo_blue[i]); 1118352d2591SJean-Christophe PLAGNIOL-VILLARD } 1119352d2591SJean-Christophe PLAGNIOL-VILLARD } 1120352d2591SJean-Christophe PLAGNIOL-VILLARD 1121352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1122e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1123e84d568fSAnatolij Gustschin int xpos = x; 1124e84d568fSAnatolij Gustschin #endif 1125352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = VIDEO_LOGO_WIDTH; 1126352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1127352d2591SJean-Christophe PLAGNIOL-VILLARD r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET]; 1128352d2591SJean-Christophe PLAGNIOL-VILLARD g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET]; 1129352d2591SJean-Christophe PLAGNIOL-VILLARD b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET]; 1130352d2591SJean-Christophe PLAGNIOL-VILLARD 1131352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1132352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 1133352d2591SJean-Christophe PLAGNIOL-VILLARD *dest = *source; 1134352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1135352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 1136352d2591SJean-Christophe PLAGNIOL-VILLARD *dest = ((r >> 5) << 5) | ((g >> 5) << 2) | (b >> 6); 1137352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1138352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1139cc347801SAndrew Dyer #if defined(VIDEO_FB_16BPP_PIXEL_SWAP) 1140cc347801SAndrew Dyer fill_555rgb_pswap (dest, xpos++, r, g, b); 1141cc347801SAndrew Dyer #else 1142352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *) dest = 1143352d2591SJean-Christophe PLAGNIOL-VILLARD SWAP16 ((unsigned short) (((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3))); 1144bed53753SAnatolij Gustschin #endif 1145352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1146352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1147352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *) dest = 1148352d2591SJean-Christophe PLAGNIOL-VILLARD SWAP16 ((unsigned short) (((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3))); 1149352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1150352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1151352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned long *) dest = 1152352d2591SJean-Christophe PLAGNIOL-VILLARD SWAP32 ((unsigned long) ((r << 16) | (g << 8) | b)); 1153352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1154352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1155352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 1156352d2591SJean-Christophe PLAGNIOL-VILLARD dest[0] = b; 1157352d2591SJean-Christophe PLAGNIOL-VILLARD dest[1] = g; 1158352d2591SJean-Christophe PLAGNIOL-VILLARD dest[2] = r; 1159352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1160352d2591SJean-Christophe PLAGNIOL-VILLARD dest[0] = r; 1161352d2591SJean-Christophe PLAGNIOL-VILLARD dest[1] = g; 1162352d2591SJean-Christophe PLAGNIOL-VILLARD dest[2] = b; 1163352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1164352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1165352d2591SJean-Christophe PLAGNIOL-VILLARD } 1166352d2591SJean-Christophe PLAGNIOL-VILLARD source++; 1167352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_PIXEL_SIZE; 1168352d2591SJean-Christophe PLAGNIOL-VILLARD } 1169352d2591SJean-Christophe PLAGNIOL-VILLARD dest += skip; 1170352d2591SJean-Christophe PLAGNIOL-VILLARD } 1171352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 1172352d2591SJean-Christophe PLAGNIOL-VILLARD free (logo_red); 1173352d2591SJean-Christophe PLAGNIOL-VILLARD free (logo_green); 1174352d2591SJean-Christophe PLAGNIOL-VILLARD free (logo_blue); 1175352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1176352d2591SJean-Christophe PLAGNIOL-VILLARD } 1177352d2591SJean-Christophe PLAGNIOL-VILLARD 1178352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1179352d2591SJean-Christophe PLAGNIOL-VILLARD 1180352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_logo (void) 1181352d2591SJean-Christophe PLAGNIOL-VILLARD { 1182352d2591SJean-Christophe PLAGNIOL-VILLARD char info[128]; 1183352d2591SJean-Christophe PLAGNIOL-VILLARD extern char version_string; 11843dcbe628SAnatolij Gustschin int space, len, y_off = 0; 1185352d2591SJean-Christophe PLAGNIOL-VILLARD 1186352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SPLASH_SCREEN 1187352d2591SJean-Christophe PLAGNIOL-VILLARD char *s; 1188352d2591SJean-Christophe PLAGNIOL-VILLARD ulong addr; 1189352d2591SJean-Christophe PLAGNIOL-VILLARD 1190352d2591SJean-Christophe PLAGNIOL-VILLARD if ((s = getenv ("splashimage")) != NULL) { 1191352d2591SJean-Christophe PLAGNIOL-VILLARD addr = simple_strtoul (s, NULL, 16); 1192352d2591SJean-Christophe PLAGNIOL-VILLARD 1193352d2591SJean-Christophe PLAGNIOL-VILLARD if (video_display_bitmap (addr, 0, 0) == 0) { 1194352d2591SJean-Christophe PLAGNIOL-VILLARD return ((void *) (video_fb_address)); 1195352d2591SJean-Christophe PLAGNIOL-VILLARD } 1196352d2591SJean-Christophe PLAGNIOL-VILLARD } 1197352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_SPLASH_SCREEN */ 1198352d2591SJean-Christophe PLAGNIOL-VILLARD 1199352d2591SJean-Christophe PLAGNIOL-VILLARD logo_plot (video_fb_address, VIDEO_COLS, 0, 0); 1200352d2591SJean-Christophe PLAGNIOL-VILLARD 1201352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf (info, " %s", &version_string); 12023dcbe628SAnatolij Gustschin 12033dcbe628SAnatolij Gustschin space = (VIDEO_LINE_LEN / 2 - VIDEO_INFO_X) / VIDEO_FONT_WIDTH; 12043dcbe628SAnatolij Gustschin len = strlen(info); 12053dcbe628SAnatolij Gustschin 12063dcbe628SAnatolij Gustschin if (len > space) { 12073dcbe628SAnatolij Gustschin video_drawchars (VIDEO_INFO_X, VIDEO_INFO_Y, 12083dcbe628SAnatolij Gustschin (uchar *)info, space); 12093dcbe628SAnatolij Gustschin video_drawchars (VIDEO_INFO_X + VIDEO_FONT_WIDTH, 12103dcbe628SAnatolij Gustschin VIDEO_INFO_Y + VIDEO_FONT_HEIGHT, 12113dcbe628SAnatolij Gustschin (uchar *)info + space, len - space); 12123dcbe628SAnatolij Gustschin y_off = 1; 12133dcbe628SAnatolij Gustschin } else 1214352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *)info); 1215352d2591SJean-Christophe PLAGNIOL-VILLARD 1216352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO 1217352d2591SJean-Christophe PLAGNIOL-VILLARD { 1218352d2591SJean-Christophe PLAGNIOL-VILLARD int i, n = ((VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT) / VIDEO_FONT_HEIGHT); 1219352d2591SJean-Christophe PLAGNIOL-VILLARD 1220352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 1; i < n; i++) { 1221352d2591SJean-Christophe PLAGNIOL-VILLARD video_get_info_str (i, info); 12223dcbe628SAnatolij Gustschin if (!*info) 12233dcbe628SAnatolij Gustschin continue; 12243dcbe628SAnatolij Gustschin 12253dcbe628SAnatolij Gustschin len = strlen(info); 12263dcbe628SAnatolij Gustschin if (len > space) { 12273dcbe628SAnatolij Gustschin video_drawchars (VIDEO_INFO_X, 12283dcbe628SAnatolij Gustschin VIDEO_INFO_Y + 12293dcbe628SAnatolij Gustschin (i + y_off) * VIDEO_FONT_HEIGHT, 12303dcbe628SAnatolij Gustschin (uchar *)info, space); 12313dcbe628SAnatolij Gustschin y_off++; 12323dcbe628SAnatolij Gustschin video_drawchars (VIDEO_INFO_X + VIDEO_FONT_WIDTH, 12333dcbe628SAnatolij Gustschin VIDEO_INFO_Y + 12343dcbe628SAnatolij Gustschin (i + y_off) * VIDEO_FONT_HEIGHT, 12353dcbe628SAnatolij Gustschin (uchar *)info + space, 12363dcbe628SAnatolij Gustschin len - space); 12373dcbe628SAnatolij Gustschin } else { 1238352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_INFO_X, 12393dcbe628SAnatolij Gustschin VIDEO_INFO_Y + 12403dcbe628SAnatolij Gustschin (i + y_off) * VIDEO_FONT_HEIGHT, 1241352d2591SJean-Christophe PLAGNIOL-VILLARD (uchar *)info); 1242352d2591SJean-Christophe PLAGNIOL-VILLARD } 1243352d2591SJean-Christophe PLAGNIOL-VILLARD } 12443dcbe628SAnatolij Gustschin } 1245352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1246352d2591SJean-Christophe PLAGNIOL-VILLARD 1247352d2591SJean-Christophe PLAGNIOL-VILLARD return (video_fb_address + VIDEO_LOGO_HEIGHT * VIDEO_LINE_LEN); 1248352d2591SJean-Christophe PLAGNIOL-VILLARD } 1249352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1250352d2591SJean-Christophe PLAGNIOL-VILLARD 1251352d2591SJean-Christophe PLAGNIOL-VILLARD 1252352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1253352d2591SJean-Christophe PLAGNIOL-VILLARD 1254352d2591SJean-Christophe PLAGNIOL-VILLARD static int video_init (void) 1255352d2591SJean-Christophe PLAGNIOL-VILLARD { 1256352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char color8; 1257352d2591SJean-Christophe PLAGNIOL-VILLARD 1258352d2591SJean-Christophe PLAGNIOL-VILLARD if ((pGD = video_hw_init ()) == NULL) 1259352d2591SJean-Christophe PLAGNIOL-VILLARD return -1; 1260352d2591SJean-Christophe PLAGNIOL-VILLARD 1261352d2591SJean-Christophe PLAGNIOL-VILLARD video_fb_address = (void *) VIDEO_FB_ADRS; 1262352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR 1263352d2591SJean-Christophe PLAGNIOL-VILLARD video_init_hw_cursor (VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT); 1264352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1265352d2591SJean-Christophe PLAGNIOL-VILLARD 1266352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init drawing pats */ 1267352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1268352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 1269352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (0x01, CONSOLE_FG_COL, CONSOLE_FG_COL, CONSOLE_FG_COL); 1270352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (0x00, CONSOLE_BG_COL, CONSOLE_BG_COL, CONSOLE_BG_COL); 1271352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = 0x01010101; 1272352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = 0x00000000; 1273352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1274352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 1275352d2591SJean-Christophe PLAGNIOL-VILLARD color8 = ((CONSOLE_FG_COL & 0xe0) | 1276352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) & 0x1c) | CONSOLE_FG_COL >> 6); 1277352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8; 1278352d2591SJean-Christophe PLAGNIOL-VILLARD color8 = ((CONSOLE_BG_COL & 0xe0) | 1279352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) & 0x1c) | CONSOLE_BG_COL >> 6); 1280352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8; 1281352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1282352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1283352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (((CONSOLE_FG_COL >> 3) << 26) | 1284352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) << 21) | ((CONSOLE_FG_COL >> 3) << 16) | 1285352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) << 10) | ((CONSOLE_FG_COL >> 3) << 5) | 1286352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL >> 3)); 1287352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (((CONSOLE_BG_COL >> 3) << 26) | 1288352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) << 21) | ((CONSOLE_BG_COL >> 3) << 16) | 1289352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) << 10) | ((CONSOLE_BG_COL >> 3) << 5) | 1290352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL >> 3)); 1291352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1292352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1293352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (((CONSOLE_FG_COL >> 3) << 27) | 1294352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 2) << 21) | ((CONSOLE_FG_COL >> 3) << 16) | 1295352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) << 11) | ((CONSOLE_FG_COL >> 2) << 5) | 1296352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL >> 3)); 1297352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (((CONSOLE_BG_COL >> 3) << 27) | 1298352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 2) << 21) | ((CONSOLE_BG_COL >> 3) << 16) | 1299352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) << 11) | ((CONSOLE_BG_COL >> 2) << 5) | 1300352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL >> 3)); 1301352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1302352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1303352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (CONSOLE_FG_COL << 16) | (CONSOLE_FG_COL << 8) | CONSOLE_FG_COL; 1304352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (CONSOLE_BG_COL << 16) | (CONSOLE_BG_COL << 8) | CONSOLE_BG_COL; 1305352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1306352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1307352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (CONSOLE_FG_COL << 24) | (CONSOLE_FG_COL << 16) | 1308352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL << 8) | CONSOLE_FG_COL; 1309352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (CONSOLE_BG_COL << 24) | (CONSOLE_BG_COL << 16) | 1310352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL << 8) | CONSOLE_BG_COL; 1311352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1312352d2591SJean-Christophe PLAGNIOL-VILLARD } 1313352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 1314352d2591SJean-Christophe PLAGNIOL-VILLARD 1315352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 1316352d2591SJean-Christophe PLAGNIOL-VILLARD /* Plot the logo and get start point of console */ 1317352d2591SJean-Christophe PLAGNIOL-VILLARD PRINTD ("Video: Drawing the logo ...\n"); 1318352d2591SJean-Christophe PLAGNIOL-VILLARD video_console_address = video_logo (); 1319352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1320352d2591SJean-Christophe PLAGNIOL-VILLARD video_console_address = video_fb_address; 1321352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1322352d2591SJean-Christophe PLAGNIOL-VILLARD 1323352d2591SJean-Christophe PLAGNIOL-VILLARD /* Initialize the console */ 1324352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = 0; 1325352d2591SJean-Christophe PLAGNIOL-VILLARD console_row = 0; 1326352d2591SJean-Christophe PLAGNIOL-VILLARD 1327352d2591SJean-Christophe PLAGNIOL-VILLARD return 0; 1328352d2591SJean-Christophe PLAGNIOL-VILLARD } 1329352d2591SJean-Christophe PLAGNIOL-VILLARD 1330352d2591SJean-Christophe PLAGNIOL-VILLARD 1331352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1332352d2591SJean-Christophe PLAGNIOL-VILLARD 1333*6cc7ba9eSWolfgang Denk /* 1334*6cc7ba9eSWolfgang Denk * Implement a weak default function for boards that optionally 1335*6cc7ba9eSWolfgang Denk * need to skip the video initialization. 1336*6cc7ba9eSWolfgang Denk */ 1337*6cc7ba9eSWolfgang Denk int __board_video_skip(void) 1338*6cc7ba9eSWolfgang Denk { 1339*6cc7ba9eSWolfgang Denk /* As default, don't skip test */ 1340*6cc7ba9eSWolfgang Denk return 0; 1341*6cc7ba9eSWolfgang Denk } 1342*6cc7ba9eSWolfgang Denk int board_video_skip(void) __attribute__((weak, alias("__board_video_skip"))); 1343*6cc7ba9eSWolfgang Denk 1344352d2591SJean-Christophe PLAGNIOL-VILLARD int drv_video_init (void) 1345352d2591SJean-Christophe PLAGNIOL-VILLARD { 1346352d2591SJean-Christophe PLAGNIOL-VILLARD int skip_dev_init; 1347352d2591SJean-Christophe PLAGNIOL-VILLARD device_t console_dev; 1348352d2591SJean-Christophe PLAGNIOL-VILLARD 1349*6cc7ba9eSWolfgang Denk /* Check if video initialization should be skipped */ 1350*6cc7ba9eSWolfgang Denk if (board_video_skip()) 1351*6cc7ba9eSWolfgang Denk return 0; 1352*6cc7ba9eSWolfgang Denk 1353352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init video chip - returns with framebuffer cleared */ 1354f62f6469SWolfgang Denk skip_dev_init = (video_init () == -1); 1355352d2591SJean-Christophe PLAGNIOL-VILLARD 1356f62f6469SWolfgang Denk #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE) 1357f62f6469SWolfgang Denk PRINTD ("KBD: Keyboard init ...\n"); 1358f62f6469SWolfgang Denk skip_dev_init |= (VIDEO_KBD_INIT_FCT == -1); 1359f62f6469SWolfgang Denk #endif 1360f62f6469SWolfgang Denk 1361f62f6469SWolfgang Denk if (skip_dev_init) 1362f62f6469SWolfgang Denk return 0; 1363f62f6469SWolfgang Denk 1364352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init vga device */ 1365352d2591SJean-Christophe PLAGNIOL-VILLARD memset (&console_dev, 0, sizeof (console_dev)); 1366352d2591SJean-Christophe PLAGNIOL-VILLARD strcpy (console_dev.name, "vga"); 1367352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.ext = DEV_EXT_VIDEO; /* Video extensions */ 1368352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM; 1369352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.putc = video_putc; /* 'putc' function */ 1370352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.puts = video_puts; /* 'puts' function */ 1371352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.tstc = NULL; /* 'tstc' function */ 1372352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.getc = NULL; /* 'getc' function */ 1373352d2591SJean-Christophe PLAGNIOL-VILLARD 1374f62f6469SWolfgang Denk #if !defined(CONFIG_VGA_AS_SINGLE_DEVICE) 1375f62f6469SWolfgang Denk /* Also init console device */ 1376f62f6469SWolfgang Denk console_dev.flags |= DEV_FLAGS_INPUT; 1377352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */ 1378352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.getc = VIDEO_GETC_FCT; /* 'getc' function */ 1379352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VGA_AS_SINGLE_DEVICE */ 1380f62f6469SWolfgang Denk 1381f62f6469SWolfgang Denk if (device_register (&console_dev) != 0) 1382352d2591SJean-Christophe PLAGNIOL-VILLARD return 0; 1383f62f6469SWolfgang Denk 1384f62f6469SWolfgang Denk /* Return success */ 1385f62f6469SWolfgang Denk return 1; 1386352d2591SJean-Christophe PLAGNIOL-VILLARD } 1387