1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-02 01:02:19 +02:00

* Add support for ymodem protocol download

Patch by Stefano Babic, 29 Mar 2006

* Memory Map Update for Delta board: U-Boot is at 0x80000000-0x84000000

Merge with /home/mk/8-benq/u-boot
This commit is contained in:
Wolfgang Denk
2006-04-01 15:52:46 +02:00
10 changed files with 1198 additions and 38 deletions

View File

@@ -29,11 +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);
@@ -471,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);
@@ -959,6 +971,66 @@ 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 */
/* -------------------------------------------------------------------- */
@@ -1018,6 +1090,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 */
/* -------------------------------------------------------------------- */