1 /* 2 * (C) Copyright 2000-2004 3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4 * 5 * (C) Copyright 2011 6 * Texas Instruments, <www.ti.com> 7 * 8 * Matt Porter <mporter@ti.com> 9 * 10 * SPDX-License-Identifier: GPL-2.0+ 11 */ 12 #include <common.h> 13 #include <spl.h> 14 #include <xyzModem.h> 15 #include <asm/u-boot.h> 16 #include <asm/utils.h> 17 18 #define BUF_SIZE 1024 19 20 static int getcymodem(void) { 21 if (tstc()) 22 return (getc()); 23 return -1; 24 } 25 26 int spl_ymodem_load_image(void) 27 { 28 int size = 0; 29 int err; 30 int res; 31 int ret; 32 connection_info_t info; 33 char buf[BUF_SIZE]; 34 ulong store_addr = ~0; 35 ulong addr = 0; 36 37 info.mode = xyzModem_ymodem; 38 ret = xyzModem_stream_open(&info, &err); 39 40 if (!ret) { 41 while ((res = 42 xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) { 43 if (addr == 0) { 44 ret = spl_parse_image_header((struct image_header *)buf); 45 if (ret) 46 return ret; 47 } 48 store_addr = addr + spl_image.load_addr; 49 size += res; 50 addr += res; 51 memcpy((char *)(store_addr), buf, res); 52 } 53 } else { 54 printf("spl: ymodem err - %s\n", xyzModem_error(err)); 55 return ret; 56 } 57 58 xyzModem_stream_close(&err); 59 xyzModem_stream_terminate(false, &getcymodem); 60 61 printf("Loaded %d bytes\n", size); 62 return 0; 63 } 64