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