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) 64352d2591SJean-Christophe PLAGNIOL-VILLARD CFG_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 #ifdef CONFIG_CFB_CONSOLE 96352d2591SJean-Christophe PLAGNIOL-VILLARD 97352d2591SJean-Christophe PLAGNIOL-VILLARD #include <malloc.h> 98352d2591SJean-Christophe PLAGNIOL-VILLARD 99352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 100352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device defines with SMI graphic */ 101352d2591SJean-Christophe PLAGNIOL-VILLARD /* Any other graphic must change this section */ 102352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 103352d2591SJean-Christophe PLAGNIOL-VILLARD 104352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SMI_LYNXEM 105352d2591SJean-Christophe PLAGNIOL-VILLARD 106352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 107352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 108352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 109352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 110352d2591SJean-Christophe PLAGNIOL-VILLARD 111352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 112352d2591SJean-Christophe PLAGNIOL-VILLARD /* Defines for the CT69000 driver */ 113352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 114352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_CT69000 115352d2591SJean-Christophe PLAGNIOL-VILLARD 116352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 117352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 118352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 119352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 120352d2591SJean-Christophe PLAGNIOL-VILLARD 121352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 122352d2591SJean-Christophe PLAGNIOL-VILLARD /* Defines for the SED13806 driver */ 123352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 124352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SED13806 125352d2591SJean-Christophe PLAGNIOL-VILLARD 126352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_TOTAL5200 127352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 128352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 129352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 130352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 131352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 132352d2591SJean-Christophe PLAGNIOL-VILLARD 133352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 134352d2591SJean-Christophe PLAGNIOL-VILLARD /* Defines for the SED13806 driver */ 135352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 136352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SM501 137352d2591SJean-Christophe PLAGNIOL-VILLARD 138352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_HH405 139352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 140352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 141352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 142352d2591SJean-Christophe PLAGNIOL-VILLARD 143352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 144352d2591SJean-Christophe PLAGNIOL-VILLARD /* Include video_fb.h after definitions of VIDEO_HW_RECTFILL etc */ 145352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 146352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_fb.h> 147352d2591SJean-Christophe PLAGNIOL-VILLARD 148352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 149352d2591SJean-Christophe PLAGNIOL-VILLARD /* some Macros */ 150352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 151352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_COLS (pGD->winSizeX) 152352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_ROWS (pGD->winSizeY) 153352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIXEL_SIZE (pGD->gdfBytesPP) 154352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_DATA_FORMAT (pGD->gdfIndex) 155352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_ADRS (pGD->frameAdrs) 156352d2591SJean-Christophe PLAGNIOL-VILLARD 157352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 158352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device defines with i8042 keyboard controller */ 159352d2591SJean-Christophe PLAGNIOL-VILLARD /* Any other keyboard controller must change this section */ 160352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 161352d2591SJean-Christophe PLAGNIOL-VILLARD 162352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_I8042_KBD 163352d2591SJean-Christophe PLAGNIOL-VILLARD #include <i8042.h> 164352d2591SJean-Christophe PLAGNIOL-VILLARD 165352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_KBD_INIT_FCT i8042_kbd_init() 166352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_TSTC_FCT i8042_tstc 167352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_GETC_FCT i8042_getc 168352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 169352d2591SJean-Christophe PLAGNIOL-VILLARD 170352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 171352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device */ 172352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 173352d2591SJean-Christophe PLAGNIOL-VILLARD 174352d2591SJean-Christophe PLAGNIOL-VILLARD #include <version.h> 175352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux/types.h> 176352d2591SJean-Christophe PLAGNIOL-VILLARD #include <devices.h> 177352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_font.h> 178352d2591SJean-Christophe PLAGNIOL-VILLARD 179352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_DATE) 180352d2591SJean-Christophe PLAGNIOL-VILLARD #include <rtc.h> 181352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 182352d2591SJean-Christophe PLAGNIOL-VILLARD 183352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) 184352d2591SJean-Christophe PLAGNIOL-VILLARD #include <watchdog.h> 185352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_layout.h> 186352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 187352d2591SJean-Christophe PLAGNIOL-VILLARD 188352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 189352d2591SJean-Christophe PLAGNIOL-VILLARD /* Cursor definition: */ 1907817cb20SMarcel Ziswiler /* CONFIG_CONSOLE_CURSOR: Uses a timer function (see drivers/input/i8042.c) */ 1917817cb20SMarcel Ziswiler /* to let the cursor blink. Uses the macros */ 1927817cb20SMarcel Ziswiler /* CURSOR_OFF and CURSOR_ON. */ 193352d2591SJean-Christophe PLAGNIOL-VILLARD /* CONFIG_VIDEO_SW_CURSOR: Draws a cursor after the last character. No */ 194352d2591SJean-Christophe PLAGNIOL-VILLARD /* blinking is provided. Uses the macros CURSOR_SET */ 195352d2591SJean-Christophe PLAGNIOL-VILLARD /* and CURSOR_OFF. */ 196352d2591SJean-Christophe PLAGNIOL-VILLARD /* CONFIG_VIDEO_HW_CURSOR: Uses the hardware cursor capability of the */ 197352d2591SJean-Christophe PLAGNIOL-VILLARD /* graphic chip. Uses the macro CURSOR_SET. */ 198352d2591SJean-Christophe PLAGNIOL-VILLARD /* ATTENTION: If booting an OS, the display driver */ 199352d2591SJean-Christophe PLAGNIOL-VILLARD /* must disable the hardware register of the graphic */ 200352d2591SJean-Christophe PLAGNIOL-VILLARD /* chip. Otherwise a blinking field is displayed */ 201352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 202352d2591SJean-Christophe PLAGNIOL-VILLARD #if !defined(CONFIG_CONSOLE_CURSOR) && \ 203352d2591SJean-Christophe PLAGNIOL-VILLARD !defined(CONFIG_VIDEO_SW_CURSOR) && \ 204352d2591SJean-Christophe PLAGNIOL-VILLARD !defined(CONFIG_VIDEO_HW_CURSOR) 205352d2591SJean-Christophe PLAGNIOL-VILLARD /* no Cursor defined */ 206352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 207352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF 208352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET 209352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 210352d2591SJean-Christophe PLAGNIOL-VILLARD 211352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 212352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 213352d2591SJean-Christophe PLAGNIOL-VILLARD #error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined 214352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 215352d2591SJean-Christophe PLAGNIOL-VILLARD void console_cursor (int state); 216352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON console_cursor(1); 217352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF console_cursor(0); 218352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET 219352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_I8042_KBD 2207817cb20SMarcel Ziswiler #warning Cursor drawing on/off needs timer function s.a. drivers/input/i8042.c 221352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 222352d2591SJean-Christophe PLAGNIOL-VILLARD #else 223352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_TIME 224352d2591SJean-Christophe PLAGNIOL-VILLARD #error CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME 225352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 226352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_CONSOLE_CURSOR */ 227352d2591SJean-Christophe PLAGNIOL-VILLARD 228352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SW_CURSOR 229352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 230352d2591SJean-Christophe PLAGNIOL-VILLARD #error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined 231352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 232352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 233352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\ 234352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, ' '); 235352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET video_set_cursor(); 236352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_SW_CURSOR */ 237352d2591SJean-Christophe PLAGNIOL-VILLARD 238352d2591SJean-Christophe PLAGNIOL-VILLARD 239352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR 240352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 241352d2591SJean-Christophe PLAGNIOL-VILLARD #error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined 242352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 243352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 244352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF 245352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET video_set_hw_cursor(console_col * VIDEO_FONT_WIDTH, \ 246352d2591SJean-Christophe PLAGNIOL-VILLARD (console_row * VIDEO_FONT_HEIGHT) + VIDEO_LOGO_HEIGHT); 247352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_HW_CURSOR */ 248352d2591SJean-Christophe PLAGNIOL-VILLARD 249352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 250352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 251352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_logo.h> 252352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH BMP_LOGO_WIDTH 253352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT BMP_LOGO_HEIGHT 254352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET BMP_LOGO_OFFSET 255352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS BMP_LOGO_COLORS 256352d2591SJean-Christophe PLAGNIOL-VILLARD 257352d2591SJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_VIDEO_BMP_LOGO */ 258352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_WIDTH 80 259352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_HEIGHT 80 260352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_COLORS 214 261352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_LUT_OFFSET 0x20 262352d2591SJean-Christophe PLAGNIOL-VILLARD #define __initdata 263352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux_logo.h> 264352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH LINUX_LOGO_WIDTH 265352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT LINUX_LOGO_HEIGHT 266352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET LINUX_LOGO_LUT_OFFSET 267352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS LINUX_LOGO_COLORS 268352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_BMP_LOGO */ 269352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_X (VIDEO_LOGO_WIDTH) 270352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_Y (VIDEO_FONT_HEIGHT/2) 271352d2591SJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_VIDEO_LOGO */ 272352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH 0 273352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT 0 274352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_LOGO */ 275352d2591SJean-Christophe PLAGNIOL-VILLARD 276352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_COLS VIDEO_VISIBLE_COLS 277352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_ROWS VIDEO_VISIBLE_ROWS 278352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_SIZE (VIDEO_ROWS*VIDEO_COLS*VIDEO_PIXEL_SIZE) 279352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIX_BLOCKS (VIDEO_SIZE >> 2) 280352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LINE_LEN (VIDEO_COLS*VIDEO_PIXEL_SIZE) 281352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_BURST_LEN (VIDEO_COLS/8) 282352d2591SJean-Christophe PLAGNIOL-VILLARD 283352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 284352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROWS ((VIDEO_ROWS - VIDEO_LOGO_HEIGHT) / VIDEO_FONT_HEIGHT) 285352d2591SJean-Christophe PLAGNIOL-VILLARD #else 286352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROWS (VIDEO_ROWS / VIDEO_FONT_HEIGHT) 287352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 288352d2591SJean-Christophe PLAGNIOL-VILLARD 289352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_COLS (VIDEO_COLS / VIDEO_FONT_WIDTH) 290352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * VIDEO_LINE_LEN) 291352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_FIRST (video_console_address) 292352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SECOND (video_console_address + CONSOLE_ROW_SIZE) 293352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_LAST (video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE) 294352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS) 295352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE) 296352d2591SJean-Christophe PLAGNIOL-VILLARD 297352d2591SJean-Christophe PLAGNIOL-VILLARD /* Macros */ 298352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 299352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP16(x) ((((x) & 0x00ff) << 8) | ( (x) >> 8)) 300352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP32(x) ((((x) & 0x000000ff) << 24) | (((x) & 0x0000ff00) << 8)|\ 301352d2591SJean-Christophe PLAGNIOL-VILLARD (((x) & 0x00ff0000) >> 8) | (((x) & 0xff000000) >> 24) ) 302352d2591SJean-Christophe PLAGNIOL-VILLARD #define SHORTSWAP32(x) ((((x) & 0x000000ff) << 8) | (((x) & 0x0000ff00) >> 8)|\ 303352d2591SJean-Christophe PLAGNIOL-VILLARD (((x) & 0x00ff0000) << 8) | (((x) & 0xff000000) >> 8) ) 304352d2591SJean-Christophe PLAGNIOL-VILLARD #else 305352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP16(x) (x) 306352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP32(x) (x) 307352d2591SJean-Christophe PLAGNIOL-VILLARD #define SHORTSWAP32(x) (x) 308352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 309352d2591SJean-Christophe PLAGNIOL-VILLARD 310352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(DEBUG) || defined(DEBUG_CFB_CONSOLE) 311352d2591SJean-Christophe PLAGNIOL-VILLARD #define PRINTD(x) printf(x) 312352d2591SJean-Christophe PLAGNIOL-VILLARD #else 313352d2591SJean-Christophe PLAGNIOL-VILLARD #define PRINTD(x) 314352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 315352d2591SJean-Christophe PLAGNIOL-VILLARD 316352d2591SJean-Christophe PLAGNIOL-VILLARD 317352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO 318352d2591SJean-Christophe PLAGNIOL-VILLARD extern void video_get_info_str ( /* setup a board string: type, speed, etc. */ 319352d2591SJean-Christophe PLAGNIOL-VILLARD int line_number, /* location to place info string beside logo */ 320352d2591SJean-Christophe PLAGNIOL-VILLARD char *info /* buffer for info string */ 321352d2591SJean-Christophe PLAGNIOL-VILLARD ); 322352d2591SJean-Christophe PLAGNIOL-VILLARD 323352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 324352d2591SJean-Christophe PLAGNIOL-VILLARD 325352d2591SJean-Christophe PLAGNIOL-VILLARD /* Locals */ 326352d2591SJean-Christophe PLAGNIOL-VILLARD static GraphicDevice *pGD; /* Pointer to Graphic array */ 327352d2591SJean-Christophe PLAGNIOL-VILLARD 328352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_fb_address; /* frame buffer address */ 329352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_console_address; /* console buffer start address */ 330352d2591SJean-Christophe PLAGNIOL-VILLARD 331352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_col = 0; /* cursor col */ 332352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_row = 0; /* cursor row */ 333352d2591SJean-Christophe PLAGNIOL-VILLARD 334352d2591SJean-Christophe PLAGNIOL-VILLARD static u32 eorx, fgx, bgx; /* color pats */ 335352d2591SJean-Christophe PLAGNIOL-VILLARD 336352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table8[] = { 337352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff, 338352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff, 339352d2591SJean-Christophe PLAGNIOL-VILLARD 0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff, 340352d2591SJean-Christophe PLAGNIOL-VILLARD 0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff }; 341352d2591SJean-Christophe PLAGNIOL-VILLARD 342352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table15[] = { 343352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x00007fff, 0x7fff0000, 0x7fff7fff }; 344352d2591SJean-Christophe PLAGNIOL-VILLARD 345352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table16[] = { 346352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff }; 347352d2591SJean-Christophe PLAGNIOL-VILLARD 348352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table24[16][3] = { 349352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00000000 }, 350352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00ffffff }, 351352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x0000ffff, 0xff000000 }, 352352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x0000ffff, 0xffffffff }, 353352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffff0000, 0x00000000 }, 354352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffff0000, 0x00ffffff }, 355352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffffffff, 0xff000000 }, 356352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffffffff, 0xffffffff }, 357352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x00000000, 0x00000000 }, 358352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x00000000, 0x00ffffff }, 359352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x0000ffff, 0xff000000 }, 360352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x0000ffff, 0xffffffff }, 361352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffff0000, 0x00000000 }, 362352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffff0000, 0x00ffffff }, 363352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffffffff, 0xff000000 }, 364352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffffffff, 0xffffffff } }; 365352d2591SJean-Christophe PLAGNIOL-VILLARD 366352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table32[16][4] = { 367352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, 368352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00000000, 0x00ffffff }, 369352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00ffffff, 0x00000000 }, 370352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00ffffff, 0x00ffffff }, 371352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00000000, 0x00000000 }, 372352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff }, 373352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00000000 }, 374352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00ffffff }, 375352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00000000, 0x00000000 }, 376352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00000000, 0x00ffffff }, 377352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000 }, 378352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00ffffff }, 379352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00000000 }, 380352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00ffffff }, 381352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00000000 }, 382352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff } }; 383352d2591SJean-Christophe PLAGNIOL-VILLARD 384352d2591SJean-Christophe PLAGNIOL-VILLARD 385352d2591SJean-Christophe PLAGNIOL-VILLARD int gunzip(void *, int, unsigned char *, unsigned long *); 386352d2591SJean-Christophe PLAGNIOL-VILLARD 387352d2591SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 388352d2591SJean-Christophe PLAGNIOL-VILLARD 389352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_drawchars (int xx, int yy, unsigned char *s, int count) 390352d2591SJean-Christophe PLAGNIOL-VILLARD { 391352d2591SJean-Christophe PLAGNIOL-VILLARD u8 *cdat, *dest, *dest0; 392352d2591SJean-Christophe PLAGNIOL-VILLARD int rows, offset, c; 393352d2591SJean-Christophe PLAGNIOL-VILLARD 394352d2591SJean-Christophe PLAGNIOL-VILLARD offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE; 395352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 = video_fb_address + offset; 396352d2591SJean-Christophe PLAGNIOL-VILLARD 397352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 398352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 399352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 400352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 401352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 402352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 403352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 404352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 405352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 406352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 407352d2591SJean-Christophe PLAGNIOL-VILLARD 408352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = (video_font_draw_table8[bits >> 4] & eorx) ^ bgx; 409352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = (video_font_draw_table8[bits & 15] & eorx) ^ bgx; 410352d2591SJean-Christophe PLAGNIOL-VILLARD } 411352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 412352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 413352d2591SJean-Christophe PLAGNIOL-VILLARD } 414352d2591SJean-Christophe PLAGNIOL-VILLARD break; 415352d2591SJean-Christophe PLAGNIOL-VILLARD 416352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 417352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 418352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 419352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 420352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 421352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 422352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 423352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 424352d2591SJean-Christophe PLAGNIOL-VILLARD 425352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 6] & eorx) ^ bgx); 426352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 4 & 3] & eorx) ^ bgx); 427352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 2 & 3] & eorx) ^ bgx); 428352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = SHORTSWAP32 ((video_font_draw_table15 [bits & 3] & eorx) ^ bgx); 429352d2591SJean-Christophe PLAGNIOL-VILLARD } 430352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 431352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 432352d2591SJean-Christophe PLAGNIOL-VILLARD } 433352d2591SJean-Christophe PLAGNIOL-VILLARD break; 434352d2591SJean-Christophe PLAGNIOL-VILLARD 435352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 436352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 437352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 438352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 439352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 440352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 441352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 442352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 443352d2591SJean-Christophe PLAGNIOL-VILLARD 444352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 6] & eorx) ^ bgx); 445352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 4 & 3] & eorx) ^ bgx); 446352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 2 & 3] & eorx) ^ bgx); 447352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = SHORTSWAP32 ((video_font_draw_table16 [bits & 3] & eorx) ^ bgx); 448352d2591SJean-Christophe PLAGNIOL-VILLARD } 449352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 450352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 451352d2591SJean-Christophe PLAGNIOL-VILLARD } 452352d2591SJean-Christophe PLAGNIOL-VILLARD break; 453352d2591SJean-Christophe PLAGNIOL-VILLARD 454352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 455352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 456352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 457352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 458352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 459352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 460352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 461352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 462352d2591SJean-Christophe PLAGNIOL-VILLARD 463352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = SWAP32 ((video_font_draw_table32 [bits >> 4][0] & eorx) ^ bgx); 464352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = SWAP32 ((video_font_draw_table32 [bits >> 4][1] & eorx) ^ bgx); 465352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = SWAP32 ((video_font_draw_table32 [bits >> 4][2] & eorx) ^ bgx); 466352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = SWAP32 ((video_font_draw_table32 [bits >> 4][3] & eorx) ^ bgx); 467352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[4] = SWAP32 ((video_font_draw_table32 [bits & 15][0] & eorx) ^ bgx); 468352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[5] = SWAP32 ((video_font_draw_table32 [bits & 15][1] & eorx) ^ bgx); 469352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[6] = SWAP32 ((video_font_draw_table32 [bits & 15][2] & eorx) ^ bgx); 470352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[7] = SWAP32 ((video_font_draw_table32 [bits & 15][3] & eorx) ^ bgx); 471352d2591SJean-Christophe PLAGNIOL-VILLARD } 472352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 473352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 474352d2591SJean-Christophe PLAGNIOL-VILLARD } 475352d2591SJean-Christophe PLAGNIOL-VILLARD break; 476352d2591SJean-Christophe PLAGNIOL-VILLARD 477352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 478352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 479352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 480352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 481352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 482352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 483352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 484352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 485352d2591SJean-Christophe PLAGNIOL-VILLARD 486352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = (video_font_draw_table24[bits >> 4][0] & eorx) ^ bgx; 487352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = (video_font_draw_table24[bits >> 4][1] & eorx) ^ bgx; 488352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = (video_font_draw_table24[bits >> 4][2] & eorx) ^ bgx; 489352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = (video_font_draw_table24[bits & 15][0] & eorx) ^ bgx; 490352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[4] = (video_font_draw_table24[bits & 15][1] & eorx) ^ bgx; 491352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[5] = (video_font_draw_table24[bits & 15][2] & eorx) ^ bgx; 492352d2591SJean-Christophe PLAGNIOL-VILLARD } 493352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 494352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 495352d2591SJean-Christophe PLAGNIOL-VILLARD } 496352d2591SJean-Christophe PLAGNIOL-VILLARD break; 497352d2591SJean-Christophe PLAGNIOL-VILLARD } 498352d2591SJean-Christophe PLAGNIOL-VILLARD } 499352d2591SJean-Christophe PLAGNIOL-VILLARD 500352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 501352d2591SJean-Christophe PLAGNIOL-VILLARD 502352d2591SJean-Christophe PLAGNIOL-VILLARD static inline void video_drawstring (int xx, int yy, unsigned char *s) 503352d2591SJean-Christophe PLAGNIOL-VILLARD { 504352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawchars (xx, yy, s, strlen ((char *)s)); 505352d2591SJean-Christophe PLAGNIOL-VILLARD } 506352d2591SJean-Christophe PLAGNIOL-VILLARD 507352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 508352d2591SJean-Christophe PLAGNIOL-VILLARD 509352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_putchar (int xx, int yy, unsigned char c) 510352d2591SJean-Christophe PLAGNIOL-VILLARD { 511352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawchars (xx, yy + VIDEO_LOGO_HEIGHT, &c, 1); 512352d2591SJean-Christophe PLAGNIOL-VILLARD } 513352d2591SJean-Christophe PLAGNIOL-VILLARD 514352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 515352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR) 516352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_set_cursor (void) 517352d2591SJean-Christophe PLAGNIOL-VILLARD { 518352d2591SJean-Christophe PLAGNIOL-VILLARD /* swap drawing colors */ 519352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx; 520352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = bgx; 521352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = eorx; 522352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 523352d2591SJean-Christophe PLAGNIOL-VILLARD /* draw cursor */ 524352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 525352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 526352d2591SJean-Christophe PLAGNIOL-VILLARD ' '); 527352d2591SJean-Christophe PLAGNIOL-VILLARD /* restore drawing colors */ 528352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx; 529352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = bgx; 530352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = eorx; 531352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 532352d2591SJean-Christophe PLAGNIOL-VILLARD } 533352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 534352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 535352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 536352d2591SJean-Christophe PLAGNIOL-VILLARD void console_cursor (int state) 537352d2591SJean-Christophe PLAGNIOL-VILLARD { 538352d2591SJean-Christophe PLAGNIOL-VILLARD static int last_state = 0; 539352d2591SJean-Christophe PLAGNIOL-VILLARD 540352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_TIME 541352d2591SJean-Christophe PLAGNIOL-VILLARD struct rtc_time tm; 542352d2591SJean-Christophe PLAGNIOL-VILLARD char info[16]; 543352d2591SJean-Christophe PLAGNIOL-VILLARD 544352d2591SJean-Christophe PLAGNIOL-VILLARD /* time update only if cursor is on (faster scroll) */ 545352d2591SJean-Christophe PLAGNIOL-VILLARD if (state) { 546352d2591SJean-Christophe PLAGNIOL-VILLARD rtc_get (&tm); 547352d2591SJean-Christophe PLAGNIOL-VILLARD 548352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf (info, " %02d:%02d:%02d ", tm.tm_hour, tm.tm_min, 549352d2591SJean-Christophe PLAGNIOL-VILLARD tm.tm_sec); 550352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, 551352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y, (uchar *)info); 552352d2591SJean-Christophe PLAGNIOL-VILLARD 553352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf (info, "%02d.%02d.%04d", tm.tm_mday, tm.tm_mon, 554352d2591SJean-Christophe PLAGNIOL-VILLARD tm.tm_year); 555352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, 556352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y + 1 * VIDEO_FONT_HEIGHT, (uchar *)info); 557352d2591SJean-Christophe PLAGNIOL-VILLARD } 558352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 559352d2591SJean-Christophe PLAGNIOL-VILLARD 560352d2591SJean-Christophe PLAGNIOL-VILLARD if (state && (last_state != state)) { 561352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_cursor (); 562352d2591SJean-Christophe PLAGNIOL-VILLARD } 563352d2591SJean-Christophe PLAGNIOL-VILLARD 564352d2591SJean-Christophe PLAGNIOL-VILLARD if (!state && (last_state != state)) { 565352d2591SJean-Christophe PLAGNIOL-VILLARD /* clear cursor */ 566352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 567352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 568352d2591SJean-Christophe PLAGNIOL-VILLARD ' '); 569352d2591SJean-Christophe PLAGNIOL-VILLARD } 570352d2591SJean-Christophe PLAGNIOL-VILLARD 571352d2591SJean-Christophe PLAGNIOL-VILLARD last_state = state; 572352d2591SJean-Christophe PLAGNIOL-VILLARD } 573352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 574352d2591SJean-Christophe PLAGNIOL-VILLARD 575352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 576352d2591SJean-Christophe PLAGNIOL-VILLARD 577352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_RECTFILL 578352d2591SJean-Christophe PLAGNIOL-VILLARD static void memsetl (int *p, int c, int v) 579352d2591SJean-Christophe PLAGNIOL-VILLARD { 580352d2591SJean-Christophe PLAGNIOL-VILLARD while (c--) 581352d2591SJean-Christophe PLAGNIOL-VILLARD *(p++) = v; 582352d2591SJean-Christophe PLAGNIOL-VILLARD } 583352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 584352d2591SJean-Christophe PLAGNIOL-VILLARD 585352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 586352d2591SJean-Christophe PLAGNIOL-VILLARD 587352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_BITBLT 588352d2591SJean-Christophe PLAGNIOL-VILLARD static void memcpyl (int *d, int *s, int c) 589352d2591SJean-Christophe PLAGNIOL-VILLARD { 590352d2591SJean-Christophe PLAGNIOL-VILLARD while (c--) 591352d2591SJean-Christophe PLAGNIOL-VILLARD *(d++) = *(s++); 592352d2591SJean-Christophe PLAGNIOL-VILLARD } 593352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 594352d2591SJean-Christophe PLAGNIOL-VILLARD 595352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 596352d2591SJean-Christophe PLAGNIOL-VILLARD 597352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_scrollup (void) 598352d2591SJean-Christophe PLAGNIOL-VILLARD { 599352d2591SJean-Christophe PLAGNIOL-VILLARD /* copy up rows ignoring the first one */ 600352d2591SJean-Christophe PLAGNIOL-VILLARD 601352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_BITBLT 602352d2591SJean-Christophe PLAGNIOL-VILLARD video_hw_bitblt (VIDEO_PIXEL_SIZE, /* bytes per pixel */ 603352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* source pos x */ 604352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_LOGO_HEIGHT + VIDEO_FONT_HEIGHT, /* source pos y */ 605352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* dest pos x */ 606352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_LOGO_HEIGHT, /* dest pos y */ 607352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS, /* frame width */ 608352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT /* frame height */ 609352d2591SJean-Christophe PLAGNIOL-VILLARD ); 610352d2591SJean-Christophe PLAGNIOL-VILLARD #else 611352d2591SJean-Christophe PLAGNIOL-VILLARD memcpyl (CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND, 612352d2591SJean-Christophe PLAGNIOL-VILLARD CONSOLE_SCROLL_SIZE >> 2); 613352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 614352d2591SJean-Christophe PLAGNIOL-VILLARD 615352d2591SJean-Christophe PLAGNIOL-VILLARD /* clear the last one */ 616352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_RECTFILL 617352d2591SJean-Christophe PLAGNIOL-VILLARD video_hw_rectfill (VIDEO_PIXEL_SIZE, /* bytes per pixel */ 618352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* dest pos x */ 619352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_ROWS - VIDEO_FONT_HEIGHT, /* dest pos y */ 620352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS, /* frame width */ 621352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_FONT_HEIGHT, /* frame height */ 622352d2591SJean-Christophe PLAGNIOL-VILLARD CONSOLE_BG_COL /* fill color */ 623352d2591SJean-Christophe PLAGNIOL-VILLARD ); 624352d2591SJean-Christophe PLAGNIOL-VILLARD #else 625352d2591SJean-Christophe PLAGNIOL-VILLARD memsetl (CONSOLE_ROW_LAST, CONSOLE_ROW_SIZE >> 2, CONSOLE_BG_COL); 626352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 627352d2591SJean-Christophe PLAGNIOL-VILLARD } 628352d2591SJean-Christophe PLAGNIOL-VILLARD 629352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 630352d2591SJean-Christophe PLAGNIOL-VILLARD 631352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_back (void) 632352d2591SJean-Christophe PLAGNIOL-VILLARD { 633352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_OFF console_col--; 634352d2591SJean-Christophe PLAGNIOL-VILLARD 635352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_col < 0) { 636352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = CONSOLE_COLS - 1; 637352d2591SJean-Christophe PLAGNIOL-VILLARD console_row--; 638352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_row < 0) 639352d2591SJean-Christophe PLAGNIOL-VILLARD console_row = 0; 640352d2591SJean-Christophe PLAGNIOL-VILLARD } 641352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 642352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 643352d2591SJean-Christophe PLAGNIOL-VILLARD ' '); 644352d2591SJean-Christophe PLAGNIOL-VILLARD } 645352d2591SJean-Christophe PLAGNIOL-VILLARD 646352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 647352d2591SJean-Christophe PLAGNIOL-VILLARD 648352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_newline (void) 649352d2591SJean-Christophe PLAGNIOL-VILLARD { 650*20c450efSAnatolij Gustschin /* Check if last character in the line was just drawn. If so, cursor was 651*20c450efSAnatolij Gustschin overwriten and need not to be cleared. Cursor clearing without this 652*20c450efSAnatolij Gustschin check causes overwriting the 1st character of the line if line lenght 653*20c450efSAnatolij Gustschin is >= CONSOLE_COLS 654*20c450efSAnatolij Gustschin */ 655*20c450efSAnatolij Gustschin if (console_col < CONSOLE_COLS) 656*20c450efSAnatolij Gustschin CURSOR_OFF 657*20c450efSAnatolij Gustschin console_row++; 658352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = 0; 659352d2591SJean-Christophe PLAGNIOL-VILLARD 660352d2591SJean-Christophe PLAGNIOL-VILLARD /* Check if we need to scroll the terminal */ 661352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_row >= CONSOLE_ROWS) { 662352d2591SJean-Christophe PLAGNIOL-VILLARD /* Scroll everything up */ 663352d2591SJean-Christophe PLAGNIOL-VILLARD console_scrollup (); 664352d2591SJean-Christophe PLAGNIOL-VILLARD 665352d2591SJean-Christophe PLAGNIOL-VILLARD /* Decrement row number */ 666352d2591SJean-Christophe PLAGNIOL-VILLARD console_row--; 667352d2591SJean-Christophe PLAGNIOL-VILLARD } 668352d2591SJean-Christophe PLAGNIOL-VILLARD } 669352d2591SJean-Christophe PLAGNIOL-VILLARD 670*20c450efSAnatolij Gustschin static void console_cr (void) 671*20c450efSAnatolij Gustschin { 672*20c450efSAnatolij Gustschin CURSOR_OFF console_col = 0; 673*20c450efSAnatolij Gustschin } 674*20c450efSAnatolij Gustschin 675352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 676352d2591SJean-Christophe PLAGNIOL-VILLARD 677352d2591SJean-Christophe PLAGNIOL-VILLARD void video_putc (const char c) 678352d2591SJean-Christophe PLAGNIOL-VILLARD { 679*20c450efSAnatolij Gustschin static int nl = 1; 680*20c450efSAnatolij Gustschin 681352d2591SJean-Christophe PLAGNIOL-VILLARD switch (c) { 682*20c450efSAnatolij Gustschin case 13: /* back to first column */ 683*20c450efSAnatolij Gustschin console_cr (); 684352d2591SJean-Christophe PLAGNIOL-VILLARD break; 685352d2591SJean-Christophe PLAGNIOL-VILLARD 686352d2591SJean-Christophe PLAGNIOL-VILLARD case '\n': /* next line */ 687*20c450efSAnatolij Gustschin if (console_col || (!console_col && nl)) 688352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline (); 689*20c450efSAnatolij Gustschin nl = 1; 690352d2591SJean-Christophe PLAGNIOL-VILLARD break; 691352d2591SJean-Christophe PLAGNIOL-VILLARD 692352d2591SJean-Christophe PLAGNIOL-VILLARD case 9: /* tab 8 */ 693352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_OFF console_col |= 0x0008; 694352d2591SJean-Christophe PLAGNIOL-VILLARD console_col &= ~0x0007; 695352d2591SJean-Christophe PLAGNIOL-VILLARD 696352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_col >= CONSOLE_COLS) 697352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline (); 698352d2591SJean-Christophe PLAGNIOL-VILLARD break; 699352d2591SJean-Christophe PLAGNIOL-VILLARD 700352d2591SJean-Christophe PLAGNIOL-VILLARD case 8: /* backspace */ 701352d2591SJean-Christophe PLAGNIOL-VILLARD console_back (); 702352d2591SJean-Christophe PLAGNIOL-VILLARD break; 703352d2591SJean-Christophe PLAGNIOL-VILLARD 704352d2591SJean-Christophe PLAGNIOL-VILLARD default: /* draw the char */ 705352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 706352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 707352d2591SJean-Christophe PLAGNIOL-VILLARD c); 708352d2591SJean-Christophe PLAGNIOL-VILLARD console_col++; 709352d2591SJean-Christophe PLAGNIOL-VILLARD 710352d2591SJean-Christophe PLAGNIOL-VILLARD /* check for newline */ 711*20c450efSAnatolij Gustschin if (console_col >= CONSOLE_COLS) { 712352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline (); 713*20c450efSAnatolij Gustschin nl = 0; 714*20c450efSAnatolij Gustschin } 715352d2591SJean-Christophe PLAGNIOL-VILLARD } 716352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_SET} 717352d2591SJean-Christophe PLAGNIOL-VILLARD 718352d2591SJean-Christophe PLAGNIOL-VILLARD 719352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 720352d2591SJean-Christophe PLAGNIOL-VILLARD 721352d2591SJean-Christophe PLAGNIOL-VILLARD void video_puts (const char *s) 722352d2591SJean-Christophe PLAGNIOL-VILLARD { 723352d2591SJean-Christophe PLAGNIOL-VILLARD int count = strlen (s); 724352d2591SJean-Christophe PLAGNIOL-VILLARD 725352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) 726352d2591SJean-Christophe PLAGNIOL-VILLARD video_putc (*s++); 727352d2591SJean-Christophe PLAGNIOL-VILLARD } 728352d2591SJean-Christophe PLAGNIOL-VILLARD 729352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 730352d2591SJean-Christophe PLAGNIOL-VILLARD 731352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) 732352d2591SJean-Christophe PLAGNIOL-VILLARD 733352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_8BIT_332RGB(r,g,b) { \ 734352d2591SJean-Christophe PLAGNIOL-VILLARD *fb = ((r>>5)<<5) | ((g>>5)<<2) | (b>>6); \ 735352d2591SJean-Christophe PLAGNIOL-VILLARD fb ++; \ 736352d2591SJean-Christophe PLAGNIOL-VILLARD } 737352d2591SJean-Christophe PLAGNIOL-VILLARD 738352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_15BIT_555RGB(r,g,b) { \ 739352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *)fb = SWAP16((unsigned short)(((r>>3)<<10) | ((g>>3)<<5) | (b>>3))); \ 740352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 2; \ 741352d2591SJean-Christophe PLAGNIOL-VILLARD } 742352d2591SJean-Christophe PLAGNIOL-VILLARD 743352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_16BIT_565RGB(r,g,b) { \ 744352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *)fb = SWAP16((unsigned short)((((r)>>3)<<11) | (((g)>>2)<<5) | ((b)>>3))); \ 745352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 2; \ 746352d2591SJean-Christophe PLAGNIOL-VILLARD } 747352d2591SJean-Christophe PLAGNIOL-VILLARD 748352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_32BIT_X888RGB(r,g,b) { \ 749352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned long *)fb = SWAP32((unsigned long)(((r<<16) | (g<<8) | b))); \ 750352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 4; \ 751352d2591SJean-Christophe PLAGNIOL-VILLARD } 752352d2591SJean-Christophe PLAGNIOL-VILLARD 753352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 754352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) { \ 755352d2591SJean-Christophe PLAGNIOL-VILLARD fb[0] = b; \ 756352d2591SJean-Christophe PLAGNIOL-VILLARD fb[1] = g; \ 757352d2591SJean-Christophe PLAGNIOL-VILLARD fb[2] = r; \ 758352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 3; \ 759352d2591SJean-Christophe PLAGNIOL-VILLARD } 760352d2591SJean-Christophe PLAGNIOL-VILLARD #else 761352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) { \ 762352d2591SJean-Christophe PLAGNIOL-VILLARD fb[0] = r; \ 763352d2591SJean-Christophe PLAGNIOL-VILLARD fb[1] = g; \ 764352d2591SJean-Christophe PLAGNIOL-VILLARD fb[2] = b; \ 765352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 3; \ 766352d2591SJean-Christophe PLAGNIOL-VILLARD } 767352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 768352d2591SJean-Christophe PLAGNIOL-VILLARD 769352d2591SJean-Christophe PLAGNIOL-VILLARD 770352d2591SJean-Christophe PLAGNIOL-VILLARD /* 771352d2591SJean-Christophe PLAGNIOL-VILLARD * Display the BMP file located at address bmp_image. 772352d2591SJean-Christophe PLAGNIOL-VILLARD * Only uncompressed 773352d2591SJean-Christophe PLAGNIOL-VILLARD */ 774352d2591SJean-Christophe PLAGNIOL-VILLARD int video_display_bitmap (ulong bmp_image, int x, int y) 775352d2591SJean-Christophe PLAGNIOL-VILLARD { 776352d2591SJean-Christophe PLAGNIOL-VILLARD ushort xcount, ycount; 777352d2591SJean-Christophe PLAGNIOL-VILLARD uchar *fb; 778352d2591SJean-Christophe PLAGNIOL-VILLARD bmp_image_t *bmp = (bmp_image_t *) bmp_image; 779352d2591SJean-Christophe PLAGNIOL-VILLARD uchar *bmap; 780352d2591SJean-Christophe PLAGNIOL-VILLARD ushort padded_line; 781352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned long width, height, bpp; 782352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned colors; 783352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned long compression; 784352d2591SJean-Christophe PLAGNIOL-VILLARD bmp_color_table_entry_t cte; 785352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 786352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *dst = NULL; 787352d2591SJean-Christophe PLAGNIOL-VILLARD ulong len; 788352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 789352d2591SJean-Christophe PLAGNIOL-VILLARD 790352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 791352d2591SJean-Christophe PLAGNIOL-VILLARD 792352d2591SJean-Christophe PLAGNIOL-VILLARD if (!((bmp->header.signature[0] == 'B') && 793352d2591SJean-Christophe PLAGNIOL-VILLARD (bmp->header.signature[1] == 'M'))) { 794352d2591SJean-Christophe PLAGNIOL-VILLARD 795352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 796352d2591SJean-Christophe PLAGNIOL-VILLARD /* 797352d2591SJean-Christophe PLAGNIOL-VILLARD * Could be a gzipped bmp image, try to decrompress... 798352d2591SJean-Christophe PLAGNIOL-VILLARD */ 799352d2591SJean-Christophe PLAGNIOL-VILLARD len = CFG_VIDEO_LOGO_MAX_SIZE; 800352d2591SJean-Christophe PLAGNIOL-VILLARD dst = malloc(CFG_VIDEO_LOGO_MAX_SIZE); 801352d2591SJean-Christophe PLAGNIOL-VILLARD if (dst == NULL) { 802352d2591SJean-Christophe PLAGNIOL-VILLARD printf("Error: malloc in gunzip failed!\n"); 803352d2591SJean-Christophe PLAGNIOL-VILLARD return(1); 804352d2591SJean-Christophe PLAGNIOL-VILLARD } 805352d2591SJean-Christophe PLAGNIOL-VILLARD if (gunzip(dst, CFG_VIDEO_LOGO_MAX_SIZE, (uchar *)bmp_image, &len) != 0) { 806352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: no valid bmp or bmp.gz image at %lx\n", bmp_image); 807352d2591SJean-Christophe PLAGNIOL-VILLARD free(dst); 808352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 809352d2591SJean-Christophe PLAGNIOL-VILLARD } 810352d2591SJean-Christophe PLAGNIOL-VILLARD if (len == CFG_VIDEO_LOGO_MAX_SIZE) { 811352d2591SJean-Christophe PLAGNIOL-VILLARD printf("Image could be truncated (increase CFG_VIDEO_LOGO_MAX_SIZE)!\n"); 812352d2591SJean-Christophe PLAGNIOL-VILLARD } 813352d2591SJean-Christophe PLAGNIOL-VILLARD 814352d2591SJean-Christophe PLAGNIOL-VILLARD /* 815352d2591SJean-Christophe PLAGNIOL-VILLARD * Set addr to decompressed image 816352d2591SJean-Christophe PLAGNIOL-VILLARD */ 817352d2591SJean-Christophe PLAGNIOL-VILLARD bmp = (bmp_image_t *)dst; 818352d2591SJean-Christophe PLAGNIOL-VILLARD 819352d2591SJean-Christophe PLAGNIOL-VILLARD if (!((bmp->header.signature[0] == 'B') && 820352d2591SJean-Christophe PLAGNIOL-VILLARD (bmp->header.signature[1] == 'M'))) { 821352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: no valid bmp.gz image at %lx\n", bmp_image); 822352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 823352d2591SJean-Christophe PLAGNIOL-VILLARD } 824352d2591SJean-Christophe PLAGNIOL-VILLARD #else 825352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: no valid bmp image at %lx\n", bmp_image); 826352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 827352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_BMP_GZIP */ 828352d2591SJean-Christophe PLAGNIOL-VILLARD } 829352d2591SJean-Christophe PLAGNIOL-VILLARD 830352d2591SJean-Christophe PLAGNIOL-VILLARD width = le32_to_cpu (bmp->header.width); 831352d2591SJean-Christophe PLAGNIOL-VILLARD height = le32_to_cpu (bmp->header.height); 832352d2591SJean-Christophe PLAGNIOL-VILLARD bpp = le16_to_cpu (bmp->header.bit_count); 833352d2591SJean-Christophe PLAGNIOL-VILLARD colors = le32_to_cpu (bmp->header.colors_used); 834352d2591SJean-Christophe PLAGNIOL-VILLARD compression = le32_to_cpu (bmp->header.compression); 835352d2591SJean-Christophe PLAGNIOL-VILLARD 836352d2591SJean-Christophe PLAGNIOL-VILLARD debug ("Display-bmp: %d x %d with %d colors\n", 837352d2591SJean-Christophe PLAGNIOL-VILLARD width, height, colors); 838352d2591SJean-Christophe PLAGNIOL-VILLARD 839352d2591SJean-Christophe PLAGNIOL-VILLARD if (compression != BMP_BI_RGB) { 840352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: compression type %ld not supported\n", 841352d2591SJean-Christophe PLAGNIOL-VILLARD compression); 842352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 843352d2591SJean-Christophe PLAGNIOL-VILLARD } 844352d2591SJean-Christophe PLAGNIOL-VILLARD 845352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3; 846352d2591SJean-Christophe PLAGNIOL-VILLARD 847352d2591SJean-Christophe PLAGNIOL-VILLARD if ((x + width) > VIDEO_VISIBLE_COLS) 848352d2591SJean-Christophe PLAGNIOL-VILLARD width = VIDEO_VISIBLE_COLS - x; 849352d2591SJean-Christophe PLAGNIOL-VILLARD if ((y + height) > VIDEO_VISIBLE_ROWS) 850352d2591SJean-Christophe PLAGNIOL-VILLARD height = VIDEO_VISIBLE_ROWS - y; 851352d2591SJean-Christophe PLAGNIOL-VILLARD 852352d2591SJean-Christophe PLAGNIOL-VILLARD bmap = (uchar *) bmp + le32_to_cpu (bmp->header.data_offset); 853352d2591SJean-Christophe PLAGNIOL-VILLARD fb = (uchar *) (video_fb_address + 854352d2591SJean-Christophe PLAGNIOL-VILLARD ((y + height - 1) * VIDEO_COLS * VIDEO_PIXEL_SIZE) + 855352d2591SJean-Christophe PLAGNIOL-VILLARD x * VIDEO_PIXEL_SIZE); 856352d2591SJean-Christophe PLAGNIOL-VILLARD 857352d2591SJean-Christophe PLAGNIOL-VILLARD /* We handle only 8bpp or 24 bpp bitmap */ 858352d2591SJean-Christophe PLAGNIOL-VILLARD switch (le16_to_cpu (bmp->header.bit_count)) { 859352d2591SJean-Christophe PLAGNIOL-VILLARD case 8: 860352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line -= width; 861352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) { 862352d2591SJean-Christophe PLAGNIOL-VILLARD /* Copy colormap */ 863352d2591SJean-Christophe PLAGNIOL-VILLARD for (xcount = 0; xcount < colors; ++xcount) { 864352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[xcount]; 865352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (xcount, cte.red, cte.green, cte.blue); 866352d2591SJean-Christophe PLAGNIOL-VILLARD } 867352d2591SJean-Christophe PLAGNIOL-VILLARD } 868352d2591SJean-Christophe PLAGNIOL-VILLARD ycount = height; 869352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 870352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 871352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 872352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 873352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 874352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 875352d2591SJean-Christophe PLAGNIOL-VILLARD *fb++ = *bmap++; 876352d2591SJean-Christophe PLAGNIOL-VILLARD } 877352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 878352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 879352d2591SJean-Christophe PLAGNIOL-VILLARD } 880352d2591SJean-Christophe PLAGNIOL-VILLARD break; 881352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 882352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 883352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 884352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 885352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 886352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 887352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_8BIT_332RGB (cte.red, cte.green, cte.blue); 888352d2591SJean-Christophe PLAGNIOL-VILLARD } 889352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 890352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 891352d2591SJean-Christophe PLAGNIOL-VILLARD } 892352d2591SJean-Christophe PLAGNIOL-VILLARD break; 893352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 894352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 895352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 896352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 897352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 898352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 899352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_15BIT_555RGB (cte.red, cte.green, cte.blue); 900352d2591SJean-Christophe PLAGNIOL-VILLARD } 901352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 902352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 903352d2591SJean-Christophe PLAGNIOL-VILLARD } 904352d2591SJean-Christophe PLAGNIOL-VILLARD break; 905352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 906352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 907352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 908352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 909352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 910352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 911352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_16BIT_565RGB (cte.red, cte.green, cte.blue); 912352d2591SJean-Christophe PLAGNIOL-VILLARD } 913352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 914352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 915352d2591SJean-Christophe PLAGNIOL-VILLARD } 916352d2591SJean-Christophe PLAGNIOL-VILLARD break; 917352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 918352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 919352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 920352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 921352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 922352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 923352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_32BIT_X888RGB (cte.red, cte.green, cte.blue); 924352d2591SJean-Christophe PLAGNIOL-VILLARD } 925352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 926352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 927352d2591SJean-Christophe PLAGNIOL-VILLARD } 928352d2591SJean-Christophe PLAGNIOL-VILLARD break; 929352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 930352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 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++]; 935352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_24BIT_888RGB (cte.red, cte.green, cte.blue); 936352d2591SJean-Christophe PLAGNIOL-VILLARD } 937352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 938352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 939352d2591SJean-Christophe PLAGNIOL-VILLARD } 940352d2591SJean-Christophe PLAGNIOL-VILLARD break; 941352d2591SJean-Christophe PLAGNIOL-VILLARD } 942352d2591SJean-Christophe PLAGNIOL-VILLARD break; 943352d2591SJean-Christophe PLAGNIOL-VILLARD case 24: 944352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line -= 3 * width; 945352d2591SJean-Christophe PLAGNIOL-VILLARD ycount = height; 946352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 947352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 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 FILL_8BIT_332RGB (bmap[2], bmap[1], bmap[0]); 953352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 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_15BIT_555RGB: 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 FILL_15BIT_555RGB (bmap[2], bmap[1], bmap[0]); 965352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 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_16BIT_565RGB: 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 FILL_16BIT_565RGB (bmap[2], bmap[1], bmap[0]); 977352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 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 case GDF_32BIT_X888RGB: 984352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 985352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 986352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 987352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 988352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_32BIT_X888RGB (bmap[2], bmap[1], bmap[0]); 989352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 990352d2591SJean-Christophe PLAGNIOL-VILLARD } 991352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 992352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 993352d2591SJean-Christophe PLAGNIOL-VILLARD } 994352d2591SJean-Christophe PLAGNIOL-VILLARD break; 995352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 996352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 997352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 998352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 999352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1000352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_24BIT_888RGB (bmap[2], bmap[1], bmap[0]); 1001352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 1002352d2591SJean-Christophe PLAGNIOL-VILLARD } 1003352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 1004352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 1005352d2591SJean-Christophe PLAGNIOL-VILLARD } 1006352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1007352d2591SJean-Christophe PLAGNIOL-VILLARD default: 1008352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: 24 bits/pixel bitmap incompatible with current video mode\n"); 1009352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1010352d2591SJean-Christophe PLAGNIOL-VILLARD } 1011352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1012352d2591SJean-Christophe PLAGNIOL-VILLARD default: 1013352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: %d bit/pixel bitmaps not supported by U-Boot\n", 1014352d2591SJean-Christophe PLAGNIOL-VILLARD le16_to_cpu (bmp->header.bit_count)); 1015352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1016352d2591SJean-Christophe PLAGNIOL-VILLARD } 1017352d2591SJean-Christophe PLAGNIOL-VILLARD 1018352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 1019352d2591SJean-Christophe PLAGNIOL-VILLARD if (dst) { 1020352d2591SJean-Christophe PLAGNIOL-VILLARD free(dst); 1021352d2591SJean-Christophe PLAGNIOL-VILLARD } 1022352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1023352d2591SJean-Christophe PLAGNIOL-VILLARD 1024352d2591SJean-Christophe PLAGNIOL-VILLARD return (0); 1025352d2591SJean-Christophe PLAGNIOL-VILLARD } 1026352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1027352d2591SJean-Christophe PLAGNIOL-VILLARD 1028352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1029352d2591SJean-Christophe PLAGNIOL-VILLARD 1030352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 1031352d2591SJean-Christophe PLAGNIOL-VILLARD void logo_plot (void *screen, int width, int x, int y) 1032352d2591SJean-Christophe PLAGNIOL-VILLARD { 1033352d2591SJean-Christophe PLAGNIOL-VILLARD 1034352d2591SJean-Christophe PLAGNIOL-VILLARD int xcount, i; 1035352d2591SJean-Christophe PLAGNIOL-VILLARD int skip = (width - VIDEO_LOGO_WIDTH) * VIDEO_PIXEL_SIZE; 1036352d2591SJean-Christophe PLAGNIOL-VILLARD int ycount = VIDEO_LOGO_HEIGHT; 1037352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char r, g, b, *logo_red, *logo_blue, *logo_green; 1038352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *source; 1039352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *dest = (unsigned char *)screen + ((y * width * VIDEO_PIXEL_SIZE) + x); 1040352d2591SJean-Christophe PLAGNIOL-VILLARD 1041352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 1042352d2591SJean-Christophe PLAGNIOL-VILLARD source = bmp_logo_bitmap; 1043352d2591SJean-Christophe PLAGNIOL-VILLARD 1044352d2591SJean-Christophe PLAGNIOL-VILLARD /* Allocate temporary space for computing colormap */ 1045352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red = malloc (BMP_LOGO_COLORS); 1046352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green = malloc (BMP_LOGO_COLORS); 1047352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue = malloc (BMP_LOGO_COLORS); 1048352d2591SJean-Christophe PLAGNIOL-VILLARD /* Compute color map */ 1049352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < VIDEO_LOGO_COLORS; i++) { 1050352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4; 1051352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green[i] = (bmp_logo_palette[i] & 0x00f0); 1052352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4; 1053352d2591SJean-Christophe PLAGNIOL-VILLARD } 1054352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1055352d2591SJean-Christophe PLAGNIOL-VILLARD source = linux_logo; 1056352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red = linux_logo_red; 1057352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green = linux_logo_green; 1058352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue = linux_logo_blue; 1059352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1060352d2591SJean-Christophe PLAGNIOL-VILLARD 1061352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) { 1062352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < VIDEO_LOGO_COLORS; i++) { 1063352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (i + VIDEO_LOGO_LUT_OFFSET, 1064352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red[i], logo_green[i], logo_blue[i]); 1065352d2591SJean-Christophe PLAGNIOL-VILLARD } 1066352d2591SJean-Christophe PLAGNIOL-VILLARD } 1067352d2591SJean-Christophe PLAGNIOL-VILLARD 1068352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1069352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = VIDEO_LOGO_WIDTH; 1070352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1071352d2591SJean-Christophe PLAGNIOL-VILLARD r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET]; 1072352d2591SJean-Christophe PLAGNIOL-VILLARD g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET]; 1073352d2591SJean-Christophe PLAGNIOL-VILLARD b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET]; 1074352d2591SJean-Christophe PLAGNIOL-VILLARD 1075352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1076352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 1077352d2591SJean-Christophe PLAGNIOL-VILLARD *dest = *source; 1078352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1079352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 1080352d2591SJean-Christophe PLAGNIOL-VILLARD *dest = ((r >> 5) << 5) | ((g >> 5) << 2) | (b >> 6); 1081352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1082352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1083352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *) dest = 1084352d2591SJean-Christophe PLAGNIOL-VILLARD SWAP16 ((unsigned short) (((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3))); 1085352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1086352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1087352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *) dest = 1088352d2591SJean-Christophe PLAGNIOL-VILLARD SWAP16 ((unsigned short) (((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3))); 1089352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1090352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1091352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned long *) dest = 1092352d2591SJean-Christophe PLAGNIOL-VILLARD SWAP32 ((unsigned long) ((r << 16) | (g << 8) | b)); 1093352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1094352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1095352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 1096352d2591SJean-Christophe PLAGNIOL-VILLARD dest[0] = b; 1097352d2591SJean-Christophe PLAGNIOL-VILLARD dest[1] = g; 1098352d2591SJean-Christophe PLAGNIOL-VILLARD dest[2] = r; 1099352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1100352d2591SJean-Christophe PLAGNIOL-VILLARD dest[0] = r; 1101352d2591SJean-Christophe PLAGNIOL-VILLARD dest[1] = g; 1102352d2591SJean-Christophe PLAGNIOL-VILLARD dest[2] = b; 1103352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1104352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1105352d2591SJean-Christophe PLAGNIOL-VILLARD } 1106352d2591SJean-Christophe PLAGNIOL-VILLARD source++; 1107352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_PIXEL_SIZE; 1108352d2591SJean-Christophe PLAGNIOL-VILLARD } 1109352d2591SJean-Christophe PLAGNIOL-VILLARD dest += skip; 1110352d2591SJean-Christophe PLAGNIOL-VILLARD } 1111352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 1112352d2591SJean-Christophe PLAGNIOL-VILLARD free (logo_red); 1113352d2591SJean-Christophe PLAGNIOL-VILLARD free (logo_green); 1114352d2591SJean-Christophe PLAGNIOL-VILLARD free (logo_blue); 1115352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1116352d2591SJean-Christophe PLAGNIOL-VILLARD } 1117352d2591SJean-Christophe PLAGNIOL-VILLARD 1118352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1119352d2591SJean-Christophe PLAGNIOL-VILLARD 1120352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_logo (void) 1121352d2591SJean-Christophe PLAGNIOL-VILLARD { 1122352d2591SJean-Christophe PLAGNIOL-VILLARD char info[128]; 1123352d2591SJean-Christophe PLAGNIOL-VILLARD extern char version_string; 1124352d2591SJean-Christophe PLAGNIOL-VILLARD 1125352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SPLASH_SCREEN 1126352d2591SJean-Christophe PLAGNIOL-VILLARD char *s; 1127352d2591SJean-Christophe PLAGNIOL-VILLARD ulong addr; 1128352d2591SJean-Christophe PLAGNIOL-VILLARD 1129352d2591SJean-Christophe PLAGNIOL-VILLARD if ((s = getenv ("splashimage")) != NULL) { 1130352d2591SJean-Christophe PLAGNIOL-VILLARD addr = simple_strtoul (s, NULL, 16); 1131352d2591SJean-Christophe PLAGNIOL-VILLARD 1132352d2591SJean-Christophe PLAGNIOL-VILLARD if (video_display_bitmap (addr, 0, 0) == 0) { 1133352d2591SJean-Christophe PLAGNIOL-VILLARD return ((void *) (video_fb_address)); 1134352d2591SJean-Christophe PLAGNIOL-VILLARD } 1135352d2591SJean-Christophe PLAGNIOL-VILLARD } 1136352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_SPLASH_SCREEN */ 1137352d2591SJean-Christophe PLAGNIOL-VILLARD 1138352d2591SJean-Christophe PLAGNIOL-VILLARD logo_plot (video_fb_address, VIDEO_COLS, 0, 0); 1139352d2591SJean-Christophe PLAGNIOL-VILLARD 1140352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf (info, " %s", &version_string); 1141352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *)info); 1142352d2591SJean-Christophe PLAGNIOL-VILLARD 1143352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO 1144352d2591SJean-Christophe PLAGNIOL-VILLARD { 1145352d2591SJean-Christophe PLAGNIOL-VILLARD int i, n = ((VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT) / VIDEO_FONT_HEIGHT); 1146352d2591SJean-Christophe PLAGNIOL-VILLARD 1147352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 1; i < n; i++) { 1148352d2591SJean-Christophe PLAGNIOL-VILLARD video_get_info_str (i, info); 1149352d2591SJean-Christophe PLAGNIOL-VILLARD if (*info) 1150352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_INFO_X, 1151352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y + i * VIDEO_FONT_HEIGHT, 1152352d2591SJean-Christophe PLAGNIOL-VILLARD (uchar *)info); 1153352d2591SJean-Christophe PLAGNIOL-VILLARD } 1154352d2591SJean-Christophe PLAGNIOL-VILLARD } 1155352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1156352d2591SJean-Christophe PLAGNIOL-VILLARD 1157352d2591SJean-Christophe PLAGNIOL-VILLARD return (video_fb_address + VIDEO_LOGO_HEIGHT * VIDEO_LINE_LEN); 1158352d2591SJean-Christophe PLAGNIOL-VILLARD } 1159352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1160352d2591SJean-Christophe PLAGNIOL-VILLARD 1161352d2591SJean-Christophe PLAGNIOL-VILLARD 1162352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1163352d2591SJean-Christophe PLAGNIOL-VILLARD 1164352d2591SJean-Christophe PLAGNIOL-VILLARD static int video_init (void) 1165352d2591SJean-Christophe PLAGNIOL-VILLARD { 1166352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char color8; 1167352d2591SJean-Christophe PLAGNIOL-VILLARD 1168352d2591SJean-Christophe PLAGNIOL-VILLARD if ((pGD = video_hw_init ()) == NULL) 1169352d2591SJean-Christophe PLAGNIOL-VILLARD return -1; 1170352d2591SJean-Christophe PLAGNIOL-VILLARD 1171352d2591SJean-Christophe PLAGNIOL-VILLARD video_fb_address = (void *) VIDEO_FB_ADRS; 1172352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR 1173352d2591SJean-Christophe PLAGNIOL-VILLARD video_init_hw_cursor (VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT); 1174352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1175352d2591SJean-Christophe PLAGNIOL-VILLARD 1176352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init drawing pats */ 1177352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1178352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 1179352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (0x01, CONSOLE_FG_COL, CONSOLE_FG_COL, CONSOLE_FG_COL); 1180352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (0x00, CONSOLE_BG_COL, CONSOLE_BG_COL, CONSOLE_BG_COL); 1181352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = 0x01010101; 1182352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = 0x00000000; 1183352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1184352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 1185352d2591SJean-Christophe PLAGNIOL-VILLARD color8 = ((CONSOLE_FG_COL & 0xe0) | 1186352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) & 0x1c) | CONSOLE_FG_COL >> 6); 1187352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8; 1188352d2591SJean-Christophe PLAGNIOL-VILLARD color8 = ((CONSOLE_BG_COL & 0xe0) | 1189352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) & 0x1c) | CONSOLE_BG_COL >> 6); 1190352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8; 1191352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1192352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1193352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (((CONSOLE_FG_COL >> 3) << 26) | 1194352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) << 21) | ((CONSOLE_FG_COL >> 3) << 16) | 1195352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) << 10) | ((CONSOLE_FG_COL >> 3) << 5) | 1196352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL >> 3)); 1197352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (((CONSOLE_BG_COL >> 3) << 26) | 1198352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) << 21) | ((CONSOLE_BG_COL >> 3) << 16) | 1199352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) << 10) | ((CONSOLE_BG_COL >> 3) << 5) | 1200352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL >> 3)); 1201352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1202352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1203352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (((CONSOLE_FG_COL >> 3) << 27) | 1204352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 2) << 21) | ((CONSOLE_FG_COL >> 3) << 16) | 1205352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) << 11) | ((CONSOLE_FG_COL >> 2) << 5) | 1206352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL >> 3)); 1207352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (((CONSOLE_BG_COL >> 3) << 27) | 1208352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 2) << 21) | ((CONSOLE_BG_COL >> 3) << 16) | 1209352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) << 11) | ((CONSOLE_BG_COL >> 2) << 5) | 1210352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL >> 3)); 1211352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1212352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1213352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (CONSOLE_FG_COL << 16) | (CONSOLE_FG_COL << 8) | CONSOLE_FG_COL; 1214352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (CONSOLE_BG_COL << 16) | (CONSOLE_BG_COL << 8) | CONSOLE_BG_COL; 1215352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1216352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1217352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (CONSOLE_FG_COL << 24) | (CONSOLE_FG_COL << 16) | 1218352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL << 8) | CONSOLE_FG_COL; 1219352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (CONSOLE_BG_COL << 24) | (CONSOLE_BG_COL << 16) | 1220352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL << 8) | CONSOLE_BG_COL; 1221352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1222352d2591SJean-Christophe PLAGNIOL-VILLARD } 1223352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 1224352d2591SJean-Christophe PLAGNIOL-VILLARD 1225352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 1226352d2591SJean-Christophe PLAGNIOL-VILLARD /* Plot the logo and get start point of console */ 1227352d2591SJean-Christophe PLAGNIOL-VILLARD PRINTD ("Video: Drawing the logo ...\n"); 1228352d2591SJean-Christophe PLAGNIOL-VILLARD video_console_address = video_logo (); 1229352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1230352d2591SJean-Christophe PLAGNIOL-VILLARD video_console_address = video_fb_address; 1231352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1232352d2591SJean-Christophe PLAGNIOL-VILLARD 1233352d2591SJean-Christophe PLAGNIOL-VILLARD /* Initialize the console */ 1234352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = 0; 1235352d2591SJean-Christophe PLAGNIOL-VILLARD console_row = 0; 1236352d2591SJean-Christophe PLAGNIOL-VILLARD 1237352d2591SJean-Christophe PLAGNIOL-VILLARD return 0; 1238352d2591SJean-Christophe PLAGNIOL-VILLARD } 1239352d2591SJean-Christophe PLAGNIOL-VILLARD 1240352d2591SJean-Christophe PLAGNIOL-VILLARD 1241352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1242352d2591SJean-Christophe PLAGNIOL-VILLARD 1243352d2591SJean-Christophe PLAGNIOL-VILLARD int drv_video_init (void) 1244352d2591SJean-Christophe PLAGNIOL-VILLARD { 1245352d2591SJean-Christophe PLAGNIOL-VILLARD int skip_dev_init; 1246352d2591SJean-Christophe PLAGNIOL-VILLARD device_t console_dev; 1247352d2591SJean-Christophe PLAGNIOL-VILLARD 1248352d2591SJean-Christophe PLAGNIOL-VILLARD skip_dev_init = 0; 1249352d2591SJean-Christophe PLAGNIOL-VILLARD 1250352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init video chip - returns with framebuffer cleared */ 1251352d2591SJean-Christophe PLAGNIOL-VILLARD if (video_init () == -1) 1252352d2591SJean-Christophe PLAGNIOL-VILLARD skip_dev_init = 1; 1253352d2591SJean-Christophe PLAGNIOL-VILLARD 1254352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VGA_AS_SINGLE_DEVICE 1255352d2591SJean-Christophe PLAGNIOL-VILLARD /* Devices VGA and Keyboard will be assigned seperately */ 1256352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init vga device */ 1257352d2591SJean-Christophe PLAGNIOL-VILLARD if (!skip_dev_init) { 1258352d2591SJean-Christophe PLAGNIOL-VILLARD memset (&console_dev, 0, sizeof (console_dev)); 1259352d2591SJean-Christophe PLAGNIOL-VILLARD strcpy (console_dev.name, "vga"); 1260352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.ext = DEV_EXT_VIDEO; /* Video extensions */ 1261352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM; 1262352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.putc = video_putc; /* 'putc' function */ 1263352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.puts = video_puts; /* 'puts' function */ 1264352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.tstc = NULL; /* 'tstc' function */ 1265352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.getc = NULL; /* 'getc' function */ 1266352d2591SJean-Christophe PLAGNIOL-VILLARD 1267352d2591SJean-Christophe PLAGNIOL-VILLARD if (device_register (&console_dev) == 0) 1268352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 1269352d2591SJean-Christophe PLAGNIOL-VILLARD } 1270352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1271352d2591SJean-Christophe PLAGNIOL-VILLARD PRINTD ("KBD: Keyboard init ...\n"); 1272352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_KBD_INIT_FCT == -1) 1273352d2591SJean-Christophe PLAGNIOL-VILLARD skip_dev_init = 1; 1274352d2591SJean-Christophe PLAGNIOL-VILLARD 1275352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init console device */ 1276352d2591SJean-Christophe PLAGNIOL-VILLARD if (!skip_dev_init) { 1277352d2591SJean-Christophe PLAGNIOL-VILLARD memset (&console_dev, 0, sizeof (console_dev)); 1278352d2591SJean-Christophe PLAGNIOL-VILLARD strcpy (console_dev.name, "vga"); 1279352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.ext = DEV_EXT_VIDEO; /* Video extensions */ 1280352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM; 1281352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.putc = video_putc; /* 'putc' function */ 1282352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.puts = video_puts; /* 'puts' function */ 1283352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */ 1284352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.getc = VIDEO_GETC_FCT; /* 'getc' function */ 1285352d2591SJean-Christophe PLAGNIOL-VILLARD 1286352d2591SJean-Christophe PLAGNIOL-VILLARD if (device_register (&console_dev) == 0) 1287352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 1288352d2591SJean-Christophe PLAGNIOL-VILLARD } 1289352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VGA_AS_SINGLE_DEVICE */ 1290352d2591SJean-Christophe PLAGNIOL-VILLARD /* No console dev available */ 1291352d2591SJean-Christophe PLAGNIOL-VILLARD return 0; 1292352d2591SJean-Christophe PLAGNIOL-VILLARD } 1293352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_CFB_CONSOLE */ 1294