Mercurial > flash_v2
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 |
| 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 | 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 | 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 | 357 |
| 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 | 595 RedBoot_load(xmodem, xyzModem_io, false, false, xyzModem_xmodem); |
| 596 RedBoot_load(ymodem, xyzModem_io, false, false, xyzModem_ymodem); |
