annotate packages/redboot/current/src/xyzModem.c @ 1760:9abe5ac74a1a

Correctly handle scenario where there are multiple flash devices but only one initialized successfully
author bartv
date Sun, 28 Nov 2004 19:10:03 +0000
parents 9f0d02327506
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
1 //==========================================================================
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
2 //
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
3 // xyzModem.c
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
4 //
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
5 // RedBoot stream handler for xyzModem protocol
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
6 //
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
12 // Copyright (C) 2002 Gary Thomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
36 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
39 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
41 //==========================================================================
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
43 //
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
44 // Author(s): gthomas
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
45 // Contributors: gthomas, tsmith, Yoshinori Sato
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
46 // Date: 2000-07-14
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
47 // Purpose:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
48 // Description:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
49 //
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
50 // This code is part of RedBoot (tm).
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
51 //
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
52 //####DESCRIPTIONEND####
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
53 //
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
54 //==========================================================================
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
55
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
56 #include <redboot.h>
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
57 #include <xyzModem.h>
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
58
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
59 // Assumption - run xyzModem protocol over the console port
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
60
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
61 // Values magic to the protocol
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
62 #define SOH 0x01
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
63 #define STX 0x02
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
64 #define EOT 0x04
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
65 #define ACK 0x06
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
66 #define BSP 0x08
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
67 #define NAK 0x15
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
68 #define CAN 0x18
201
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
69 #define EOF 0x1A // ^Z for DOS officionados
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
70
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
71 #define nUSE_YMODEM_LENGTH
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
72
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
73 // Data & state local to the protocol
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
74 static struct {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
75 hal_virtual_comm_table_t* __chan;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
76 unsigned char pkt[1024], *bufp;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
77 unsigned char blk,cblk,crc1,crc2;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
78 unsigned char next_blk; // Expected block
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
79 int len, mode, total_retries;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
80 int total_SOH, total_STX, total_CAN;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
81 bool crc_mode, at_eof, tx_ack;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
82 #ifdef USE_YMODEM_LENGTH
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
83 unsigned long file_length, read_length;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
84 #endif
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
85 } xyz;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
86
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
87 #define xyzModem_CHAR_TIMEOUT 2000 // 2 seconds
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
88 #define xyzModem_MAX_RETRIES 20
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
89 #define xyzModem_MAX_RETRIES_WITH_CRC 10
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
90 #define xyzModem_CAN_COUNT 3 // Wait for 3 CAN before quitting
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
91
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
92 #ifdef DEBUG
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
93 #ifndef USE_SPRINTF
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
94 //
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
95 // Note: this debug setup only works if the target platform has two serial ports
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
96 // available so that the other one (currently only port 1) can be used for debug
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
97 // messages.
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
98 //
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
99 static int
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
100 zm_dprintf(char *fmt, ...)
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
101 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
102 int cur_console;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
103 va_list args;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
104
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
105 va_start(args, fmt);
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
106 cur_console = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
107 CYGACC_CALL_IF_SET_CONSOLE_COMM(1);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
108 diag_vprintf(fmt, args);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
109 CYGACC_CALL_IF_SET_CONSOLE_COMM(cur_console);
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
110 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
111
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
112 static void
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
113 zm_flush(void)
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
114 {
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
115 }
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
116
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
117 #else
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
118 //
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
119 // Note: this debug setup works by storing the strings in a fixed buffer
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
120 //
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
121 static char *zm_out = (char *)0x00380000;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
122 static char *zm_out_start = (char *)0x00380000;
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
123
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
124 static int
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
125 zm_dprintf(char *fmt, ...)
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
126 {
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
127 int len;
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
128 va_list args;
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
129
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
130 va_start(args, fmt);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
131 len = diag_vsprintf(zm_out, fmt, args);
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
132 zm_out += len;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
133 return len;
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
134 }
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
135
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
136 static void
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
137 zm_flush(void)
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
138 {
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
139 char *p = zm_out_start;
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
140 while (*p) mon_write_char(*p++);
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
141 zm_out = zm_out_start;
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
142 }
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
143 #endif
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
144
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
145 static void
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
146 zm_dump_buf(void *buf, int len)
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
147 {
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
148 diag_vdump_buf_with_offset(zm_dprintf, buf, len, 0);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
149 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
150
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
151 static unsigned char zm_buf[2048];
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
152 static unsigned char *zm_bp;
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
153
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
154 static void
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
155 zm_new(void)
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
156 {
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
157 zm_bp = zm_buf;
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
158 }
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
159
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
160 static void
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
161 zm_save(unsigned char c)
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
162 {
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
163 *zm_bp++ = c;
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
164 }
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
165
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
166 static void
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
167 zm_dump(int line)
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
168 {
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
169 zm_dprintf("Packet at line: %d\n", line);
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
170 zm_dump_buf(zm_buf, zm_bp-zm_buf);
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
171 }
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
172
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
173 #define ZM_DEBUG(x) x
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
174 #else
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
175 #define ZM_DEBUG(x)
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
176 #endif
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
177
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
178 // Wait for the line to go idle
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
179 static void
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
180 xyzModem_flush(void)
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
181 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
182 int res;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
183 char c;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
184 while (true) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
185 res = CYGACC_COMM_IF_GETC_TIMEOUT(*xyz.__chan, &c);
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
186 if (!res) return;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
187 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
188 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
189
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
190 static int
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
191 xyzModem_get_hdr(void)
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
192 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
193 char c;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
194 int res;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
195 bool hdr_found = false;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
196 int i, can_total, hdr_chars;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
197 unsigned short cksum;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
198
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
199 ZM_DEBUG(zm_new());
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
200 // Find the start of a header
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
201 can_total = 0;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
202 hdr_chars = 0;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
203
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
204 if (xyz.tx_ack) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
205 CYGACC_COMM_IF_PUTC(*xyz.__chan, ACK);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
206 xyz.tx_ack = false;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
207 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
208 while (!hdr_found) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
209 res = CYGACC_COMM_IF_GETC_TIMEOUT(*xyz.__chan, &c);
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
210 ZM_DEBUG(zm_save(c));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
211 if (res) {
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
212 hdr_chars++;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
213 switch (c) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
214 case SOH:
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
215 xyz.total_SOH++;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
216 case STX:
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
217 if (c == STX) xyz.total_STX++;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
218 hdr_found = true;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
219 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
220 case CAN:
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
221 xyz.total_CAN++;
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
222 ZM_DEBUG(zm_dump(__LINE__));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
223 if (++can_total == xyzModem_CAN_COUNT) {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
224 return xyzModem_cancel;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
225 } else {
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
226 // Wait for multiple CAN to avoid early quits
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
227 break;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
228 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
229 case EOT:
165
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 162
diff changeset
230 // EOT only supported if no noise
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
231 if (hdr_chars == 1) {
165
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 162
diff changeset
232 CYGACC_COMM_IF_PUTC(*xyz.__chan, ACK);
d63db767121d Merge from eCos master repository on 2001-06-29-06:43:03-BST
jlarmour
parents: 162
diff changeset
233 ZM_DEBUG(zm_dprintf("ACK on EOT #%d\n", __LINE__));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
234 ZM_DEBUG(zm_dump(__LINE__));
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
235 return xyzModem_eof;
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
236 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
237 default:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
238 // Ignore, waiting for start of header
191
678094f34118 Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents: 184
diff changeset
239 ;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
240 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
241 } else {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
242 // Data stream timed out
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
243 xyzModem_flush(); // Toss any current input
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
244 ZM_DEBUG(zm_dump(__LINE__));
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
245 CYGACC_CALL_IF_DELAY_US((cyg_int32)250000);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
246 return xyzModem_timeout;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
247 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
248 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
249
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
250 // Header found, now read the data
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
251 res = CYGACC_COMM_IF_GETC_TIMEOUT(*xyz.__chan, &xyz.blk);
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
252 ZM_DEBUG(zm_save(xyz.blk));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
253 if (!res) {
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
254 ZM_DEBUG(zm_dump(__LINE__));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
255 return xyzModem_timeout;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
256 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
257 res = CYGACC_COMM_IF_GETC_TIMEOUT(*xyz.__chan, &xyz.cblk);
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
258 ZM_DEBUG(zm_save(xyz.cblk));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
259 if (!res) {
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
260 ZM_DEBUG(zm_dump(__LINE__));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
261 return xyzModem_timeout;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
262 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
263 xyz.len = (c == SOH) ? 128 : 1024;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
264 xyz.bufp = xyz.pkt;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
265 for (i = 0; i < xyz.len; i++) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
266 res = CYGACC_COMM_IF_GETC_TIMEOUT(*xyz.__chan, &c);
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
267 ZM_DEBUG(zm_save(c));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
268 if (res) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
269 xyz.pkt[i] = c;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
270 } else {
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
271 ZM_DEBUG(zm_dump(__LINE__));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
272 return xyzModem_timeout;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
273 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
274 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
275 res = CYGACC_COMM_IF_GETC_TIMEOUT(*xyz.__chan, &xyz.crc1);
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
276 ZM_DEBUG(zm_save(xyz.crc1));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
277 if (!res) {
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
278 ZM_DEBUG(zm_dump(__LINE__));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
279 return xyzModem_timeout;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
280 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
281 if (xyz.crc_mode) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
282 res = CYGACC_COMM_IF_GETC_TIMEOUT(*xyz.__chan, &xyz.crc2);
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
283 ZM_DEBUG(zm_save(xyz.crc2));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
284 if (!res) {
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
285 ZM_DEBUG(zm_dump(__LINE__));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
286 return xyzModem_timeout;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
287 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
288 }
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
289 ZM_DEBUG(zm_dump(__LINE__));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
290 // Validate the message
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
291 if ((xyz.blk ^ xyz.cblk) != (unsigned char)0xFF) {
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
292 ZM_DEBUG(zm_dprintf("Framing error - blk: %x/%x/%x\n", xyz.blk, xyz.cblk, (xyz.blk ^ xyz.cblk)));
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
293 ZM_DEBUG(zm_dump_buf(xyz.pkt, xyz.len));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
294 xyzModem_flush();
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
295 return xyzModem_frame;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
296 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
297 // Verify checksum/CRC
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
298 if (xyz.crc_mode) {
284
3e80ecaaa3f8 * src/crc.c: Removed. Replaced with the CRC package.
asl
parents: 245
diff changeset
299 cksum = cyg_crc16(xyz.pkt, xyz.len);
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
300 if (cksum != ((xyz.crc1 << 8) | xyz.crc2)) {
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
301 ZM_DEBUG(zm_dprintf("CRC error - recvd: %02x%02x, computed: %x\n",
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
302 xyz.crc1, xyz.crc2, cksum & 0xFFFF));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
303 return xyzModem_cksum;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
304 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
305 } else {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
306 cksum = 0;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
307 for (i = 0; i < xyz.len; i++) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
308 cksum += xyz.pkt[i];
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
309 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
310 if (xyz.crc1 != (cksum & 0xFF)) {
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
311 ZM_DEBUG(zm_dprintf("Checksum error - recvd: %x, computed: %x\n", xyz.crc1, cksum & 0xFF));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
312 return xyzModem_cksum;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
313 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
314 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
315 // If we get here, the message passes [structural] muster
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
316 return 0;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
317 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
318
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
319 int
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
320 xyzModem_stream_open(connection_info_t *info, int *err)
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
321 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
322 int console_chan, stat;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
323 int retries = xyzModem_MAX_RETRIES;
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
324 int crc_retries = xyzModem_MAX_RETRIES_WITH_CRC;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
325
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
326 // ZM_DEBUG(zm_out = zm_out_start);
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
327 #ifdef xyzModem_zmodem
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
328 if (info->mode == xyzModem_zmodem) {
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
329 *err = xyzModem_noZmodem;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
330 return -1;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
331 }
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
332 #endif
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
333
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
334 // Set up the I/O channel. Note: this allows for using a different port in the future
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
335 console_chan = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
336 if (info->chan >= 0) {
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
337 CYGACC_CALL_IF_SET_CONSOLE_COMM(info->chan);
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
338 } else {
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
339 CYGACC_CALL_IF_SET_CONSOLE_COMM(console_chan);
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
340 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
341 xyz.__chan = CYGACC_CALL_IF_CONSOLE_PROCS();
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
342 CYGACC_CALL_IF_SET_CONSOLE_COMM(console_chan);
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
343 CYGACC_COMM_IF_CONTROL(*xyz.__chan, __COMMCTL_SET_TIMEOUT, xyzModem_CHAR_TIMEOUT);
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
344 xyz.len = 0;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
345 xyz.crc_mode = true;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
346 xyz.at_eof = false;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
347 xyz.tx_ack = false;
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
348 xyz.mode = info->mode;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
349 xyz.total_retries = 0;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
350 xyz.total_SOH = 0;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
351 xyz.total_STX = 0;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
352 xyz.total_CAN = 0;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
353 #ifdef USE_YMODEM_LENGTH
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
354 xyz.read_length = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
355 xyz.file_length = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
356 #endif
1506
56bd97c45aa5 Faster XY-modem startup - from Jani Monoses
gthomas
parents: 284
diff changeset
357
56bd97c45aa5 Faster XY-modem startup - from Jani Monoses
gthomas
parents: 284
diff changeset
358 CYGACC_COMM_IF_PUTC(*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
359
1519
9f0d02327506 No need to wait for file header in X-modem protocol - from Gratian Crisan
gthomas
parents: 1506
diff changeset
360 if (xyz.mode == xyzModem_xmodem) {
9f0d02327506 No need to wait for file header in X-modem protocol - from Gratian Crisan
gthomas
parents: 1506
diff changeset
361 // X-modem doesn't have an information header - exit here
9f0d02327506 No need to wait for file header in X-modem protocol - from Gratian Crisan
gthomas
parents: 1506
diff changeset
362 xyz.next_blk = 1;
9f0d02327506 No need to wait for file header in X-modem protocol - from Gratian Crisan
gthomas
parents: 1506
diff changeset
363 return 0;
9f0d02327506 No need to wait for file header in X-modem protocol - from Gratian Crisan
gthomas
parents: 1506
diff changeset
364 }
9f0d02327506 No need to wait for file header in X-modem protocol - from Gratian Crisan
gthomas
parents: 1506
diff changeset
365
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
366 while (retries-- > 0) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
367 stat = xyzModem_get_hdr();
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
368 if (stat == 0) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
369 // Y-modem file information header
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
370 if (xyz.blk == 0) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
371 #ifdef USE_YMODEM_LENGTH
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
372 // skip filename
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
373 while (*xyz.bufp++);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
374 // get the length
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
375 parse_num(xyz.bufp, &xyz.file_length, NULL, " ");
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
376 #endif
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
377 // The rest of the file name data block quietly discarded
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
378 xyz.tx_ack = true;
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
379 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
380 xyz.next_blk = 1;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
381 xyz.len = 0;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
382 return 0;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
383 } else
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
384 if (stat == xyzModem_timeout) {
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
385 if (--crc_retries <= 0) xyz.crc_mode = false;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
386 CYGACC_CALL_IF_DELAY_US(5*100000); // Extra delay for startup
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
387 CYGACC_COMM_IF_PUTC(*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
388 xyz.total_retries++;
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
389 ZM_DEBUG(zm_dprintf("NAK (%d)\n", __LINE__));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
390 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
391 if (stat == xyzModem_cancel) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
392 break;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
393 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
394 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
395 *err = stat;
149
52c99470ec11 Merge from eCos master repository on 2001-01-19-06:43:03-GMT
jlarmour
parents: 143
diff changeset
396 ZM_DEBUG(zm_flush());
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
397 return -1;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
398 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
399
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
400 int
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
401 xyzModem_stream_read(char *buf, int size, int *err)
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
402 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
403 int stat, total, len;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
404 int retries;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
405
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
406 total = 0;
174
38892b97b685 Merge from eCos master repository on 2001-07-28-00:17:32-BST
jlarmour
parents: 165
diff changeset
407 stat = xyzModem_cancel;
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
408 // Try and get 'size' bytes into the buffer
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
409 while (!xyz.at_eof && (size > 0)) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
410 if (xyz.len == 0) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
411 retries = xyzModem_MAX_RETRIES;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
412 while (retries-- > 0) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
413 stat = xyzModem_get_hdr();
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
414 if (stat == 0) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
415 if (xyz.blk == xyz.next_blk) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
416 xyz.tx_ack = true;
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
417 ZM_DEBUG(zm_dprintf("ACK block %d (%d)\n", xyz.blk, __LINE__));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
418 xyz.next_blk = (xyz.next_blk + 1) & 0xFF;
201
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
419 // Data blocks can be padded with ^Z (EOF) characters
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
420 // This code tries to detect and remove them
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
421 #ifdef xyzModem_zmodem
201
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
422 if (xyz.mode != xyzModem_zmodem) {
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
423 #else
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
424 if (1) {
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
425 #endif
201
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
426 if ((xyz.bufp[xyz.len-1] == EOF) &&
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
427 (xyz.bufp[xyz.len-2] == EOF) &&
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
428 (xyz.bufp[xyz.len-3] == EOF)) {
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
429 while (xyz.len && (xyz.bufp[xyz.len-1] == EOF)) {
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
430 xyz.len--;
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
431 }
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
432 }
dd81b18e45fb Merge from eCos master repository on 2002-01-04-06:43:04-GMT
jlarmour
parents: 191
diff changeset
433 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
434
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
435 #ifdef USE_YMODEM_LENGTH
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
436 // See if accumulated length exceeds that of the file.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
437 // If so, reduce size (i.e., cut out pad bytes)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
438 // Only do this for Y-modem (and Z-modem should it ever
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
439 // be supported since it can fall back to Y-modem mode).
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
440 if (xyz.mode != xyzModem_xmodem && 0 != xyz.file_length) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
441 xyz.read_length += xyz.len;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
442 if (xyz.read_length > xyz.file_length) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
443 xyz.len -= (xyz.read_length - xyz.file_length);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
444 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
445 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
446 #endif
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
447 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
448 } else if (xyz.blk == ((xyz.next_blk - 1) & 0xFF)) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
449 // Just re-ACK this so sender will get on with it
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
450 CYGACC_COMM_IF_PUTC(*xyz.__chan, ACK);
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
451 continue; // Need new header
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
452 } else {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
453 stat = xyzModem_sequence;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
454 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
455 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
456 if (stat == xyzModem_cancel) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
457 break;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
458 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
459 if (stat == xyzModem_eof) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
460 CYGACC_COMM_IF_PUTC(*xyz.__chan, ACK);
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
461 ZM_DEBUG(zm_dprintf("ACK (%d)\n", __LINE__));
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
462 if (xyz.mode == xyzModem_ymodem) {
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
463 CYGACC_COMM_IF_PUTC(*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
464 xyz.total_retries++;
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
465 ZM_DEBUG(zm_dprintf("Reading Final Header\n"));
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
466 stat = xyzModem_get_hdr();
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
467 CYGACC_COMM_IF_PUTC(*xyz.__chan, ACK);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
468 ZM_DEBUG(zm_dprintf("FINAL ACK (%d)\n", __LINE__));
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
469 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
470 xyz.at_eof = true;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
471 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
472 }
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
473 CYGACC_COMM_IF_PUTC(*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
474 xyz.total_retries++;
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 132
diff changeset
475 ZM_DEBUG(zm_dprintf("NAK (%d)\n", __LINE__));
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
476 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
477 if (stat < 0) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
478 *err = stat;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
479 xyz.len = -1;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
480 return total;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
481 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
482 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
483 // Don't "read" data from the EOF protocol package
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
484 if (!xyz.at_eof) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
485 len = xyz.len;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
486 if (size < len) len = size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
487 memcpy(buf, xyz.bufp, len);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
488 size -= len;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
489 buf += len;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
490 total += len;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
491 xyz.len -= len;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
492 xyz.bufp += len;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
493 }
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
494 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
495 return total;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
496 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
497
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
498 void
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
499 xyzModem_stream_close(int *err)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
500 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
501 diag_printf("xyzModem - %s mode, %d(SOH)/%d(STX)/%d(CAN) packets, %d retries\n",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
502 xyz.crc_mode ? "CRC" : "Cksum",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
503 xyz.total_SOH, xyz.total_STX, xyz.total_CAN,
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
504 xyz.total_retries);
162
2395031e7a66 Merge from eCos master repository on 2001-06-15-06:43:03-BST
jlarmour
parents: 151
diff changeset
505 // ZM_DEBUG(zm_flush());
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
506 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
507
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
508 // Need to be able to clean out the input buffer, so have to take the
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
509 // getc
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
510 void xyzModem_stream_terminate(bool abort, int (*getc)(void))
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
511 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
512 int c;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
513
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
514 if (abort) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
515 ZM_DEBUG(zm_dprintf("!!!! TRANSFER ABORT !!!!\n"));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
516 switch (xyz.mode) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
517 case xyzModem_xmodem:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
518 case xyzModem_ymodem:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
519 // The X/YMODEM Spec seems to suggest that multiple CAN followed by an equal
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
520 // number of Backspaces is a friendly way to get the other end to abort.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
521 CYGACC_COMM_IF_PUTC(*xyz.__chan,CAN);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
522 CYGACC_COMM_IF_PUTC(*xyz.__chan,CAN);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
523 CYGACC_COMM_IF_PUTC(*xyz.__chan,CAN);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
524 CYGACC_COMM_IF_PUTC(*xyz.__chan,CAN);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
525 CYGACC_COMM_IF_PUTC(*xyz.__chan,BSP);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
526 CYGACC_COMM_IF_PUTC(*xyz.__chan,BSP);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
527 CYGACC_COMM_IF_PUTC(*xyz.__chan,BSP);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
528 CYGACC_COMM_IF_PUTC(*xyz.__chan,BSP);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
529 // Now consume the rest of what's waiting on the line.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
530 ZM_DEBUG(zm_dprintf("Flushing serial line.\n"));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
531 xyzModem_flush();
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
532 xyz.at_eof = true;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
533 break;
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
534 #ifdef xyzModem_zmodem
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
535 case xyzModem_zmodem:
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
536 // Might support it some day I suppose.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
537 #endif
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
538 break;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
539 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
540 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
541 ZM_DEBUG(zm_dprintf("Engaging cleanup mode...\n"));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
542 // Consume any trailing crap left in the inbuffer from
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
543 // previous recieved blocks. Since very few files are an exact multiple
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
544 // of the transfer block size, there will almost always be some gunk here.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
545 // If we don't eat it now, RedBoot will think the user typed it.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
546 ZM_DEBUG(zm_dprintf("Trailing gunk:\n"));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
547 while ((c = (*getc)()) > -1) ;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
548 ZM_DEBUG(zm_dprintf("\n"));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
549 // Make a small delay to give terminal programs like minicom
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
550 // time to get control again after their file transfer program
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
551 // exits.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 201
diff changeset
552 CYGACC_CALL_IF_DELAY_US((cyg_int32)250000);
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
553 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
554 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 174
diff changeset
555
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
556 char *
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
557 xyzModem_error(int err)
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
558 {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
559 switch (err) {
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
560 case xyzModem_access:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
561 return "Can't access file";
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
562 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
563 case xyzModem_noZmodem:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
564 return "Sorry, zModem not available yet";
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
565 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
566 case xyzModem_timeout:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
567 return "Timed out";
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
568 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
569 case xyzModem_eof:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
570 return "End of file";
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
571 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
572 case xyzModem_cancel:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
573 return "Cancelled";
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
574 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
575 case xyzModem_frame:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
576 return "Invalid framing";
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
577 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
578 case xyzModem_cksum:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
579 return "CRC/checksum error";
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
580 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
581 case xyzModem_sequence:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
582 return "Block sequence error";
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
583 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
584 default:
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
585 return "Unknown error";
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
586 break;
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
587 }
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
diff changeset
588 }
228
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
589
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
590 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
591 // RedBoot interface
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
592 //
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
593 GETC_IO_FUNCS(xyzModem_io, xyzModem_stream_open, xyzModem_stream_close,
e1b642d73533 Improve load command - make I/O methods table driven.
gthomas
parents: 210
diff changeset
594 xyzModem_stream_terminate, xyzModem_stream_read, xyzModem_error);
245
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
595 RedBoot_load(xmodem, xyzModem_io, false, false, xyzModem_xmodem);
a6660704f7a6 Fix problem with x/y-modem load.
gthomas
parents: 228
diff changeset
596 RedBoot_load(ymodem, xyzModem_io, false, false, xyzModem_ymodem);