int ret;
connection_info_t info;
char buf[BUF_SIZE];
- struct image_header *ih;
+ struct image_header *ih = NULL;
ulong addr = 0;
info.mode = xyzModem_ymodem;
if (res <= 0)
goto end_stream;
- if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+ if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL) &&
+ image_get_magic((struct image_header *)buf) == FDT_MAGIC) {
+ addr = CONFIG_SYS_LOAD_ADDR;
+ ih = (struct image_header *)addr;
+
+ memcpy((void *)addr, buf, res);
+ size += res;
+ addr += res;
+
+ while ((res = xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) {
+ memcpy((void *)addr, buf, res);
+ size += res;
+ addr += res;
+ }
+
+ ret = spl_parse_image_header(spl_image, ih);
+ if (ret)
+ return ret;
+ } else if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
image_get_magic((struct image_header *)buf) == FDT_MAGIC) {
struct spl_load_info load;
struct ymodem_fit_info info;
ih = (struct image_header *)buf;
ret = spl_parse_image_header(spl_image, ih);
if (ret)
- return ret;
+ goto end_stream;
#ifdef CONFIG_SPL_GZIP
if (ih->ih_comp == IH_COMP_GZIP)
addr = CONFIG_SYS_LOAD_ADDR;
size += res;
addr += res;
}
-
-#ifdef CONFIG_SPL_GZIP
- if (ih->ih_comp == IH_COMP_GZIP) {
- if (gunzip((void *)(spl_image->load_addr + sizeof(*ih)),
- CONFIG_SYS_BOOTM_LEN,
- (void *)(CONFIG_SYS_LOAD_ADDR + sizeof(*ih)),
- &size)) {
- puts("Uncompressing error\n");
- return -EIO;
- }
- }
-#endif
}
end_stream:
xyzModem_stream_terminate(false, &getcymodem);
printf("Loaded %lu bytes\n", size);
- return 0;
+
+#ifdef CONFIG_SPL_GZIP
+ if (!(IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+ image_get_magic((struct image_header *)buf) == FDT_MAGIC) &&
+ (ih->ih_comp == IH_COMP_GZIP)) {
+ if (gunzip((void *)(spl_image->load_addr + sizeof(*ih)),
+ CONFIG_SYS_BOOTM_LEN,
+ (void *)(CONFIG_SYS_LOAD_ADDR + sizeof(*ih)),
+ &size)) {
+ puts("Uncompressing error\n");
+ return -EIO;
+ }
+ }
+#endif
+
+ return ret;
}
SPL_LOAD_IMAGE_METHOD("UART", 0, BOOT_DEVICE_UART, spl_ymodem_load_image);