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