X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=common%2FxyzModem.c;h=6bf2375671d2825668457472e29c9e81a12fef28;hb=a595a0e910960ccd4611719d5fb5c279859efaee;hp=5656aac48fb1b688a10247adf572444392779194;hpb=88033d737d9f46e7eebda6a8f9770957eb9aae9c;p=oweals%2Fu-boot.git diff --git a/common/xyzModem.c b/common/xyzModem.c index 5656aac48f..6bf2375671 100644 --- a/common/xyzModem.c +++ b/common/xyzModem.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: eCos-2.0 /* *========================================================================== * @@ -6,8 +7,6 @@ * RedBoot stream handler for xyzModem protocol * *========================================================================== - * SPDX-License-Identifier: eCos-2.0 - *========================================================================== *#####DESCRIPTIONBEGIN#### * * Author(s): gthomas @@ -25,7 +24,8 @@ #include #include #include -#include +#include +#include /* Assumption - run xyzModem protocol over the console port */ @@ -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,17 +58,17 @@ 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) { -#define DELAY 20 - unsigned long counter = 0; - while (!tstc () && (counter < xyzModem_CHAR_TIMEOUT * 1000 / DELAY)) + + ulong now = get_timer(0); + WATCHDOG_RESET(); + while (!tstc ()) { - udelay (DELAY); - counter++; + if (get_timer(now) > xyzModem_CHAR_TIMEOUT) + break; } if (tstc ()) { @@ -156,17 +148,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,86 +172,38 @@ 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 +#if defined(DEBUG) && !CONFIG_IS_ENABLED(USE_TINY_PRINTF) /* * Note: this debug setup works by storing the strings in a fixed buffer */ -#define FINAL -#ifdef FINAL -static char *zm_out = (char *) 0x00380000; -static char *zm_out_start = (char *) 0x00380000; -#else -static char zm_buf[8192]; -static char *zm_out = zm_buf; -static char *zm_out_start = zm_buf; +static char zm_debug_buf[8192]; +static char *zm_out = zm_debug_buf; +static char *zm_out_start = zm_debug_buf; -#endif static int -zm_dprintf (char *fmt, ...) +zm_dprintf(char *fmt, ...) { - int len; - va_list args; - - va_start (args, fmt); - len = diag_vsprintf (zm_out, fmt, args); - zm_out += len; - return len; + int len; + va_list args; + + va_start(args, fmt); + len = diag_vsprintf(zm_out, fmt, args); + va_end(args); + zm_out += len; + return len; } 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 +410,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 +423,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 +435,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 +455,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 +511,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 +527,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 +541,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 +709,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