|
|
|
@ -39,25 +39,17 @@ |
|
|
|
|
#define CAN 0x18 |
|
|
|
|
#define EOF 0x1A /* ^Z for DOS officionados */ |
|
|
|
|
|
|
|
|
|
#define USE_YMODEM_LENGTH |
|
|
|
|
|
|
|
|
|
/* Data & state local to the protocol */ |
|
|
|
|
static struct |
|
|
|
|
{ |
|
|
|
|
#ifdef REDBOOT |
|
|
|
|
hal_virtual_comm_table_t *__chan; |
|
|
|
|
#else |
|
|
|
|
int *__chan; |
|
|
|
|
#endif |
|
|
|
|
unsigned char pkt[1024], *bufp; |
|
|
|
|
unsigned char blk, cblk, crc1, crc2; |
|
|
|
|
unsigned char next_blk; /* Expected block */ |
|
|
|
|
int len, mode, total_retries; |
|
|
|
|
int total_SOH, total_STX, total_CAN; |
|
|
|
|
bool crc_mode, at_eof, tx_ack; |
|
|
|
|
#ifdef USE_YMODEM_LENGTH |
|
|
|
|
unsigned long file_length, read_length; |
|
|
|
|
#endif |
|
|
|
|
} xyz; |
|
|
|
|
|
|
|
|
|
#define xyzModem_CHAR_TIMEOUT 2000 /* 2 seconds */ |
|
|
|
@ -66,7 +58,6 @@ static struct |
|
|
|
|
#define xyzModem_CAN_COUNT 3 /* Wait for 3 CAN before quitting */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef REDBOOT /*SB */ |
|
|
|
|
typedef int cyg_int32; |
|
|
|
|
static int |
|
|
|
|
CYGACC_COMM_IF_GETC_TIMEOUT (char chan, char *c) |
|
|
|
@ -156,17 +147,7 @@ parse_num (char *s, unsigned long *val, char **es, char *delim) |
|
|
|
|
if (_is_hex (c) && ((digit = _from_hex (c)) < radix)) |
|
|
|
|
{ |
|
|
|
|
/* Valid digit */ |
|
|
|
|
#ifdef CYGPKG_HAL_MIPS |
|
|
|
|
/* FIXME: tx49 compiler generates 0x2539018 for MUL which */ |
|
|
|
|
/* isn't any good. */ |
|
|
|
|
if (16 == radix) |
|
|
|
|
result = result << 4; |
|
|
|
|
else |
|
|
|
|
result = 10 * result; |
|
|
|
|
result += digit; |
|
|
|
|
#else |
|
|
|
|
result = (result * radix) + digit; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
@ -190,41 +171,8 @@ parse_num (char *s, unsigned long *val, char **es, char *delim) |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#define USE_SPRINTF |
|
|
|
|
#ifdef DEBUG |
|
|
|
|
#ifndef USE_SPRINTF |
|
|
|
|
/*
|
|
|
|
|
* Note: this debug setup only works if the target platform has two serial ports |
|
|
|
|
* available so that the other one (currently only port 1) can be used for debug |
|
|
|
|
* messages. |
|
|
|
|
*/ |
|
|
|
|
static int |
|
|
|
|
zm_dprintf (char *fmt, ...) |
|
|
|
|
{ |
|
|
|
|
int cur_console; |
|
|
|
|
va_list args; |
|
|
|
|
|
|
|
|
|
va_start (args, fmt); |
|
|
|
|
#ifdef REDBOOT |
|
|
|
|
cur_console = |
|
|
|
|
CYGACC_CALL_IF_SET_CONSOLE_COMM |
|
|
|
|
(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); |
|
|
|
|
CYGACC_CALL_IF_SET_CONSOLE_COMM (1); |
|
|
|
|
#endif |
|
|
|
|
diag_vprintf (fmt, args); |
|
|
|
|
#ifdef REDBOOT |
|
|
|
|
CYGACC_CALL_IF_SET_CONSOLE_COMM (cur_console); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
zm_flush (void) |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
/*
|
|
|
|
|
* Note: this debug setup works by storing the strings in a fixed buffer |
|
|
|
|
*/ |
|
|
|
@ -253,23 +201,13 @@ zm_dprintf (char *fmt, ...) |
|
|
|
|
static void |
|
|
|
|
zm_flush (void) |
|
|
|
|
{ |
|
|
|
|
#ifdef REDBOOT |
|
|
|
|
char *p = zm_out_start; |
|
|
|
|
while (*p) |
|
|
|
|
mon_write_char (*p++); |
|
|
|
|
#endif |
|
|
|
|
zm_out = zm_out_start; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
zm_dump_buf (void *buf, int len) |
|
|
|
|
{ |
|
|
|
|
#ifdef REDBOOT |
|
|
|
|
diag_vdump_buf_with_offset (zm_dprintf, buf, len, 0); |
|
|
|
|
#else |
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static unsigned char zm_buf[2048]; |
|
|
|
@ -476,9 +414,6 @@ xyzModem_get_hdr (void) |
|
|
|
|
int |
|
|
|
|
xyzModem_stream_open (connection_info_t * info, int *err) |
|
|
|
|
{ |
|
|
|
|
#ifdef REDBOOT |
|
|
|
|
int console_chan; |
|
|
|
|
#endif |
|
|
|
|
int stat = 0; |
|
|
|
|
int retries = xyzModem_MAX_RETRIES; |
|
|
|
|
int crc_retries = xyzModem_MAX_RETRIES_WITH_CRC; |
|
|
|
@ -492,29 +427,9 @@ xyzModem_stream_open (connection_info_t * info, int *err) |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef REDBOOT |
|
|
|
|
/* Set up the I/O channel. Note: this allows for using a different port in the future */ |
|
|
|
|
console_chan = |
|
|
|
|
CYGACC_CALL_IF_SET_CONSOLE_COMM |
|
|
|
|
(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT); |
|
|
|
|
if (info->chan >= 0) |
|
|
|
|
{ |
|
|
|
|
CYGACC_CALL_IF_SET_CONSOLE_COMM (info->chan); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
CYGACC_CALL_IF_SET_CONSOLE_COMM (console_chan); |
|
|
|
|
} |
|
|
|
|
xyz.__chan = CYGACC_CALL_IF_CONSOLE_PROCS (); |
|
|
|
|
|
|
|
|
|
CYGACC_CALL_IF_SET_CONSOLE_COMM (console_chan); |
|
|
|
|
CYGACC_COMM_IF_CONTROL (*xyz.__chan, __COMMCTL_SET_TIMEOUT, |
|
|
|
|
xyzModem_CHAR_TIMEOUT); |
|
|
|
|
#else |
|
|
|
|
/* TODO: CHECK ! */ |
|
|
|
|
int dummy = 0; |
|
|
|
|
xyz.__chan = &dummy; |
|
|
|
|
#endif |
|
|
|
|
xyz.len = 0; |
|
|
|
|
xyz.crc_mode = true; |
|
|
|
|
xyz.at_eof = false; |
|
|
|
@ -524,10 +439,8 @@ xyzModem_stream_open (connection_info_t * info, int *err) |
|
|
|
|
xyz.total_SOH = 0; |
|
|
|
|
xyz.total_STX = 0; |
|
|
|
|
xyz.total_CAN = 0; |
|
|
|
|
#ifdef USE_YMODEM_LENGTH |
|
|
|
|
xyz.read_length = 0; |
|
|
|
|
xyz.file_length = 0; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
CYGACC_COMM_IF_PUTC (*xyz.__chan, (xyz.crc_mode ? 'C' : NAK)); |
|
|
|
|
|
|
|
|
@ -546,12 +459,10 @@ xyzModem_stream_open (connection_info_t * info, int *err) |
|
|
|
|
/* Y-modem file information header */ |
|
|
|
|
if (xyz.blk == 0) |
|
|
|
|
{ |
|
|
|
|
#ifdef USE_YMODEM_LENGTH |
|
|
|
|
/* skip filename */ |
|
|
|
|
while (*xyz.bufp++); |
|
|
|
|
/* get the length */ |
|
|
|
|
parse_num ((char *) xyz.bufp, &xyz.file_length, NULL, " "); |
|
|
|
|
#endif |
|
|
|
|
/* The rest of the file name data block quietly discarded */ |
|
|
|
|
xyz.tx_ack = true; |
|
|
|
|
} |
|
|
|
@ -604,13 +515,8 @@ xyzModem_stream_read (char *buf, int size, int *err) |
|
|
|
|
("ACK block %d (%d)\n", xyz.blk, __LINE__)); |
|
|
|
|
xyz.next_blk = (xyz.next_blk + 1) & 0xFF; |
|
|
|
|
|
|
|
|
|
#if defined(xyzModem_zmodem) || defined(USE_YMODEM_LENGTH) |
|
|
|
|
if (xyz.mode == xyzModem_xmodem || xyz.file_length == 0) |
|
|
|
|
{ |
|
|
|
|
#else |
|
|
|
|
if (1) |
|
|
|
|
{ |
|
|
|
|
#endif |
|
|
|
|
/* Data blocks can be padded with ^Z (EOF) characters */ |
|
|
|
|
/* This code tries to detect and remove them */ |
|
|
|
|
if ((xyz.bufp[xyz.len - 1] == EOF) && |
|
|
|
@ -625,7 +531,6 @@ xyzModem_stream_read (char *buf, int size, int *err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef USE_YMODEM_LENGTH |
|
|
|
|
/*
|
|
|
|
|
* See if accumulated length exceeds that of the file. |
|
|
|
|
* If so, reduce size (i.e., cut out pad bytes) |
|
|
|
@ -640,7 +545,6 @@ xyzModem_stream_read (char *buf, int size, int *err) |
|
|
|
|
xyz.len -= (xyz.read_length - xyz.file_length); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
else if (xyz.blk == ((xyz.next_blk - 1) & 0xFF)) |
|
|
|
@ -809,10 +713,3 @@ xyzModem_error (int err) |
|
|
|
|
/*
|
|
|
|
|
* RedBoot interface |
|
|
|
|
*/ |
|
|
|
|
#if 0 /* SB */
|
|
|
|
|
GETC_IO_FUNCS (xyzModem_io, xyzModem_stream_open, xyzModem_stream_close, |
|
|
|
|
xyzModem_stream_terminate, xyzModem_stream_read, |
|
|
|
|
xyzModem_error); |
|
|
|
|
RedBoot_load (xmodem, xyzModem_io, false, false, xyzModem_xmodem); |
|
|
|
|
RedBoot_load (ymodem, xyzModem_io, false, false, xyzModem_ymodem); |
|
|
|
|
#endif |
|
|
|
|