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 * See file CREDITS for list of people who contributed to this 11 * project. 12 * 13 * This program is free software; you can redistribute it and/or 14 * modify it under the terms of the GNU General Public License as 15 * published by the Free Software Foundation; either version 2 of 16 * the License, or (at your option) any later version. 17 * 18 * This program is distributed in the hope that it will be useful, 19 * but WITHOUT ANY WARRANTY; without even the implied warranty of 20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21 * GNU General Public License for more details. 22 * 23 * You should have received a copy of the GNU General Public License 24 * along with this program; if not, write to the Free Software 25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 26 * MA 02111-1307 USA 27 */ 28 #include <common.h> 29 #include <spl.h> 30 #include <xyzModem.h> 31 #include <asm/u-boot.h> 32 #include <asm/utils.h> 33 34 #define BUF_SIZE 1024 35 36 static int getcymodem(void) { 37 if (tstc()) 38 return (getc()); 39 return -1; 40 } 41 42 void spl_ymodem_load_image(void) 43 { 44 int size = 0; 45 int err; 46 int res; 47 int ret; 48 connection_info_t info; 49 char buf[BUF_SIZE]; 50 ulong store_addr = ~0; 51 ulong addr = 0; 52 53 info.mode = xyzModem_ymodem; 54 ret = xyzModem_stream_open(&info, &err); 55 56 if (!ret) { 57 while ((res = 58 xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) { 59 if (addr == 0) 60 spl_parse_image_header((struct image_header *)buf); 61 store_addr = addr + spl_image.load_addr; 62 size += res; 63 addr += res; 64 memcpy((char *)(store_addr), buf, res); 65 } 66 } else { 67 printf("spl: ymodem err - %s\n", xyzModem_error(err)); 68 hang(); 69 } 70 71 xyzModem_stream_close(&err); 72 xyzModem_stream_terminate(false, &getcymodem); 73 74 printf("Loaded %d bytes\n", size); 75 } 76