]> Git Repo - J-u-boot.git/blame - cmd/bmp.c
common: Drop init.h from common header
[J-u-boot.git] / cmd / bmp.c
CommitLineData
83d290c5 1// SPDX-License-Identifier: GPL-2.0+
059ae173
WD
2/*
3 * (C) Copyright 2002
b37c7e5e 4 * Detlev Zundel, DENX Software Engineering, [email protected].
059ae173
WD
5 */
6
7/*
8 * BMP handling routines
9 */
10
11#include <common.h>
12#include <bmp_layout.h>
13#include <command.h>
0c670fc1
SG
14#include <dm.h>
15#include <gzip.h>
8e8ccfe1 16#include <image.h>
0c670fc1 17#include <lcd.h>
c29ab9d7 18#include <malloc.h>
72b335e9 19#include <mapmem.h>
ff8fb56b 20#include <splash.h>
f674f7cf 21#include <video.h>
0c670fc1 22#include <asm/byteorder.h>
059ae173 23
059ae173 24static int bmp_info (ulong addr);
059ae173 25
43ef1c38
HCE
26/*
27 * Allocate and decompress a BMP image using gunzip().
28 *
f7ef9d61
PW
29 * Returns a pointer to the decompressed image data. This pointer is
30 * aligned to 32-bit-aligned-address + 2.
31 * See doc/README.displaying-bmps for explanation.
32 *
33 * The allocation address is passed to 'alloc_addr' and must be freed
34 * by the caller after use.
43ef1c38
HCE
35 *
36 * Returns NULL if decompression failed, or if the decompressed data
37 * didn't contain a valid BMP signature.
38 */
39#ifdef CONFIG_VIDEO_BMP_GZIP
1c3dbe56
SG
40struct bmp_image *gunzip_bmp(unsigned long addr, unsigned long *lenp,
41 void **alloc_addr)
43ef1c38
HCE
42{
43 void *dst;
44 unsigned long len;
1c3dbe56 45 struct bmp_image *bmp;
43ef1c38
HCE
46
47 /*
48 * Decompress bmp image
49 */
6d0f6bcf 50 len = CONFIG_SYS_VIDEO_LOGO_MAX_SIZE;
f7ef9d61
PW
51 /* allocate extra 3 bytes for 32-bit-aligned-address + 2 alignment */
52 dst = malloc(CONFIG_SYS_VIDEO_LOGO_MAX_SIZE + 3);
43ef1c38
HCE
53 if (dst == NULL) {
54 puts("Error: malloc in gunzip failed!\n");
55 return NULL;
56 }
f7ef9d61
PW
57
58 bmp = dst;
59
60 /* align to 32-bit-aligned-address + 2 */
77195216 61 bmp = (struct bmp_image *)((((uintptr_t)dst + 1) & ~3) + 2);
f7ef9d61 62
72b335e9
SG
63 if (gunzip(bmp, CONFIG_SYS_VIDEO_LOGO_MAX_SIZE, map_sysmem(addr, 0),
64 &len) != 0) {
43ef1c38
HCE
65 free(dst);
66 return NULL;
67 }
6d0f6bcf 68 if (len == CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)
43ef1c38 69 puts("Image could be truncated"
6d0f6bcf 70 " (increase CONFIG_SYS_VIDEO_LOGO_MAX_SIZE)!\n");
43ef1c38 71
43ef1c38
HCE
72 /*
73 * Check for bmp mark 'BM'
74 */
75 if (!((bmp->header.signature[0] == 'B') &&
76 (bmp->header.signature[1] == 'M'))) {
77 free(dst);
78 return NULL;
79 }
80
17f79e45 81 debug("Gzipped BMP image detected!\n");
43ef1c38 82
f7ef9d61 83 *alloc_addr = dst;
43ef1c38
HCE
84 return bmp;
85}
86#else
1c3dbe56
SG
87struct bmp_image *gunzip_bmp(unsigned long addr, unsigned long *lenp,
88 void **alloc_addr)
43ef1c38
HCE
89{
90 return NULL;
91}
92#endif
93
54841ab5 94static int do_bmp_info(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
9acd4f0e
FM
95{
96 ulong addr;
43ef1c38 97
9acd4f0e 98 switch (argc) {
bb872dd9
SG
99 case 1: /* use image_load_addr as default address */
100 addr = image_load_addr;
9acd4f0e
FM
101 break;
102 case 2: /* use argument */
103 addr = simple_strtoul(argv[1], NULL, 16);
104 break;
105 default:
4c12eeb8 106 return CMD_RET_USAGE;
9acd4f0e
FM
107 }
108
109 return (bmp_info(addr));
110}
111
54841ab5 112static int do_bmp_display(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
059ae173
WD
113{
114 ulong addr;
4b248f3f 115 int x = 0, y = 0;
059ae173 116
ff8fb56b
AG
117 splash_get_pos(&x, &y);
118
059ae173 119 switch (argc) {
bb872dd9
SG
120 case 1: /* use image_load_addr as default address */
121 addr = image_load_addr;
059ae173 122 break;
9acd4f0e
FM
123 case 2: /* use argument */
124 addr = simple_strtoul(argv[1], NULL, 16);
059ae173 125 break;
9acd4f0e
FM
126 case 4:
127 addr = simple_strtoul(argv[1], NULL, 16);
b0fcedb7
PD
128 if (!strcmp(argv[2], "m"))
129 x = BMP_ALIGN_CENTER;
130 else
131 x = simple_strtoul(argv[2], NULL, 10);
132 if (!strcmp(argv[3], "m"))
133 y = BMP_ALIGN_CENTER;
134 else
135 y = simple_strtoul(argv[3], NULL, 10);
93e14596 136 break;
059ae173 137 default:
4c12eeb8 138 return CMD_RET_USAGE;
059ae173
WD
139 }
140
9acd4f0e
FM
141 return (bmp_display(addr, x, y));
142}
143
144static cmd_tbl_t cmd_bmp_sub[] = {
145 U_BOOT_CMD_MKENT(info, 3, 0, do_bmp_info, "", ""),
146 U_BOOT_CMD_MKENT(display, 5, 0, do_bmp_display, "", ""),
147};
148
2e5167cc 149#ifdef CONFIG_NEEDS_MANUAL_RELOC
f1d2b313
HS
150void bmp_reloc(void) {
151 fixup_cmdtable(cmd_bmp_sub, ARRAY_SIZE(cmd_bmp_sub));
152}
153#endif
154
9acd4f0e
FM
155/*
156 * Subroutine: do_bmp
157 *
158 * Description: Handler for 'bmp' command..
159 *
160 * Inputs: argv[1] contains the subcommand
161 *
162 * Return: None
163 *
164 */
54841ab5 165static int do_bmp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
9acd4f0e
FM
166{
167 cmd_tbl_t *c;
168
169 /* Strip off leading 'bmp' command argument */
170 argc--;
171 argv++;
172
173 c = find_cmd_tbl(argv[0], &cmd_bmp_sub[0], ARRAY_SIZE(cmd_bmp_sub));
174
47e26b1b 175 if (c)
9acd4f0e 176 return c->cmd(cmdtp, flag, argc, argv);
47e26b1b 177 else
4c12eeb8 178 return CMD_RET_USAGE;
059ae173
WD
179}
180
0d498393 181U_BOOT_CMD(
4b248f3f 182 bmp, 5, 1, do_bmp,
2fb2604d 183 "manipulate BMP image data",
4b248f3f 184 "info <imageAddr> - display image info\n"
a89c33db 185 "bmp display <imageAddr> [x y] - display image at x,y"
b0fce99b
WD
186);
187
059ae173
WD
188/*
189 * Subroutine: bmp_info
190 *
191 * Description: Show information about bmp file in memory
192 *
193 * Inputs: addr address of the bmp file
194 *
195 * Return: None
196 *
197 */
198static int bmp_info(ulong addr)
199{
72b335e9 200 struct bmp_image *bmp = (struct bmp_image *)map_sysmem(addr, 0);
f7ef9d61 201 void *bmp_alloc_addr = NULL;
43ef1c38 202 unsigned long len;
c29ab9d7 203
059ae173 204 if (!((bmp->header.signature[0]=='B') &&
43ef1c38 205 (bmp->header.signature[1]=='M')))
f7ef9d61 206 bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr);
c29ab9d7 207
43ef1c38 208 if (bmp == NULL) {
059ae173 209 printf("There is no valid bmp file at the given address\n");
43ef1c38 210 return 1;
059ae173 211 }
43ef1c38 212
059ae173
WD
213 printf("Image size : %d x %d\n", le32_to_cpu(bmp->header.width),
214 le32_to_cpu(bmp->header.height));
215 printf("Bits per pixel: %d\n", le16_to_cpu(bmp->header.bit_count));
216 printf("Compression : %d\n", le32_to_cpu(bmp->header.compression));
c29ab9d7 217
f7ef9d61
PW
218 if (bmp_alloc_addr)
219 free(bmp_alloc_addr);
c29ab9d7 220
059ae173
WD
221 return(0);
222}
223
224/*
225 * Subroutine: bmp_display
226 *
227 * Description: Display bmp file located in memory
228 *
229 * Inputs: addr address of the bmp file
230 *
231 * Return: None
232 *
233 */
de3b49c4 234int bmp_display(ulong addr, int x, int y)
059ae173 235{
b01c7923
SG
236#ifdef CONFIG_DM_VIDEO
237 struct udevice *dev;
238#endif
43ef1c38 239 int ret;
72b335e9 240 struct bmp_image *bmp = map_sysmem(addr, 0);
f7ef9d61 241 void *bmp_alloc_addr = NULL;
43ef1c38
HCE
242 unsigned long len;
243
244 if (!((bmp->header.signature[0]=='B') &&
245 (bmp->header.signature[1]=='M')))
f7ef9d61 246 bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr);
43ef1c38
HCE
247
248 if (!bmp) {
249 printf("There is no valid bmp file at the given address\n");
250 return 1;
251 }
72b335e9 252 addr = map_to_sysmem(bmp);
43ef1c38 253
b01c7923 254#ifdef CONFIG_DM_VIDEO
3f603cbb 255 ret = uclass_first_device_err(UCLASS_VIDEO, &dev);
b01c7923 256 if (!ret) {
3f603cbb 257 bool align = false;
b01c7923 258
b0fcedb7
PD
259 if (CONFIG_IS_ENABLED(SPLASH_SCREEN_ALIGN) ||
260 x == BMP_ALIGN_CENTER ||
261 y == BMP_ALIGN_CENTER)
262 align = true;
263
3f603cbb 264 ret = video_bmp_display(dev, addr, x, y, align);
b01c7923 265 }
b01c7923 266#elif defined(CONFIG_LCD)
72b335e9 267 ret = lcd_display_bitmap(addr, x, y);
281e00a3 268#elif defined(CONFIG_VIDEO)
72b335e9 269 ret = video_display_bitmap(addr, x, y);
281e00a3
WD
270#else
271# error bmp_display() requires CONFIG_LCD or CONFIG_VIDEO
4b248f3f 272#endif
43ef1c38 273
f7ef9d61
PW
274 if (bmp_alloc_addr)
275 free(bmp_alloc_addr);
43ef1c38 276
e517db73 277 return ret ? CMD_RET_FAILURE : 0;
059ae173 278}
This page took 0.527407 seconds and 4 git commands to generate.