#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 */
#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)
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
{
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
*/
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];
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;
}
#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;
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));
/* 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;
}
("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) &&
}
}
-#ifdef USE_YMODEM_LENGTH
/*
* See if accumulated length exceeds that of the file.
* If so, reduce size (i.e., cut out pad bytes)
xyz.len -= (xyz.read_length - xyz.file_length);
}
}
-#endif
break;
}
else if (xyz.blk == ((xyz.next_blk - 1) & 0xFF))
/*
* 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