diff options
Diffstat (limited to 'common/cmd_load.c')
| -rw-r--r-- | common/cmd_load.c | 112 | 
1 files changed, 95 insertions, 17 deletions
diff --git a/common/cmd_load.c b/common/cmd_load.c index 749849711..2432ee205 100644 --- a/common/cmd_load.c +++ b/common/cmd_load.c @@ -29,10 +29,13 @@  #include <s_record.h>  #include <net.h>  #include <exports.h> +#include <xyzModem.h> +DECLARE_GLOBAL_DATA_PTR;  #if (CONFIG_COMMANDS & CFG_CMD_LOADS)  static ulong load_serial (ulong offset); +static ulong load_serial_ymodem (ulong offset);  static int read_record (char *buf, ulong len);  # if (CONFIG_COMMANDS & CFG_CMD_SAVES)  static int save_serial (ulong offset, ulong size); @@ -53,7 +56,6 @@ int do_load_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	char *env_echo;  	int rcode = 0;  #ifdef	CFG_LOADS_BAUD_CHANGE -	DECLARE_GLOBAL_DATA_PTR;  	int load_baudrate, current_baudrate;  	load_baudrate = current_baudrate = gd->baudrate; @@ -213,7 +215,6 @@ load_serial (ulong offset)  static int  read_record (char *buf, ulong len)  { -	DECLARE_GLOBAL_DATA_PTR;  	char *p;  	char c; @@ -256,7 +257,6 @@ int do_save_serial (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  	ulong offset = 0;  	ulong size   = 0;  #ifdef	CFG_LOADS_BAUD_CHANGE -	DECLARE_GLOBAL_DATA_PTR;  	int save_baudrate, current_baudrate;  	save_baudrate = current_baudrate = gd->baudrate; @@ -433,8 +433,6 @@ char his_quote;      /* quote chars he'll use */  int do_load_serial_bin (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  { -	DECLARE_GLOBAL_DATA_PTR; -  	ulong offset = 0;  	ulong addr;  	int load_baudrate, current_baudrate; @@ -475,21 +473,31 @@ int do_load_serial_bin (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  		}  	} -	printf ("## Ready for binary (kermit) download " -		"to 0x%08lX at %d bps...\n", -		offset, -		load_baudrate); -	addr = load_serial_bin (offset); +	if (strcmp(argv[0],"loady")==0) { +		printf ("## Ready for binary (ymodem) download " +			"to 0x%08lX at %d bps...\n", +			offset, +			load_baudrate); + +		addr = load_serial_ymodem (offset); -	if (addr == ~0) { -		load_addr = 0; -		printf ("## Binary (kermit) download aborted\n"); -		rcode = 1;  	} else { -		printf ("## Start Addr      = 0x%08lX\n", addr); -		load_addr = addr; -	} +		printf ("## Ready for binary (kermit) download " +			"to 0x%08lX at %d bps...\n", +			offset, +			load_baudrate); +		addr = load_serial_bin (offset); + +		if (addr == ~0) { +			load_addr = 0; +			printf ("## Binary (kermit) download aborted\n"); +			rcode = 1; +		} else { +			printf ("## Start Addr      = 0x%08lX\n", addr); +			load_addr = addr; +		} +	}  	if (load_baudrate != current_baudrate) {  		printf ("## Switch baudrate to %d bps and press ESC ...\n",  			current_baudrate); @@ -963,6 +971,68 @@ START:  	}  	return ((ulong) os_data_addr - (ulong) bin_start_address);  } + +static int getcxmodem(void) { +	if (tstc()) +		return (getc()); +	return -1; +} +static ulong load_serial_ymodem (ulong offset) +{ +	int size; +	char buf[32]; +	int err; +	int res; +	connection_info_t info; +	char ymodemBuf[1024]; +	ulong store_addr = ~0; +	ulong addr = 0; + +	size = 0; +	info.mode = xyzModem_ymodem; +	res = xyzModem_stream_open (&info, &err); +	if (!res) { + +		while ((res = +			xyzModem_stream_read (ymodemBuf, 1024, &err)) > 0) { +			store_addr = addr + offset; +			size += res; +			addr += res; +#ifndef CFG_NO_FLASH +			if (addr2info (store_addr)) { +				int rc; + +				rc = flash_write ((char *) ymodemBuf, +						  store_addr, res); +				if (rc != 0) { +					flash_perror (rc); +					return (~0); +				} +			} else +#endif +			{ +				memcpy ((char *) (store_addr), ymodemBuf, +					res); +			} + +		} +	} else { +		printf ("%s\n", xyzModem_error (err)); +	} + +	xyzModem_stream_close (&err); +	xyzModem_stream_terminate (false, &getcxmodem); + + +	flush_cache (offset, size); + +	printf ("## Total Size      = 0x%08x = %d Bytes\n", size, size); +	sprintf (buf, "%X", size); +	setenv ("filesize", buf); + +	return offset; +} +  #endif	/* CFG_CMD_LOADB */  /* -------------------------------------------------------------------- */ @@ -1022,6 +1092,14 @@ U_BOOT_CMD(  	" with offset 'off' and baudrate 'baud'\n"  ); +U_BOOT_CMD( +	loady, 3, 0,	do_load_serial_bin, +	"loady   - load binary file over serial line (ymodem mode)\n", +	"[ off ] [ baud ]\n" +	"    - load binary file over serial line" +	" with offset 'off' and baudrate 'baud'\n" +); +  #endif	/* CFG_CMD_LOADB */  /* -------------------------------------------------------------------- */  |