xref: /rk3399_rockchip-uboot/drivers/video/cfb_console.c (revision 352d259130b349fe9593b8dada641bd78a9659e5)
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