xref: /rk3399_rockchip-uboot/drivers/video/cfb_console.c (revision e84d568fa2a9f4ce7888141e71676368ef6b3f25)
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 /*****************************************************************************/
144bed53753SAnatolij Gustschin /* Defines for the MB862xx driver					     */
145bed53753SAnatolij Gustschin /*****************************************************************************/
146bed53753SAnatolij Gustschin #ifdef CONFIG_VIDEO_MB862xx
147bed53753SAnatolij Gustschin 
148bed53753SAnatolij Gustschin #ifdef CONFIG_VIDEO_CORALP
149bed53753SAnatolij Gustschin #define VIDEO_FB_LITTLE_ENDIAN
150bed53753SAnatolij Gustschin #endif
151bed53753SAnatolij Gustschin #define VIDEO_HW_RECTFILL
152bed53753SAnatolij Gustschin #define VIDEO_HW_BITBLT
153bed53753SAnatolij Gustschin #endif
154bed53753SAnatolij Gustschin 
155bed53753SAnatolij Gustschin /*****************************************************************************/
156352d2591SJean-Christophe PLAGNIOL-VILLARD /* Include video_fb.h after definitions of VIDEO_HW_RECTFILL etc	     */
157352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
158352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_fb.h>
159352d2591SJean-Christophe PLAGNIOL-VILLARD 
160352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
161352d2591SJean-Christophe PLAGNIOL-VILLARD /* some Macros								     */
162352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
163352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_COLS	(pGD->winSizeX)
164352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_VISIBLE_ROWS	(pGD->winSizeY)
165352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIXEL_SIZE	(pGD->gdfBytesPP)
166352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_DATA_FORMAT	(pGD->gdfIndex)
167352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_FB_ADRS		(pGD->frameAdrs)
168352d2591SJean-Christophe PLAGNIOL-VILLARD 
169352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
170352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device defines with i8042 keyboard controller		     */
171352d2591SJean-Christophe PLAGNIOL-VILLARD /* Any other keyboard controller must change this section		     */
172352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
173352d2591SJean-Christophe PLAGNIOL-VILLARD 
174352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CONFIG_I8042_KBD
175352d2591SJean-Christophe PLAGNIOL-VILLARD #include <i8042.h>
176352d2591SJean-Christophe PLAGNIOL-VILLARD 
177352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_KBD_INIT_FCT	i8042_kbd_init()
178352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_TSTC_FCT		i8042_tstc
179352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_GETC_FCT		i8042_getc
180352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
181352d2591SJean-Christophe PLAGNIOL-VILLARD 
182352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
183352d2591SJean-Christophe PLAGNIOL-VILLARD /* Console device							     */
184352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
185352d2591SJean-Christophe PLAGNIOL-VILLARD 
186352d2591SJean-Christophe PLAGNIOL-VILLARD #include <version.h>
187352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux/types.h>
188352d2591SJean-Christophe PLAGNIOL-VILLARD #include <devices.h>
189352d2591SJean-Christophe PLAGNIOL-VILLARD #include <video_font.h>
190352d2591SJean-Christophe PLAGNIOL-VILLARD 
191352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_DATE)
192352d2591SJean-Christophe PLAGNIOL-VILLARD #include <rtc.h>
193352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
194352d2591SJean-Christophe PLAGNIOL-VILLARD 
195352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
196352d2591SJean-Christophe PLAGNIOL-VILLARD #include <watchdog.h>
197352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_layout.h>
198352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
199352d2591SJean-Christophe PLAGNIOL-VILLARD 
200352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
201352d2591SJean-Christophe PLAGNIOL-VILLARD /* Cursor definition:							     */
2027817cb20SMarcel Ziswiler /* CONFIG_CONSOLE_CURSOR:  Uses a timer function (see drivers/input/i8042.c) */
2037817cb20SMarcel Ziswiler /*                         to let the cursor blink. Uses the macros	     */
2047817cb20SMarcel Ziswiler /*                         CURSOR_OFF and CURSOR_ON.			     */
205352d2591SJean-Christophe PLAGNIOL-VILLARD /* CONFIG_VIDEO_SW_CURSOR: Draws a cursor after the last character. No	     */
206352d2591SJean-Christophe PLAGNIOL-VILLARD /*			   blinking is provided. Uses the macros CURSOR_SET  */
207352d2591SJean-Christophe PLAGNIOL-VILLARD /*			   and CURSOR_OFF.				     */
208352d2591SJean-Christophe PLAGNIOL-VILLARD /* CONFIG_VIDEO_HW_CURSOR: Uses the hardware cursor capability of the	     */
209352d2591SJean-Christophe PLAGNIOL-VILLARD /*			   graphic chip. Uses the macro CURSOR_SET.	     */
210352d2591SJean-Christophe PLAGNIOL-VILLARD /*			   ATTENTION: If booting an OS, the display driver   */
211352d2591SJean-Christophe PLAGNIOL-VILLARD /*			   must disable the hardware register of the graphic */
212352d2591SJean-Christophe PLAGNIOL-VILLARD /*			   chip. Otherwise a blinking field is displayed     */
213352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
214352d2591SJean-Christophe PLAGNIOL-VILLARD #if !defined(CONFIG_CONSOLE_CURSOR) && \
215352d2591SJean-Christophe PLAGNIOL-VILLARD     !defined(CONFIG_VIDEO_SW_CURSOR) && \
216352d2591SJean-Christophe PLAGNIOL-VILLARD     !defined(CONFIG_VIDEO_HW_CURSOR)
217352d2591SJean-Christophe PLAGNIOL-VILLARD /* no Cursor defined */
218352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON
219352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF
220352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET
221352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
222352d2591SJean-Christophe PLAGNIOL-VILLARD 
223352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CONFIG_CONSOLE_CURSOR
224352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CURSOR_ON
225352d2591SJean-Christophe PLAGNIOL-VILLARD #error	only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined
226352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
227352d2591SJean-Christophe PLAGNIOL-VILLARD void	console_cursor (int state);
228352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON  console_cursor(1);
229352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF console_cursor(0);
230352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET
231352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_I8042_KBD
2327817cb20SMarcel Ziswiler #warning Cursor drawing on/off needs timer function s.a. drivers/input/i8042.c
233352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
234352d2591SJean-Christophe PLAGNIOL-VILLARD #else
235352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CONFIG_CONSOLE_TIME
236352d2591SJean-Christophe PLAGNIOL-VILLARD #error	CONFIG_CONSOLE_CURSOR must be defined for CONFIG_CONSOLE_TIME
237352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
238352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_CONSOLE_CURSOR */
239352d2591SJean-Christophe PLAGNIOL-VILLARD 
240352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CONFIG_VIDEO_SW_CURSOR
241352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CURSOR_ON
242352d2591SJean-Christophe PLAGNIOL-VILLARD #error	only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined
243352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
244352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON
245352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF video_putchar(console_col * VIDEO_FONT_WIDTH,\
246352d2591SJean-Christophe PLAGNIOL-VILLARD 				 console_row * VIDEO_FONT_HEIGHT, ' ');
247352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET video_set_cursor();
248352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_SW_CURSOR */
249352d2591SJean-Christophe PLAGNIOL-VILLARD 
250352d2591SJean-Christophe PLAGNIOL-VILLARD 
251352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR
252352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CURSOR_ON
253352d2591SJean-Christophe PLAGNIOL-VILLARD #error	only one of CONFIG_CONSOLE_CURSOR,CONFIG_VIDEO_SW_CURSOR,CONFIG_VIDEO_HW_CURSOR can be defined
254352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
255352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_ON
256352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_OFF
257352d2591SJean-Christophe PLAGNIOL-VILLARD #define CURSOR_SET video_set_hw_cursor(console_col * VIDEO_FONT_WIDTH, \
258352d2591SJean-Christophe PLAGNIOL-VILLARD 		  (console_row * VIDEO_FONT_HEIGHT) + VIDEO_LOGO_HEIGHT);
259352d2591SJean-Christophe PLAGNIOL-VILLARD #endif	/* CONFIG_VIDEO_HW_CURSOR */
260352d2591SJean-Christophe PLAGNIOL-VILLARD 
261352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CONFIG_VIDEO_LOGO
262352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CONFIG_VIDEO_BMP_LOGO
263352d2591SJean-Christophe PLAGNIOL-VILLARD #include <bmp_logo.h>
264352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH	BMP_LOGO_WIDTH
265352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT	BMP_LOGO_HEIGHT
266352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET	BMP_LOGO_OFFSET
267352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS	BMP_LOGO_COLORS
268352d2591SJean-Christophe PLAGNIOL-VILLARD 
269352d2591SJean-Christophe PLAGNIOL-VILLARD #else	/* CONFIG_VIDEO_BMP_LOGO */
270352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_WIDTH	80
271352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_HEIGHT	80
272352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_COLORS	214
273352d2591SJean-Christophe PLAGNIOL-VILLARD #define LINUX_LOGO_LUT_OFFSET	0x20
274352d2591SJean-Christophe PLAGNIOL-VILLARD #define __initdata
275352d2591SJean-Christophe PLAGNIOL-VILLARD #include <linux_logo.h>
276352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH	LINUX_LOGO_WIDTH
277352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT	LINUX_LOGO_HEIGHT
278352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_LUT_OFFSET	LINUX_LOGO_LUT_OFFSET
279352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_COLORS	LINUX_LOGO_COLORS
280352d2591SJean-Christophe PLAGNIOL-VILLARD #endif	/* CONFIG_VIDEO_BMP_LOGO */
281352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_X		(VIDEO_LOGO_WIDTH)
282352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_INFO_Y		(VIDEO_FONT_HEIGHT/2)
283352d2591SJean-Christophe PLAGNIOL-VILLARD #else	/* CONFIG_VIDEO_LOGO */
284352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_WIDTH	0
285352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LOGO_HEIGHT	0
286352d2591SJean-Christophe PLAGNIOL-VILLARD #endif	/* CONFIG_VIDEO_LOGO */
287352d2591SJean-Christophe PLAGNIOL-VILLARD 
288352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_COLS		VIDEO_VISIBLE_COLS
289352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_ROWS		VIDEO_VISIBLE_ROWS
290352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_SIZE		(VIDEO_ROWS*VIDEO_COLS*VIDEO_PIXEL_SIZE)
291352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_PIX_BLOCKS	(VIDEO_SIZE >> 2)
292352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_LINE_LEN		(VIDEO_COLS*VIDEO_PIXEL_SIZE)
293352d2591SJean-Christophe PLAGNIOL-VILLARD #define VIDEO_BURST_LEN		(VIDEO_COLS/8)
294352d2591SJean-Christophe PLAGNIOL-VILLARD 
295352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	CONFIG_VIDEO_LOGO
296352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROWS		((VIDEO_ROWS - VIDEO_LOGO_HEIGHT) / VIDEO_FONT_HEIGHT)
297352d2591SJean-Christophe PLAGNIOL-VILLARD #else
298352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROWS		(VIDEO_ROWS / VIDEO_FONT_HEIGHT)
299352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
300352d2591SJean-Christophe PLAGNIOL-VILLARD 
301352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_COLS		(VIDEO_COLS / VIDEO_FONT_WIDTH)
302352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SIZE	(VIDEO_FONT_HEIGHT * VIDEO_LINE_LEN)
303352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_FIRST	(video_console_address)
304352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_SECOND	(video_console_address + CONSOLE_ROW_SIZE)
305352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_ROW_LAST	(video_console_address + CONSOLE_SIZE - CONSOLE_ROW_SIZE)
306352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SIZE		(CONSOLE_ROW_SIZE * CONSOLE_ROWS)
307352d2591SJean-Christophe PLAGNIOL-VILLARD #define CONSOLE_SCROLL_SIZE	(CONSOLE_SIZE - CONSOLE_ROW_SIZE)
308352d2591SJean-Christophe PLAGNIOL-VILLARD 
309352d2591SJean-Christophe PLAGNIOL-VILLARD /* Macros */
310352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef	VIDEO_FB_LITTLE_ENDIAN
311352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP16(x)	 ((((x) & 0x00ff) << 8) | ( (x) >> 8))
312352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP32(x)	 ((((x) & 0x000000ff) << 24) | (((x) & 0x0000ff00) << 8)|\
313352d2591SJean-Christophe PLAGNIOL-VILLARD 			  (((x) & 0x00ff0000) >>  8) | (((x) & 0xff000000) >> 24) )
314352d2591SJean-Christophe PLAGNIOL-VILLARD #define SHORTSWAP32(x)	 ((((x) & 0x000000ff) <<  8) | (((x) & 0x0000ff00) >> 8)|\
315352d2591SJean-Christophe PLAGNIOL-VILLARD 			  (((x) & 0x00ff0000) <<  8) | (((x) & 0xff000000) >> 8) )
316352d2591SJean-Christophe PLAGNIOL-VILLARD #else
317352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP16(x)	 (x)
318352d2591SJean-Christophe PLAGNIOL-VILLARD #define SWAP32(x)	 (x)
319bed53753SAnatolij Gustschin #if !defined(VIDEO_FB_16BPP_PIXEL_SWAP)
320352d2591SJean-Christophe PLAGNIOL-VILLARD #define SHORTSWAP32(x)	 (x)
321bed53753SAnatolij Gustschin #else
322bed53753SAnatolij Gustschin #define SHORTSWAP32(x)	 ( ((x) >> 16) | ((x) << 16) )
323bed53753SAnatolij Gustschin #endif
324352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
325352d2591SJean-Christophe PLAGNIOL-VILLARD 
326352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(DEBUG) || defined(DEBUG_CFB_CONSOLE)
327352d2591SJean-Christophe PLAGNIOL-VILLARD #define PRINTD(x)	  printf(x)
328352d2591SJean-Christophe PLAGNIOL-VILLARD #else
329352d2591SJean-Christophe PLAGNIOL-VILLARD #define PRINTD(x)
330352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
331352d2591SJean-Christophe PLAGNIOL-VILLARD 
332352d2591SJean-Christophe PLAGNIOL-VILLARD 
333352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO
334352d2591SJean-Christophe PLAGNIOL-VILLARD extern void video_get_info_str (    /* setup a board string: type, speed, etc. */
335352d2591SJean-Christophe PLAGNIOL-VILLARD     int line_number,	    /* location to place info string beside logo */
336352d2591SJean-Christophe PLAGNIOL-VILLARD     char *info		    /* buffer for info string */
337352d2591SJean-Christophe PLAGNIOL-VILLARD     );
338352d2591SJean-Christophe PLAGNIOL-VILLARD 
339352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
340352d2591SJean-Christophe PLAGNIOL-VILLARD 
341352d2591SJean-Christophe PLAGNIOL-VILLARD /* Locals */
342352d2591SJean-Christophe PLAGNIOL-VILLARD static GraphicDevice *pGD;	/* Pointer to Graphic array */
343352d2591SJean-Christophe PLAGNIOL-VILLARD 
344352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_fb_address;		/* frame buffer address */
345352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_console_address;	/* console buffer start address */
346352d2591SJean-Christophe PLAGNIOL-VILLARD 
347352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_col = 0; /* cursor col */
348352d2591SJean-Christophe PLAGNIOL-VILLARD static int console_row = 0; /* cursor row */
349352d2591SJean-Christophe PLAGNIOL-VILLARD 
350352d2591SJean-Christophe PLAGNIOL-VILLARD static u32 eorx, fgx, bgx;  /* color pats */
351352d2591SJean-Christophe PLAGNIOL-VILLARD 
352352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table8[] = {
353352d2591SJean-Christophe PLAGNIOL-VILLARD 	    0x00000000, 0x000000ff, 0x0000ff00, 0x0000ffff,
354352d2591SJean-Christophe PLAGNIOL-VILLARD 	    0x00ff0000, 0x00ff00ff, 0x00ffff00, 0x00ffffff,
355352d2591SJean-Christophe PLAGNIOL-VILLARD 	    0xff000000, 0xff0000ff, 0xff00ff00, 0xff00ffff,
356352d2591SJean-Christophe PLAGNIOL-VILLARD 	    0xffff0000, 0xffff00ff, 0xffffff00, 0xffffffff };
357352d2591SJean-Christophe PLAGNIOL-VILLARD 
358352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table15[] = {
359352d2591SJean-Christophe PLAGNIOL-VILLARD 	    0x00000000, 0x00007fff, 0x7fff0000, 0x7fff7fff };
360352d2591SJean-Christophe PLAGNIOL-VILLARD 
361352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table16[] = {
362352d2591SJean-Christophe PLAGNIOL-VILLARD 	    0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff };
363352d2591SJean-Christophe PLAGNIOL-VILLARD 
364352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table24[16][3] = {
365352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00000000, 0x00000000 },
366352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00000000, 0x00ffffff },
367352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x0000ffff, 0xff000000 },
368352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x0000ffff, 0xffffffff },
369352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x000000ff, 0xffff0000, 0x00000000 },
370352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x000000ff, 0xffff0000, 0x00ffffff },
371352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x000000ff, 0xffffffff, 0xff000000 },
372352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x000000ff, 0xffffffff, 0xffffffff },
373352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0xffffff00, 0x00000000, 0x00000000 },
374352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0xffffff00, 0x00000000, 0x00ffffff },
375352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0xffffff00, 0x0000ffff, 0xff000000 },
376352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0xffffff00, 0x0000ffff, 0xffffffff },
377352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0xffffffff, 0xffff0000, 0x00000000 },
378352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0xffffffff, 0xffff0000, 0x00ffffff },
379352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0xffffffff, 0xffffffff, 0xff000000 },
380352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0xffffffff, 0xffffffff, 0xffffffff } };
381352d2591SJean-Christophe PLAGNIOL-VILLARD 
382352d2591SJean-Christophe PLAGNIOL-VILLARD static const int video_font_draw_table32[16][4] = {
383352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
384352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00000000, 0x00000000, 0x00ffffff },
385352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00000000, 0x00ffffff, 0x00000000 },
386352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00000000, 0x00ffffff, 0x00ffffff },
387352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00ffffff, 0x00000000, 0x00000000 },
388352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00ffffff, 0x00000000, 0x00ffffff },
389352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00000000 },
390352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00000000, 0x00ffffff, 0x00ffffff, 0x00ffffff },
391352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00ffffff, 0x00000000, 0x00000000, 0x00000000 },
392352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00ffffff, 0x00000000, 0x00000000, 0x00ffffff },
393352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00000000 },
394352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00ffffff, 0x00000000, 0x00ffffff, 0x00ffffff },
395352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00000000 },
396352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00ffffff, 0x00ffffff, 0x00000000, 0x00ffffff },
397352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00000000 },
398352d2591SJean-Christophe PLAGNIOL-VILLARD 	    { 0x00ffffff, 0x00ffffff, 0x00ffffff, 0x00ffffff } };
399352d2591SJean-Christophe PLAGNIOL-VILLARD 
400352d2591SJean-Christophe PLAGNIOL-VILLARD 
401352d2591SJean-Christophe PLAGNIOL-VILLARD int gunzip(void *, int, unsigned char *, unsigned long *);
402352d2591SJean-Christophe PLAGNIOL-VILLARD 
403352d2591SJean-Christophe PLAGNIOL-VILLARD /******************************************************************************/
404352d2591SJean-Christophe PLAGNIOL-VILLARD 
405352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_drawchars (int xx, int yy, unsigned char *s, int count)
406352d2591SJean-Christophe PLAGNIOL-VILLARD {
407352d2591SJean-Christophe PLAGNIOL-VILLARD 	u8 *cdat, *dest, *dest0;
408352d2591SJean-Christophe PLAGNIOL-VILLARD 	int rows, offset, c;
409352d2591SJean-Christophe PLAGNIOL-VILLARD 
410352d2591SJean-Christophe PLAGNIOL-VILLARD 	offset = yy * VIDEO_LINE_LEN + xx * VIDEO_PIXEL_SIZE;
411352d2591SJean-Christophe PLAGNIOL-VILLARD 	dest0 = video_fb_address + offset;
412352d2591SJean-Christophe PLAGNIOL-VILLARD 
413352d2591SJean-Christophe PLAGNIOL-VILLARD 	switch (VIDEO_DATA_FORMAT) {
414352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF__8BIT_INDEX:
415352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF__8BIT_332RGB:
416352d2591SJean-Christophe PLAGNIOL-VILLARD 		while (count--) {
417352d2591SJean-Christophe PLAGNIOL-VILLARD 			c = *s;
418352d2591SJean-Christophe PLAGNIOL-VILLARD 			cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
419352d2591SJean-Christophe PLAGNIOL-VILLARD 			for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
420352d2591SJean-Christophe PLAGNIOL-VILLARD 			     rows--;
421352d2591SJean-Christophe PLAGNIOL-VILLARD 			     dest += VIDEO_LINE_LEN) {
422352d2591SJean-Christophe PLAGNIOL-VILLARD 				u8 bits = *cdat++;
423352d2591SJean-Christophe PLAGNIOL-VILLARD 
424352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[0] = (video_font_draw_table8[bits >> 4] & eorx) ^ bgx;
425352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[1] = (video_font_draw_table8[bits & 15] & eorx) ^ bgx;
426352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
427352d2591SJean-Christophe PLAGNIOL-VILLARD 			dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
428352d2591SJean-Christophe PLAGNIOL-VILLARD 			s++;
429352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
430352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
431352d2591SJean-Christophe PLAGNIOL-VILLARD 
432352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF_15BIT_555RGB:
433352d2591SJean-Christophe PLAGNIOL-VILLARD 		while (count--) {
434352d2591SJean-Christophe PLAGNIOL-VILLARD 			c = *s;
435352d2591SJean-Christophe PLAGNIOL-VILLARD 			cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
436352d2591SJean-Christophe PLAGNIOL-VILLARD 			for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
437352d2591SJean-Christophe PLAGNIOL-VILLARD 			     rows--;
438352d2591SJean-Christophe PLAGNIOL-VILLARD 			     dest += VIDEO_LINE_LEN) {
439352d2591SJean-Christophe PLAGNIOL-VILLARD 				u8 bits = *cdat++;
440352d2591SJean-Christophe PLAGNIOL-VILLARD 
441352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[0] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 6] & eorx) ^ bgx);
442352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[1] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 4 & 3] & eorx) ^ bgx);
443352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[2] = SHORTSWAP32 ((video_font_draw_table15 [bits >> 2 & 3] & eorx) ^ bgx);
444352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[3] = SHORTSWAP32 ((video_font_draw_table15 [bits & 3] & eorx) ^ bgx);
445352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
446352d2591SJean-Christophe PLAGNIOL-VILLARD 			dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
447352d2591SJean-Christophe PLAGNIOL-VILLARD 			s++;
448352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
449352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
450352d2591SJean-Christophe PLAGNIOL-VILLARD 
451352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF_16BIT_565RGB:
452352d2591SJean-Christophe PLAGNIOL-VILLARD 		while (count--) {
453352d2591SJean-Christophe PLAGNIOL-VILLARD 			c = *s;
454352d2591SJean-Christophe PLAGNIOL-VILLARD 			cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
455352d2591SJean-Christophe PLAGNIOL-VILLARD 			for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
456352d2591SJean-Christophe PLAGNIOL-VILLARD 			     rows--;
457352d2591SJean-Christophe PLAGNIOL-VILLARD 			     dest += VIDEO_LINE_LEN) {
458352d2591SJean-Christophe PLAGNIOL-VILLARD 				u8 bits = *cdat++;
459352d2591SJean-Christophe PLAGNIOL-VILLARD 
460352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[0] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 6] & eorx) ^ bgx);
461352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[1] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 4 & 3] & eorx) ^ bgx);
462352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[2] = SHORTSWAP32 ((video_font_draw_table16 [bits >> 2 & 3] & eorx) ^ bgx);
463352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[3] = SHORTSWAP32 ((video_font_draw_table16 [bits & 3] & eorx) ^ bgx);
464352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
465352d2591SJean-Christophe PLAGNIOL-VILLARD 			dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
466352d2591SJean-Christophe PLAGNIOL-VILLARD 			s++;
467352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
468352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
469352d2591SJean-Christophe PLAGNIOL-VILLARD 
470352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF_32BIT_X888RGB:
471352d2591SJean-Christophe PLAGNIOL-VILLARD 		while (count--) {
472352d2591SJean-Christophe PLAGNIOL-VILLARD 			c = *s;
473352d2591SJean-Christophe PLAGNIOL-VILLARD 			cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
474352d2591SJean-Christophe PLAGNIOL-VILLARD 			for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
475352d2591SJean-Christophe PLAGNIOL-VILLARD 			     rows--;
476352d2591SJean-Christophe PLAGNIOL-VILLARD 			     dest += VIDEO_LINE_LEN) {
477352d2591SJean-Christophe PLAGNIOL-VILLARD 				u8 bits = *cdat++;
478352d2591SJean-Christophe PLAGNIOL-VILLARD 
479352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[0] = SWAP32 ((video_font_draw_table32 [bits >> 4][0] & eorx) ^ bgx);
480352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[1] = SWAP32 ((video_font_draw_table32 [bits >> 4][1] & eorx) ^ bgx);
481352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[2] = SWAP32 ((video_font_draw_table32 [bits >> 4][2] & eorx) ^ bgx);
482352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[3] = SWAP32 ((video_font_draw_table32 [bits >> 4][3] & eorx) ^ bgx);
483352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[4] = SWAP32 ((video_font_draw_table32 [bits & 15][0] & eorx) ^ bgx);
484352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[5] = SWAP32 ((video_font_draw_table32 [bits & 15][1] & eorx) ^ bgx);
485352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[6] = SWAP32 ((video_font_draw_table32 [bits & 15][2] & eorx) ^ bgx);
486352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[7] = SWAP32 ((video_font_draw_table32 [bits & 15][3] & eorx) ^ bgx);
487352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
488352d2591SJean-Christophe PLAGNIOL-VILLARD 			dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
489352d2591SJean-Christophe PLAGNIOL-VILLARD 			s++;
490352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
491352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
492352d2591SJean-Christophe PLAGNIOL-VILLARD 
493352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF_24BIT_888RGB:
494352d2591SJean-Christophe PLAGNIOL-VILLARD 		while (count--) {
495352d2591SJean-Christophe PLAGNIOL-VILLARD 			c = *s;
496352d2591SJean-Christophe PLAGNIOL-VILLARD 			cdat = video_fontdata + c * VIDEO_FONT_HEIGHT;
497352d2591SJean-Christophe PLAGNIOL-VILLARD 			for (rows = VIDEO_FONT_HEIGHT, dest = dest0;
498352d2591SJean-Christophe PLAGNIOL-VILLARD 			     rows--;
499352d2591SJean-Christophe PLAGNIOL-VILLARD 			     dest += VIDEO_LINE_LEN) {
500352d2591SJean-Christophe PLAGNIOL-VILLARD 				u8 bits = *cdat++;
501352d2591SJean-Christophe PLAGNIOL-VILLARD 
502352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[0] = (video_font_draw_table24[bits >> 4][0] & eorx) ^ bgx;
503352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[1] = (video_font_draw_table24[bits >> 4][1] & eorx) ^ bgx;
504352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[2] = (video_font_draw_table24[bits >> 4][2] & eorx) ^ bgx;
505352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[3] = (video_font_draw_table24[bits & 15][0] & eorx) ^ bgx;
506352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[4] = (video_font_draw_table24[bits & 15][1] & eorx) ^ bgx;
507352d2591SJean-Christophe PLAGNIOL-VILLARD 				((u32 *) dest)[5] = (video_font_draw_table24[bits & 15][2] & eorx) ^ bgx;
508352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
509352d2591SJean-Christophe PLAGNIOL-VILLARD 			dest0 += VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE;
510352d2591SJean-Christophe PLAGNIOL-VILLARD 			s++;
511352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
512352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
513352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
514352d2591SJean-Christophe PLAGNIOL-VILLARD }
515352d2591SJean-Christophe PLAGNIOL-VILLARD 
516352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
517352d2591SJean-Christophe PLAGNIOL-VILLARD 
518352d2591SJean-Christophe PLAGNIOL-VILLARD static inline void video_drawstring (int xx, int yy, unsigned char *s)
519352d2591SJean-Christophe PLAGNIOL-VILLARD {
520352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_drawchars (xx, yy, s, strlen ((char *)s));
521352d2591SJean-Christophe PLAGNIOL-VILLARD }
522352d2591SJean-Christophe PLAGNIOL-VILLARD 
523352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
524352d2591SJean-Christophe PLAGNIOL-VILLARD 
525352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_putchar (int xx, int yy, unsigned char c)
526352d2591SJean-Christophe PLAGNIOL-VILLARD {
527352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_drawchars (xx, yy + VIDEO_LOGO_HEIGHT, &c, 1);
528352d2591SJean-Christophe PLAGNIOL-VILLARD }
529352d2591SJean-Christophe PLAGNIOL-VILLARD 
530352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
531352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CONSOLE_CURSOR) || defined(CONFIG_VIDEO_SW_CURSOR)
532352d2591SJean-Christophe PLAGNIOL-VILLARD static void video_set_cursor (void)
533352d2591SJean-Christophe PLAGNIOL-VILLARD {
534352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* swap drawing colors */
535352d2591SJean-Christophe PLAGNIOL-VILLARD 	eorx = fgx;
536352d2591SJean-Christophe PLAGNIOL-VILLARD 	fgx = bgx;
537352d2591SJean-Christophe PLAGNIOL-VILLARD 	bgx = eorx;
538352d2591SJean-Christophe PLAGNIOL-VILLARD 	eorx = fgx ^ bgx;
539352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* draw cursor */
540352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_putchar (console_col * VIDEO_FONT_WIDTH,
541352d2591SJean-Christophe PLAGNIOL-VILLARD 		       console_row * VIDEO_FONT_HEIGHT,
542352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ' ');
543352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* restore drawing colors */
544352d2591SJean-Christophe PLAGNIOL-VILLARD 	eorx = fgx;
545352d2591SJean-Christophe PLAGNIOL-VILLARD 	fgx = bgx;
546352d2591SJean-Christophe PLAGNIOL-VILLARD 	bgx = eorx;
547352d2591SJean-Christophe PLAGNIOL-VILLARD 	eorx = fgx ^ bgx;
548352d2591SJean-Christophe PLAGNIOL-VILLARD }
549352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
550352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
551352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_CURSOR
552352d2591SJean-Christophe PLAGNIOL-VILLARD void console_cursor (int state)
553352d2591SJean-Christophe PLAGNIOL-VILLARD {
554352d2591SJean-Christophe PLAGNIOL-VILLARD 	static int last_state = 0;
555352d2591SJean-Christophe PLAGNIOL-VILLARD 
556352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_TIME
557352d2591SJean-Christophe PLAGNIOL-VILLARD 	struct rtc_time tm;
558352d2591SJean-Christophe PLAGNIOL-VILLARD 	char info[16];
559352d2591SJean-Christophe PLAGNIOL-VILLARD 
560352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* time update only if cursor is on (faster scroll) */
561352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (state) {
562352d2591SJean-Christophe PLAGNIOL-VILLARD 		rtc_get (&tm);
563352d2591SJean-Christophe PLAGNIOL-VILLARD 
564352d2591SJean-Christophe PLAGNIOL-VILLARD 		sprintf (info, " %02d:%02d:%02d ", tm.tm_hour, tm.tm_min,
565352d2591SJean-Christophe PLAGNIOL-VILLARD 			 tm.tm_sec);
566352d2591SJean-Christophe PLAGNIOL-VILLARD 		video_drawstring (VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH,
567352d2591SJean-Christophe PLAGNIOL-VILLARD 				  VIDEO_INFO_Y, (uchar *)info);
568352d2591SJean-Christophe PLAGNIOL-VILLARD 
569352d2591SJean-Christophe PLAGNIOL-VILLARD 		sprintf (info, "%02d.%02d.%04d", tm.tm_mday, tm.tm_mon,
570352d2591SJean-Christophe PLAGNIOL-VILLARD 			 tm.tm_year);
571352d2591SJean-Christophe PLAGNIOL-VILLARD 		video_drawstring (VIDEO_VISIBLE_COLS - 10 * VIDEO_FONT_WIDTH,
572352d2591SJean-Christophe PLAGNIOL-VILLARD 				  VIDEO_INFO_Y + 1 * VIDEO_FONT_HEIGHT, (uchar *)info);
573352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
574352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
575352d2591SJean-Christophe PLAGNIOL-VILLARD 
576352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (state && (last_state != state)) {
577352d2591SJean-Christophe PLAGNIOL-VILLARD 		video_set_cursor ();
578352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
579352d2591SJean-Christophe PLAGNIOL-VILLARD 
580352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (!state && (last_state != state)) {
581352d2591SJean-Christophe PLAGNIOL-VILLARD 		/* clear cursor */
582352d2591SJean-Christophe PLAGNIOL-VILLARD 		video_putchar (console_col * VIDEO_FONT_WIDTH,
583352d2591SJean-Christophe PLAGNIOL-VILLARD 			       console_row * VIDEO_FONT_HEIGHT,
584352d2591SJean-Christophe PLAGNIOL-VILLARD 			       ' ');
585352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
586352d2591SJean-Christophe PLAGNIOL-VILLARD 
587352d2591SJean-Christophe PLAGNIOL-VILLARD 	last_state = state;
588352d2591SJean-Christophe PLAGNIOL-VILLARD }
589352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
590352d2591SJean-Christophe PLAGNIOL-VILLARD 
591352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
592352d2591SJean-Christophe PLAGNIOL-VILLARD 
593352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_RECTFILL
594352d2591SJean-Christophe PLAGNIOL-VILLARD static void memsetl (int *p, int c, int v)
595352d2591SJean-Christophe PLAGNIOL-VILLARD {
596352d2591SJean-Christophe PLAGNIOL-VILLARD 	while (c--)
597352d2591SJean-Christophe PLAGNIOL-VILLARD 		*(p++) = v;
598352d2591SJean-Christophe PLAGNIOL-VILLARD }
599352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
600352d2591SJean-Christophe PLAGNIOL-VILLARD 
601352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
602352d2591SJean-Christophe PLAGNIOL-VILLARD 
603352d2591SJean-Christophe PLAGNIOL-VILLARD #ifndef VIDEO_HW_BITBLT
604352d2591SJean-Christophe PLAGNIOL-VILLARD static void memcpyl (int *d, int *s, int c)
605352d2591SJean-Christophe PLAGNIOL-VILLARD {
606352d2591SJean-Christophe PLAGNIOL-VILLARD 	while (c--)
607352d2591SJean-Christophe PLAGNIOL-VILLARD 		*(d++) = *(s++);
608352d2591SJean-Christophe PLAGNIOL-VILLARD }
609352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
610352d2591SJean-Christophe PLAGNIOL-VILLARD 
611352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
612352d2591SJean-Christophe PLAGNIOL-VILLARD 
613352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_scrollup (void)
614352d2591SJean-Christophe PLAGNIOL-VILLARD {
615352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* copy up rows ignoring the first one */
616352d2591SJean-Christophe PLAGNIOL-VILLARD 
617352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_BITBLT
618352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_hw_bitblt (VIDEO_PIXEL_SIZE,	/* bytes per pixel */
619352d2591SJean-Christophe PLAGNIOL-VILLARD 			 0,	/* source pos x */
620352d2591SJean-Christophe PLAGNIOL-VILLARD 			 VIDEO_LOGO_HEIGHT + VIDEO_FONT_HEIGHT, /* source pos y */
621352d2591SJean-Christophe PLAGNIOL-VILLARD 			 0,	/* dest pos x */
622352d2591SJean-Christophe PLAGNIOL-VILLARD 			 VIDEO_LOGO_HEIGHT,	/* dest pos y */
623352d2591SJean-Christophe PLAGNIOL-VILLARD 			 VIDEO_VISIBLE_COLS,	/* frame width */
624352d2591SJean-Christophe PLAGNIOL-VILLARD 			 VIDEO_VISIBLE_ROWS - VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT	/* frame height */
625352d2591SJean-Christophe PLAGNIOL-VILLARD 		);
626352d2591SJean-Christophe PLAGNIOL-VILLARD #else
627352d2591SJean-Christophe PLAGNIOL-VILLARD 	memcpyl (CONSOLE_ROW_FIRST, CONSOLE_ROW_SECOND,
628352d2591SJean-Christophe PLAGNIOL-VILLARD 		 CONSOLE_SCROLL_SIZE >> 2);
629352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
630352d2591SJean-Christophe PLAGNIOL-VILLARD 
631352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* clear the last one */
632352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_HW_RECTFILL
633352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_hw_rectfill (VIDEO_PIXEL_SIZE,	/* bytes per pixel */
634352d2591SJean-Christophe PLAGNIOL-VILLARD 			   0,	/* dest pos x */
635352d2591SJean-Christophe PLAGNIOL-VILLARD 			   VIDEO_VISIBLE_ROWS - VIDEO_FONT_HEIGHT,	/* dest pos y */
636352d2591SJean-Christophe PLAGNIOL-VILLARD 			   VIDEO_VISIBLE_COLS,	/* frame width */
637352d2591SJean-Christophe PLAGNIOL-VILLARD 			   VIDEO_FONT_HEIGHT,	/* frame height */
638352d2591SJean-Christophe PLAGNIOL-VILLARD 			   CONSOLE_BG_COL	/* fill color */
639352d2591SJean-Christophe PLAGNIOL-VILLARD 		);
640352d2591SJean-Christophe PLAGNIOL-VILLARD #else
641352d2591SJean-Christophe PLAGNIOL-VILLARD 	memsetl (CONSOLE_ROW_LAST, CONSOLE_ROW_SIZE >> 2, CONSOLE_BG_COL);
642352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
643352d2591SJean-Christophe PLAGNIOL-VILLARD }
644352d2591SJean-Christophe PLAGNIOL-VILLARD 
645352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
646352d2591SJean-Christophe PLAGNIOL-VILLARD 
647352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_back (void)
648352d2591SJean-Christophe PLAGNIOL-VILLARD {
649352d2591SJean-Christophe PLAGNIOL-VILLARD 	CURSOR_OFF console_col--;
650352d2591SJean-Christophe PLAGNIOL-VILLARD 
651352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (console_col < 0) {
652352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_col = CONSOLE_COLS - 1;
653352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_row--;
654352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (console_row < 0)
655352d2591SJean-Christophe PLAGNIOL-VILLARD 			console_row = 0;
656352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
657352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_putchar (console_col * VIDEO_FONT_WIDTH,
658352d2591SJean-Christophe PLAGNIOL-VILLARD 		       console_row * VIDEO_FONT_HEIGHT,
659352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ' ');
660352d2591SJean-Christophe PLAGNIOL-VILLARD }
661352d2591SJean-Christophe PLAGNIOL-VILLARD 
662352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
663352d2591SJean-Christophe PLAGNIOL-VILLARD 
664352d2591SJean-Christophe PLAGNIOL-VILLARD static void console_newline (void)
665352d2591SJean-Christophe PLAGNIOL-VILLARD {
66620c450efSAnatolij Gustschin 	/* Check if last character in the line was just drawn. If so, cursor was
66720c450efSAnatolij Gustschin 	   overwriten and need not to be cleared. Cursor clearing without this
66820c450efSAnatolij Gustschin 	   check causes overwriting the 1st character of the line if line lenght
66920c450efSAnatolij Gustschin 	   is >= CONSOLE_COLS
67020c450efSAnatolij Gustschin 	 */
67120c450efSAnatolij Gustschin 	if (console_col < CONSOLE_COLS)
67220c450efSAnatolij Gustschin 		CURSOR_OFF
67320c450efSAnatolij Gustschin 	console_row++;
674352d2591SJean-Christophe PLAGNIOL-VILLARD 	console_col = 0;
675352d2591SJean-Christophe PLAGNIOL-VILLARD 
676352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Check if we need to scroll the terminal */
677352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (console_row >= CONSOLE_ROWS) {
678352d2591SJean-Christophe PLAGNIOL-VILLARD 		/* Scroll everything up */
679352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_scrollup ();
680352d2591SJean-Christophe PLAGNIOL-VILLARD 
681352d2591SJean-Christophe PLAGNIOL-VILLARD 		/* Decrement row number */
682352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_row--;
683352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
684352d2591SJean-Christophe PLAGNIOL-VILLARD }
685352d2591SJean-Christophe PLAGNIOL-VILLARD 
68620c450efSAnatolij Gustschin static void console_cr (void)
68720c450efSAnatolij Gustschin {
68820c450efSAnatolij Gustschin 	CURSOR_OFF console_col = 0;
68920c450efSAnatolij Gustschin }
69020c450efSAnatolij Gustschin 
691352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
692352d2591SJean-Christophe PLAGNIOL-VILLARD 
693352d2591SJean-Christophe PLAGNIOL-VILLARD void video_putc (const char c)
694352d2591SJean-Christophe PLAGNIOL-VILLARD {
69520c450efSAnatolij Gustschin 	static int nl = 1;
69620c450efSAnatolij Gustschin 
697352d2591SJean-Christophe PLAGNIOL-VILLARD 	switch (c) {
69820c450efSAnatolij Gustschin 	case 13:		/* back to first column */
69920c450efSAnatolij Gustschin 		console_cr ();
700352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
701352d2591SJean-Christophe PLAGNIOL-VILLARD 
702352d2591SJean-Christophe PLAGNIOL-VILLARD 	case '\n':		/* next line */
70320c450efSAnatolij Gustschin 		if (console_col || (!console_col && nl))
704352d2591SJean-Christophe PLAGNIOL-VILLARD 			console_newline ();
70520c450efSAnatolij Gustschin 		nl = 1;
706352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
707352d2591SJean-Christophe PLAGNIOL-VILLARD 
708352d2591SJean-Christophe PLAGNIOL-VILLARD 	case 9:		/* tab 8 */
709352d2591SJean-Christophe PLAGNIOL-VILLARD 		CURSOR_OFF console_col |= 0x0008;
710352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_col &= ~0x0007;
711352d2591SJean-Christophe PLAGNIOL-VILLARD 
712352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (console_col >= CONSOLE_COLS)
713352d2591SJean-Christophe PLAGNIOL-VILLARD 			console_newline ();
714352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
715352d2591SJean-Christophe PLAGNIOL-VILLARD 
716352d2591SJean-Christophe PLAGNIOL-VILLARD 	case 8:		/* backspace */
717352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_back ();
718352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
719352d2591SJean-Christophe PLAGNIOL-VILLARD 
720352d2591SJean-Christophe PLAGNIOL-VILLARD 	default:		/* draw the char */
721352d2591SJean-Christophe PLAGNIOL-VILLARD 		video_putchar (console_col * VIDEO_FONT_WIDTH,
722352d2591SJean-Christophe PLAGNIOL-VILLARD 			       console_row * VIDEO_FONT_HEIGHT,
723352d2591SJean-Christophe PLAGNIOL-VILLARD 			       c);
724352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_col++;
725352d2591SJean-Christophe PLAGNIOL-VILLARD 
726352d2591SJean-Christophe PLAGNIOL-VILLARD 		/* check for newline */
72720c450efSAnatolij Gustschin 		if (console_col >= CONSOLE_COLS) {
728352d2591SJean-Christophe PLAGNIOL-VILLARD 			console_newline ();
72920c450efSAnatolij Gustschin 			nl = 0;
73020c450efSAnatolij Gustschin 		}
731352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
732352d2591SJean-Christophe PLAGNIOL-VILLARD CURSOR_SET}
733352d2591SJean-Christophe PLAGNIOL-VILLARD 
734352d2591SJean-Christophe PLAGNIOL-VILLARD 
735352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
736352d2591SJean-Christophe PLAGNIOL-VILLARD 
737352d2591SJean-Christophe PLAGNIOL-VILLARD void video_puts (const char *s)
738352d2591SJean-Christophe PLAGNIOL-VILLARD {
739352d2591SJean-Christophe PLAGNIOL-VILLARD 	int count = strlen (s);
740352d2591SJean-Christophe PLAGNIOL-VILLARD 
741352d2591SJean-Christophe PLAGNIOL-VILLARD 	while (count--)
742352d2591SJean-Christophe PLAGNIOL-VILLARD 		video_putc (*s++);
743352d2591SJean-Christophe PLAGNIOL-VILLARD }
744352d2591SJean-Christophe PLAGNIOL-VILLARD 
745352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
746352d2591SJean-Christophe PLAGNIOL-VILLARD 
747352d2591SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
748352d2591SJean-Christophe PLAGNIOL-VILLARD 
749352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_8BIT_332RGB(r,g,b)	{			\
750352d2591SJean-Christophe PLAGNIOL-VILLARD 	*fb = ((r>>5)<<5) | ((g>>5)<<2) | (b>>6);	\
751352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb ++;						\
752352d2591SJean-Christophe PLAGNIOL-VILLARD }
753352d2591SJean-Christophe PLAGNIOL-VILLARD 
754352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_15BIT_555RGB(r,g,b) {			\
755352d2591SJean-Christophe PLAGNIOL-VILLARD 	*(unsigned short *)fb = SWAP16((unsigned short)(((r>>3)<<10) | ((g>>3)<<5) | (b>>3))); \
756352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb += 2;					\
757352d2591SJean-Christophe PLAGNIOL-VILLARD }
758352d2591SJean-Christophe PLAGNIOL-VILLARD 
759352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_16BIT_565RGB(r,g,b) {			\
760352d2591SJean-Christophe PLAGNIOL-VILLARD 	*(unsigned short *)fb = SWAP16((unsigned short)((((r)>>3)<<11) | (((g)>>2)<<5) | ((b)>>3))); \
761352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb += 2;					\
762352d2591SJean-Christophe PLAGNIOL-VILLARD }
763352d2591SJean-Christophe PLAGNIOL-VILLARD 
764352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_32BIT_X888RGB(r,g,b) {			\
765352d2591SJean-Christophe PLAGNIOL-VILLARD 	*(unsigned long *)fb = SWAP32((unsigned long)(((r<<16) | (g<<8) | b))); \
766352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb += 4;					\
767352d2591SJean-Christophe PLAGNIOL-VILLARD }
768352d2591SJean-Christophe PLAGNIOL-VILLARD 
769352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN
770352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) {			\
771352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb[0] = b;					\
772352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb[1] = g;					\
773352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb[2] = r;					\
774352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb += 3;					\
775352d2591SJean-Christophe PLAGNIOL-VILLARD }
776352d2591SJean-Christophe PLAGNIOL-VILLARD #else
777352d2591SJean-Christophe PLAGNIOL-VILLARD #define FILL_24BIT_888RGB(r,g,b) {			\
778352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb[0] = r;					\
779352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb[1] = g;					\
780352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb[2] = b;					\
781352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb += 3;					\
782352d2591SJean-Christophe PLAGNIOL-VILLARD }
783352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
784352d2591SJean-Christophe PLAGNIOL-VILLARD 
785*e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
786*e84d568fSAnatolij Gustschin static void inline fill_555rgb_pswap(uchar *fb, int x,
787*e84d568fSAnatolij Gustschin 				     u8 r, u8 g, u8 b)
788*e84d568fSAnatolij Gustschin {
789*e84d568fSAnatolij Gustschin 	ushort *dst = (ushort *)fb;
790*e84d568fSAnatolij Gustschin 	ushort color = (ushort)(((r >> 3) << 10) |
791*e84d568fSAnatolij Gustschin 				((g >> 3) << 5) |
792*e84d568fSAnatolij Gustschin 				(b >> 3));
793*e84d568fSAnatolij Gustschin 	if (x & 1)
794*e84d568fSAnatolij Gustschin 		*(--dst) = color;
795*e84d568fSAnatolij Gustschin 	else
796*e84d568fSAnatolij Gustschin 		*(++dst) = color;
797*e84d568fSAnatolij Gustschin }
798*e84d568fSAnatolij Gustschin #endif
799352d2591SJean-Christophe PLAGNIOL-VILLARD 
800352d2591SJean-Christophe PLAGNIOL-VILLARD /*
801352d2591SJean-Christophe PLAGNIOL-VILLARD  * Display the BMP file located at address bmp_image.
802352d2591SJean-Christophe PLAGNIOL-VILLARD  * Only uncompressed
803352d2591SJean-Christophe PLAGNIOL-VILLARD  */
804352d2591SJean-Christophe PLAGNIOL-VILLARD int video_display_bitmap (ulong bmp_image, int x, int y)
805352d2591SJean-Christophe PLAGNIOL-VILLARD {
806352d2591SJean-Christophe PLAGNIOL-VILLARD 	ushort xcount, ycount;
807352d2591SJean-Christophe PLAGNIOL-VILLARD 	uchar *fb;
808352d2591SJean-Christophe PLAGNIOL-VILLARD 	bmp_image_t *bmp = (bmp_image_t *) bmp_image;
809352d2591SJean-Christophe PLAGNIOL-VILLARD 	uchar *bmap;
810352d2591SJean-Christophe PLAGNIOL-VILLARD 	ushort padded_line;
811352d2591SJean-Christophe PLAGNIOL-VILLARD 	unsigned long width, height, bpp;
812352d2591SJean-Christophe PLAGNIOL-VILLARD 	unsigned colors;
813352d2591SJean-Christophe PLAGNIOL-VILLARD 	unsigned long compression;
814352d2591SJean-Christophe PLAGNIOL-VILLARD 	bmp_color_table_entry_t cte;
815352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP
816352d2591SJean-Christophe PLAGNIOL-VILLARD 	unsigned char *dst = NULL;
817352d2591SJean-Christophe PLAGNIOL-VILLARD 	ulong len;
818352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
819352d2591SJean-Christophe PLAGNIOL-VILLARD 
820352d2591SJean-Christophe PLAGNIOL-VILLARD 	WATCHDOG_RESET ();
821352d2591SJean-Christophe PLAGNIOL-VILLARD 
822352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (!((bmp->header.signature[0] == 'B') &&
823352d2591SJean-Christophe PLAGNIOL-VILLARD 	      (bmp->header.signature[1] == 'M'))) {
824352d2591SJean-Christophe PLAGNIOL-VILLARD 
825352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP
826352d2591SJean-Christophe PLAGNIOL-VILLARD 		/*
827352d2591SJean-Christophe PLAGNIOL-VILLARD 		 * Could be a gzipped bmp image, try to decrompress...
828352d2591SJean-Christophe PLAGNIOL-VILLARD 		 */
829352d2591SJean-Christophe PLAGNIOL-VILLARD 		len = CFG_VIDEO_LOGO_MAX_SIZE;
830352d2591SJean-Christophe PLAGNIOL-VILLARD 		dst = malloc(CFG_VIDEO_LOGO_MAX_SIZE);
831352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (dst == NULL) {
832352d2591SJean-Christophe PLAGNIOL-VILLARD 			printf("Error: malloc in gunzip failed!\n");
833352d2591SJean-Christophe PLAGNIOL-VILLARD 			return(1);
834352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
835352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (gunzip(dst, CFG_VIDEO_LOGO_MAX_SIZE, (uchar *)bmp_image, &len) != 0) {
836352d2591SJean-Christophe PLAGNIOL-VILLARD 			printf ("Error: no valid bmp or bmp.gz image at %lx\n", bmp_image);
837352d2591SJean-Christophe PLAGNIOL-VILLARD 			free(dst);
838352d2591SJean-Christophe PLAGNIOL-VILLARD 			return 1;
839352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
840352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (len == CFG_VIDEO_LOGO_MAX_SIZE) {
841352d2591SJean-Christophe PLAGNIOL-VILLARD 			printf("Image could be truncated (increase CFG_VIDEO_LOGO_MAX_SIZE)!\n");
842352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
843352d2591SJean-Christophe PLAGNIOL-VILLARD 
844352d2591SJean-Christophe PLAGNIOL-VILLARD 		/*
845352d2591SJean-Christophe PLAGNIOL-VILLARD 		 * Set addr to decompressed image
846352d2591SJean-Christophe PLAGNIOL-VILLARD 		 */
847352d2591SJean-Christophe PLAGNIOL-VILLARD 		bmp = (bmp_image_t *)dst;
848352d2591SJean-Christophe PLAGNIOL-VILLARD 
849352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (!((bmp->header.signature[0] == 'B') &&
850352d2591SJean-Christophe PLAGNIOL-VILLARD 		      (bmp->header.signature[1] == 'M'))) {
851352d2591SJean-Christophe PLAGNIOL-VILLARD 			printf ("Error: no valid bmp.gz image at %lx\n", bmp_image);
852a49e0d17SMatthias Fuchs 			free(dst);
853352d2591SJean-Christophe PLAGNIOL-VILLARD 			return 1;
854352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
855352d2591SJean-Christophe PLAGNIOL-VILLARD #else
856352d2591SJean-Christophe PLAGNIOL-VILLARD 		printf ("Error: no valid bmp image at %lx\n", bmp_image);
857352d2591SJean-Christophe PLAGNIOL-VILLARD 		return 1;
858352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VIDEO_BMP_GZIP */
859352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
860352d2591SJean-Christophe PLAGNIOL-VILLARD 
861352d2591SJean-Christophe PLAGNIOL-VILLARD 	width = le32_to_cpu (bmp->header.width);
862352d2591SJean-Christophe PLAGNIOL-VILLARD 	height = le32_to_cpu (bmp->header.height);
863352d2591SJean-Christophe PLAGNIOL-VILLARD 	bpp = le16_to_cpu (bmp->header.bit_count);
864352d2591SJean-Christophe PLAGNIOL-VILLARD 	colors = le32_to_cpu (bmp->header.colors_used);
865352d2591SJean-Christophe PLAGNIOL-VILLARD 	compression = le32_to_cpu (bmp->header.compression);
866352d2591SJean-Christophe PLAGNIOL-VILLARD 
867352d2591SJean-Christophe PLAGNIOL-VILLARD 	debug ("Display-bmp: %d x %d  with %d colors\n",
868352d2591SJean-Christophe PLAGNIOL-VILLARD 	       width, height, colors);
869352d2591SJean-Christophe PLAGNIOL-VILLARD 
870352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (compression != BMP_BI_RGB) {
871352d2591SJean-Christophe PLAGNIOL-VILLARD 		printf ("Error: compression type %ld not supported\n",
872352d2591SJean-Christophe PLAGNIOL-VILLARD 			compression);
873a49e0d17SMatthias Fuchs #ifdef CONFIG_VIDEO_BMP_GZIP
874a49e0d17SMatthias Fuchs 		if (dst)
875a49e0d17SMatthias Fuchs 			free(dst);
876a49e0d17SMatthias Fuchs #endif
877352d2591SJean-Christophe PLAGNIOL-VILLARD 		return 1;
878352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
879352d2591SJean-Christophe PLAGNIOL-VILLARD 
880352d2591SJean-Christophe PLAGNIOL-VILLARD 	padded_line = (((width * bpp + 7) / 8) + 3) & ~0x3;
881352d2591SJean-Christophe PLAGNIOL-VILLARD 
882352d2591SJean-Christophe PLAGNIOL-VILLARD 	if ((x + width) > VIDEO_VISIBLE_COLS)
883352d2591SJean-Christophe PLAGNIOL-VILLARD 		width = VIDEO_VISIBLE_COLS - x;
884352d2591SJean-Christophe PLAGNIOL-VILLARD 	if ((y + height) > VIDEO_VISIBLE_ROWS)
885352d2591SJean-Christophe PLAGNIOL-VILLARD 		height = VIDEO_VISIBLE_ROWS - y;
886352d2591SJean-Christophe PLAGNIOL-VILLARD 
887352d2591SJean-Christophe PLAGNIOL-VILLARD 	bmap = (uchar *) bmp + le32_to_cpu (bmp->header.data_offset);
888352d2591SJean-Christophe PLAGNIOL-VILLARD 	fb = (uchar *) (video_fb_address +
889352d2591SJean-Christophe PLAGNIOL-VILLARD 			((y + height - 1) * VIDEO_COLS * VIDEO_PIXEL_SIZE) +
890352d2591SJean-Christophe PLAGNIOL-VILLARD 			x * VIDEO_PIXEL_SIZE);
891352d2591SJean-Christophe PLAGNIOL-VILLARD 
892352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* We handle only 8bpp or 24 bpp bitmap */
893352d2591SJean-Christophe PLAGNIOL-VILLARD 	switch (le16_to_cpu (bmp->header.bit_count)) {
894352d2591SJean-Christophe PLAGNIOL-VILLARD 	case 8:
895352d2591SJean-Christophe PLAGNIOL-VILLARD 		padded_line -= width;
896352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) {
897352d2591SJean-Christophe PLAGNIOL-VILLARD 			/* Copy colormap					     */
898352d2591SJean-Christophe PLAGNIOL-VILLARD 			for (xcount = 0; xcount < colors; ++xcount) {
899352d2591SJean-Christophe PLAGNIOL-VILLARD 				cte = bmp->color_table[xcount];
900352d2591SJean-Christophe PLAGNIOL-VILLARD 				video_set_lut (xcount, cte.red, cte.green, cte.blue);
901352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
902352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
903352d2591SJean-Christophe PLAGNIOL-VILLARD 		ycount = height;
904352d2591SJean-Christophe PLAGNIOL-VILLARD 		switch (VIDEO_DATA_FORMAT) {
905352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF__8BIT_INDEX:
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 					*fb++ = *bmap++;
911352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
912352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
913352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
914352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
915352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
916352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF__8BIT_332RGB:
917352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
918352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
919352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
920352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
921352d2591SJean-Christophe PLAGNIOL-VILLARD 					cte = bmp->color_table[*bmap++];
922352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_8BIT_332RGB (cte.red, cte.green, cte.blue);
923352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
924352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
925352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
926352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
927352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
928352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF_15BIT_555RGB:
929352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
930*e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
931*e84d568fSAnatolij Gustschin 				int xpos = x;
932*e84d568fSAnatolij Gustschin #endif
933352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
934352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
935352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
936352d2591SJean-Christophe PLAGNIOL-VILLARD 					cte = bmp->color_table[*bmap++];
937*e84d568fSAnatolij Gustschin #if !defined(VIDEO_FB_16BPP_PIXEL_SWAP)
938352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_15BIT_555RGB (cte.red, cte.green, cte.blue);
939*e84d568fSAnatolij Gustschin #else
940*e84d568fSAnatolij Gustschin 					fill_555rgb_pswap (fb, xpos++, cte.red,
941*e84d568fSAnatolij Gustschin 							   cte.green, cte.blue);
942*e84d568fSAnatolij Gustschin 					fb += 2;
943*e84d568fSAnatolij Gustschin #endif
944352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
945352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
946352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
947352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
948352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
949352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF_16BIT_565RGB:
950352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
951352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
952352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
953352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
954352d2591SJean-Christophe PLAGNIOL-VILLARD 					cte = bmp->color_table[*bmap++];
955352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_16BIT_565RGB (cte.red, cte.green, cte.blue);
956352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
957352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
958352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
959352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
960352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
961352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF_32BIT_X888RGB:
962352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
963352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
964352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
965352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
966352d2591SJean-Christophe PLAGNIOL-VILLARD 					cte = bmp->color_table[*bmap++];
967352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_32BIT_X888RGB (cte.red, cte.green, cte.blue);
968352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
969352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
970352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
971352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
972352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
973352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF_24BIT_888RGB:
974352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
975352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
976352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
977352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
978352d2591SJean-Christophe PLAGNIOL-VILLARD 					cte = bmp->color_table[*bmap++];
979352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_24BIT_888RGB (cte.red, cte.green, cte.blue);
980352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
981352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
982352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
983352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
984352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
985352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
986352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
987352d2591SJean-Christophe PLAGNIOL-VILLARD 	case 24:
988352d2591SJean-Christophe PLAGNIOL-VILLARD 		padded_line -= 3 * width;
989352d2591SJean-Christophe PLAGNIOL-VILLARD 		ycount = height;
990352d2591SJean-Christophe PLAGNIOL-VILLARD 		switch (VIDEO_DATA_FORMAT) {
991352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF__8BIT_332RGB:
992352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
993352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
994352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
995352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
996352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_8BIT_332RGB (bmap[2], bmap[1], bmap[0]);
997352d2591SJean-Christophe PLAGNIOL-VILLARD 					bmap += 3;
998352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
999352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
1000352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
1001352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
1002352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
1003352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF_15BIT_555RGB:
1004352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
1005*e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
1006*e84d568fSAnatolij Gustschin 				int xpos = x;
1007*e84d568fSAnatolij Gustschin #endif
1008352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
1009352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
1010352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
1011*e84d568fSAnatolij Gustschin #if !defined(VIDEO_FB_16BPP_PIXEL_SWAP)
1012352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_15BIT_555RGB (bmap[2], bmap[1], bmap[0]);
1013*e84d568fSAnatolij Gustschin #else
1014*e84d568fSAnatolij Gustschin 					fill_555rgb_pswap (fb, xpos++, bmap[2],
1015*e84d568fSAnatolij Gustschin 							   bmap[1], bmap[0]);
1016*e84d568fSAnatolij Gustschin 					fb += 2;
1017*e84d568fSAnatolij Gustschin #endif
1018352d2591SJean-Christophe PLAGNIOL-VILLARD 					bmap += 3;
1019352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
1020352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
1021352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
1022352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
1023352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
1024352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF_16BIT_565RGB:
1025352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
1026352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
1027352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
1028352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
1029352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_16BIT_565RGB (bmap[2], bmap[1], bmap[0]);
1030352d2591SJean-Christophe PLAGNIOL-VILLARD 					bmap += 3;
1031352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
1032352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
1033352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
1034352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
1035352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
1036352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF_32BIT_X888RGB:
1037352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
1038352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
1039352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
1040352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
1041352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_32BIT_X888RGB (bmap[2], bmap[1], bmap[0]);
1042352d2591SJean-Christophe PLAGNIOL-VILLARD 					bmap += 3;
1043352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
1044352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
1045352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
1046352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
1047352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
1048352d2591SJean-Christophe PLAGNIOL-VILLARD 		case GDF_24BIT_888RGB:
1049352d2591SJean-Christophe PLAGNIOL-VILLARD 			while (ycount--) {
1050352d2591SJean-Christophe PLAGNIOL-VILLARD 				WATCHDOG_RESET ();
1051352d2591SJean-Christophe PLAGNIOL-VILLARD 				xcount = width;
1052352d2591SJean-Christophe PLAGNIOL-VILLARD 				while (xcount--) {
1053352d2591SJean-Christophe PLAGNIOL-VILLARD 					FILL_24BIT_888RGB (bmap[2], bmap[1], bmap[0]);
1054352d2591SJean-Christophe PLAGNIOL-VILLARD 					bmap += 3;
1055352d2591SJean-Christophe PLAGNIOL-VILLARD 				}
1056352d2591SJean-Christophe PLAGNIOL-VILLARD 				bmap += padded_line;
1057352d2591SJean-Christophe PLAGNIOL-VILLARD 				fb -= (VIDEO_VISIBLE_COLS + width) * VIDEO_PIXEL_SIZE;
1058352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
1059352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
1060352d2591SJean-Christophe PLAGNIOL-VILLARD 		default:
1061352d2591SJean-Christophe PLAGNIOL-VILLARD 			printf ("Error: 24 bits/pixel bitmap incompatible with current video mode\n");
1062352d2591SJean-Christophe PLAGNIOL-VILLARD 			break;
1063352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
1064352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
1065352d2591SJean-Christophe PLAGNIOL-VILLARD 	default:
1066352d2591SJean-Christophe PLAGNIOL-VILLARD 		printf ("Error: %d bit/pixel bitmaps not supported by U-Boot\n",
1067352d2591SJean-Christophe PLAGNIOL-VILLARD 			le16_to_cpu (bmp->header.bit_count));
1068352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
1069352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1070352d2591SJean-Christophe PLAGNIOL-VILLARD 
1071352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_GZIP
1072352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (dst) {
1073352d2591SJean-Christophe PLAGNIOL-VILLARD 		free(dst);
1074352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1075352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
1076352d2591SJean-Christophe PLAGNIOL-VILLARD 
1077352d2591SJean-Christophe PLAGNIOL-VILLARD 	return (0);
1078352d2591SJean-Christophe PLAGNIOL-VILLARD }
1079352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
1080352d2591SJean-Christophe PLAGNIOL-VILLARD 
1081352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
1082352d2591SJean-Christophe PLAGNIOL-VILLARD 
1083352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO
1084352d2591SJean-Christophe PLAGNIOL-VILLARD void logo_plot (void *screen, int width, int x, int y)
1085352d2591SJean-Christophe PLAGNIOL-VILLARD {
1086352d2591SJean-Christophe PLAGNIOL-VILLARD 
1087352d2591SJean-Christophe PLAGNIOL-VILLARD 	int xcount, i;
1088352d2591SJean-Christophe PLAGNIOL-VILLARD 	int skip   = (width - VIDEO_LOGO_WIDTH) * VIDEO_PIXEL_SIZE;
1089352d2591SJean-Christophe PLAGNIOL-VILLARD 	int ycount = VIDEO_LOGO_HEIGHT;
1090352d2591SJean-Christophe PLAGNIOL-VILLARD 	unsigned char r, g, b, *logo_red, *logo_blue, *logo_green;
1091352d2591SJean-Christophe PLAGNIOL-VILLARD 	unsigned char *source;
1092d9015f6aSAnatolij Gustschin 	unsigned char *dest = (unsigned char *)screen +
1093d9015f6aSAnatolij Gustschin 			      ((y * width * VIDEO_PIXEL_SIZE) +
1094d9015f6aSAnatolij Gustschin 			       x * VIDEO_PIXEL_SIZE);
1095352d2591SJean-Christophe PLAGNIOL-VILLARD 
1096352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO
1097352d2591SJean-Christophe PLAGNIOL-VILLARD 	source = bmp_logo_bitmap;
1098352d2591SJean-Christophe PLAGNIOL-VILLARD 
1099352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Allocate temporary space for computing colormap			 */
1100352d2591SJean-Christophe PLAGNIOL-VILLARD 	logo_red = malloc (BMP_LOGO_COLORS);
1101352d2591SJean-Christophe PLAGNIOL-VILLARD 	logo_green = malloc (BMP_LOGO_COLORS);
1102352d2591SJean-Christophe PLAGNIOL-VILLARD 	logo_blue = malloc (BMP_LOGO_COLORS);
1103352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Compute color map							 */
1104352d2591SJean-Christophe PLAGNIOL-VILLARD 	for (i = 0; i < VIDEO_LOGO_COLORS; i++) {
1105352d2591SJean-Christophe PLAGNIOL-VILLARD 		logo_red[i] = (bmp_logo_palette[i] & 0x0f00) >> 4;
1106352d2591SJean-Christophe PLAGNIOL-VILLARD 		logo_green[i] = (bmp_logo_palette[i] & 0x00f0);
1107352d2591SJean-Christophe PLAGNIOL-VILLARD 		logo_blue[i] = (bmp_logo_palette[i] & 0x000f) << 4;
1108352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1109352d2591SJean-Christophe PLAGNIOL-VILLARD #else
1110352d2591SJean-Christophe PLAGNIOL-VILLARD 	source = linux_logo;
1111352d2591SJean-Christophe PLAGNIOL-VILLARD 	logo_red = linux_logo_red;
1112352d2591SJean-Christophe PLAGNIOL-VILLARD 	logo_green = linux_logo_green;
1113352d2591SJean-Christophe PLAGNIOL-VILLARD 	logo_blue = linux_logo_blue;
1114352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
1115352d2591SJean-Christophe PLAGNIOL-VILLARD 
1116352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (VIDEO_DATA_FORMAT == GDF__8BIT_INDEX) {
1117352d2591SJean-Christophe PLAGNIOL-VILLARD 		for (i = 0; i < VIDEO_LOGO_COLORS; i++) {
1118352d2591SJean-Christophe PLAGNIOL-VILLARD 			video_set_lut (i + VIDEO_LOGO_LUT_OFFSET,
1119352d2591SJean-Christophe PLAGNIOL-VILLARD 				       logo_red[i], logo_green[i], logo_blue[i]);
1120352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
1121352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1122352d2591SJean-Christophe PLAGNIOL-VILLARD 
1123352d2591SJean-Christophe PLAGNIOL-VILLARD 	while (ycount--) {
1124*e84d568fSAnatolij Gustschin #if defined(VIDEO_FB_16BPP_PIXEL_SWAP)
1125*e84d568fSAnatolij Gustschin 		int xpos = x;
1126*e84d568fSAnatolij Gustschin #endif
1127352d2591SJean-Christophe PLAGNIOL-VILLARD 		xcount = VIDEO_LOGO_WIDTH;
1128352d2591SJean-Christophe PLAGNIOL-VILLARD 		while (xcount--) {
1129352d2591SJean-Christophe PLAGNIOL-VILLARD 			r = logo_red[*source - VIDEO_LOGO_LUT_OFFSET];
1130352d2591SJean-Christophe PLAGNIOL-VILLARD 			g = logo_green[*source - VIDEO_LOGO_LUT_OFFSET];
1131352d2591SJean-Christophe PLAGNIOL-VILLARD 			b = logo_blue[*source - VIDEO_LOGO_LUT_OFFSET];
1132352d2591SJean-Christophe PLAGNIOL-VILLARD 
1133352d2591SJean-Christophe PLAGNIOL-VILLARD 			switch (VIDEO_DATA_FORMAT) {
1134352d2591SJean-Christophe PLAGNIOL-VILLARD 			case GDF__8BIT_INDEX:
1135352d2591SJean-Christophe PLAGNIOL-VILLARD 				*dest = *source;
1136352d2591SJean-Christophe PLAGNIOL-VILLARD 				break;
1137352d2591SJean-Christophe PLAGNIOL-VILLARD 			case GDF__8BIT_332RGB:
1138352d2591SJean-Christophe PLAGNIOL-VILLARD 				*dest = ((r >> 5) << 5) | ((g >> 5) << 2) | (b >> 6);
1139352d2591SJean-Christophe PLAGNIOL-VILLARD 				break;
1140352d2591SJean-Christophe PLAGNIOL-VILLARD 			case GDF_15BIT_555RGB:
1141bed53753SAnatolij Gustschin #if !defined(VIDEO_FB_16BPP_PIXEL_SWAP)
1142352d2591SJean-Christophe PLAGNIOL-VILLARD 				*(unsigned short *) dest =
1143352d2591SJean-Christophe PLAGNIOL-VILLARD 					SWAP16 ((unsigned short) (((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3)));
1144bed53753SAnatolij Gustschin #else
1145*e84d568fSAnatolij Gustschin 				fill_555rgb_pswap (dest, xpos++, r, g, b);
1146bed53753SAnatolij Gustschin #endif
1147352d2591SJean-Christophe PLAGNIOL-VILLARD 				break;
1148352d2591SJean-Christophe PLAGNIOL-VILLARD 			case GDF_16BIT_565RGB:
1149352d2591SJean-Christophe PLAGNIOL-VILLARD 				*(unsigned short *) dest =
1150352d2591SJean-Christophe PLAGNIOL-VILLARD 					SWAP16 ((unsigned short) (((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3)));
1151352d2591SJean-Christophe PLAGNIOL-VILLARD 				break;
1152352d2591SJean-Christophe PLAGNIOL-VILLARD 			case GDF_32BIT_X888RGB:
1153352d2591SJean-Christophe PLAGNIOL-VILLARD 				*(unsigned long *) dest =
1154352d2591SJean-Christophe PLAGNIOL-VILLARD 					SWAP32 ((unsigned long) ((r << 16) | (g << 8) | b));
1155352d2591SJean-Christophe PLAGNIOL-VILLARD 				break;
1156352d2591SJean-Christophe PLAGNIOL-VILLARD 			case GDF_24BIT_888RGB:
1157352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef VIDEO_FB_LITTLE_ENDIAN
1158352d2591SJean-Christophe PLAGNIOL-VILLARD 				dest[0] = b;
1159352d2591SJean-Christophe PLAGNIOL-VILLARD 				dest[1] = g;
1160352d2591SJean-Christophe PLAGNIOL-VILLARD 				dest[2] = r;
1161352d2591SJean-Christophe PLAGNIOL-VILLARD #else
1162352d2591SJean-Christophe PLAGNIOL-VILLARD 				dest[0] = r;
1163352d2591SJean-Christophe PLAGNIOL-VILLARD 				dest[1] = g;
1164352d2591SJean-Christophe PLAGNIOL-VILLARD 				dest[2] = b;
1165352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
1166352d2591SJean-Christophe PLAGNIOL-VILLARD 				break;
1167352d2591SJean-Christophe PLAGNIOL-VILLARD 			}
1168352d2591SJean-Christophe PLAGNIOL-VILLARD 			source++;
1169352d2591SJean-Christophe PLAGNIOL-VILLARD 			dest += VIDEO_PIXEL_SIZE;
1170352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
1171352d2591SJean-Christophe PLAGNIOL-VILLARD 		dest += skip;
1172352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1173352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_BMP_LOGO
1174352d2591SJean-Christophe PLAGNIOL-VILLARD 	free (logo_red);
1175352d2591SJean-Christophe PLAGNIOL-VILLARD 	free (logo_green);
1176352d2591SJean-Christophe PLAGNIOL-VILLARD 	free (logo_blue);
1177352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
1178352d2591SJean-Christophe PLAGNIOL-VILLARD }
1179352d2591SJean-Christophe PLAGNIOL-VILLARD 
1180352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
1181352d2591SJean-Christophe PLAGNIOL-VILLARD 
1182352d2591SJean-Christophe PLAGNIOL-VILLARD static void *video_logo (void)
1183352d2591SJean-Christophe PLAGNIOL-VILLARD {
1184352d2591SJean-Christophe PLAGNIOL-VILLARD 	char info[128];
1185352d2591SJean-Christophe PLAGNIOL-VILLARD 	extern char version_string;
1186352d2591SJean-Christophe PLAGNIOL-VILLARD 
1187352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_SPLASH_SCREEN
1188352d2591SJean-Christophe PLAGNIOL-VILLARD 	char *s;
1189352d2591SJean-Christophe PLAGNIOL-VILLARD 	ulong addr;
1190352d2591SJean-Christophe PLAGNIOL-VILLARD 
1191352d2591SJean-Christophe PLAGNIOL-VILLARD 	if ((s = getenv ("splashimage")) != NULL) {
1192352d2591SJean-Christophe PLAGNIOL-VILLARD 		addr = simple_strtoul (s, NULL, 16);
1193352d2591SJean-Christophe PLAGNIOL-VILLARD 
1194352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (video_display_bitmap (addr, 0, 0) == 0) {
1195352d2591SJean-Christophe PLAGNIOL-VILLARD 			return ((void *) (video_fb_address));
1196352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
1197352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1198352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_SPLASH_SCREEN */
1199352d2591SJean-Christophe PLAGNIOL-VILLARD 
1200352d2591SJean-Christophe PLAGNIOL-VILLARD 	logo_plot (video_fb_address, VIDEO_COLS, 0, 0);
1201352d2591SJean-Christophe PLAGNIOL-VILLARD 
1202352d2591SJean-Christophe PLAGNIOL-VILLARD 	sprintf (info, " %s", &version_string);
1203352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_drawstring (VIDEO_INFO_X, VIDEO_INFO_Y, (uchar *)info);
1204352d2591SJean-Christophe PLAGNIOL-VILLARD 
1205352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_CONSOLE_EXTRA_INFO
1206352d2591SJean-Christophe PLAGNIOL-VILLARD 	{
1207352d2591SJean-Christophe PLAGNIOL-VILLARD 		int i, n = ((VIDEO_LOGO_HEIGHT - VIDEO_FONT_HEIGHT) / VIDEO_FONT_HEIGHT);
1208352d2591SJean-Christophe PLAGNIOL-VILLARD 
1209352d2591SJean-Christophe PLAGNIOL-VILLARD 		for (i = 1; i < n; i++) {
1210352d2591SJean-Christophe PLAGNIOL-VILLARD 			video_get_info_str (i, info);
1211352d2591SJean-Christophe PLAGNIOL-VILLARD 			if (*info)
1212352d2591SJean-Christophe PLAGNIOL-VILLARD 				video_drawstring (VIDEO_INFO_X,
1213352d2591SJean-Christophe PLAGNIOL-VILLARD 						  VIDEO_INFO_Y + i * VIDEO_FONT_HEIGHT,
1214352d2591SJean-Christophe PLAGNIOL-VILLARD 						  (uchar *)info);
1215352d2591SJean-Christophe PLAGNIOL-VILLARD 		}
1216352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1217352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
1218352d2591SJean-Christophe PLAGNIOL-VILLARD 
1219352d2591SJean-Christophe PLAGNIOL-VILLARD 	return (video_fb_address + VIDEO_LOGO_HEIGHT * VIDEO_LINE_LEN);
1220352d2591SJean-Christophe PLAGNIOL-VILLARD }
1221352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
1222352d2591SJean-Christophe PLAGNIOL-VILLARD 
1223352d2591SJean-Christophe PLAGNIOL-VILLARD 
1224352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
1225352d2591SJean-Christophe PLAGNIOL-VILLARD 
1226352d2591SJean-Christophe PLAGNIOL-VILLARD static int video_init (void)
1227352d2591SJean-Christophe PLAGNIOL-VILLARD {
1228352d2591SJean-Christophe PLAGNIOL-VILLARD 	unsigned char color8;
1229352d2591SJean-Christophe PLAGNIOL-VILLARD 
1230352d2591SJean-Christophe PLAGNIOL-VILLARD 	if ((pGD = video_hw_init ()) == NULL)
1231352d2591SJean-Christophe PLAGNIOL-VILLARD 		return -1;
1232352d2591SJean-Christophe PLAGNIOL-VILLARD 
1233352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_fb_address = (void *) VIDEO_FB_ADRS;
1234352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_HW_CURSOR
1235352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_init_hw_cursor (VIDEO_FONT_WIDTH, VIDEO_FONT_HEIGHT);
1236352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
1237352d2591SJean-Christophe PLAGNIOL-VILLARD 
1238352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Init drawing pats */
1239352d2591SJean-Christophe PLAGNIOL-VILLARD 	switch (VIDEO_DATA_FORMAT) {
1240352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF__8BIT_INDEX:
1241352d2591SJean-Christophe PLAGNIOL-VILLARD 		video_set_lut (0x01, CONSOLE_FG_COL, CONSOLE_FG_COL, CONSOLE_FG_COL);
1242352d2591SJean-Christophe PLAGNIOL-VILLARD 		video_set_lut (0x00, CONSOLE_BG_COL, CONSOLE_BG_COL, CONSOLE_BG_COL);
1243352d2591SJean-Christophe PLAGNIOL-VILLARD 		fgx = 0x01010101;
1244352d2591SJean-Christophe PLAGNIOL-VILLARD 		bgx = 0x00000000;
1245352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
1246352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF__8BIT_332RGB:
1247352d2591SJean-Christophe PLAGNIOL-VILLARD 		color8 = ((CONSOLE_FG_COL & 0xe0) |
1248352d2591SJean-Christophe PLAGNIOL-VILLARD 			  ((CONSOLE_FG_COL >> 3) & 0x1c) | CONSOLE_FG_COL >> 6);
1249352d2591SJean-Christophe PLAGNIOL-VILLARD 		fgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8;
1250352d2591SJean-Christophe PLAGNIOL-VILLARD 		color8 = ((CONSOLE_BG_COL & 0xe0) |
1251352d2591SJean-Christophe PLAGNIOL-VILLARD 			  ((CONSOLE_BG_COL >> 3) & 0x1c) | CONSOLE_BG_COL >> 6);
1252352d2591SJean-Christophe PLAGNIOL-VILLARD 		bgx = (color8 << 24) | (color8 << 16) | (color8 << 8) | color8;
1253352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
1254352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF_15BIT_555RGB:
1255352d2591SJean-Christophe PLAGNIOL-VILLARD 		fgx = (((CONSOLE_FG_COL >> 3) << 26) |
1256352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ((CONSOLE_FG_COL >> 3) << 21) | ((CONSOLE_FG_COL >> 3) << 16) |
1257352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ((CONSOLE_FG_COL >> 3) << 10) | ((CONSOLE_FG_COL >> 3) << 5) |
1258352d2591SJean-Christophe PLAGNIOL-VILLARD 		       (CONSOLE_FG_COL >> 3));
1259352d2591SJean-Christophe PLAGNIOL-VILLARD 		bgx = (((CONSOLE_BG_COL >> 3) << 26) |
1260352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ((CONSOLE_BG_COL >> 3) << 21) | ((CONSOLE_BG_COL >> 3) << 16) |
1261352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ((CONSOLE_BG_COL >> 3) << 10) | ((CONSOLE_BG_COL >> 3) << 5) |
1262352d2591SJean-Christophe PLAGNIOL-VILLARD 		       (CONSOLE_BG_COL >> 3));
1263352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
1264352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF_16BIT_565RGB:
1265352d2591SJean-Christophe PLAGNIOL-VILLARD 		fgx = (((CONSOLE_FG_COL >> 3) << 27) |
1266352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ((CONSOLE_FG_COL >> 2) << 21) | ((CONSOLE_FG_COL >> 3) << 16) |
1267352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ((CONSOLE_FG_COL >> 3) << 11) | ((CONSOLE_FG_COL >> 2) << 5) |
1268352d2591SJean-Christophe PLAGNIOL-VILLARD 		       (CONSOLE_FG_COL >> 3));
1269352d2591SJean-Christophe PLAGNIOL-VILLARD 		bgx = (((CONSOLE_BG_COL >> 3) << 27) |
1270352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ((CONSOLE_BG_COL >> 2) << 21) | ((CONSOLE_BG_COL >> 3) << 16) |
1271352d2591SJean-Christophe PLAGNIOL-VILLARD 		       ((CONSOLE_BG_COL >> 3) << 11) | ((CONSOLE_BG_COL >> 2) << 5) |
1272352d2591SJean-Christophe PLAGNIOL-VILLARD 		       (CONSOLE_BG_COL >> 3));
1273352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
1274352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF_32BIT_X888RGB:
1275352d2591SJean-Christophe PLAGNIOL-VILLARD 		fgx = (CONSOLE_FG_COL << 16) | (CONSOLE_FG_COL << 8) | CONSOLE_FG_COL;
1276352d2591SJean-Christophe PLAGNIOL-VILLARD 		bgx = (CONSOLE_BG_COL << 16) | (CONSOLE_BG_COL << 8) | CONSOLE_BG_COL;
1277352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
1278352d2591SJean-Christophe PLAGNIOL-VILLARD 	case GDF_24BIT_888RGB:
1279352d2591SJean-Christophe PLAGNIOL-VILLARD 		fgx = (CONSOLE_FG_COL << 24) | (CONSOLE_FG_COL << 16) |
1280352d2591SJean-Christophe PLAGNIOL-VILLARD 			(CONSOLE_FG_COL << 8) | CONSOLE_FG_COL;
1281352d2591SJean-Christophe PLAGNIOL-VILLARD 		bgx = (CONSOLE_BG_COL << 24) | (CONSOLE_BG_COL << 16) |
1282352d2591SJean-Christophe PLAGNIOL-VILLARD 			(CONSOLE_BG_COL << 8) | CONSOLE_BG_COL;
1283352d2591SJean-Christophe PLAGNIOL-VILLARD 		break;
1284352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1285352d2591SJean-Christophe PLAGNIOL-VILLARD 	eorx = fgx ^ bgx;
1286352d2591SJean-Christophe PLAGNIOL-VILLARD 
1287352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VIDEO_LOGO
1288352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Plot the logo and get start point of console */
1289352d2591SJean-Christophe PLAGNIOL-VILLARD 	PRINTD ("Video: Drawing the logo ...\n");
1290352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_console_address = video_logo ();
1291352d2591SJean-Christophe PLAGNIOL-VILLARD #else
1292352d2591SJean-Christophe PLAGNIOL-VILLARD 	video_console_address = video_fb_address;
1293352d2591SJean-Christophe PLAGNIOL-VILLARD #endif
1294352d2591SJean-Christophe PLAGNIOL-VILLARD 
1295352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Initialize the console */
1296352d2591SJean-Christophe PLAGNIOL-VILLARD 	console_col = 0;
1297352d2591SJean-Christophe PLAGNIOL-VILLARD 	console_row = 0;
1298352d2591SJean-Christophe PLAGNIOL-VILLARD 
1299352d2591SJean-Christophe PLAGNIOL-VILLARD 	return 0;
1300352d2591SJean-Christophe PLAGNIOL-VILLARD }
1301352d2591SJean-Christophe PLAGNIOL-VILLARD 
1302352d2591SJean-Christophe PLAGNIOL-VILLARD 
1303352d2591SJean-Christophe PLAGNIOL-VILLARD /*****************************************************************************/
1304352d2591SJean-Christophe PLAGNIOL-VILLARD 
1305352d2591SJean-Christophe PLAGNIOL-VILLARD int drv_video_init (void)
1306352d2591SJean-Christophe PLAGNIOL-VILLARD {
1307352d2591SJean-Christophe PLAGNIOL-VILLARD 	int skip_dev_init;
1308352d2591SJean-Christophe PLAGNIOL-VILLARD 	device_t console_dev;
1309352d2591SJean-Christophe PLAGNIOL-VILLARD 
1310352d2591SJean-Christophe PLAGNIOL-VILLARD 	skip_dev_init = 0;
1311352d2591SJean-Christophe PLAGNIOL-VILLARD 
1312352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Init video chip - returns with framebuffer cleared */
1313352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (video_init () == -1)
1314352d2591SJean-Christophe PLAGNIOL-VILLARD 		skip_dev_init = 1;
1315352d2591SJean-Christophe PLAGNIOL-VILLARD 
1316352d2591SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_VGA_AS_SINGLE_DEVICE
1317352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Devices VGA and Keyboard will be assigned seperately */
1318352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Init vga device */
1319352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (!skip_dev_init) {
1320352d2591SJean-Christophe PLAGNIOL-VILLARD 		memset (&console_dev, 0, sizeof (console_dev));
1321352d2591SJean-Christophe PLAGNIOL-VILLARD 		strcpy (console_dev.name, "vga");
1322352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.ext = DEV_EXT_VIDEO;	/* Video extensions */
1323352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_SYSTEM;
1324352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.putc = video_putc;	/* 'putc' function */
1325352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.puts = video_puts;	/* 'puts' function */
1326352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.tstc = NULL;	/* 'tstc' function */
1327352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.getc = NULL;	/* 'getc' function */
1328352d2591SJean-Christophe PLAGNIOL-VILLARD 
1329352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (device_register (&console_dev) == 0)
1330352d2591SJean-Christophe PLAGNIOL-VILLARD 			return 1;
1331352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1332352d2591SJean-Christophe PLAGNIOL-VILLARD #else
1333352d2591SJean-Christophe PLAGNIOL-VILLARD 	PRINTD ("KBD: Keyboard init ...\n");
1334352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (VIDEO_KBD_INIT_FCT == -1)
1335352d2591SJean-Christophe PLAGNIOL-VILLARD 		skip_dev_init = 1;
1336352d2591SJean-Christophe PLAGNIOL-VILLARD 
1337352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* Init console device */
1338352d2591SJean-Christophe PLAGNIOL-VILLARD 	if (!skip_dev_init) {
1339352d2591SJean-Christophe PLAGNIOL-VILLARD 		memset (&console_dev, 0, sizeof (console_dev));
1340352d2591SJean-Christophe PLAGNIOL-VILLARD 		strcpy (console_dev.name, "vga");
1341352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.ext = DEV_EXT_VIDEO;	/* Video extensions */
1342352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
1343352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.putc = video_putc;	/* 'putc' function */
1344352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.puts = video_puts;	/* 'puts' function */
1345352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.tstc = VIDEO_TSTC_FCT;	/* 'tstc' function */
1346352d2591SJean-Christophe PLAGNIOL-VILLARD 		console_dev.getc = VIDEO_GETC_FCT;	/* 'getc' function */
1347352d2591SJean-Christophe PLAGNIOL-VILLARD 
1348352d2591SJean-Christophe PLAGNIOL-VILLARD 		if (device_register (&console_dev) == 0)
1349352d2591SJean-Christophe PLAGNIOL-VILLARD 			return 1;
1350352d2591SJean-Christophe PLAGNIOL-VILLARD 	}
1351352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_VGA_AS_SINGLE_DEVICE */
1352352d2591SJean-Christophe PLAGNIOL-VILLARD 	/* No console dev available */
1353352d2591SJean-Christophe PLAGNIOL-VILLARD 	return 0;
1354352d2591SJean-Christophe PLAGNIOL-VILLARD }
1355352d2591SJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_CFB_CONSOLE */
1356