1*352d2591SJean-Christophe PLAGNIOL-VILLARD /* 2*352d2591SJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2002 ELTEC Elektronik AG 3*352d2591SJean-Christophe PLAGNIOL-VILLARD * Frank Gottschling <fgottschling@eltec.de> 4*352d2591SJean-Christophe PLAGNIOL-VILLARD * 5*352d2591SJean-Christophe PLAGNIOL-VILLARD * See file CREDITS for list of people who contributed to this 6*352d2591SJean-Christophe PLAGNIOL-VILLARD * project. 7*352d2591SJean-Christophe PLAGNIOL-VILLARD * 8*352d2591SJean-Christophe PLAGNIOL-VILLARD * This program is free software; you can redistribute it and/or 9*352d2591SJean-Christophe PLAGNIOL-VILLARD * modify it under the terms of the GNU General Public License as 10*352d2591SJean-Christophe PLAGNIOL-VILLARD * published by the Free Software Foundation; either version 2 of 11*352d2591SJean-Christophe PLAGNIOL-VILLARD * the License, or (at your option) any later version. 12*352d2591SJean-Christophe PLAGNIOL-VILLARD * 13*352d2591SJean-Christophe PLAGNIOL-VILLARD * This program is distributed in the hope that it will be useful, 14*352d2591SJean-Christophe PLAGNIOL-VILLARD * but WITHOUT ANY WARRANTY; without even the implied warranty of 15*352d2591SJean-Christophe PLAGNIOL-VILLARD * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*352d2591SJean-Christophe PLAGNIOL-VILLARD * GNU General Public License for more details. 17*352d2591SJean-Christophe PLAGNIOL-VILLARD * 18*352d2591SJean-Christophe PLAGNIOL-VILLARD * You should have received a copy of the GNU General Public License 19*352d2591SJean-Christophe PLAGNIOL-VILLARD * along with this program; if not, write to the Free Software 20*352d2591SJean-Christophe PLAGNIOL-VILLARD * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21*352d2591SJean-Christophe PLAGNIOL-VILLARD * MA 02111-1307 USA 22*352d2591SJean-Christophe PLAGNIOL-VILLARD */ 23*352d2591SJean-Christophe PLAGNIOL-VILLARD 24*352d2591SJean-Christophe PLAGNIOL-VILLARD /* 25*352d2591SJean-Christophe PLAGNIOL-VILLARD * cfb_console.c 26*352d2591SJean-Christophe PLAGNIOL-VILLARD * 27*352d2591SJean-Christophe PLAGNIOL-VILLARD * Color Framebuffer Console driver for 8/15/16/24/32 bits per pixel. 28*352d2591SJean-Christophe PLAGNIOL-VILLARD * 29*352d2591SJean-Christophe PLAGNIOL-VILLARD * At the moment only the 8x16 font is tested and the font fore- and 30*352d2591SJean-Christophe PLAGNIOL-VILLARD * background color is limited to black/white/gray colors. The Linux 31*352d2591SJean-Christophe PLAGNIOL-VILLARD * logo can be placed in the upper left corner and additional board 32*352d2591SJean-Christophe PLAGNIOL-VILLARD * information strings (that normaly goes to serial port) can be drawed. 33*352d2591SJean-Christophe PLAGNIOL-VILLARD * 34*352d2591SJean-Christophe PLAGNIOL-VILLARD * The console driver can use the standard PC keyboard interface (i8042) 35*352d2591SJean-Christophe PLAGNIOL-VILLARD * for character input. Character output goes to a memory mapped video 36*352d2591SJean-Christophe PLAGNIOL-VILLARD * framebuffer with little or big-endian organisation. 37*352d2591SJean-Christophe PLAGNIOL-VILLARD * With environment setting 'console=serial' the console i/o can be 38*352d2591SJean-Christophe PLAGNIOL-VILLARD * forced to serial port. 39*352d2591SJean-Christophe PLAGNIOL-VILLARD 40*352d2591SJean-Christophe PLAGNIOL-VILLARD The driver uses graphic specific defines/parameters/functions: 41*352d2591SJean-Christophe PLAGNIOL-VILLARD 42*352d2591SJean-Christophe PLAGNIOL-VILLARD (for SMI LynxE graphic chip) 43*352d2591SJean-Christophe PLAGNIOL-VILLARD 44*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_SMI_LYNXEM - use graphic driver for SMI 710,712,810 45*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_FB_LITTLE_ENDIAN - framebuffer organisation default: big endian 46*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_HW_RECTFILL - graphic driver supports hardware rectangle fill 47*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_HW_BITBLT - graphic driver supports hardware bit blt 48*352d2591SJean-Christophe PLAGNIOL-VILLARD 49*352d2591SJean-Christophe PLAGNIOL-VILLARD Console Parameters are set by graphic drivers global struct: 50*352d2591SJean-Christophe PLAGNIOL-VILLARD 51*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS - x resolution 52*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_ROWS - y resolution 53*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_PIXEL_SIZE - storage size in byte per pixel 54*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_DATA_FORMAT - graphical data format GDF 55*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_FB_ADRS - start of video memory 56*352d2591SJean-Christophe PLAGNIOL-VILLARD 57*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_I8042_KBD - AT Keyboard driver for i8042 58*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_KBD_INIT_FCT - init function for keyboard 59*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_TSTC_FCT - keyboard_tstc function 60*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_GETC_FCT - keyboard_getc function 61*352d2591SJean-Christophe PLAGNIOL-VILLARD 62*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_CONSOLE_CURSOR - on/off drawing cursor is done with delay 63*352d2591SJean-Christophe PLAGNIOL-VILLARD loop in VIDEO_TSTC_FCT (i8042) 64*352d2591SJean-Christophe PLAGNIOL-VILLARD CFG_CONSOLE_BLINK_COUNT - value for delay loop - blink rate 65*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_CONSOLE_TIME - display time/date in upper right corner, 66*352d2591SJean-Christophe PLAGNIOL-VILLARD needs CONFIG_CMD_DATE and CONFIG_CONSOLE_CURSOR 67*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_LOGO - display Linux Logo in upper left corner 68*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_BMP_LOGO - use bmp_logo instead of linux_logo 69*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_CONSOLE_EXTRA_INFO - display additional board information strings 70*352d2591SJean-Christophe PLAGNIOL-VILLARD that normaly goes to serial port. This define 71*352d2591SJean-Christophe PLAGNIOL-VILLARD requires a board specific function: 72*352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_INFO_X, 73*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y + i*VIDEO_FONT_HEIGHT, 74*352d2591SJean-Christophe PLAGNIOL-VILLARD info); 75*352d2591SJean-Christophe PLAGNIOL-VILLARD that fills a info buffer at i=row. 76*352d2591SJean-Christophe PLAGNIOL-VILLARD s.a: board/eltec/bab7xx. 77*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VGA_AS_SINGLE_DEVICE - If set the framebuffer device will be initialised 78*352d2591SJean-Christophe PLAGNIOL-VILLARD as an output only device. The Keyboard driver 79*352d2591SJean-Christophe PLAGNIOL-VILLARD will not be set-up. This may be used, if you 80*352d2591SJean-Christophe PLAGNIOL-VILLARD have none or more than one Keyboard devices 81*352d2591SJean-Christophe PLAGNIOL-VILLARD (USB Keyboard, AT Keyboard). 82*352d2591SJean-Christophe PLAGNIOL-VILLARD 83*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_SW_CURSOR: - Draws a cursor after the last character. No 84*352d2591SJean-Christophe PLAGNIOL-VILLARD blinking is provided. Uses the macros CURSOR_SET 85*352d2591SJean-Christophe PLAGNIOL-VILLARD and CURSOR_OFF. 86*352d2591SJean-Christophe PLAGNIOL-VILLARD CONFIG_VIDEO_HW_CURSOR: - Uses the hardware cursor capability of the 87*352d2591SJean-Christophe PLAGNIOL-VILLARD graphic chip. Uses the macro CURSOR_SET. 88*352d2591SJean-Christophe PLAGNIOL-VILLARD ATTENTION: If booting an OS, the display driver 89*352d2591SJean-Christophe PLAGNIOL-VILLARD must disable the hardware register of the graphic 90*352d2591SJean-Christophe PLAGNIOL-VILLARD chip. Otherwise a blinking field is displayed 91*352d2591SJean-Christophe PLAGNIOL-VILLARD */ 92*352d2591SJean-Christophe PLAGNIOL-VILLARD 93*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 94*352d2591SJean-Christophe PLAGNIOL-VILLARD 95*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CFB_CONSOLE 96*352d2591SJean-Christophe PLAGNIOL-VILLARD 97*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <malloc.h> 98*352d2591SJean-Christophe PLAGNIOL-VILLARD 99*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 100*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device defines with SMI graphic */ 101*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Any other graphic must change this section */ 102*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 103*352d2591SJean-Christophe PLAGNIOL-VILLARD 104*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SMI_LYNXEM 105*352d2591SJean-Christophe PLAGNIOL-VILLARD 106*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 107*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 108*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 109*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 110*352d2591SJean-Christophe PLAGNIOL-VILLARD 111*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 112*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Defines for the CT69000 driver */ 113*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 114*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_CT69000 115*352d2591SJean-Christophe PLAGNIOL-VILLARD 116*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 117*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 118*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 119*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 120*352d2591SJean-Christophe PLAGNIOL-VILLARD 121*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 122*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Defines for the SED13806 driver */ 123*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 124*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SED13806 125*352d2591SJean-Christophe PLAGNIOL-VILLARD 126*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_TOTAL5200 127*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 128*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 129*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_RECTFILL 130*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_HW_BITBLT 131*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 132*352d2591SJean-Christophe PLAGNIOL-VILLARD 133*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 134*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Defines for the SED13806 driver */ 135*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 136*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SM501 137*352d2591SJean-Christophe PLAGNIOL-VILLARD 138*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_HH405 139*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_LITTLE_ENDIAN 140*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 141*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 142*352d2591SJean-Christophe PLAGNIOL-VILLARD 143*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 144*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Include video_fb.h after definitions of VIDEO_HW_RECTFILL etc */ 145*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 146*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_fb.h> 147*352d2591SJean-Christophe PLAGNIOL-VILLARD 148*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 149*352d2591SJean-Christophe PLAGNIOL-VILLARD /* some Macros */ 150*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 151*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_COLS (pGD->winSizeX) 152*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_ROWS (pGD->winSizeY) 153*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIXEL_SIZE (pGD->gdfBytesPP) 154*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_DATA_FORMAT (pGD->gdfIndex) 155*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_ADRS (pGD->frameAdrs) 156*352d2591SJean-Christophe PLAGNIOL-VILLARD 157*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 158*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device defines with i8042 keyboard controller */ 159*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Any other keyboard controller must change this section */ 160*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 161*352d2591SJean-Christophe PLAGNIOL-VILLARD 162*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_I8042_KBD 163*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <i8042.h> 164*352d2591SJean-Christophe PLAGNIOL-VILLARD 165*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_KBD_INIT_FCT i8042_kbd_init() 166*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_TSTC_FCT i8042_tstc 167*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_GETC_FCT i8042_getc 168*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 169*352d2591SJean-Christophe PLAGNIOL-VILLARD 170*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 171*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device */ 172*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 173*352d2591SJean-Christophe PLAGNIOL-VILLARD 174*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <version.h> 175*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux/types.h> 176*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <devices.h> 177*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_font.h> 178*352d2591SJean-Christophe PLAGNIOL-VILLARD 179*352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_DATE) 180*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <rtc.h> 181*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 182*352d2591SJean-Christophe PLAGNIOL-VILLARD 183*352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) 184*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <watchdog.h> 185*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_layout.h> 186*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 187*352d2591SJean-Christophe PLAGNIOL-VILLARD 188*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 189*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Cursor definition: */ 190*352d2591SJean-Christophe PLAGNIOL-VILLARD /* CONFIG_CONSOLE_CURSOR: Uses a timer function (see drivers/i8042.c) to */ 191*352d2591SJean-Christophe PLAGNIOL-VILLARD /* let the cursor blink. Uses the macros CURSOR_OFF */ 192*352d2591SJean-Christophe PLAGNIOL-VILLARD /* and CURSOR_ON. */ 193*352d2591SJean-Christophe PLAGNIOL-VILLARD /* CONFIG_VIDEO_SW_CURSOR: Draws a cursor after the last character. No */ 194*352d2591SJean-Christophe PLAGNIOL-VILLARD /* blinking is provided. Uses the macros CURSOR_SET */ 195*352d2591SJean-Christophe PLAGNIOL-VILLARD /* and CURSOR_OFF. */ 196*352d2591SJean-Christophe PLAGNIOL-VILLARD /* CONFIG_VIDEO_HW_CURSOR: Uses the hardware cursor capability of the */ 197*352d2591SJean-Christophe PLAGNIOL-VILLARD /* graphic chip. Uses the macro CURSOR_SET. */ 198*352d2591SJean-Christophe PLAGNIOL-VILLARD /* ATTENTION: If booting an OS, the display driver */ 199*352d2591SJean-Christophe PLAGNIOL-VILLARD /* must disable the hardware register of the graphic */ 200*352d2591SJean-Christophe PLAGNIOL-VILLARD /* chip. Otherwise a blinking field is displayed */ 201*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 202*352d2591SJean-Christophe PLAGNIOL-VILLARD #if !defined(CONFIG_CONSOLE_CURSOR) && \ 203*352d2591SJean-Christophe PLAGNIOL-VILLARD !defined(CONFIG_VIDEO_SW_CURSOR) && \ 204*352d2591SJean-Christophe PLAGNIOL-VILLARD !defined(CONFIG_VIDEO_HW_CURSOR) 205*352d2591SJean-Christophe PLAGNIOL-VILLARD /* no Cursor defined */ 206*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 207*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF 208*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET 209*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 210*352d2591SJean-Christophe PLAGNIOL-VILLARD 211*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 212*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 213*352d2591SJean-Christophe PLAGNIOL-VILLARD #error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined 214*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 215*352d2591SJean-Christophe PLAGNIOL-VILLARD void console_cursor (int state); 216*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON console_cursor(1); 217*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF console_cursor(0); 218*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET 219*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_I8042_KBD 220*352d2591SJean-Christophe PLAGNIOL-VILLARD #warning Cursor drawing on/off needs timer function s.a. drivers/i8042.c 221*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 222*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 223*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_TIME 224*352d2591SJean-Christophe PLAGNIOL-VILLARD #error CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME 225*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 226*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_CONSOLE_CURSOR */ 227*352d2591SJean-Christophe PLAGNIOL-VILLARD 228*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_SW_CURSOR 229*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 230*352d2591SJean-Christophe PLAGNIOL-VILLARD #error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined 231*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 232*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 233*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\ 234*352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, ' '); 235*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET video_set_cursor(); 236*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_SW_CURSOR */ 237*352d2591SJean-Christophe PLAGNIOL-VILLARD 238*352d2591SJean-Christophe PLAGNIOL-VILLARD 239*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR 240*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CURSOR_ON 241*352d2591SJean-Christophe PLAGNIOL-VILLARD #error only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined 242*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 243*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON 244*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF 245*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET video_set_hw_cursor(console_col * VIDEO_FONT_WIDTH, \ 246*352d2591SJean-Christophe PLAGNIOL-VILLARD (console_row * VIDEO_FONT_HEIGHT) + VIDEO_LOGO_HEIGHT); 247*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_HW_CURSOR */ 248*352d2591SJean-Christophe PLAGNIOL-VILLARD 249*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 250*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 251*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_logo.h> 252*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH BMP_LOGO_WIDTH 253*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT BMP_LOGO_HEIGHT 254*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET BMP_LOGO_OFFSET 255*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS BMP_LOGO_COLORS 256*352d2591SJean-Christophe PLAGNIOL-VILLARD 257*352d2591SJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_VIDEO_BMP_LOGO */ 258*352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_WIDTH 80 259*352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_HEIGHT 80 260*352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_COLORS 214 261*352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_LUT_OFFSET 0x20 262*352d2591SJean-Christophe PLAGNIOL-VILLARD #define __initdata 263*352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux_logo.h> 264*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH LINUX_LOGO_WIDTH 265*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT LINUX_LOGO_HEIGHT 266*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET LINUX_LOGO_LUT_OFFSET 267*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS LINUX_LOGO_COLORS 268*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_BMP_LOGO */ 269*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_X (VIDEO_LOGO_WIDTH) 270*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_Y (VIDEO_FONT_HEIGHT/2) 271*352d2591SJean-Christophe PLAGNIOL-VILLARD #else /* CONFIG_VIDEO_LOGO */ 272*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH 0 273*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT 0 274*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_LOGO */ 275*352d2591SJean-Christophe PLAGNIOL-VILLARD 276*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_COLS VIDEO_VISIBLE_COLS 277*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_ROWS VIDEO_VISIBLE_ROWS 278*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_SIZE (VIDEO_ROWS*VIDEO_COLS*VIDEO_PIXEL_SIZE) 279*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIX_BLOCKS (VIDEO_SIZE >> 2) 280*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LINE_LEN (VIDEO_COLS*VIDEO_PIXEL_SIZE) 281*352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_BURST_LEN (VIDEO_COLS/8) 282*352d2591SJean-Christophe PLAGNIOL-VILLARD 283*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 284*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROWS ((VIDEO_ROWS - VIDEO_LOGO_HEIGHT) / VIDEO_FONT_HEIGHT) 285*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 286*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROWS (VIDEO_ROWS / VIDEO_FONT_HEIGHT) 287*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 288*352d2591SJean-Christophe PLAGNIOL-VILLARD 289*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_COLS (VIDEO_COLS / VIDEO_FONT_WIDTH) 290*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SIZE (VIDEO_FONT_HEIGHT * VIDEO_LINE_LEN) 291*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_FIRST (video_console_address) 292*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SECOND (video_console_address + CONSOLE_ROW_SIZE) 293*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_LAST (video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE) 294*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SIZE (CONSOLE_ROW_SIZE * CONSOLE_ROWS) 295*352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SCROLL_SIZE (CONSOLE_SIZE - CONSOLE_ROW_SIZE) 296*352d2591SJean-Christophe PLAGNIOL-VILLARD 297*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Macros */ 298*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 299*352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP16(x) ((((x) & 0x00ff) << 8) | ( (x) >> 8)) 300*352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP32(x) ((((x) & 0x000000ff) << 24) | (((x) & 0x0000ff00) << 8)|\ 301*352d2591SJean-Christophe PLAGNIOL-VILLARD (((x) & 0x00ff0000) >> 8) | (((x) & 0xff000000) >> 24) ) 302*352d2591SJean-Christophe PLAGNIOL-VILLARD #define SHORTSWAP32(x) ((((x) & 0x000000ff) << 8) | (((x) & 0x0000ff00) >> 8)|\ 303*352d2591SJean-Christophe PLAGNIOL-VILLARD (((x) & 0x00ff0000) << 8) | (((x) & 0xff000000) >> 8) ) 304*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 305*352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP16(x) (x) 306*352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP32(x) (x) 307*352d2591SJean-Christophe PLAGNIOL-VILLARD #define SHORTSWAP32(x) (x) 308*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 309*352d2591SJean-Christophe PLAGNIOL-VILLARD 310*352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(DEBUG) || defined(DEBUG_CFB_CONSOLE) 311*352d2591SJean-Christophe PLAGNIOL-VILLARD #define PRINTD(x) printf(x) 312*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 313*352d2591SJean-Christophe PLAGNIOL-VILLARD #define PRINTD(x) 314*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 315*352d2591SJean-Christophe PLAGNIOL-VILLARD 316*352d2591SJean-Christophe PLAGNIOL-VILLARD 317*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO 318*352d2591SJean-Christophe PLAGNIOL-VILLARD extern void video_get_info_str ( /* setup a board string: type, speed, etc. */ 319*352d2591SJean-Christophe PLAGNIOL-VILLARD int line_number, /* location to place info string beside logo */ 320*352d2591SJean-Christophe PLAGNIOL-VILLARD char *info /* buffer for info string */ 321*352d2591SJean-Christophe PLAGNIOL-VILLARD ); 322*352d2591SJean-Christophe PLAGNIOL-VILLARD 323*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 324*352d2591SJean-Christophe PLAGNIOL-VILLARD 325*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Locals */ 326*352d2591SJean-Christophe PLAGNIOL-VILLARD static GraphicDevice *pGD; /* Pointer to Graphic array */ 327*352d2591SJean-Christophe PLAGNIOL-VILLARD 328*352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_fb_address; /* frame buffer address */ 329*352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_console_address; /* console buffer start address */ 330*352d2591SJean-Christophe PLAGNIOL-VILLARD 331*352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_col = 0; /* cursor col */ 332*352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_row = 0; /* cursor row */ 333*352d2591SJean-Christophe PLAGNIOL-VILLARD 334*352d2591SJean-Christophe PLAGNIOL-VILLARD static u32 eorx, fgx, bgx; /* color pats */ 335*352d2591SJean-Christophe PLAGNIOL-VILLARD 336*352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table8[] = { 337*352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff, 338*352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff, 339*352d2591SJean-Christophe PLAGNIOL-VILLARD 0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff, 340*352d2591SJean-Christophe PLAGNIOL-VILLARD 0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff }; 341*352d2591SJean-Christophe PLAGNIOL-VILLARD 342*352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table15[] = { 343*352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x00007fff, 0x7fff0000, 0x7fff7fff }; 344*352d2591SJean-Christophe PLAGNIOL-VILLARD 345*352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table16[] = { 346*352d2591SJean-Christophe PLAGNIOL-VILLARD 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff }; 347*352d2591SJean-Christophe PLAGNIOL-VILLARD 348*352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table24[16][3] = { 349*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00000000 }, 350*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00ffffff }, 351*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x0000ffff, 0xff000000 }, 352*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x0000ffff, 0xffffffff }, 353*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffff0000, 0x00000000 }, 354*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffff0000, 0x00ffffff }, 355*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffffffff, 0xff000000 }, 356*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x000000ff, 0xffffffff, 0xffffffff }, 357*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x00000000, 0x00000000 }, 358*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x00000000, 0x00ffffff }, 359*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x0000ffff, 0xff000000 }, 360*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffff00, 0x0000ffff, 0xffffffff }, 361*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffff0000, 0x00000000 }, 362*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffff0000, 0x00ffffff }, 363*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffffffff, 0xff000000 }, 364*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0xffffffff, 0xffffffff, 0xffffffff } }; 365*352d2591SJean-Christophe PLAGNIOL-VILLARD 366*352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table32[16][4] = { 367*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, 368*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00000000, 0x00ffffff }, 369*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00ffffff, 0x00000000 }, 370*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00000000, 0x00ffffff, 0x00ffffff }, 371*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00000000, 0x00000000 }, 372*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff }, 373*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00000000 }, 374*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00ffffff }, 375*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00000000, 0x00000000 }, 376*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00000000, 0x00ffffff }, 377*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000 }, 378*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00ffffff }, 379*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00000000 }, 380*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00ffffff }, 381*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00000000 }, 382*352d2591SJean-Christophe PLAGNIOL-VILLARD { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff } }; 383*352d2591SJean-Christophe PLAGNIOL-VILLARD 384*352d2591SJean-Christophe PLAGNIOL-VILLARD 385*352d2591SJean-Christophe PLAGNIOL-VILLARD int gunzip(void *, int, unsigned char *, unsigned long *); 386*352d2591SJean-Christophe PLAGNIOL-VILLARD 387*352d2591SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/ 388*352d2591SJean-Christophe PLAGNIOL-VILLARD 389*352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_drawchars (int xx, int yy, unsigned char *s, int count) 390*352d2591SJean-Christophe PLAGNIOL-VILLARD { 391*352d2591SJean-Christophe PLAGNIOL-VILLARD u8 *cdat, *dest, *dest0; 392*352d2591SJean-Christophe PLAGNIOL-VILLARD int rows, offset, c; 393*352d2591SJean-Christophe PLAGNIOL-VILLARD 394*352d2591SJean-Christophe PLAGNIOL-VILLARD offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE; 395*352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 = video_fb_address + offset; 396*352d2591SJean-Christophe PLAGNIOL-VILLARD 397*352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 398*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 399*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 400*352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 401*352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 402*352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 403*352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 404*352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 405*352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 406*352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 407*352d2591SJean-Christophe PLAGNIOL-VILLARD 408*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = (video_font_draw_table8[bits >> 4] & eorx) ^ bgx; 409*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = (video_font_draw_table8[bits & 15] & eorx) ^ bgx; 410*352d2591SJean-Christophe PLAGNIOL-VILLARD } 411*352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 412*352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 413*352d2591SJean-Christophe PLAGNIOL-VILLARD } 414*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 415*352d2591SJean-Christophe PLAGNIOL-VILLARD 416*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 417*352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 418*352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 419*352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 420*352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 421*352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 422*352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 423*352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 424*352d2591SJean-Christophe PLAGNIOL-VILLARD 425*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 6] & eorx) ^ bgx); 426*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 4 & 3] & eorx) ^ bgx); 427*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 2 & 3] & eorx) ^ bgx); 428*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = SHORTSWAP32 ((video_font_draw_table15 [bits & 3] & eorx) ^ bgx); 429*352d2591SJean-Christophe PLAGNIOL-VILLARD } 430*352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 431*352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 432*352d2591SJean-Christophe PLAGNIOL-VILLARD } 433*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 434*352d2591SJean-Christophe PLAGNIOL-VILLARD 435*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 436*352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 437*352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 438*352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 439*352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 440*352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 441*352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 442*352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 443*352d2591SJean-Christophe PLAGNIOL-VILLARD 444*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 6] & eorx) ^ bgx); 445*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 4 & 3] & eorx) ^ bgx); 446*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 2 & 3] & eorx) ^ bgx); 447*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = SHORTSWAP32 ((video_font_draw_table16 [bits & 3] & eorx) ^ bgx); 448*352d2591SJean-Christophe PLAGNIOL-VILLARD } 449*352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 450*352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 451*352d2591SJean-Christophe PLAGNIOL-VILLARD } 452*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 453*352d2591SJean-Christophe PLAGNIOL-VILLARD 454*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 455*352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 456*352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 457*352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 458*352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 459*352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 460*352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 461*352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 462*352d2591SJean-Christophe PLAGNIOL-VILLARD 463*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = SWAP32 ((video_font_draw_table32 [bits >> 4][0] & eorx) ^ bgx); 464*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = SWAP32 ((video_font_draw_table32 [bits >> 4][1] & eorx) ^ bgx); 465*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = SWAP32 ((video_font_draw_table32 [bits >> 4][2] & eorx) ^ bgx); 466*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = SWAP32 ((video_font_draw_table32 [bits >> 4][3] & eorx) ^ bgx); 467*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[4] = SWAP32 ((video_font_draw_table32 [bits & 15][0] & eorx) ^ bgx); 468*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[5] = SWAP32 ((video_font_draw_table32 [bits & 15][1] & eorx) ^ bgx); 469*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[6] = SWAP32 ((video_font_draw_table32 [bits & 15][2] & eorx) ^ bgx); 470*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[7] = SWAP32 ((video_font_draw_table32 [bits & 15][3] & eorx) ^ bgx); 471*352d2591SJean-Christophe PLAGNIOL-VILLARD } 472*352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 473*352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 474*352d2591SJean-Christophe PLAGNIOL-VILLARD } 475*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 476*352d2591SJean-Christophe PLAGNIOL-VILLARD 477*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 478*352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) { 479*352d2591SJean-Christophe PLAGNIOL-VILLARD c = *s; 480*352d2591SJean-Christophe PLAGNIOL-VILLARD cdat = video_fontdata + c * VIDEO_FONT_HEIGHT; 481*352d2591SJean-Christophe PLAGNIOL-VILLARD for (rows = VIDEO_FONT_HEIGHT, dest = dest0; 482*352d2591SJean-Christophe PLAGNIOL-VILLARD rows--; 483*352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_LINE_LEN) { 484*352d2591SJean-Christophe PLAGNIOL-VILLARD u8 bits = *cdat++; 485*352d2591SJean-Christophe PLAGNIOL-VILLARD 486*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[0] = (video_font_draw_table24[bits >> 4][0] & eorx) ^ bgx; 487*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[1] = (video_font_draw_table24[bits >> 4][1] & eorx) ^ bgx; 488*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[2] = (video_font_draw_table24[bits >> 4][2] & eorx) ^ bgx; 489*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[3] = (video_font_draw_table24[bits & 15][0] & eorx) ^ bgx; 490*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[4] = (video_font_draw_table24[bits & 15][1] & eorx) ^ bgx; 491*352d2591SJean-Christophe PLAGNIOL-VILLARD ((u32 *) dest)[5] = (video_font_draw_table24[bits & 15][2] & eorx) ^ bgx; 492*352d2591SJean-Christophe PLAGNIOL-VILLARD } 493*352d2591SJean-Christophe PLAGNIOL-VILLARD dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; 494*352d2591SJean-Christophe PLAGNIOL-VILLARD s++; 495*352d2591SJean-Christophe PLAGNIOL-VILLARD } 496*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 497*352d2591SJean-Christophe PLAGNIOL-VILLARD } 498*352d2591SJean-Christophe PLAGNIOL-VILLARD } 499*352d2591SJean-Christophe PLAGNIOL-VILLARD 500*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 501*352d2591SJean-Christophe PLAGNIOL-VILLARD 502*352d2591SJean-Christophe PLAGNIOL-VILLARD static inline void video_drawstring (int xx, int yy, unsigned char *s) 503*352d2591SJean-Christophe PLAGNIOL-VILLARD { 504*352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawchars (xx, yy, s, strlen ((char *)s)); 505*352d2591SJean-Christophe PLAGNIOL-VILLARD } 506*352d2591SJean-Christophe PLAGNIOL-VILLARD 507*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 508*352d2591SJean-Christophe PLAGNIOL-VILLARD 509*352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_putchar (int xx, int yy, unsigned char c) 510*352d2591SJean-Christophe PLAGNIOL-VILLARD { 511*352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawchars (xx, yy + VIDEO_LOGO_HEIGHT, &c, 1); 512*352d2591SJean-Christophe PLAGNIOL-VILLARD } 513*352d2591SJean-Christophe PLAGNIOL-VILLARD 514*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 515*352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR) 516*352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_set_cursor (void) 517*352d2591SJean-Christophe PLAGNIOL-VILLARD { 518*352d2591SJean-Christophe PLAGNIOL-VILLARD /* swap drawing colors */ 519*352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx; 520*352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = bgx; 521*352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = eorx; 522*352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 523*352d2591SJean-Christophe PLAGNIOL-VILLARD /* draw cursor */ 524*352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 525*352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 526*352d2591SJean-Christophe PLAGNIOL-VILLARD ' '); 527*352d2591SJean-Christophe PLAGNIOL-VILLARD /* restore drawing colors */ 528*352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx; 529*352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = bgx; 530*352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = eorx; 531*352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 532*352d2591SJean-Christophe PLAGNIOL-VILLARD } 533*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 534*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 535*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR 536*352d2591SJean-Christophe PLAGNIOL-VILLARD void console_cursor (int state) 537*352d2591SJean-Christophe PLAGNIOL-VILLARD { 538*352d2591SJean-Christophe PLAGNIOL-VILLARD static int last_state = 0; 539*352d2591SJean-Christophe PLAGNIOL-VILLARD 540*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_TIME 541*352d2591SJean-Christophe PLAGNIOL-VILLARD struct rtc_time tm; 542*352d2591SJean-Christophe PLAGNIOL-VILLARD char info[16]; 543*352d2591SJean-Christophe PLAGNIOL-VILLARD 544*352d2591SJean-Christophe PLAGNIOL-VILLARD /* time update only if cursor is on (faster scroll) */ 545*352d2591SJean-Christophe PLAGNIOL-VILLARD if (state) { 546*352d2591SJean-Christophe PLAGNIOL-VILLARD rtc_get (&tm); 547*352d2591SJean-Christophe PLAGNIOL-VILLARD 548*352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf (info, " %02d:%02d:%02d ", tm.tm_hour, tm.tm_min, 549*352d2591SJean-Christophe PLAGNIOL-VILLARD tm.tm_sec); 550*352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, 551*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y, (uchar *)info); 552*352d2591SJean-Christophe PLAGNIOL-VILLARD 553*352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf (info, "%02d.%02d.%04d", tm.tm_mday, tm.tm_mon, 554*352d2591SJean-Christophe PLAGNIOL-VILLARD tm.tm_year); 555*352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH, 556*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y + 1 * VIDEO_FONT_HEIGHT, (uchar *)info); 557*352d2591SJean-Christophe PLAGNIOL-VILLARD } 558*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 559*352d2591SJean-Christophe PLAGNIOL-VILLARD 560*352d2591SJean-Christophe PLAGNIOL-VILLARD if (state && (last_state != state)) { 561*352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_cursor (); 562*352d2591SJean-Christophe PLAGNIOL-VILLARD } 563*352d2591SJean-Christophe PLAGNIOL-VILLARD 564*352d2591SJean-Christophe PLAGNIOL-VILLARD if (!state && (last_state != state)) { 565*352d2591SJean-Christophe PLAGNIOL-VILLARD /* clear cursor */ 566*352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 567*352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 568*352d2591SJean-Christophe PLAGNIOL-VILLARD ' '); 569*352d2591SJean-Christophe PLAGNIOL-VILLARD } 570*352d2591SJean-Christophe PLAGNIOL-VILLARD 571*352d2591SJean-Christophe PLAGNIOL-VILLARD last_state = state; 572*352d2591SJean-Christophe PLAGNIOL-VILLARD } 573*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 574*352d2591SJean-Christophe PLAGNIOL-VILLARD 575*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 576*352d2591SJean-Christophe PLAGNIOL-VILLARD 577*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_RECTFILL 578*352d2591SJean-Christophe PLAGNIOL-VILLARD static void memsetl (int *p, int c, int v) 579*352d2591SJean-Christophe PLAGNIOL-VILLARD { 580*352d2591SJean-Christophe PLAGNIOL-VILLARD while (c--) 581*352d2591SJean-Christophe PLAGNIOL-VILLARD *(p++) = v; 582*352d2591SJean-Christophe PLAGNIOL-VILLARD } 583*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 584*352d2591SJean-Christophe PLAGNIOL-VILLARD 585*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 586*352d2591SJean-Christophe PLAGNIOL-VILLARD 587*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_BITBLT 588*352d2591SJean-Christophe PLAGNIOL-VILLARD static void memcpyl (int *d, int *s, int c) 589*352d2591SJean-Christophe PLAGNIOL-VILLARD { 590*352d2591SJean-Christophe PLAGNIOL-VILLARD while (c--) 591*352d2591SJean-Christophe PLAGNIOL-VILLARD *(d++) = *(s++); 592*352d2591SJean-Christophe PLAGNIOL-VILLARD } 593*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 594*352d2591SJean-Christophe PLAGNIOL-VILLARD 595*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 596*352d2591SJean-Christophe PLAGNIOL-VILLARD 597*352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_scrollup (void) 598*352d2591SJean-Christophe PLAGNIOL-VILLARD { 599*352d2591SJean-Christophe PLAGNIOL-VILLARD /* copy up rows ignoring the first one */ 600*352d2591SJean-Christophe PLAGNIOL-VILLARD 601*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_BITBLT 602*352d2591SJean-Christophe PLAGNIOL-VILLARD video_hw_bitblt (VIDEO_PIXEL_SIZE, /* bytes per pixel */ 603*352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* source pos x */ 604*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_LOGO_HEIGHT + VIDEO_FONT_HEIGHT, /* source pos y */ 605*352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* dest pos x */ 606*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_LOGO_HEIGHT, /* dest pos y */ 607*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS, /* frame width */ 608*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT /* frame height */ 609*352d2591SJean-Christophe PLAGNIOL-VILLARD ); 610*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 611*352d2591SJean-Christophe PLAGNIOL-VILLARD memcpyl (CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND, 612*352d2591SJean-Christophe PLAGNIOL-VILLARD CONSOLE_SCROLL_SIZE >> 2); 613*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 614*352d2591SJean-Christophe PLAGNIOL-VILLARD 615*352d2591SJean-Christophe PLAGNIOL-VILLARD /* clear the last one */ 616*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_RECTFILL 617*352d2591SJean-Christophe PLAGNIOL-VILLARD video_hw_rectfill (VIDEO_PIXEL_SIZE, /* bytes per pixel */ 618*352d2591SJean-Christophe PLAGNIOL-VILLARD 0, /* dest pos x */ 619*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_ROWS - VIDEO_FONT_HEIGHT, /* dest pos y */ 620*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_VISIBLE_COLS, /* frame width */ 621*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_FONT_HEIGHT, /* frame height */ 622*352d2591SJean-Christophe PLAGNIOL-VILLARD CONSOLE_BG_COL /* fill color */ 623*352d2591SJean-Christophe PLAGNIOL-VILLARD ); 624*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 625*352d2591SJean-Christophe PLAGNIOL-VILLARD memsetl (CONSOLE_ROW_LAST, CONSOLE_ROW_SIZE >> 2, CONSOLE_BG_COL); 626*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 627*352d2591SJean-Christophe PLAGNIOL-VILLARD } 628*352d2591SJean-Christophe PLAGNIOL-VILLARD 629*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 630*352d2591SJean-Christophe PLAGNIOL-VILLARD 631*352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_back (void) 632*352d2591SJean-Christophe PLAGNIOL-VILLARD { 633*352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_OFF console_col--; 634*352d2591SJean-Christophe PLAGNIOL-VILLARD 635*352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_col < 0) { 636*352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = CONSOLE_COLS - 1; 637*352d2591SJean-Christophe PLAGNIOL-VILLARD console_row--; 638*352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_row < 0) 639*352d2591SJean-Christophe PLAGNIOL-VILLARD console_row = 0; 640*352d2591SJean-Christophe PLAGNIOL-VILLARD } 641*352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 642*352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 643*352d2591SJean-Christophe PLAGNIOL-VILLARD ' '); 644*352d2591SJean-Christophe PLAGNIOL-VILLARD } 645*352d2591SJean-Christophe PLAGNIOL-VILLARD 646*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 647*352d2591SJean-Christophe PLAGNIOL-VILLARD 648*352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_newline (void) 649*352d2591SJean-Christophe PLAGNIOL-VILLARD { 650*352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_OFF console_row++; 651*352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = 0; 652*352d2591SJean-Christophe PLAGNIOL-VILLARD 653*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Check if we need to scroll the terminal */ 654*352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_row >= CONSOLE_ROWS) { 655*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Scroll everything up */ 656*352d2591SJean-Christophe PLAGNIOL-VILLARD console_scrollup (); 657*352d2591SJean-Christophe PLAGNIOL-VILLARD 658*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Decrement row number */ 659*352d2591SJean-Christophe PLAGNIOL-VILLARD console_row--; 660*352d2591SJean-Christophe PLAGNIOL-VILLARD } 661*352d2591SJean-Christophe PLAGNIOL-VILLARD } 662*352d2591SJean-Christophe PLAGNIOL-VILLARD 663*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 664*352d2591SJean-Christophe PLAGNIOL-VILLARD 665*352d2591SJean-Christophe PLAGNIOL-VILLARD void video_putc (const char c) 666*352d2591SJean-Christophe PLAGNIOL-VILLARD { 667*352d2591SJean-Christophe PLAGNIOL-VILLARD switch (c) { 668*352d2591SJean-Christophe PLAGNIOL-VILLARD case 13: /* ignore */ 669*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 670*352d2591SJean-Christophe PLAGNIOL-VILLARD 671*352d2591SJean-Christophe PLAGNIOL-VILLARD case '\n': /* next line */ 672*352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline (); 673*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 674*352d2591SJean-Christophe PLAGNIOL-VILLARD 675*352d2591SJean-Christophe PLAGNIOL-VILLARD case 9: /* tab 8 */ 676*352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_OFF console_col |= 0x0008; 677*352d2591SJean-Christophe PLAGNIOL-VILLARD console_col &= ~0x0007; 678*352d2591SJean-Christophe PLAGNIOL-VILLARD 679*352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_col >= CONSOLE_COLS) 680*352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline (); 681*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 682*352d2591SJean-Christophe PLAGNIOL-VILLARD 683*352d2591SJean-Christophe PLAGNIOL-VILLARD case 8: /* backspace */ 684*352d2591SJean-Christophe PLAGNIOL-VILLARD console_back (); 685*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 686*352d2591SJean-Christophe PLAGNIOL-VILLARD 687*352d2591SJean-Christophe PLAGNIOL-VILLARD default: /* draw the char */ 688*352d2591SJean-Christophe PLAGNIOL-VILLARD video_putchar (console_col * VIDEO_FONT_WIDTH, 689*352d2591SJean-Christophe PLAGNIOL-VILLARD console_row * VIDEO_FONT_HEIGHT, 690*352d2591SJean-Christophe PLAGNIOL-VILLARD c); 691*352d2591SJean-Christophe PLAGNIOL-VILLARD console_col++; 692*352d2591SJean-Christophe PLAGNIOL-VILLARD 693*352d2591SJean-Christophe PLAGNIOL-VILLARD /* check for newline */ 694*352d2591SJean-Christophe PLAGNIOL-VILLARD if (console_col >= CONSOLE_COLS) 695*352d2591SJean-Christophe PLAGNIOL-VILLARD console_newline (); 696*352d2591SJean-Christophe PLAGNIOL-VILLARD } 697*352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_SET} 698*352d2591SJean-Christophe PLAGNIOL-VILLARD 699*352d2591SJean-Christophe PLAGNIOL-VILLARD 700*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 701*352d2591SJean-Christophe PLAGNIOL-VILLARD 702*352d2591SJean-Christophe PLAGNIOL-VILLARD void video_puts (const char *s) 703*352d2591SJean-Christophe PLAGNIOL-VILLARD { 704*352d2591SJean-Christophe PLAGNIOL-VILLARD int count = strlen (s); 705*352d2591SJean-Christophe PLAGNIOL-VILLARD 706*352d2591SJean-Christophe PLAGNIOL-VILLARD while (count--) 707*352d2591SJean-Christophe PLAGNIOL-VILLARD video_putc (*s++); 708*352d2591SJean-Christophe PLAGNIOL-VILLARD } 709*352d2591SJean-Christophe PLAGNIOL-VILLARD 710*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 711*352d2591SJean-Christophe PLAGNIOL-VILLARD 712*352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN) 713*352d2591SJean-Christophe PLAGNIOL-VILLARD 714*352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_8BIT_332RGB(r,g,b) { \ 715*352d2591SJean-Christophe PLAGNIOL-VILLARD *fb = ((r>>5)<<5) | ((g>>5)<<2) | (b>>6); \ 716*352d2591SJean-Christophe PLAGNIOL-VILLARD fb ++; \ 717*352d2591SJean-Christophe PLAGNIOL-VILLARD } 718*352d2591SJean-Christophe PLAGNIOL-VILLARD 719*352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_15BIT_555RGB(r,g,b) { \ 720*352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *)fb = SWAP16((unsigned short)(((r>>3)<<10) | ((g>>3)<<5) | (b>>3))); \ 721*352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 2; \ 722*352d2591SJean-Christophe PLAGNIOL-VILLARD } 723*352d2591SJean-Christophe PLAGNIOL-VILLARD 724*352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_16BIT_565RGB(r,g,b) { \ 725*352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *)fb = SWAP16((unsigned short)((((r)>>3)<<11) | (((g)>>2)<<5) | ((b)>>3))); \ 726*352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 2; \ 727*352d2591SJean-Christophe PLAGNIOL-VILLARD } 728*352d2591SJean-Christophe PLAGNIOL-VILLARD 729*352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_32BIT_X888RGB(r,g,b) { \ 730*352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned long *)fb = SWAP32((unsigned long)(((r<<16) | (g<<8) | b))); \ 731*352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 4; \ 732*352d2591SJean-Christophe PLAGNIOL-VILLARD } 733*352d2591SJean-Christophe PLAGNIOL-VILLARD 734*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 735*352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) { \ 736*352d2591SJean-Christophe PLAGNIOL-VILLARD fb[0] = b; \ 737*352d2591SJean-Christophe PLAGNIOL-VILLARD fb[1] = g; \ 738*352d2591SJean-Christophe PLAGNIOL-VILLARD fb[2] = r; \ 739*352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 3; \ 740*352d2591SJean-Christophe PLAGNIOL-VILLARD } 741*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 742*352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) { \ 743*352d2591SJean-Christophe PLAGNIOL-VILLARD fb[0] = r; \ 744*352d2591SJean-Christophe PLAGNIOL-VILLARD fb[1] = g; \ 745*352d2591SJean-Christophe PLAGNIOL-VILLARD fb[2] = b; \ 746*352d2591SJean-Christophe PLAGNIOL-VILLARD fb += 3; \ 747*352d2591SJean-Christophe PLAGNIOL-VILLARD } 748*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 749*352d2591SJean-Christophe PLAGNIOL-VILLARD 750*352d2591SJean-Christophe PLAGNIOL-VILLARD 751*352d2591SJean-Christophe PLAGNIOL-VILLARD /* 752*352d2591SJean-Christophe PLAGNIOL-VILLARD * Display the BMP file located at address bmp_image. 753*352d2591SJean-Christophe PLAGNIOL-VILLARD * Only uncompressed 754*352d2591SJean-Christophe PLAGNIOL-VILLARD */ 755*352d2591SJean-Christophe PLAGNIOL-VILLARD int video_display_bitmap (ulong bmp_image, int x, int y) 756*352d2591SJean-Christophe PLAGNIOL-VILLARD { 757*352d2591SJean-Christophe PLAGNIOL-VILLARD ushort xcount, ycount; 758*352d2591SJean-Christophe PLAGNIOL-VILLARD uchar *fb; 759*352d2591SJean-Christophe PLAGNIOL-VILLARD bmp_image_t *bmp = (bmp_image_t *) bmp_image; 760*352d2591SJean-Christophe PLAGNIOL-VILLARD uchar *bmap; 761*352d2591SJean-Christophe PLAGNIOL-VILLARD ushort padded_line; 762*352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned long width, height, bpp; 763*352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned colors; 764*352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned long compression; 765*352d2591SJean-Christophe PLAGNIOL-VILLARD bmp_color_table_entry_t cte; 766*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 767*352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *dst = NULL; 768*352d2591SJean-Christophe PLAGNIOL-VILLARD ulong len; 769*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 770*352d2591SJean-Christophe PLAGNIOL-VILLARD 771*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 772*352d2591SJean-Christophe PLAGNIOL-VILLARD 773*352d2591SJean-Christophe PLAGNIOL-VILLARD if (!((bmp->header.signature[0] == 'B') && 774*352d2591SJean-Christophe PLAGNIOL-VILLARD (bmp->header.signature[1] == 'M'))) { 775*352d2591SJean-Christophe PLAGNIOL-VILLARD 776*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 777*352d2591SJean-Christophe PLAGNIOL-VILLARD /* 778*352d2591SJean-Christophe PLAGNIOL-VILLARD * Could be a gzipped bmp image, try to decrompress... 779*352d2591SJean-Christophe PLAGNIOL-VILLARD */ 780*352d2591SJean-Christophe PLAGNIOL-VILLARD len = CFG_VIDEO_LOGO_MAX_SIZE; 781*352d2591SJean-Christophe PLAGNIOL-VILLARD dst = malloc(CFG_VIDEO_LOGO_MAX_SIZE); 782*352d2591SJean-Christophe PLAGNIOL-VILLARD if (dst == NULL) { 783*352d2591SJean-Christophe PLAGNIOL-VILLARD printf("Error: malloc in gunzip failed!\n"); 784*352d2591SJean-Christophe PLAGNIOL-VILLARD return(1); 785*352d2591SJean-Christophe PLAGNIOL-VILLARD } 786*352d2591SJean-Christophe PLAGNIOL-VILLARD if (gunzip(dst, CFG_VIDEO_LOGO_MAX_SIZE, (uchar *)bmp_image, &len) != 0) { 787*352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: no valid bmp or bmp.gz image at %lx\n", bmp_image); 788*352d2591SJean-Christophe PLAGNIOL-VILLARD free(dst); 789*352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 790*352d2591SJean-Christophe PLAGNIOL-VILLARD } 791*352d2591SJean-Christophe PLAGNIOL-VILLARD if (len == CFG_VIDEO_LOGO_MAX_SIZE) { 792*352d2591SJean-Christophe PLAGNIOL-VILLARD printf("Image could be truncated (increase CFG_VIDEO_LOGO_MAX_SIZE)!\n"); 793*352d2591SJean-Christophe PLAGNIOL-VILLARD } 794*352d2591SJean-Christophe PLAGNIOL-VILLARD 795*352d2591SJean-Christophe PLAGNIOL-VILLARD /* 796*352d2591SJean-Christophe PLAGNIOL-VILLARD * Set addr to decompressed image 797*352d2591SJean-Christophe PLAGNIOL-VILLARD */ 798*352d2591SJean-Christophe PLAGNIOL-VILLARD bmp = (bmp_image_t *)dst; 799*352d2591SJean-Christophe PLAGNIOL-VILLARD 800*352d2591SJean-Christophe PLAGNIOL-VILLARD if (!((bmp->header.signature[0] == 'B') && 801*352d2591SJean-Christophe PLAGNIOL-VILLARD (bmp->header.signature[1] == 'M'))) { 802*352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: no valid bmp.gz image at %lx\n", bmp_image); 803*352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 804*352d2591SJean-Christophe PLAGNIOL-VILLARD } 805*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 806*352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: no valid bmp image at %lx\n", bmp_image); 807*352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 808*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_BMP_GZIP */ 809*352d2591SJean-Christophe PLAGNIOL-VILLARD } 810*352d2591SJean-Christophe PLAGNIOL-VILLARD 811*352d2591SJean-Christophe PLAGNIOL-VILLARD width = le32_to_cpu (bmp->header.width); 812*352d2591SJean-Christophe PLAGNIOL-VILLARD height = le32_to_cpu (bmp->header.height); 813*352d2591SJean-Christophe PLAGNIOL-VILLARD bpp = le16_to_cpu (bmp->header.bit_count); 814*352d2591SJean-Christophe PLAGNIOL-VILLARD colors = le32_to_cpu (bmp->header.colors_used); 815*352d2591SJean-Christophe PLAGNIOL-VILLARD compression = le32_to_cpu (bmp->header.compression); 816*352d2591SJean-Christophe PLAGNIOL-VILLARD 817*352d2591SJean-Christophe PLAGNIOL-VILLARD debug ("Display-bmp: %d x %d with %d colors\n", 818*352d2591SJean-Christophe PLAGNIOL-VILLARD width, height, colors); 819*352d2591SJean-Christophe PLAGNIOL-VILLARD 820*352d2591SJean-Christophe PLAGNIOL-VILLARD if (compression != BMP_BI_RGB) { 821*352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: compression type %ld not supported\n", 822*352d2591SJean-Christophe PLAGNIOL-VILLARD compression); 823*352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 824*352d2591SJean-Christophe PLAGNIOL-VILLARD } 825*352d2591SJean-Christophe PLAGNIOL-VILLARD 826*352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3; 827*352d2591SJean-Christophe PLAGNIOL-VILLARD 828*352d2591SJean-Christophe PLAGNIOL-VILLARD if ((x + width) > VIDEO_VISIBLE_COLS) 829*352d2591SJean-Christophe PLAGNIOL-VILLARD width = VIDEO_VISIBLE_COLS - x; 830*352d2591SJean-Christophe PLAGNIOL-VILLARD if ((y + height) > VIDEO_VISIBLE_ROWS) 831*352d2591SJean-Christophe PLAGNIOL-VILLARD height = VIDEO_VISIBLE_ROWS - y; 832*352d2591SJean-Christophe PLAGNIOL-VILLARD 833*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap = (uchar *) bmp + le32_to_cpu (bmp->header.data_offset); 834*352d2591SJean-Christophe PLAGNIOL-VILLARD fb = (uchar *) (video_fb_address + 835*352d2591SJean-Christophe PLAGNIOL-VILLARD ((y + height - 1) * VIDEO_COLS * VIDEO_PIXEL_SIZE) + 836*352d2591SJean-Christophe PLAGNIOL-VILLARD x * VIDEO_PIXEL_SIZE); 837*352d2591SJean-Christophe PLAGNIOL-VILLARD 838*352d2591SJean-Christophe PLAGNIOL-VILLARD /* We handle only 8bpp or 24 bpp bitmap */ 839*352d2591SJean-Christophe PLAGNIOL-VILLARD switch (le16_to_cpu (bmp->header.bit_count)) { 840*352d2591SJean-Christophe PLAGNIOL-VILLARD case 8: 841*352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line -= width; 842*352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) { 843*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Copy colormap */ 844*352d2591SJean-Christophe PLAGNIOL-VILLARD for (xcount = 0; xcount < colors; ++xcount) { 845*352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[xcount]; 846*352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (xcount, cte.red, cte.green, cte.blue); 847*352d2591SJean-Christophe PLAGNIOL-VILLARD } 848*352d2591SJean-Christophe PLAGNIOL-VILLARD } 849*352d2591SJean-Christophe PLAGNIOL-VILLARD ycount = height; 850*352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 851*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 852*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 853*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 854*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 855*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 856*352d2591SJean-Christophe PLAGNIOL-VILLARD *fb++ = *bmap++; 857*352d2591SJean-Christophe PLAGNIOL-VILLARD } 858*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 859*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 860*352d2591SJean-Christophe PLAGNIOL-VILLARD } 861*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 862*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 863*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 864*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 865*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 866*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 867*352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 868*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_8BIT_332RGB (cte.red, cte.green, cte.blue); 869*352d2591SJean-Christophe PLAGNIOL-VILLARD } 870*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 871*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 872*352d2591SJean-Christophe PLAGNIOL-VILLARD } 873*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 874*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 875*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 876*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 877*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 878*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 879*352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 880*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_15BIT_555RGB (cte.red, cte.green, cte.blue); 881*352d2591SJean-Christophe PLAGNIOL-VILLARD } 882*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 883*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 884*352d2591SJean-Christophe PLAGNIOL-VILLARD } 885*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 886*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 887*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 888*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 889*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 890*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 891*352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 892*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_16BIT_565RGB (cte.red, cte.green, cte.blue); 893*352d2591SJean-Christophe PLAGNIOL-VILLARD } 894*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 895*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 896*352d2591SJean-Christophe PLAGNIOL-VILLARD } 897*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 898*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 899*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 900*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 901*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 902*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 903*352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 904*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_32BIT_X888RGB (cte.red, cte.green, cte.blue); 905*352d2591SJean-Christophe PLAGNIOL-VILLARD } 906*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 907*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 908*352d2591SJean-Christophe PLAGNIOL-VILLARD } 909*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 910*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 911*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 912*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 913*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 914*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 915*352d2591SJean-Christophe PLAGNIOL-VILLARD cte = bmp->color_table[*bmap++]; 916*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_24BIT_888RGB (cte.red, cte.green, cte.blue); 917*352d2591SJean-Christophe PLAGNIOL-VILLARD } 918*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 919*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 920*352d2591SJean-Christophe PLAGNIOL-VILLARD } 921*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 922*352d2591SJean-Christophe PLAGNIOL-VILLARD } 923*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 924*352d2591SJean-Christophe PLAGNIOL-VILLARD case 24: 925*352d2591SJean-Christophe PLAGNIOL-VILLARD padded_line -= 3 * width; 926*352d2591SJean-Christophe PLAGNIOL-VILLARD ycount = height; 927*352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 928*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 929*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 930*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 931*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 932*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 933*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_8BIT_332RGB (bmap[2], bmap[1], bmap[0]); 934*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 935*352d2591SJean-Christophe PLAGNIOL-VILLARD } 936*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 937*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 938*352d2591SJean-Christophe PLAGNIOL-VILLARD } 939*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 940*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 941*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 942*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 943*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 944*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 945*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_15BIT_555RGB (bmap[2], bmap[1], bmap[0]); 946*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 947*352d2591SJean-Christophe PLAGNIOL-VILLARD } 948*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 949*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 950*352d2591SJean-Christophe PLAGNIOL-VILLARD } 951*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 952*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 953*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 954*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 955*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 956*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 957*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_16BIT_565RGB (bmap[2], bmap[1], bmap[0]); 958*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 959*352d2591SJean-Christophe PLAGNIOL-VILLARD } 960*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 961*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 962*352d2591SJean-Christophe PLAGNIOL-VILLARD } 963*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 964*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 965*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 966*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 967*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 968*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 969*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_32BIT_X888RGB (bmap[2], bmap[1], bmap[0]); 970*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 971*352d2591SJean-Christophe PLAGNIOL-VILLARD } 972*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 973*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 974*352d2591SJean-Christophe PLAGNIOL-VILLARD } 975*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 976*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 977*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 978*352d2591SJean-Christophe PLAGNIOL-VILLARD WATCHDOG_RESET (); 979*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = width; 980*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 981*352d2591SJean-Christophe PLAGNIOL-VILLARD FILL_24BIT_888RGB (bmap[2], bmap[1], bmap[0]); 982*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += 3; 983*352d2591SJean-Christophe PLAGNIOL-VILLARD } 984*352d2591SJean-Christophe PLAGNIOL-VILLARD bmap += padded_line; 985*352d2591SJean-Christophe PLAGNIOL-VILLARD fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE; 986*352d2591SJean-Christophe PLAGNIOL-VILLARD } 987*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 988*352d2591SJean-Christophe PLAGNIOL-VILLARD default: 989*352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: 24 bits/pixel bitmap incompatible with current video mode\n"); 990*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 991*352d2591SJean-Christophe PLAGNIOL-VILLARD } 992*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 993*352d2591SJean-Christophe PLAGNIOL-VILLARD default: 994*352d2591SJean-Christophe PLAGNIOL-VILLARD printf ("Error: %d bit/pixel bitmaps not supported by U-Boot\n", 995*352d2591SJean-Christophe PLAGNIOL-VILLARD le16_to_cpu (bmp->header.bit_count)); 996*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 997*352d2591SJean-Christophe PLAGNIOL-VILLARD } 998*352d2591SJean-Christophe PLAGNIOL-VILLARD 999*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP 1000*352d2591SJean-Christophe PLAGNIOL-VILLARD if (dst) { 1001*352d2591SJean-Christophe PLAGNIOL-VILLARD free(dst); 1002*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1003*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1004*352d2591SJean-Christophe PLAGNIOL-VILLARD 1005*352d2591SJean-Christophe PLAGNIOL-VILLARD return (0); 1006*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1007*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1008*352d2591SJean-Christophe PLAGNIOL-VILLARD 1009*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1010*352d2591SJean-Christophe PLAGNIOL-VILLARD 1011*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 1012*352d2591SJean-Christophe PLAGNIOL-VILLARD void logo_plot (void *screen, int width, int x, int y) 1013*352d2591SJean-Christophe PLAGNIOL-VILLARD { 1014*352d2591SJean-Christophe PLAGNIOL-VILLARD 1015*352d2591SJean-Christophe PLAGNIOL-VILLARD int xcount, i; 1016*352d2591SJean-Christophe PLAGNIOL-VILLARD int skip = (width - VIDEO_LOGO_WIDTH) * VIDEO_PIXEL_SIZE; 1017*352d2591SJean-Christophe PLAGNIOL-VILLARD int ycount = VIDEO_LOGO_HEIGHT; 1018*352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char r, g, b, *logo_red, *logo_blue, *logo_green; 1019*352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *source; 1020*352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char *dest = (unsigned char *)screen + ((y * width * VIDEO_PIXEL_SIZE) + x); 1021*352d2591SJean-Christophe PLAGNIOL-VILLARD 1022*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 1023*352d2591SJean-Christophe PLAGNIOL-VILLARD source = bmp_logo_bitmap; 1024*352d2591SJean-Christophe PLAGNIOL-VILLARD 1025*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Allocate temporary space for computing colormap */ 1026*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red = malloc (BMP_LOGO_COLORS); 1027*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green = malloc (BMP_LOGO_COLORS); 1028*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue = malloc (BMP_LOGO_COLORS); 1029*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Compute color map */ 1030*352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < VIDEO_LOGO_COLORS; i++) { 1031*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4; 1032*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green[i] = (bmp_logo_palette[i] & 0x00f0); 1033*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4; 1034*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1035*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1036*352d2591SJean-Christophe PLAGNIOL-VILLARD source = linux_logo; 1037*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red = linux_logo_red; 1038*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_green = linux_logo_green; 1039*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_blue = linux_logo_blue; 1040*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1041*352d2591SJean-Christophe PLAGNIOL-VILLARD 1042*352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) { 1043*352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 0; i < VIDEO_LOGO_COLORS; i++) { 1044*352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (i + VIDEO_LOGO_LUT_OFFSET, 1045*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_red[i], logo_green[i], logo_blue[i]); 1046*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1047*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1048*352d2591SJean-Christophe PLAGNIOL-VILLARD 1049*352d2591SJean-Christophe PLAGNIOL-VILLARD while (ycount--) { 1050*352d2591SJean-Christophe PLAGNIOL-VILLARD xcount = VIDEO_LOGO_WIDTH; 1051*352d2591SJean-Christophe PLAGNIOL-VILLARD while (xcount--) { 1052*352d2591SJean-Christophe PLAGNIOL-VILLARD r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET]; 1053*352d2591SJean-Christophe PLAGNIOL-VILLARD g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET]; 1054*352d2591SJean-Christophe PLAGNIOL-VILLARD b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET]; 1055*352d2591SJean-Christophe PLAGNIOL-VILLARD 1056*352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1057*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 1058*352d2591SJean-Christophe PLAGNIOL-VILLARD *dest = *source; 1059*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1060*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 1061*352d2591SJean-Christophe PLAGNIOL-VILLARD *dest = ((r >> 5) << 5) | ((g >> 5) << 2) | (b >> 6); 1062*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1063*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1064*352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *) dest = 1065*352d2591SJean-Christophe PLAGNIOL-VILLARD SWAP16 ((unsigned short) (((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3))); 1066*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1067*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1068*352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned short *) dest = 1069*352d2591SJean-Christophe PLAGNIOL-VILLARD SWAP16 ((unsigned short) (((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3))); 1070*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1071*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1072*352d2591SJean-Christophe PLAGNIOL-VILLARD *(unsigned long *) dest = 1073*352d2591SJean-Christophe PLAGNIOL-VILLARD SWAP32 ((unsigned long) ((r << 16) | (g << 8) | b)); 1074*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1075*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1076*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN 1077*352d2591SJean-Christophe PLAGNIOL-VILLARD dest[0] = b; 1078*352d2591SJean-Christophe PLAGNIOL-VILLARD dest[1] = g; 1079*352d2591SJean-Christophe PLAGNIOL-VILLARD dest[2] = r; 1080*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1081*352d2591SJean-Christophe PLAGNIOL-VILLARD dest[0] = r; 1082*352d2591SJean-Christophe PLAGNIOL-VILLARD dest[1] = g; 1083*352d2591SJean-Christophe PLAGNIOL-VILLARD dest[2] = b; 1084*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1085*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1086*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1087*352d2591SJean-Christophe PLAGNIOL-VILLARD source++; 1088*352d2591SJean-Christophe PLAGNIOL-VILLARD dest += VIDEO_PIXEL_SIZE; 1089*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1090*352d2591SJean-Christophe PLAGNIOL-VILLARD dest += skip; 1091*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1092*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO 1093*352d2591SJean-Christophe PLAGNIOL-VILLARD free (logo_red); 1094*352d2591SJean-Christophe PLAGNIOL-VILLARD free (logo_green); 1095*352d2591SJean-Christophe PLAGNIOL-VILLARD free (logo_blue); 1096*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1097*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1098*352d2591SJean-Christophe PLAGNIOL-VILLARD 1099*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1100*352d2591SJean-Christophe PLAGNIOL-VILLARD 1101*352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_logo (void) 1102*352d2591SJean-Christophe PLAGNIOL-VILLARD { 1103*352d2591SJean-Christophe PLAGNIOL-VILLARD char info[128]; 1104*352d2591SJean-Christophe PLAGNIOL-VILLARD extern char version_string; 1105*352d2591SJean-Christophe PLAGNIOL-VILLARD 1106*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SPLASH_SCREEN 1107*352d2591SJean-Christophe PLAGNIOL-VILLARD char *s; 1108*352d2591SJean-Christophe PLAGNIOL-VILLARD ulong addr; 1109*352d2591SJean-Christophe PLAGNIOL-VILLARD 1110*352d2591SJean-Christophe PLAGNIOL-VILLARD if ((s = getenv ("splashimage")) != NULL) { 1111*352d2591SJean-Christophe PLAGNIOL-VILLARD addr = simple_strtoul (s, NULL, 16); 1112*352d2591SJean-Christophe PLAGNIOL-VILLARD 1113*352d2591SJean-Christophe PLAGNIOL-VILLARD if (video_display_bitmap (addr, 0, 0) == 0) { 1114*352d2591SJean-Christophe PLAGNIOL-VILLARD return ((void *) (video_fb_address)); 1115*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1116*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1117*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_SPLASH_SCREEN */ 1118*352d2591SJean-Christophe PLAGNIOL-VILLARD 1119*352d2591SJean-Christophe PLAGNIOL-VILLARD logo_plot (video_fb_address, VIDEO_COLS, 0, 0); 1120*352d2591SJean-Christophe PLAGNIOL-VILLARD 1121*352d2591SJean-Christophe PLAGNIOL-VILLARD sprintf (info, " %s", &version_string); 1122*352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *)info); 1123*352d2591SJean-Christophe PLAGNIOL-VILLARD 1124*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO 1125*352d2591SJean-Christophe PLAGNIOL-VILLARD { 1126*352d2591SJean-Christophe PLAGNIOL-VILLARD int i, n = ((VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT) / VIDEO_FONT_HEIGHT); 1127*352d2591SJean-Christophe PLAGNIOL-VILLARD 1128*352d2591SJean-Christophe PLAGNIOL-VILLARD for (i = 1; i < n; i++) { 1129*352d2591SJean-Christophe PLAGNIOL-VILLARD video_get_info_str (i, info); 1130*352d2591SJean-Christophe PLAGNIOL-VILLARD if (*info) 1131*352d2591SJean-Christophe PLAGNIOL-VILLARD video_drawstring (VIDEO_INFO_X, 1132*352d2591SJean-Christophe PLAGNIOL-VILLARD VIDEO_INFO_Y + i * VIDEO_FONT_HEIGHT, 1133*352d2591SJean-Christophe PLAGNIOL-VILLARD (uchar *)info); 1134*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1135*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1136*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1137*352d2591SJean-Christophe PLAGNIOL-VILLARD 1138*352d2591SJean-Christophe PLAGNIOL-VILLARD return (video_fb_address + VIDEO_LOGO_HEIGHT * VIDEO_LINE_LEN); 1139*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1140*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1141*352d2591SJean-Christophe PLAGNIOL-VILLARD 1142*352d2591SJean-Christophe PLAGNIOL-VILLARD 1143*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1144*352d2591SJean-Christophe PLAGNIOL-VILLARD 1145*352d2591SJean-Christophe PLAGNIOL-VILLARD static int video_init (void) 1146*352d2591SJean-Christophe PLAGNIOL-VILLARD { 1147*352d2591SJean-Christophe PLAGNIOL-VILLARD unsigned char color8; 1148*352d2591SJean-Christophe PLAGNIOL-VILLARD 1149*352d2591SJean-Christophe PLAGNIOL-VILLARD if ((pGD = video_hw_init ()) == NULL) 1150*352d2591SJean-Christophe PLAGNIOL-VILLARD return -1; 1151*352d2591SJean-Christophe PLAGNIOL-VILLARD 1152*352d2591SJean-Christophe PLAGNIOL-VILLARD video_fb_address = (void *) VIDEO_FB_ADRS; 1153*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR 1154*352d2591SJean-Christophe PLAGNIOL-VILLARD video_init_hw_cursor (VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT); 1155*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1156*352d2591SJean-Christophe PLAGNIOL-VILLARD 1157*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init drawing pats */ 1158*352d2591SJean-Christophe PLAGNIOL-VILLARD switch (VIDEO_DATA_FORMAT) { 1159*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_INDEX: 1160*352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (0x01, CONSOLE_FG_COL, CONSOLE_FG_COL, CONSOLE_FG_COL); 1161*352d2591SJean-Christophe PLAGNIOL-VILLARD video_set_lut (0x00, CONSOLE_BG_COL, CONSOLE_BG_COL, CONSOLE_BG_COL); 1162*352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = 0x01010101; 1163*352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = 0x00000000; 1164*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1165*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF__8BIT_332RGB: 1166*352d2591SJean-Christophe PLAGNIOL-VILLARD color8 = ((CONSOLE_FG_COL & 0xe0) | 1167*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) & 0x1c) | CONSOLE_FG_COL >> 6); 1168*352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8; 1169*352d2591SJean-Christophe PLAGNIOL-VILLARD color8 = ((CONSOLE_BG_COL & 0xe0) | 1170*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) & 0x1c) | CONSOLE_BG_COL >> 6); 1171*352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8; 1172*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1173*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_15BIT_555RGB: 1174*352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (((CONSOLE_FG_COL >> 3) << 26) | 1175*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) << 21) | ((CONSOLE_FG_COL >> 3) << 16) | 1176*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) << 10) | ((CONSOLE_FG_COL >> 3) << 5) | 1177*352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL >> 3)); 1178*352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (((CONSOLE_BG_COL >> 3) << 26) | 1179*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) << 21) | ((CONSOLE_BG_COL >> 3) << 16) | 1180*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) << 10) | ((CONSOLE_BG_COL >> 3) << 5) | 1181*352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL >> 3)); 1182*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1183*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_16BIT_565RGB: 1184*352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (((CONSOLE_FG_COL >> 3) << 27) | 1185*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 2) << 21) | ((CONSOLE_FG_COL >> 3) << 16) | 1186*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_FG_COL >> 3) << 11) | ((CONSOLE_FG_COL >> 2) << 5) | 1187*352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL >> 3)); 1188*352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (((CONSOLE_BG_COL >> 3) << 27) | 1189*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 2) << 21) | ((CONSOLE_BG_COL >> 3) << 16) | 1190*352d2591SJean-Christophe PLAGNIOL-VILLARD ((CONSOLE_BG_COL >> 3) << 11) | ((CONSOLE_BG_COL >> 2) << 5) | 1191*352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL >> 3)); 1192*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1193*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_32BIT_X888RGB: 1194*352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (CONSOLE_FG_COL << 16) | (CONSOLE_FG_COL << 8) | CONSOLE_FG_COL; 1195*352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (CONSOLE_BG_COL << 16) | (CONSOLE_BG_COL << 8) | CONSOLE_BG_COL; 1196*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1197*352d2591SJean-Christophe PLAGNIOL-VILLARD case GDF_24BIT_888RGB: 1198*352d2591SJean-Christophe PLAGNIOL-VILLARD fgx = (CONSOLE_FG_COL << 24) | (CONSOLE_FG_COL << 16) | 1199*352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_FG_COL << 8) | CONSOLE_FG_COL; 1200*352d2591SJean-Christophe PLAGNIOL-VILLARD bgx = (CONSOLE_BG_COL << 24) | (CONSOLE_BG_COL << 16) | 1201*352d2591SJean-Christophe PLAGNIOL-VILLARD (CONSOLE_BG_COL << 8) | CONSOLE_BG_COL; 1202*352d2591SJean-Christophe PLAGNIOL-VILLARD break; 1203*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1204*352d2591SJean-Christophe PLAGNIOL-VILLARD eorx = fgx ^ bgx; 1205*352d2591SJean-Christophe PLAGNIOL-VILLARD 1206*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO 1207*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Plot the logo and get start point of console */ 1208*352d2591SJean-Christophe PLAGNIOL-VILLARD PRINTD ("Video: Drawing the logo ...\n"); 1209*352d2591SJean-Christophe PLAGNIOL-VILLARD video_console_address = video_logo (); 1210*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1211*352d2591SJean-Christophe PLAGNIOL-VILLARD video_console_address = video_fb_address; 1212*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif 1213*352d2591SJean-Christophe PLAGNIOL-VILLARD 1214*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Initialize the console */ 1215*352d2591SJean-Christophe PLAGNIOL-VILLARD console_col = 0; 1216*352d2591SJean-Christophe PLAGNIOL-VILLARD console_row = 0; 1217*352d2591SJean-Christophe PLAGNIOL-VILLARD 1218*352d2591SJean-Christophe PLAGNIOL-VILLARD return 0; 1219*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1220*352d2591SJean-Christophe PLAGNIOL-VILLARD 1221*352d2591SJean-Christophe PLAGNIOL-VILLARD 1222*352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/ 1223*352d2591SJean-Christophe PLAGNIOL-VILLARD 1224*352d2591SJean-Christophe PLAGNIOL-VILLARD int drv_video_init (void) 1225*352d2591SJean-Christophe PLAGNIOL-VILLARD { 1226*352d2591SJean-Christophe PLAGNIOL-VILLARD int skip_dev_init; 1227*352d2591SJean-Christophe PLAGNIOL-VILLARD device_t console_dev; 1228*352d2591SJean-Christophe PLAGNIOL-VILLARD 1229*352d2591SJean-Christophe PLAGNIOL-VILLARD skip_dev_init = 0; 1230*352d2591SJean-Christophe PLAGNIOL-VILLARD 1231*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init video chip - returns with framebuffer cleared */ 1232*352d2591SJean-Christophe PLAGNIOL-VILLARD if (video_init () == -1) 1233*352d2591SJean-Christophe PLAGNIOL-VILLARD skip_dev_init = 1; 1234*352d2591SJean-Christophe PLAGNIOL-VILLARD 1235*352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VGA_AS_SINGLE_DEVICE 1236*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Devices VGA and Keyboard will be assigned seperately */ 1237*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init vga device */ 1238*352d2591SJean-Christophe PLAGNIOL-VILLARD if (!skip_dev_init) { 1239*352d2591SJean-Christophe PLAGNIOL-VILLARD memset (&console_dev, 0, sizeof (console_dev)); 1240*352d2591SJean-Christophe PLAGNIOL-VILLARD strcpy (console_dev.name, "vga"); 1241*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.ext = DEV_EXT_VIDEO; /* Video extensions */ 1242*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM; 1243*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.putc = video_putc; /* 'putc' function */ 1244*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.puts = video_puts; /* 'puts' function */ 1245*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.tstc = NULL; /* 'tstc' function */ 1246*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.getc = NULL; /* 'getc' function */ 1247*352d2591SJean-Christophe PLAGNIOL-VILLARD 1248*352d2591SJean-Christophe PLAGNIOL-VILLARD if (device_register (&console_dev) == 0) 1249*352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 1250*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1251*352d2591SJean-Christophe PLAGNIOL-VILLARD #else 1252*352d2591SJean-Christophe PLAGNIOL-VILLARD PRINTD ("KBD: Keyboard init ...\n"); 1253*352d2591SJean-Christophe PLAGNIOL-VILLARD if (VIDEO_KBD_INIT_FCT == -1) 1254*352d2591SJean-Christophe PLAGNIOL-VILLARD skip_dev_init = 1; 1255*352d2591SJean-Christophe PLAGNIOL-VILLARD 1256*352d2591SJean-Christophe PLAGNIOL-VILLARD /* Init console device */ 1257*352d2591SJean-Christophe PLAGNIOL-VILLARD if (!skip_dev_init) { 1258*352d2591SJean-Christophe PLAGNIOL-VILLARD memset (&console_dev, 0, sizeof (console_dev)); 1259*352d2591SJean-Christophe PLAGNIOL-VILLARD strcpy (console_dev.name, "vga"); 1260*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.ext = DEV_EXT_VIDEO; /* Video extensions */ 1261*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM; 1262*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.putc = video_putc; /* 'putc' function */ 1263*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.puts = video_puts; /* 'puts' function */ 1264*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.tstc = VIDEO_TSTC_FCT; /* 'tstc' function */ 1265*352d2591SJean-Christophe PLAGNIOL-VILLARD console_dev.getc = VIDEO_GETC_FCT; /* 'getc' function */ 1266*352d2591SJean-Christophe PLAGNIOL-VILLARD 1267*352d2591SJean-Christophe PLAGNIOL-VILLARD if (device_register (&console_dev) == 0) 1268*352d2591SJean-Christophe PLAGNIOL-VILLARD return 1; 1269*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1270*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VGA_AS_SINGLE_DEVICE */ 1271*352d2591SJean-Christophe PLAGNIOL-VILLARD /* No console dev available */ 1272*352d2591SJean-Christophe PLAGNIOL-VILLARD return 0; 1273*352d2591SJean-Christophe PLAGNIOL-VILLARD } 1274*352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_CFB_CONSOLE */ 1275