Blame view

common/lcd.c 17.4 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
8655b6f86   wdenk   * Clean up tools/...
2
  /*
c8d2febcc   Nikita Kiryanov   lcd: various clea...
3
   * Common LCD routines
8655b6f86   wdenk   * Clean up tools/...
4
5
6
   *
   * (C) Copyright 2001-2002
   * Wolfgang Denk, DENX Software Engineering -- wd@denx.de
8655b6f86   wdenk   * Clean up tools/...
7
   */
8655b6f86   wdenk   * Clean up tools/...
8
  /* #define DEBUG */
8655b6f86   wdenk   * Clean up tools/...
9
10
11
  #include <config.h>
  #include <common.h>
  #include <command.h>
c08804853   Nikita Kiryanov   lcd: implement a ...
12
  #include <env_callback.h>
8655b6f86   wdenk   * Clean up tools/...
13
  #include <linux/types.h>
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
14
  #include <stdio_dev.h>
8655b6f86   wdenk   * Clean up tools/...
15
  #include <lcd.h>
0eb25b619   Joe Hershberger   common: Make sure...
16
  #include <mapmem.h>
8b0bfc680   wdenk   * Patch by Yuli B...
17
  #include <watchdog.h>
dca2a1c18   Przemyslaw Marczak   common: lcd.c: fi...
18
  #include <asm/unaligned.h>
dd4425e85   Robert Winkler   video: lcd: Add C...
19
  #include <splash.h>
7d95f2a32   Simon Glass   sandbox: Add LCD ...
20
21
  #include <asm/io.h>
  #include <asm/unaligned.h>
c8d2febcc   Nikita Kiryanov   lcd: various clea...
22
  #include <video_font.h>
dd4425e85   Robert Winkler   video: lcd: Add C...
23

88804d19e   wdenk   * Patch by Detlev...
24
  #ifdef CONFIG_LCD_LOGO
c8d2febcc   Nikita Kiryanov   lcd: various clea...
25
26
27
28
29
  #include <bmp_logo.h>
  #include <bmp_logo_data.h>
  #if (CONSOLE_COLOR_WHITE >= BMP_LOGO_OFFSET) && (LCD_BPP != LCD_COLOR16)
  #error Default Color Map overlaps with Logo Color Map
  #endif
88804d19e   wdenk   * Patch by Detlev...
30
  #endif
8655b6f86   wdenk   * Clean up tools/...
31

676d319ef   Simon Glass   lcd: Add CONFIG_L...
32
33
34
  #ifndef CONFIG_LCD_ALIGNMENT
  #define CONFIG_LCD_ALIGNMENT PAGE_SIZE
  #endif
d87080b72   Wolfgang Denk   GCC-4.x fixes: cl...
35
  DECLARE_GLOBAL_DATA_PTR;
8655b6f86   wdenk   * Clean up tools/...
36

8f47d917c   Nikita Kiryanov   common lcd: minor...
37
  static int lcd_init(void *lcdbase);
7bf71d1f5   Nikita Kiryanov   lcd: split splash...
38
  static void lcd_logo(void);
8f47d917c   Nikita Kiryanov   common lcd: minor...
39
40
  static void lcd_setfgcolor(int color);
  static void lcd_setbgcolor(int color);
8655b6f86   wdenk   * Clean up tools/...
41

46d1d5dd4   Wolfgang Denk   common/lcd.c: cle...
42
43
  static int lcd_color_fg;
  static int lcd_color_bg;
f1d205a19   Jeroen Hofstee   common/lcd.c: cle...
44
  int lcd_line_length;
8655b6f86   wdenk   * Clean up tools/...
45
  char lcd_is_enabled = 0;
00a0ca598   Jeroen Hofstee   common/lcd.c: rem...
46
  static void *lcd_base;			/* Start of framebuffer memory	*/
9a8efc460   Simon Glass   lcd: Add support ...
47
  static char lcd_flush_dcache;	/* 1 to flush dcache after each lcd update */
8655b6f86   wdenk   * Clean up tools/...
48

9a8efc460   Simon Glass   lcd: Add support ...
49
50
51
52
53
54
55
56
57
58
59
60
  /* Flush LCD activity to the caches */
  void lcd_sync(void)
  {
  	/*
  	 * flush_dcache_range() is declared in common.h but it seems that some
  	 * architectures do not actually implement it. Is there a way to find
  	 * out whether it exists? For now, ARM is safe.
  	 */
  #if defined(CONFIG_ARM) && !defined(CONFIG_SYS_DCACHE_OFF)
  	int line_length;
  
  	if (lcd_flush_dcache)
f8f58fbb0   Alexander Graf   lcd: Fix compile ...
61
62
  		flush_dcache_range((ulong)lcd_base,
  			(ulong)(lcd_base + lcd_get_size(&line_length)));
9a8efc460   Simon Glass   lcd: Add support ...
63
64
65
66
67
68
69
  #endif
  }
  
  void lcd_set_flush_dcache(int flush)
  {
  	lcd_flush_dcache = (flush != 0);
  }
709ea543b   Simon Glass   stdio: Pass devic...
70
71
72
73
  static void lcd_stub_putc(struct stdio_dev *dev, const char c)
  {
  	lcd_putc(c);
  }
709ea543b   Simon Glass   stdio: Pass devic...
74
75
76
77
  static void lcd_stub_puts(struct stdio_dev *dev, const char *s)
  {
  	lcd_puts(s);
  }
c8d2febcc   Nikita Kiryanov   lcd: various clea...
78
  /* Small utility to check that you got the colours right */
8655b6f86   wdenk   * Clean up tools/...
79
  #ifdef LCD_TEST_PATTERN
e32951b52   Andreas Neubacher   lcd: fix the colo...
80
  #if LCD_BPP == LCD_COLOR8
8655b6f86   wdenk   * Clean up tools/...
81
82
  #define	N_BLK_VERT	2
  #define	N_BLK_HOR	3
6b035141f   Jeroen Hofstee   common/lcd: cosme...
83
  static int test_colors[N_BLK_HOR * N_BLK_VERT] = {
8655b6f86   wdenk   * Clean up tools/...
84
85
  	CONSOLE_COLOR_RED,	CONSOLE_COLOR_GREEN,	CONSOLE_COLOR_YELLOW,
  	CONSOLE_COLOR_BLUE,	CONSOLE_COLOR_MAGENTA,	CONSOLE_COLOR_CYAN,
e32951b52   Andreas Neubacher   lcd: fix the colo...
86
87
88
89
90
91
92
93
94
  }; /*LCD_BPP == LCD_COLOR8 */
  
  #elif LCD_BPP == LCD_COLOR16
  #define	N_BLK_VERT	2
  #define	N_BLK_HOR	4
  
  static int test_colors[N_BLK_HOR * N_BLK_VERT] = {
  	CONSOLE_COLOR_RED,	CONSOLE_COLOR_GREEN,	CONSOLE_COLOR_YELLOW,	CONSOLE_COLOR_BLUE,
  	CONSOLE_COLOR_MAGENTA,	CONSOLE_COLOR_CYAN,	CONSOLE_COLOR_GREY,	CONSOLE_COLOR_WHITE,
8655b6f86   wdenk   * Clean up tools/...
95
  };
e32951b52   Andreas Neubacher   lcd: fix the colo...
96
  #endif /*LCD_BPP == LCD_COLOR16 */
8655b6f86   wdenk   * Clean up tools/...
97

8f47d917c   Nikita Kiryanov   common lcd: minor...
98
  static void test_pattern(void)
8655b6f86   wdenk   * Clean up tools/...
99
100
101
102
103
104
  {
  	ushort v_max  = panel_info.vl_row;
  	ushort h_max  = panel_info.vl_col;
  	ushort v_step = (v_max + N_BLK_VERT - 1) / N_BLK_VERT;
  	ushort h_step = (h_max + N_BLK_HOR  - 1) / N_BLK_HOR;
  	ushort v, h;
e32951b52   Andreas Neubacher   lcd: fix the colo...
105
  #if LCD_BPP == LCD_COLOR8
8655b6f86   wdenk   * Clean up tools/...
106
  	uchar *pix = (uchar *)lcd_base;
e32951b52   Andreas Neubacher   lcd: fix the colo...
107
108
109
  #elif LCD_BPP == LCD_COLOR16
  	ushort *pix = (ushort *)lcd_base;
  #endif
8655b6f86   wdenk   * Clean up tools/...
110

8f47d917c   Nikita Kiryanov   common lcd: minor...
111
112
  	printf("[LCD] Test Pattern: %d x %d [%d x %d]
  ",
8655b6f86   wdenk   * Clean up tools/...
113
  		h_max, v_max, h_step, v_step);
8f47d917c   Nikita Kiryanov   common lcd: minor...
114
  	for (v = 0; v < v_max; ++v) {
8655b6f86   wdenk   * Clean up tools/...
115
  		uchar iy = v / v_step;
8f47d917c   Nikita Kiryanov   common lcd: minor...
116
  		for (h = 0; h < h_max; ++h) {
6b035141f   Jeroen Hofstee   common/lcd: cosme...
117
  			uchar ix = N_BLK_HOR * iy + h / h_step;
8655b6f86   wdenk   * Clean up tools/...
118
119
120
121
122
  			*pix++ = test_colors[ix];
  		}
  	}
  }
  #endif /* LCD_TEST_PATTERN */
cefa47171   Anatolij Gustschin   lcd: allow overri...
123
124
125
126
127
128
129
  /*
   * With most lcd drivers the line length is set up
   * by calculating it from panel_info parameters. Some
   * drivers need to calculate the line length differently,
   * so make the function weak to allow overriding it.
   */
  __weak int lcd_get_size(int *line_length)
676d319ef   Simon Glass   lcd: Add CONFIG_L...
130
131
132
133
  {
  	*line_length = (panel_info.vl_col * NBITS(panel_info.vl_bpix)) / 8;
  	return *line_length * panel_info.vl_row;
  }
6b035141f   Jeroen Hofstee   common/lcd: cosme...
134
  int drv_lcd_init(void)
8655b6f86   wdenk   * Clean up tools/...
135
  {
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
136
  	struct stdio_dev lcddev;
8655b6f86   wdenk   * Clean up tools/...
137
  	int rc;
7d95f2a32   Simon Glass   sandbox: Add LCD ...
138
  	lcd_base = map_sysmem(gd->fb_base, 0);
8655b6f86   wdenk   * Clean up tools/...
139

c8d2febcc   Nikita Kiryanov   lcd: various clea...
140
  	lcd_init(lcd_base);
8655b6f86   wdenk   * Clean up tools/...
141
142
  
  	/* Device initialization */
8f47d917c   Nikita Kiryanov   common lcd: minor...
143
  	memset(&lcddev, 0, sizeof(lcddev));
8655b6f86   wdenk   * Clean up tools/...
144

8f47d917c   Nikita Kiryanov   common lcd: minor...
145
  	strcpy(lcddev.name, "lcd");
8655b6f86   wdenk   * Clean up tools/...
146
147
  	lcddev.ext   = 0;			/* No extensions */
  	lcddev.flags = DEV_FLAGS_OUTPUT;	/* Output only */
709ea543b   Simon Glass   stdio: Pass devic...
148
149
  	lcddev.putc  = lcd_stub_putc;		/* 'putc' function */
  	lcddev.puts  = lcd_stub_puts;		/* 'puts' function */
8655b6f86   wdenk   * Clean up tools/...
150

6b035141f   Jeroen Hofstee   common/lcd: cosme...
151
  	rc = stdio_register(&lcddev);
8655b6f86   wdenk   * Clean up tools/...
152
153
154
  
  	return (rc == 0) ? 1 : rc;
  }
02110903a   Che-Liang Chiou   lcd: add clear an...
155
  void lcd_clear(void)
8655b6f86   wdenk   * Clean up tools/...
156
  {
7bf71d1f5   Nikita Kiryanov   lcd: split splash...
157
158
159
  	char *s;
  	ulong addr;
  	static int do_splash = 1;
237742f73   Peng Fan   MLK-12425-2 video...
160
161
162
163
164
  #if LCD_BPP == LCD_MONOCHROME
  	/* Setting the palette */
  	lcd_initcolregs();
  
  #elif LCD_BPP == LCD_COLOR8
8655b6f86   wdenk   * Clean up tools/...
165
  	/* Setting the palette */
8f47d917c   Nikita Kiryanov   common lcd: minor...
166
167
168
169
170
171
172
173
174
  	lcd_setcolreg(CONSOLE_COLOR_BLACK, 0, 0, 0);
  	lcd_setcolreg(CONSOLE_COLOR_RED, 0xFF, 0, 0);
  	lcd_setcolreg(CONSOLE_COLOR_GREEN, 0, 0xFF, 0);
  	lcd_setcolreg(CONSOLE_COLOR_YELLOW, 0xFF, 0xFF, 0);
  	lcd_setcolreg(CONSOLE_COLOR_BLUE, 0, 0, 0xFF);
  	lcd_setcolreg(CONSOLE_COLOR_MAGENTA, 0xFF, 0, 0xFF);
  	lcd_setcolreg(CONSOLE_COLOR_CYAN, 0, 0xFF, 0xFF);
  	lcd_setcolreg(CONSOLE_COLOR_GREY, 0xAA, 0xAA, 0xAA);
  	lcd_setcolreg(CONSOLE_COLOR_WHITE, 0xFF, 0xFF, 0xFF);
8655b6f86   wdenk   * Clean up tools/...
175
  #endif
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
176
  #ifndef CONFIG_SYS_WHITE_ON_BLACK
8f47d917c   Nikita Kiryanov   common lcd: minor...
177
178
  	lcd_setfgcolor(CONSOLE_COLOR_BLACK);
  	lcd_setbgcolor(CONSOLE_COLOR_WHITE);
8655b6f86   wdenk   * Clean up tools/...
179
  #else
8f47d917c   Nikita Kiryanov   common lcd: minor...
180
181
  	lcd_setfgcolor(CONSOLE_COLOR_WHITE);
  	lcd_setbgcolor(CONSOLE_COLOR_BLACK);
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
182
  #endif	/* CONFIG_SYS_WHITE_ON_BLACK */
8655b6f86   wdenk   * Clean up tools/...
183
184
185
186
187
  
  #ifdef	LCD_TEST_PATTERN
  	test_pattern();
  #else
  	/* set framebuffer to background color */
57d76a89b   Hannes Petermaier   Add support for 3...
188
  #if (LCD_BPP != LCD_COLOR32)
237742f73   Peng Fan   MLK-12425-2 video...
189
190
  	memset((char *)lcd_base, COLOR_MASK(lcd_getbgcolor()),
  	       lcd_line_length * panel_info.vl_row);
57d76a89b   Hannes Petermaier   Add support for 3...
191
192
193
194
195
196
  #else
  	u32 *ppix = lcd_base;
  	u32 i;
  	for (i = 0;
  	   i < (lcd_line_length * panel_info.vl_row)/NBYTES(panel_info.vl_bpix);
  	   i++) {
237742f73   Peng Fan   MLK-12425-2 video...
197
  		*ppix++ = COLOR_MASK(lcd_getbgcolor());
57d76a89b   Hannes Petermaier   Add support for 3...
198
199
  	}
  #endif
8655b6f86   wdenk   * Clean up tools/...
200
  #endif
604c7d4a5   Hannes Petermaier   common/lcd_consol...
201
202
203
204
205
206
207
  	/* setup text-console */
  	debug("[LCD] setting up console...
  ");
  	lcd_init_console(lcd_base,
  			 panel_info.vl_col,
  			 panel_info.vl_row,
  			 panel_info.vl_rot);
8655b6f86   wdenk   * Clean up tools/...
208
  	/* Paint the logo and retrieve LCD base address */
8f47d917c   Nikita Kiryanov   common lcd: minor...
209
210
  	debug("[LCD] Drawing the logo...
  ");
7bf71d1f5   Nikita Kiryanov   lcd: split splash...
211
  	if (do_splash) {
00caae6d4   Simon Glass   env: Rename geten...
212
  		s = env_get("splashimage");
7bf71d1f5   Nikita Kiryanov   lcd: split splash...
213
214
215
216
217
218
219
220
221
222
223
224
225
  		if (s) {
  			do_splash = 0;
  			addr = simple_strtoul(s, NULL, 16);
  			if (lcd_splash(addr) == 0) {
  				lcd_sync();
  				return;
  			}
  		}
  	}
  
  	lcd_logo();
  #if defined(CONFIG_LCD_LOGO) && !defined(CONFIG_LCD_INFO_BELOW_LOGO)
  	addr = (ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length;
3b96b9096   Marcel Ziswiler   common/lcd_consol...
226
227
  	lcd_init_console((void *)addr, panel_info.vl_col,
  			 panel_info.vl_row, panel_info.vl_rot);
7bf71d1f5   Nikita Kiryanov   lcd: split splash...
228
  #endif
9a8efc460   Simon Glass   lcd: Add support ...
229
230
  	lcd_sync();
  }
8f47d917c   Nikita Kiryanov   common lcd: minor...
231
  static int lcd_init(void *lcdbase)
8655b6f86   wdenk   * Clean up tools/...
232
  {
8f47d917c   Nikita Kiryanov   common lcd: minor...
233
234
  	debug("[LCD] Initializing LCD frambuffer at %p
  ", lcdbase);
8f47d917c   Nikita Kiryanov   common lcd: minor...
235
  	lcd_ctrl_init(lcdbase);
1d3dea12e   Anatolij Gustschin   video: bcm2835: f...
236
237
  
  	/*
9316e1440   Stephen Warren   ARM: rpi: rename ...
238
  	 * lcd_ctrl_init() of some drivers (i.e. bcm2835 on rpi) ignores
1d3dea12e   Anatolij Gustschin   video: bcm2835: f...
239
240
241
242
  	 * the 'lcdbase' argument and uses custom lcd base address
  	 * by setting up gd->fb_base. Check for this condition and fixup
  	 * 'lcd_base' address.
  	 */
7d95f2a32   Simon Glass   sandbox: Add LCD ...
243
244
  	if (map_to_sysmem(lcdbase) != gd->fb_base)
  		lcd_base = map_sysmem(gd->fb_base, 0);
1d3dea12e   Anatolij Gustschin   video: bcm2835: f...
245
246
247
  
  	debug("[LCD] Using LCD frambuffer at %p
  ", lcd_base);
6d3307195   Stephen Warren   lcd: calculate li...
248
  	lcd_get_size(&lcd_line_length);
6f93d2b8f   Haavard Skinnemoen   lcd: Set lcd_is_e...
249
  	lcd_is_enabled = 1;
02110903a   Che-Liang Chiou   lcd: add clear an...
250
  	lcd_clear();
6b035141f   Jeroen Hofstee   common/lcd: cosme...
251
  	lcd_enable();
8655b6f86   wdenk   * Clean up tools/...
252
253
  
  	/* Initialize the console */
140beb943   Nikita Kiryanov   lcd: expand conso...
254
  	lcd_set_col(0);
88804d19e   wdenk   * Patch by Detlev...
255
  #ifdef CONFIG_LCD_INFO_BELOW_LOGO
140beb943   Nikita Kiryanov   lcd: expand conso...
256
  	lcd_set_row(7 + BMP_LOGO_HEIGHT / VIDEO_FONT_HEIGHT);
8655b6f86   wdenk   * Clean up tools/...
257
  #else
140beb943   Nikita Kiryanov   lcd: expand conso...
258
  	lcd_set_row(1);	/* leave 1 blank line below logo */
8655b6f86   wdenk   * Clean up tools/...
259
  #endif
8655b6f86   wdenk   * Clean up tools/...
260
261
262
  
  	return 0;
  }
8655b6f86   wdenk   * Clean up tools/...
263
264
265
266
267
268
269
  /*
   * This is called early in the system initialization to grab memory
   * for the LCD controller.
   * Returns new address for monitor, after reserving LCD buffer memory
   *
   * Note that this is running from ROM, so no write access to global data.
   */
8f47d917c   Nikita Kiryanov   common lcd: minor...
270
  ulong lcd_setmem(ulong addr)
8655b6f86   wdenk   * Clean up tools/...
271
272
  {
  	ulong size;
676d319ef   Simon Glass   lcd: Add CONFIG_L...
273
  	int line_length;
8655b6f86   wdenk   * Clean up tools/...
274

237742f73   Peng Fan   MLK-12425-2 video...
275
276
  	debug("LCD panel info: %lu x %lu, %d bit/pix
  ", panel_info.vl_col,
8f47d917c   Nikita Kiryanov   common lcd: minor...
277
  		panel_info.vl_row, NBITS(panel_info.vl_bpix));
8655b6f86   wdenk   * Clean up tools/...
278

676d319ef   Simon Glass   lcd: Add CONFIG_L...
279
  	size = lcd_get_size(&line_length);
8655b6f86   wdenk   * Clean up tools/...
280

676d319ef   Simon Glass   lcd: Add CONFIG_L...
281
282
283
  	/* Round up to nearest full page, or MMU section if defined */
  	size = ALIGN(size, CONFIG_LCD_ALIGNMENT);
  	addr = ALIGN(addr - CONFIG_LCD_ALIGNMENT + 1, CONFIG_LCD_ALIGNMENT);
8655b6f86   wdenk   * Clean up tools/...
284
285
286
  
  	/* Allocate pages for the frame buffer. */
  	addr -= size;
6b035141f   Jeroen Hofstee   common/lcd: cosme...
287
288
289
  	debug("Reserving %ldk for LCD Framebuffer at: %08lx
  ",
  	      size >> 10, addr);
8655b6f86   wdenk   * Clean up tools/...
290

8f47d917c   Nikita Kiryanov   common lcd: minor...
291
  	return addr;
8655b6f86   wdenk   * Clean up tools/...
292
  }
8f47d917c   Nikita Kiryanov   common lcd: minor...
293
  static void lcd_setfgcolor(int color)
8655b6f86   wdenk   * Clean up tools/...
294
  {
39cf48048   Stelian Pop   Add ATMEL LCD driver
295
  	lcd_color_fg = color;
8655b6f86   wdenk   * Clean up tools/...
296
  }
4d03634e5   Nikita Kiryanov   lcd: introduce ge...
297
298
299
300
  int lcd_getfgcolor(void)
  {
  	return lcd_color_fg;
  }
8f47d917c   Nikita Kiryanov   common lcd: minor...
301
  static void lcd_setbgcolor(int color)
8655b6f86   wdenk   * Clean up tools/...
302
  {
39cf48048   Stelian Pop   Add ATMEL LCD driver
303
  	lcd_color_bg = color;
8655b6f86   wdenk   * Clean up tools/...
304
  }
4d03634e5   Nikita Kiryanov   lcd: introduce ge...
305
306
307
308
  int lcd_getbgcolor(void)
  {
  	return lcd_color_bg;
  }
8655b6f86   wdenk   * Clean up tools/...
309
  #ifdef CONFIG_LCD_LOGO
a02e94813   Nikita Kiryanov   lcd: atmel: intro...
310
311
  __weak void lcd_logo_set_cmap(void)
  {
2306457c4   Nikita Kiryanov   lcd: logo: move g...
312
313
314
315
316
  	int i;
  	ushort *cmap = configuration_get_cmap();
  
  	for (i = 0; i < ARRAY_SIZE(bmp_logo_palette); ++i)
  		*cmap++ = bmp_logo_palette[i];
a02e94813   Nikita Kiryanov   lcd: atmel: intro...
317
  }
bf21a5deb   Nikita Kiryanov   lcd: rename bitma...
318
  void lcd_logo_plot(int x, int y)
8655b6f86   wdenk   * Clean up tools/...
319
  {
8655b6f86   wdenk   * Clean up tools/...
320
  	ushort i, j;
c8d2febcc   Nikita Kiryanov   lcd: various clea...
321
  	uchar *bmap = &bmp_logo_bitmap[0];
317461c1d   Andre Renaud   Fix bitmap offset...
322
  	unsigned bpix = NBITS(panel_info.vl_bpix);
c8d2febcc   Nikita Kiryanov   lcd: various clea...
323
324
  	uchar *fb = (uchar *)(lcd_base + y * lcd_line_length + x * bpix / 8);
  	ushort *fb16;
8655b6f86   wdenk   * Clean up tools/...
325

2306457c4   Nikita Kiryanov   lcd: logo: move g...
326
327
328
  	debug("Logo: width %d  height %d  colors %d
  ",
  	      BMP_LOGO_WIDTH, BMP_LOGO_HEIGHT, BMP_LOGO_COLORS);
8655b6f86   wdenk   * Clean up tools/...
329

317461c1d   Andre Renaud   Fix bitmap offset...
330
  	if (bpix < 12) {
8655b6f86   wdenk   * Clean up tools/...
331
  		WATCHDOG_RESET();
a02e94813   Nikita Kiryanov   lcd: atmel: intro...
332
  		lcd_logo_set_cmap();
8655b6f86   wdenk   * Clean up tools/...
333
  		WATCHDOG_RESET();
8f47d917c   Nikita Kiryanov   common lcd: minor...
334
335
  		for (i = 0; i < BMP_LOGO_HEIGHT; ++i) {
  			memcpy(fb, bmap, BMP_LOGO_WIDTH);
8655b6f86   wdenk   * Clean up tools/...
336
  			bmap += BMP_LOGO_WIDTH;
6b035141f   Jeroen Hofstee   common/lcd: cosme...
337
  			fb += panel_info.vl_col;
8655b6f86   wdenk   * Clean up tools/...
338
339
340
  		}
  	}
  	else { /* true color mode */
acb138689   Alessandro Rubini   lcd: make 16bpp work
341
  		u16 col16;
317461c1d   Andre Renaud   Fix bitmap offset...
342
  		fb16 = (ushort *)fb;
8f47d917c   Nikita Kiryanov   common lcd: minor...
343
344
  		for (i = 0; i < BMP_LOGO_HEIGHT; ++i) {
  			for (j = 0; j < BMP_LOGO_WIDTH; j++) {
acb138689   Alessandro Rubini   lcd: make 16bpp work
345
346
347
348
349
  				col16 = bmp_logo_palette[(bmap[j]-16)];
  				fb16[j] =
  					((col16 & 0x000F) << 1) |
  					((col16 & 0x00F0) << 3) |
  					((col16 & 0x0F00) << 4);
8655b6f86   wdenk   * Clean up tools/...
350
351
352
353
354
355
356
  				}
  			bmap += BMP_LOGO_WIDTH;
  			fb16 += panel_info.vl_col;
  		}
  	}
  
  	WATCHDOG_RESET();
9a8efc460   Simon Glass   lcd: Add support ...
357
  	lcd_sync();
8655b6f86   wdenk   * Clean up tools/...
358
  }
2b5cb3d33   Anatolij Gustschin   common/lcd.c: red...
359
  #else
bf21a5deb   Nikita Kiryanov   lcd: rename bitma...
360
  static inline void lcd_logo_plot(int x, int y) {}
8655b6f86   wdenk   * Clean up tools/...
361
  #endif /* CONFIG_LCD_LOGO */
c3517f919   Jon Loeliger   common/* non-cmd*...
362
  #if defined(CONFIG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)
1ca298ced   Matthias Weisser   Added support for...
363
  #ifdef CONFIG_SPLASH_SCREEN_ALIGN
7c7e280aa   Nikita Kiryanov   common lcd: simpl...
364
365
366
367
368
369
370
371
372
373
374
375
376
  
  static void splash_align_axis(int *axis, unsigned long panel_size,
  					unsigned long picture_size)
  {
  	unsigned long panel_picture_delta = panel_size - picture_size;
  	unsigned long axis_alignment;
  
  	if (*axis == BMP_ALIGN_CENTER)
  		axis_alignment = panel_picture_delta / 2;
  	else if (*axis < 0)
  		axis_alignment = panel_picture_delta + *axis + 1;
  	else
  		return;
b41411954   Masahiro Yamada   linux/kernel.h: s...
377
  	*axis = max(0, (int)axis_alignment);
7c7e280aa   Nikita Kiryanov   common lcd: simpl...
378
  }
1ca298ced   Matthias Weisser   Added support for...
379
  #endif
45d7f5251   Tom Wai-Hong Tam   lcd: Implement RL...
380
  #ifdef CONFIG_LCD_BMP_RLE8
45d7f5251   Tom Wai-Hong Tam   lcd: Implement RL...
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
  #define BMP_RLE8_ESCAPE		0
  #define BMP_RLE8_EOL		0
  #define BMP_RLE8_EOBMP		1
  #define BMP_RLE8_DELTA		2
  
  static void draw_unencoded_bitmap(ushort **fbp, uchar *bmap, ushort *cmap,
  				  int cnt)
  {
  	while (cnt > 0) {
  		*(*fbp)++ = cmap[*bmap++];
  		cnt--;
  	}
  }
  
  static void draw_encoded_bitmap(ushort **fbp, ushort c, int cnt)
  {
  	ushort *fb = *fbp;
  	int cnt_8copy = cnt >> 3;
  
  	cnt -= cnt_8copy << 3;
  	while (cnt_8copy > 0) {
  		*fb++ = c;
  		*fb++ = c;
  		*fb++ = c;
  		*fb++ = c;
  		*fb++ = c;
  		*fb++ = c;
  		*fb++ = c;
  		*fb++ = c;
  		cnt_8copy--;
  	}
  	while (cnt > 0) {
  		*fb++ = c;
  		cnt--;
  	}
6b035141f   Jeroen Hofstee   common/lcd: cosme...
416
  	*fbp = fb;
45d7f5251   Tom Wai-Hong Tam   lcd: Implement RL...
417
418
419
  }
  
  /*
6b035141f   Jeroen Hofstee   common/lcd: cosme...
420
   * Do not call this function directly, must be called from lcd_display_bitmap.
45d7f5251   Tom Wai-Hong Tam   lcd: Implement RL...
421
   */
1c3dbe56f   Simon Glass   Remove typedefs f...
422
423
  static void lcd_display_rle8_bitmap(struct bmp_image *bmp, ushort *cmap,
  				    uchar *fb, int x_off, int y_off)
45d7f5251   Tom Wai-Hong Tam   lcd: Implement RL...
424
425
426
427
428
429
  {
  	uchar *bmap;
  	ulong width, height;
  	ulong cnt, runlen;
  	int x, y;
  	int decode = 1;
dca2a1c18   Przemyslaw Marczak   common: lcd.c: fi...
430
431
432
  	width = get_unaligned_le32(&bmp->header.width);
  	height = get_unaligned_le32(&bmp->header.height);
  	bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset);
45d7f5251   Tom Wai-Hong Tam   lcd: Implement RL...
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
  
  	x = 0;
  	y = height - 1;
  
  	while (decode) {
  		if (bmap[0] == BMP_RLE8_ESCAPE) {
  			switch (bmap[1]) {
  			case BMP_RLE8_EOL:
  				/* end of line */
  				bmap += 2;
  				x = 0;
  				y--;
  				/* 16bpix, 2-byte per pixel, width should *2 */
  				fb -= (width * 2 + lcd_line_length);
  				break;
  			case BMP_RLE8_EOBMP:
  				/* end of bitmap */
  				decode = 0;
  				break;
  			case BMP_RLE8_DELTA:
  				/* delta run */
  				x += bmap[2];
  				y -= bmap[3];
  				/* 16bpix, 2-byte per pixel, x should *2 */
  				fb = (uchar *) (lcd_base + (y + y_off - 1)
  					* lcd_line_length + (x + x_off) * 2);
  				bmap += 4;
  				break;
  			default:
  				/* unencoded run */
  				runlen = bmap[1];
  				bmap += 2;
  				if (y < height) {
  					if (x < width) {
  						if (x + runlen > width)
  							cnt = width - x;
  						else
  							cnt = runlen;
  						draw_unencoded_bitmap(
  							(ushort **)&fb,
  							bmap, cmap, cnt);
  					}
  					x += runlen;
  				}
  				bmap += runlen;
  				if (runlen & 1)
  					bmap++;
  			}
  		} else {
  			/* encoded run */
  			if (y < height) {
  				runlen = bmap[0];
  				if (x < width) {
  					/* aggregate the same code */
  					while (bmap[0] == 0xff &&
  					       bmap[2] != BMP_RLE8_ESCAPE &&
  					       bmap[1] == bmap[3]) {
  						runlen += bmap[2];
  						bmap += 2;
  					}
  					if (x + runlen > width)
  						cnt = width - x;
  					else
  						cnt = runlen;
  					draw_encoded_bitmap((ushort **)&fb,
  						cmap[bmap[1]], cnt);
  				}
  				x += runlen;
  			}
  			bmap += 2;
  		}
  	}
  }
  #endif
27fad01b7   Nikita Kiryanov   lcd: mpc8xx: move...
507
508
509
510
  __weak void fb_put_byte(uchar **fb, uchar **from)
  {
  	*(*fb)++ = *(*from)++;
  }
bfdcc65e1   Nikita Kiryanov   common lcd: simpl...
511
512
  
  #if defined(CONFIG_BMP_16BPP)
b3d12e9bc   Nikita Kiryanov   lcd: atmel: move ...
513
  __weak void fb_put_word(uchar **fb, uchar **from)
bfdcc65e1   Nikita Kiryanov   common lcd: simpl...
514
515
516
517
  {
  	*(*fb)++ = *(*from)++;
  	*(*fb)++ = *(*from)++;
  }
bfdcc65e1   Nikita Kiryanov   common lcd: simpl...
518
  #endif /* CONFIG_BMP_16BPP */
1c3dbe56f   Simon Glass   Remove typedefs f...
519
  __weak void lcd_set_cmap(struct bmp_image *bmp, unsigned colors)
0b29a8969   Nikita Kiryanov   lcd: introduce lc...
520
521
  {
  	int i;
1c3dbe56f   Simon Glass   Remove typedefs f...
522
  	struct bmp_color_table_entry cte;
0b29a8969   Nikita Kiryanov   lcd: introduce lc...
523
524
525
526
527
528
529
  	ushort *cmap = configuration_get_cmap();
  
  	for (i = 0; i < colors; ++i) {
  		cte = bmp->color_table[i];
  		*cmap = (((cte.red)   << 8) & 0xf800) |
  			(((cte.green) << 3) & 0x07e0) |
  			(((cte.blue)  >> 3) & 0x001f);
0b29a8969   Nikita Kiryanov   lcd: introduce lc...
530
  		cmap++;
0b29a8969   Nikita Kiryanov   lcd: introduce lc...
531
532
  	}
  }
8655b6f86   wdenk   * Clean up tools/...
533
534
  int lcd_display_bitmap(ulong bmp_image, int x, int y)
  {
00cc5595a   Anatolij Gustschin   lcd: Fix compilat...
535
  	ushort *cmap_base = NULL;
8655b6f86   wdenk   * Clean up tools/...
536
537
  	ushort i, j;
  	uchar *fb;
1c3dbe56f   Simon Glass   Remove typedefs f...
538
  	struct bmp_image *bmp = (struct bmp_image *)map_sysmem(bmp_image, 0);
8655b6f86   wdenk   * Clean up tools/...
539
  	uchar *bmap;
fecac46cf   Tom Wai-Hong Tam   lcd: Fix BMP deco...
540
  	ushort padded_width;
b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
541
  	unsigned long width, height, byte_width;
e8143e72e   Wolfgang Denk   Add splashscreen ...
542
  	unsigned long pwidth = panel_info.vl_col;
b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
543
  	unsigned colors, bpix, bmp_bpix;
8d379f179   Simon Glass   lcd: Support colo...
544
  	int hdr_size;
021414a33   xypron.glpk@gmx.de   lcd: avoid possib...
545
  	struct bmp_color_table_entry *palette;
8655b6f86   wdenk   * Clean up tools/...
546

6b035141f   Jeroen Hofstee   common/lcd: cosme...
547
548
  	if (!bmp || !(bmp->header.signature[0] == 'B' &&
  		bmp->header.signature[1] == 'M')) {
8f47d917c   Nikita Kiryanov   common lcd: minor...
549
550
  		printf("Error: no valid bmp image at %lx
  ", bmp_image);
8655b6f86   wdenk   * Clean up tools/...
551
  		return 1;
b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
552
  	}
8655b6f86   wdenk   * Clean up tools/...
553

021414a33   xypron.glpk@gmx.de   lcd: avoid possib...
554
  	palette = bmp->color_table;
dca2a1c18   Przemyslaw Marczak   common: lcd.c: fi...
555
556
557
  	width = get_unaligned_le32(&bmp->header.width);
  	height = get_unaligned_le32(&bmp->header.height);
  	bmp_bpix = get_unaligned_le16(&bmp->header.bit_count);
8d379f179   Simon Glass   lcd: Support colo...
558
559
560
  	hdr_size = get_unaligned_le16(&bmp->header.size);
  	debug("hdr_size=%d, bmp_bpix=%d
  ", hdr_size, bmp_bpix);
dca2a1c18   Przemyslaw Marczak   common: lcd.c: fi...
561

b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
562
  	colors = 1 << bmp_bpix;
8655b6f86   wdenk   * Clean up tools/...
563
564
  
  	bpix = NBITS(panel_info.vl_bpix);
6b035141f   Jeroen Hofstee   common/lcd: cosme...
565
  	if (bpix != 1 && bpix != 8 && bpix != 16 && bpix != 32) {
b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
566
567
568
  		printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel
  ",
  			bpix, bmp_bpix);
8f47d917c   Nikita Kiryanov   common lcd: minor...
569

8655b6f86   wdenk   * Clean up tools/...
570
571
  		return 1;
  	}
a305fb155   Hannes Petermaier   lcd: support disp...
572
573
574
575
576
577
578
  	/*
  	 * We support displaying 8bpp BMPs on 16bpp LCDs
  	 * and displaying 24bpp BMPs on 32bpp LCDs
  	 * */
  	if (bpix != bmp_bpix &&
  	    !(bmp_bpix == 8 && bpix == 16) &&
  	    !(bmp_bpix == 24 && bpix == 32)) {
8655b6f86   wdenk   * Clean up tools/...
579
580
  		printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel
  ",
dca2a1c18   Przemyslaw Marczak   common: lcd.c: fi...
581
  			bpix, get_unaligned_le16(&bmp->header.bit_count));
8655b6f86   wdenk   * Clean up tools/...
582
583
  		return 1;
  	}
8d379f179   Simon Glass   lcd: Support colo...
584
585
586
  	debug("Display-bmp: %d x %d  with %d colors, display %d
  ",
  	      (int)width, (int)height, (int)colors, 1 << bpix);
8655b6f86   wdenk   * Clean up tools/...
587

0b29a8969   Nikita Kiryanov   lcd: introduce lc...
588
589
  	if (bmp_bpix == 8)
  		lcd_set_cmap(bmp, colors);
e8143e72e   Wolfgang Denk   Add splashscreen ...
590

6b035141f   Jeroen Hofstee   common/lcd: cosme...
591
  	padded_width = (width & 0x3 ? (width & ~0x3) + 4 : width);
1ca298ced   Matthias Weisser   Added support for...
592
593
  
  #ifdef CONFIG_SPLASH_SCREEN_ALIGN
7c7e280aa   Nikita Kiryanov   common lcd: simpl...
594
595
  	splash_align_axis(&x, pwidth, width);
  	splash_align_axis(&y, panel_info.vl_row, height);
1ca298ced   Matthias Weisser   Added support for...
596
  #endif /* CONFIG_SPLASH_SCREEN_ALIGN */
8f47d917c   Nikita Kiryanov   common lcd: minor...
597
  	if ((x + width) > pwidth)
e8143e72e   Wolfgang Denk   Add splashscreen ...
598
  		width = pwidth - x;
8f47d917c   Nikita Kiryanov   common lcd: minor...
599
  	if ((y + height) > panel_info.vl_row)
8655b6f86   wdenk   * Clean up tools/...
600
  		height = panel_info.vl_row - y;
dca2a1c18   Przemyslaw Marczak   common: lcd.c: fi...
601
602
  	bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset);
  	fb   = (uchar *)(lcd_base +
8d46d5b18   Liu Ying   lcd: align fb wri...
603
  		(y + height - 1) * lcd_line_length + x * bpix / 8);
a303dfb0e   Mark Jackson   Add 16bpp BMP sup...
604

b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
605
  	switch (bmp_bpix) {
c8d2febcc   Nikita Kiryanov   lcd: various clea...
606
  	case 1:
0156444cf   Simon Glass   lcd: Fix build er...
607
  	case 8: {
0b29a8969   Nikita Kiryanov   lcd: introduce lc...
608
  		cmap_base = configuration_get_cmap();
45d7f5251   Tom Wai-Hong Tam   lcd: Implement RL...
609
  #ifdef CONFIG_LCD_BMP_RLE8
dca2a1c18   Przemyslaw Marczak   common: lcd.c: fi...
610
  		u32 compression = get_unaligned_le32(&bmp->header.compression);
8d379f179   Simon Glass   lcd: Support colo...
611
612
  		debug("compressed %d %d
  ", compression, BMP_BI_RLE8);
dca2a1c18   Przemyslaw Marczak   common: lcd.c: fi...
613
  		if (compression == BMP_BI_RLE8) {
45d7f5251   Tom Wai-Hong Tam   lcd: Implement RL...
614
615
616
617
618
619
620
621
622
  			if (bpix != 16) {
  				/* TODO implement render code for bpix != 16 */
  				printf("Error: only support 16 bpix");
  				return 1;
  			}
  			lcd_display_rle8_bitmap(bmp, cmap_base, fb, x, y);
  			break;
  		}
  #endif
b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
623
624
625
626
  		if (bpix != 16)
  			byte_width = width;
  		else
  			byte_width = width * 2;
a303dfb0e   Mark Jackson   Add 16bpp BMP sup...
627
628
  		for (i = 0; i < height; ++i) {
  			WATCHDOG_RESET();
b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
629
630
  			for (j = 0; j < width; j++) {
  				if (bpix != 16) {
27fad01b7   Nikita Kiryanov   lcd: mpc8xx: move...
631
  					fb_put_byte(&fb, &bmap);
b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
632
  				} else {
8d379f179   Simon Glass   lcd: Support colo...
633
634
635
636
637
638
639
640
641
642
643
644
645
  					struct bmp_color_table_entry *entry;
  					uint val;
  
  					if (cmap_base) {
  						val = cmap_base[*bmap];
  					} else {
  						entry = &palette[*bmap];
  						val = entry->blue >> 3 |
  							entry->green >> 2 << 5 |
  							entry->red >> 3 << 11;
  					}
  					*(uint16_t *)fb = val;
  					bmap++;
b245e65ee   Guennadi Liakhovetski   LCD: support 8bpp...
646
647
648
  					fb += sizeof(uint16_t) / sizeof(*fb);
  				}
  			}
fecac46cf   Tom Wai-Hong Tam   lcd: Fix BMP deco...
649
  			bmap += (padded_width - width);
6b035141f   Jeroen Hofstee   common/lcd: cosme...
650
  			fb -= byte_width + lcd_line_length;
a303dfb0e   Mark Jackson   Add 16bpp BMP sup...
651
652
  		}
  		break;
0156444cf   Simon Glass   lcd: Fix build er...
653
  	}
a303dfb0e   Mark Jackson   Add 16bpp BMP sup...
654
655
656
657
  #if defined(CONFIG_BMP_16BPP)
  	case 16:
  		for (i = 0; i < height; ++i) {
  			WATCHDOG_RESET();
bfdcc65e1   Nikita Kiryanov   common lcd: simpl...
658
659
  			for (j = 0; j < width; j++)
  				fb_put_word(&fb, &bmap);
fecac46cf   Tom Wai-Hong Tam   lcd: Fix BMP deco...
660
  			bmap += (padded_width - width) * 2;
6b035141f   Jeroen Hofstee   common/lcd: cosme...
661
  			fb -= width * 2 + lcd_line_length;
a303dfb0e   Mark Jackson   Add 16bpp BMP sup...
662
663
664
  		}
  		break;
  #endif /* CONFIG_BMP_16BPP */
10ba6b333   Philipp Tomsich   video: bmp: renam...
665
  #if defined(CONFIG_BMP_24BPP)
a305fb155   Hannes Petermaier   lcd: support disp...
666
667
668
669
670
671
672
673
674
675
676
  	case 24:
  		for (i = 0; i < height; ++i) {
  			for (j = 0; j < width; j++) {
  				*(fb++) = *(bmap++);
  				*(fb++) = *(bmap++);
  				*(fb++) = *(bmap++);
  				*(fb++) = 0;
  			}
  			fb -= lcd_line_length + width * (bpix / 8);
  		}
  		break;
10ba6b333   Philipp Tomsich   video: bmp: renam...
677
  #endif /* CONFIG_BMP_24BPP */
fb6a9aab7   Donghwa Lee   LCD: display 32bp...
678
679
680
681
682
683
684
685
686
  #if defined(CONFIG_BMP_32BPP)
  	case 32:
  		for (i = 0; i < height; ++i) {
  			for (j = 0; j < width; j++) {
  				*(fb++) = *(bmap++);
  				*(fb++) = *(bmap++);
  				*(fb++) = *(bmap++);
  				*(fb++) = *(bmap++);
  			}
6b035141f   Jeroen Hofstee   common/lcd: cosme...
687
  			fb -= lcd_line_length + width * (bpix / 8);
fb6a9aab7   Donghwa Lee   LCD: display 32bp...
688
689
690
  		}
  		break;
  #endif /* CONFIG_BMP_32BPP */
a303dfb0e   Mark Jackson   Add 16bpp BMP sup...
691
692
693
  	default:
  		break;
  	};
8655b6f86   wdenk   * Clean up tools/...
694

9a8efc460   Simon Glass   lcd: Add support ...
695
  	lcd_sync();
8f47d917c   Nikita Kiryanov   common lcd: minor...
696
  	return 0;
8655b6f86   wdenk   * Clean up tools/...
697
  }
c3517f919   Jon Loeliger   common/* non-cmd*...
698
  #endif
8655b6f86   wdenk   * Clean up tools/...
699

7bf71d1f5   Nikita Kiryanov   lcd: split splash...
700
  static void lcd_logo(void)
8655b6f86   wdenk   * Clean up tools/...
701
  {
bf21a5deb   Nikita Kiryanov   lcd: rename bitma...
702
  	lcd_logo_plot(0, 0);
8655b6f86   wdenk   * Clean up tools/...
703

6b59e03e0   Haavard Skinnemoen   lcd: Let the boar...
704
  #ifdef CONFIG_LCD_INFO
140beb943   Nikita Kiryanov   lcd: expand conso...
705
706
  	lcd_set_col(LCD_INFO_X / VIDEO_FONT_WIDTH);
  	lcd_set_row(LCD_INFO_Y / VIDEO_FONT_HEIGHT);
6b59e03e0   Haavard Skinnemoen   lcd: Let the boar...
707
708
  	lcd_show_board_info();
  #endif /* CONFIG_LCD_INFO */
8655b6f86   wdenk   * Clean up tools/...
709
  }
c08804853   Nikita Kiryanov   lcd: implement a ...
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
  #ifdef CONFIG_SPLASHIMAGE_GUARD
  static int on_splashimage(const char *name, const char *value, enum env_op op,
  	int flags)
  {
  	ulong addr;
  	int aligned;
  
  	if (op == env_op_delete)
  		return 0;
  
  	addr = simple_strtoul(value, NULL, 16);
  	/* See README.displaying-bmps */
  	aligned = (addr % 4 == 2);
  	if (!aligned) {
  		printf("Invalid splashimage value. Value must be 16 bit aligned, but not 32 bit aligned
  ");
  		return -1;
  	}
  
  	return 0;
  }
  
  U_BOOT_ENV_CALLBACK(splashimage, on_splashimage);
  #endif
395166cff   Vadim Bendebury   lcd: Provide an A...
734
735
736
737
738
739
740
741
742
  int lcd_get_pixel_width(void)
  {
  	return panel_info.vl_col;
  }
  
  int lcd_get_pixel_height(void)
  {
  	return panel_info.vl_row;
  }