Blame view

common/cmd_bmp.c 5.29 KB
059ae173e   wdenk   Add files needed ...
1
2
  /*
   * (C) Copyright 2002
b37c7e5e5   wdenk   * Patch by Seb Ja...
3
   * Detlev Zundel, DENX Software Engineering, dzu@denx.de.
059ae173e   wdenk   Add files needed ...
4
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
059ae173e   wdenk   Add files needed ...
6
7
8
9
10
11
12
   */
  
  /*
   * BMP handling routines
   */
  
  #include <common.h>
6111722a9   Alessandro Rubini   video: move exter...
13
  #include <lcd.h>
059ae173e   wdenk   Add files needed ...
14
15
  #include <bmp_layout.h>
  #include <command.h>
8655b6f86   wdenk   * Clean up tools/...
16
  #include <asm/byteorder.h>
c29ab9d71   Stefan Roese   Fix gzip bmp supp...
17
  #include <malloc.h>
ff8fb56b6   Anatolij Gustschin   video: consolidat...
18
  #include <splash.h>
f674f7cfc   Stefan Reinauer   video: Provide an...
19
  #include <video.h>
059ae173e   wdenk   Add files needed ...
20

059ae173e   wdenk   Add files needed ...
21
  static int bmp_info (ulong addr);
059ae173e   wdenk   Add files needed ...
22
23
  
  /*
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
24
25
   * Allocate and decompress a BMP image using gunzip().
   *
f7ef9d610   Piotr Wilczek   lcd: align bmp he...
26
27
28
29
30
31
   * Returns a pointer to the decompressed image data. This pointer is
   * aligned to 32-bit-aligned-address + 2.
   * See doc/README.displaying-bmps for explanation.
   *
   * The allocation address is passed to 'alloc_addr' and must be freed
   * by the caller after use.
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
32
33
34
35
36
   *
   * Returns NULL if decompression failed, or if the decompressed data
   * didn't contain a valid BMP signature.
   */
  #ifdef CONFIG_VIDEO_BMP_GZIP
f7ef9d610   Piotr Wilczek   lcd: align bmp he...
37
38
  bmp_image_t *gunzip_bmp(unsigned long addr, unsigned long *lenp,
  			void **alloc_addr)
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
39
40
41
42
43
44
45
46
  {
  	void *dst;
  	unsigned long len;
  	bmp_image_t *bmp;
  
  	/*
  	 * Decompress bmp image
  	 */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
47
  	len = CONFIG_SYS_VIDEO_LOGO_MAX_SIZE;
f7ef9d610   Piotr Wilczek   lcd: align bmp he...
48
49
  	/* allocate extra 3 bytes for 32-bit-aligned-address + 2 alignment */
  	dst = malloc(CONFIG_SYS_VIDEO_LOGO_MAX_SIZE + 3);
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
50
51
52
53
54
  	if (dst == NULL) {
  		puts("Error: malloc in gunzip failed!
  ");
  		return NULL;
  	}
f7ef9d610   Piotr Wilczek   lcd: align bmp he...
55
56
57
58
59
60
61
  
  	bmp = dst;
  
  	/* align to 32-bit-aligned-address + 2 */
  	bmp = (bmp_image_t *)((((unsigned int)dst + 1) & ~3) + 2);
  
  	if (gunzip(bmp, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE, (uchar *)addr, &len) != 0) {
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
62
63
64
  		free(dst);
  		return NULL;
  	}
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
65
  	if (len == CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
66
  		puts("Image could be truncated"
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
67
68
  				" (increase CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)!
  ");
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
69

43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
70
71
72
73
74
75
76
77
  	/*
  	 * Check for bmp mark 'BM'
  	 */
  	if (!((bmp->header.signature[0] == 'B') &&
  	      (bmp->header.signature[1] == 'M'))) {
  		free(dst);
  		return NULL;
  	}
17f79e45e   Wolfgang Denk   cmd_bmp.c: messag...
78
79
  	debug("Gzipped BMP image detected!
  ");
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
80

f7ef9d610   Piotr Wilczek   lcd: align bmp he...
81
  	*alloc_addr = dst;
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
82
83
84
  	return bmp;
  }
  #else
f7ef9d610   Piotr Wilczek   lcd: align bmp he...
85
86
  bmp_image_t *gunzip_bmp(unsigned long addr, unsigned long *lenp,
  			void **alloc_addr)
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
87
88
89
90
  {
  	return NULL;
  }
  #endif
54841ab50   Wolfgang Denk   Make sure that ar...
91
  static int do_bmp_info(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
92
93
  {
  	ulong addr;
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
94

9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
95
96
97
98
99
100
101
102
  	switch (argc) {
  	case 1:		/* use load_addr as default address */
  		addr = load_addr;
  		break;
  	case 2:		/* use argument */
  		addr = simple_strtoul(argv[1], NULL, 16);
  		break;
  	default:
4c12eeb8b   Simon Glass   Convert cmd_usage...
103
  		return CMD_RET_USAGE;
9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
104
105
106
107
  	}
  
  	return (bmp_info(addr));
  }
54841ab50   Wolfgang Denk   Make sure that ar...
108
  static int do_bmp_display(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
059ae173e   wdenk   Add files needed ...
109
110
  {
  	ulong addr;
4b248f3f7   wdenk   * Patch by Pierr...
111
  	int x = 0, y = 0;
059ae173e   wdenk   Add files needed ...
112

ff8fb56b6   Anatolij Gustschin   video: consolidat...
113
  	splash_get_pos(&x, &y);
059ae173e   wdenk   Add files needed ...
114
  	switch (argc) {
9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
115
  	case 1:		/* use load_addr as default address */
059ae173e   wdenk   Add files needed ...
116
117
  		addr = load_addr;
  		break;
9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
118
119
  	case 2:		/* use argument */
  		addr = simple_strtoul(argv[1], NULL, 16);
059ae173e   wdenk   Add files needed ...
120
  		break;
9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
121
122
  	case 4:
  		addr = simple_strtoul(argv[1], NULL, 16);
93e145964   Wolfgang Denk   Coding Style clea...
123
124
125
  		x = simple_strtoul(argv[2], NULL, 10);
  		y = simple_strtoul(argv[3], NULL, 10);
  		break;
059ae173e   wdenk   Add files needed ...
126
  	default:
4c12eeb8b   Simon Glass   Convert cmd_usage...
127
  		return CMD_RET_USAGE;
059ae173e   wdenk   Add files needed ...
128
  	}
9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
129
130
131
132
133
134
135
  	 return (bmp_display(addr, x, y));
  }
  
  static cmd_tbl_t cmd_bmp_sub[] = {
  	U_BOOT_CMD_MKENT(info, 3, 0, do_bmp_info, "", ""),
  	U_BOOT_CMD_MKENT(display, 5, 0, do_bmp_display, "", ""),
  };
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
136
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
f1d2b313c   Heiko Schocher   ARM: add relocati...
137
138
139
140
  void bmp_reloc(void) {
  	fixup_cmdtable(cmd_bmp_sub, ARRAY_SIZE(cmd_bmp_sub));
  }
  #endif
9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
141
142
143
144
145
146
147
148
149
150
  /*
   * Subroutine:  do_bmp
   *
   * Description: Handler for 'bmp' command..
   *
   * Inputs:	argv[1] contains the subcommand
   *
   * Return:      None
   *
   */
54841ab50   Wolfgang Denk   Make sure that ar...
151
  static int do_bmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
152
153
154
155
156
157
158
159
  {
  	cmd_tbl_t *c;
  
  	/* Strip off leading 'bmp' command argument */
  	argc--;
  	argv++;
  
  	c = find_cmd_tbl(argv[0], &cmd_bmp_sub[0], ARRAY_SIZE(cmd_bmp_sub));
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
160
  	if (c)
9acd4f0e9   Frans Meulenbroeks   cmd_bmp.c: add st...
161
  		return  c->cmd(cmdtp, flag, argc, argv);
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
162
  	else
4c12eeb8b   Simon Glass   Convert cmd_usage...
163
  		return CMD_RET_USAGE;
059ae173e   wdenk   Add files needed ...
164
  }
0d4983930   wdenk   Patch by Kenneth ...
165
  U_BOOT_CMD(
4b248f3f7   wdenk   * Patch by Pierr...
166
  	bmp,	5,	1,	do_bmp,
2fb2604d5   Peter Tyser   Command usage cle...
167
  	"manipulate BMP image data",
4b248f3f7   wdenk   * Patch by Pierr...
168
169
  	"info <imageAddr>          - display image info
  "
a89c33db9   Wolfgang Denk   General help mess...
170
  	"bmp display <imageAddr> [x y] - display image at x,y"
b0fce99bf   wdenk   Fix some missing ...
171
  );
059ae173e   wdenk   Add files needed ...
172
173
174
175
176
177
178
179
180
181
182
183
184
  /*
   * Subroutine:  bmp_info
   *
   * Description: Show information about bmp file in memory
   *
   * Inputs:	addr		address of the bmp file
   *
   * Return:      None
   *
   */
  static int bmp_info(ulong addr)
  {
  	bmp_image_t *bmp=(bmp_image_t *)addr;
f7ef9d610   Piotr Wilczek   lcd: align bmp he...
185
  	void *bmp_alloc_addr = NULL;
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
186
  	unsigned long len;
c29ab9d71   Stefan Roese   Fix gzip bmp supp...
187

059ae173e   wdenk   Add files needed ...
188
  	if (!((bmp->header.signature[0]=='B') &&
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
189
  	      (bmp->header.signature[1]=='M')))
f7ef9d610   Piotr Wilczek   lcd: align bmp he...
190
  		bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr);
c29ab9d71   Stefan Roese   Fix gzip bmp supp...
191

43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
192
  	if (bmp == NULL) {
059ae173e   wdenk   Add files needed ...
193
194
  		printf("There is no valid bmp file at the given address
  ");
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
195
  		return 1;
059ae173e   wdenk   Add files needed ...
196
  	}
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
197

059ae173e   wdenk   Add files needed ...
198
199
200
201
202
203
204
  	printf("Image size    : %d x %d
  ", le32_to_cpu(bmp->header.width),
  	       le32_to_cpu(bmp->header.height));
  	printf("Bits per pixel: %d
  ", le16_to_cpu(bmp->header.bit_count));
  	printf("Compression   : %d
  ", le32_to_cpu(bmp->header.compression));
c29ab9d71   Stefan Roese   Fix gzip bmp supp...
205

f7ef9d610   Piotr Wilczek   lcd: align bmp he...
206
207
  	if (bmp_alloc_addr)
  		free(bmp_alloc_addr);
c29ab9d71   Stefan Roese   Fix gzip bmp supp...
208

059ae173e   wdenk   Add files needed ...
209
210
211
212
213
214
215
216
217
218
219
220
221
  	return(0);
  }
  
  /*
   * Subroutine:  bmp_display
   *
   * Description: Display bmp file located in memory
   *
   * Inputs:	addr		address of the bmp file
   *
   * Return:      None
   *
   */
de3b49c4d   Anatolij Gustschin   cmd_bmp.c: make b...
222
  int bmp_display(ulong addr, int x, int y)
059ae173e   wdenk   Add files needed ...
223
  {
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
224
225
  	int ret;
  	bmp_image_t *bmp = (bmp_image_t *)addr;
f7ef9d610   Piotr Wilczek   lcd: align bmp he...
226
  	void *bmp_alloc_addr = NULL;
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
227
228
229
230
  	unsigned long len;
  
  	if (!((bmp->header.signature[0]=='B') &&
  	      (bmp->header.signature[1]=='M')))
f7ef9d610   Piotr Wilczek   lcd: align bmp he...
231
  		bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr);
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
232
233
234
235
236
237
  
  	if (!bmp) {
  		printf("There is no valid bmp file at the given address
  ");
  		return 1;
  	}
281e00a3b   wdenk   * Code cleanup
238
  #if defined(CONFIG_LCD)
02110903a   Che-Liang Chiou   lcd: add clear an...
239
  	ret = lcd_display_bitmap((ulong)bmp, x, y);
281e00a3b   wdenk   * Code cleanup
240
  #elif defined(CONFIG_VIDEO)
f674f7cfc   Stefan Reinauer   video: Provide an...
241
  	ret = video_display_bitmap((unsigned long)bmp, x, y);
281e00a3b   wdenk   * Code cleanup
242
243
  #else
  # error bmp_display() requires CONFIG_LCD or CONFIG_VIDEO
4b248f3f7   wdenk   * Patch by Pierr...
244
  #endif
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
245

f7ef9d610   Piotr Wilczek   lcd: align bmp he...
246
247
  	if (bmp_alloc_addr)
  		free(bmp_alloc_addr);
43ef1c381   Hans-Christian Egtvedt   cmd_bmp: Add supp...
248
249
  
  	return ret;
059ae173e   wdenk   Add files needed ...
250
  }