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 spl_parse_image_header((struct image_header *)buf); 45 store_addr = addr + spl_image.load_addr; 46 size += res; 47 addr += res; 48 memcpy((char *)(store_addr), buf, res); 49 } 50 } else { 51 printf("spl: ymodem err - %s\n", xyzModem_error(err)); 52 return ret; 53 } 54 55 xyzModem_stream_close(&err); 56 xyzModem_stream_terminate(false, &getcymodem); 57 58 printf("Loaded %d bytes\n", size); 59 return 0; 60 } 61