1 // SPDX-License-Identifier: BSD-2-Clause
3 * Copyright (c) 2022 Matthias Schiffer <mschiffer@universe-factory.net>
13 static bool check_image_header(const image_header_t
*header
)
15 if (header
->ih_magic
!= cpu_to_be32(IH_MAGIC_OKLI
)) {
16 puts("Invalid image magic\n");
20 if (header
->ih_comp
!= cpu_to_be32(IH_COMP_NONE
)) {
21 puts("Unsupported compressed image\n");
28 static uint32_t do_load(void)
30 image_header_t header
;
31 uint32_t ih_size
, ih_load
, ih_ep
;
33 if (spi_nor_read_id())
36 puts("Reading image header...\n");
37 if (spi_nor_read_data(&header
, CONFIG_IMAGE_OFFSET
, sizeof(header
)))
40 if (!check_image_header(&header
))
43 header
.ih_name
[sizeof(header
.ih_name
) - 1] = 0;
44 ih_size
= be32_to_cpu(header
.ih_size
);
45 ih_load
= be32_to_cpu(header
.ih_load
);
46 ih_ep
= be32_to_cpu(header
.ih_ep
);
48 put_with_label("Image Name: ", puts
, (const char *)header
.ih_name
);
49 put_with_label("Data Size: ", put_u32
, ih_size
);
50 put_with_label("Load Address: ", put_u32
, ih_load
);
51 put_with_label("Entry Point: ", put_u32
, ih_ep
);
53 puts("Reading image data...\n");
54 void *loadaddr
= (void *)ih_load
;
55 if (spi_nor_read_data(loadaddr
, CONFIG_IMAGE_OFFSET
+ sizeof(header
),
59 flush_cache(loadaddr
, ih_size
);
64 static void enter_image(uint32_t addr
)
66 typedef void (*entry_t
)(void);
67 entry_t entry
= (entry_t
)addr
;
69 puts("Starting image...\n");
73 static void load(void)
78 ret
= spi_init(0, CONFIG_SPI_MAX_HZ
, SPI_MODE_0
);
80 puts("Failed to initialize SPI controller\n");
84 ret
= spi_claim_bus();
86 puts("Failed to enable SPI controller\n");
94 if (addr
!= UINT32_MAX
)
100 serial_console_init();
101 puts("=== " CONFIG_PROGRAM_NAME
" ===\n");
105 puts("Halting execution.\n");