Mercurial > ecos
annotate packages/io/serial/current/tests/ser_test_protocol.inl @ 22:53104bbd5f99 ecos-sw-1999-07-09
Merge from eCos master repository on 1999-07-09-05:47:06-BST
| author | jlarmour |
|---|---|
| date | Fri, 09 Jul 1999 07:15:07 +0000 |
| parents | 5f5102441818 |
| children | 641b639be825 |
| rev | line source |
|---|---|
| 2 | 1 //========================================================================== |
| 2 // | |
| 3 // ser_test_protocol.c | |
| 4 // | |
| 5 // Serial device driver testing protocol | |
| 6 // | |
| 7 //========================================================================== | |
| 8 //####COPYRIGHTBEGIN#### | |
| 9 // | |
| 10 // ------------------------------------------- | |
| 11 // The contents of this file are subject to the Cygnus eCos Public License | |
| 12 // Version 1.0 (the "License"); you may not use this file except in | |
| 13 // compliance with the License. You may obtain a copy of the License at | |
| 14 // http://sourceware.cygnus.com/ecos | |
| 15 // | |
| 16 // Software distributed under the License is distributed on an "AS IS" | |
| 17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the | |
| 18 // License for the specific language governing rights and limitations under | |
| 19 // the License. | |
| 20 // | |
| 21 // The Original Code is eCos - Embedded Cygnus Operating System, released | |
| 22 // September 30, 1998. | |
| 23 // | |
| 24 // The Initial Developer of the Original Code is Cygnus. Portions created | |
| 25 // by Cygnus are Copyright (C) 1998, 1999 Cygnus Solutions. | |
| 26 // All Rights Reserved. | |
| 27 // ------------------------------------------- | |
| 28 // | |
| 29 //####COPYRIGHTEND#### | |
| 30 //========================================================================== | |
| 31 //#####DESCRIPTIONBEGIN#### | |
| 32 // | |
| 33 // Author(s): jskov | |
| 34 // Contributors: jskov | |
| 35 // Date: 1999-03-17 | |
| 36 // Description: Protocol implementation used to test eCos serial devices. | |
| 37 // Relies on ser_filter to be present on the host side to | |
| 38 // respond to test requests. | |
| 39 // | |
| 40 // To Do: | |
| 41 // o Clean up. | |
| 42 // o Clean up config change magic. | |
| 43 // o Figure out how to handle kernel dependency | |
| 44 // : without kernel, no timeout. Without timeout, no filter auto detection. | |
| 45 // | |
| 46 //####DESCRIPTIONEND#### | |
| 47 | |
| 48 #include <pkgconf/system.h> | |
| 49 #include <pkgconf/io.h> | |
| 50 #include <pkgconf/io_serial.h> | |
| 51 | |
| 52 #include <cyg/io/io.h> | |
| 53 #include <cyg/io/devtab.h> | |
| 54 #include <cyg/io/ttyio.h> | |
| 55 #include <cyg/infra/diag.h> | |
| 56 | |
| 57 #include <cyg/hal/hal_intr.h> // for reclaiming interrup vector | |
| 58 | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
59 #ifdef CYG_HAL_SPARCLITE_SLEB |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
60 #include <pkgconf/hal_sparclite_sleb.h> // CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
61 #endif |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
62 |
| 2 | 63 //---------------------------------------------------------------------------- |
| 64 // Definition of which device to run tests on on various platforms. | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
65 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
66 #define NA_MSG "No test device specified" |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
67 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
68 |
| 2 | 69 #if defined(CYGPKG_HAL_POWERPC_COGENT) \ |
| 70 && defined(CYGPKG_IO_SERIAL_POWERPC_COGENT) \ | |
| 71 && defined(CYGPKG_IO_SERIAL_POWERPC_COGENT_SERIAL_B) | |
| 72 # define TEST_SER_DEV CYGDAT_IO_SERIAL_POWERPC_COGENT_SERIAL_B_NAME | |
| 73 # if defined(CYGPKG_IO_SERIAL_TTY_TTY2) | |
| 74 # define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY2_DEV | |
| 75 # endif | |
| 76 #endif | |
| 77 #if defined(CYGPKG_HAL_ARM_PID) \ | |
| 78 && defined(CYGPKG_IO_SERIAL_ARM_PID) \ | |
| 79 && defined(CYGPKG_IO_SERIAL_ARM_PID_SERIAL0) | |
| 80 # define TEST_SER_DEV CYGDAT_IO_SERIAL_ARM_PID_SERIAL0_NAME | |
| 81 # if defined(CYGPKG_IO_SERIAL_TTY_TTY0) | |
| 82 # define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY0_DEV | |
| 83 # endif | |
| 84 #endif | |
| 85 #if defined(CYGPKG_HAL_ARM_AEB) \ | |
| 86 && defined(CYGPKG_IO_SERIAL_ARM_AEB) \ | |
| 87 && defined(CYGPKG_IO_SERIAL_ARM_AEB_SERIAL1) | |
| 88 # define TEST_SER_DEV CYGDAT_IO_SERIAL_ARM_AEB_SERIAL1_NAME | |
| 89 # if defined(CYGPKG_IO_SERIAL_TTY_TTY1) | |
| 90 # define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV | |
| 91 # endif | |
| 92 #endif | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
93 #if defined(CYGPKG_HAL_MIPS_TX39_JMR3904) \ |
| 2 | 94 && defined(CYGPKG_IO_SERIAL_TX39_JMR3904) \ |
| 95 && defined(CYGPKG_IO_SERIAL_TX39_JMR3904_SERIAL0) | |
| 96 # define TEST_SER_DEV CYGDAT_IO_SERIAL_TX39_JMR3904_SERIAL0_NAME | |
| 97 # if defined(CYGPKG_IO_SERIAL_TTY_TTY1) | |
| 98 # define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV | |
| 99 # endif | |
| 100 #endif | |
| 101 #if defined(CYGPKG_HAL_MN10300_STDEVAL1) \ | |
| 102 && defined(CYGPKG_IO_SERIAL_MN10300) \ | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
103 && defined(CYGPKG_IO_SERIAL_MN10300_SERIAL2) |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
104 # define TEST_SER_DEV CYGDAT_IO_SERIAL_MN10300_SERIAL2_NAME |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
105 # if defined(CYGPKG_IO_SERIAL_TTY_TTY2) |
| 2 | 106 # define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY1_DEV |
| 107 # endif | |
| 108 #endif | |
| 109 #if defined(CYGPKG_HAL_SPARCLITE_SLEB) \ | |
| 110 && defined(CYGPKG_IO_SERIAL_SPARCLITE_SLEB) \ | |
| 111 && defined(CYGPKG_IO_SERIAL_SPARCLITE_SLEB_CON1) | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
112 # undef NA_MSG |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
113 # define NA_MSG "CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT is unset" |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
114 # if !defined(CYG_HAL_STARTUP_RAM) \ |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
115 || defined(CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT) |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
116 # define TEST_SER_DEV CYGDAT_IO_SERIAL_SPARCLITE_SLEB_CON1_NAME |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
117 // The interrupt vectors are normally in CygMon's control. Steal them back, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
118 // but beware that this results in GDB acknowledge characters showing up in |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
119 // the serial driver if CygMon is used for hal_diag output. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
120 // Set CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT in hal_sparclite_sleb as a workaround. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
121 # define SER_OVERRIDE_INT_1 CYGNUM_HAL_INTERRUPT_9 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
122 # define SER_OVERRIDE_INT_2 CYGNUM_HAL_INTERRUPT_10 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
123 # if defined(CYGPKG_IO_SERIAL_TTY_TTY0) |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
124 # define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY0_DEV |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
125 # endif |
| 2 | 126 # endif |
| 127 #endif | |
| 128 | |
| 129 // We can't rely on haldiag for ser_filter detection - it may not define | |
| 130 // a working character reading function. | |
| 131 #ifndef TEST_SER_DEV | |
| 132 # define SER_NOP_TEST | |
| 133 # define TTY_NOP_TEST | |
| 134 # define TEST_SER_DEV "/dev/null" | |
| 135 # define TEST_TTY_DEV "/dev/null" | |
| 136 #else | |
| 137 # ifndef TEST_TTY_DEV | |
| 138 # define TTY_NOP_TEST | |
| 139 # define TEST_TTY_DEV "/dev/null" | |
| 140 # endif | |
| 141 #endif | |
| 142 | |
| 143 //---------------------------------------------------------------------------- | |
| 144 // The data in buffer and the cmd buffer | |
| 145 #define IN_BUFFER_SIZE 1024 | |
| 146 cyg_uint8 in_buffer[IN_BUFFER_SIZE]; | |
| 147 | |
| 148 cyg_int8 cmd_buffer[128]; | |
| 149 | |
| 150 //---------------------------------------------------------------------------- | |
| 151 // Some types specific to the testing protocol. | |
| 152 typedef enum { | |
| 153 MODE_NO_ECHO = 0, | |
| 154 MODE_EOP_ECHO, | |
| 155 MODE_DUPLEX_ECHO | |
| 156 } cyg_mode_t; | |
| 157 | |
| 158 typedef enum { | |
| 159 TEST_RETURN_OK = ENOERR, | |
| 160 TEST_RETURN_NA | |
| 161 } cyg_test_return_t; | |
| 162 | |
| 163 typedef struct ser_cfg { | |
| 164 cyg_serial_baud_rate_t baud_rate; | |
| 165 cyg_serial_word_length_t data_bits; | |
| 166 cyg_serial_stop_bits_t stop_bits; | |
| 167 cyg_serial_parity_t parity; | |
| 168 // etc... | |
| 169 } cyg_ser_cfg_t; | |
| 170 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
171 typedef enum { |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
172 OPT_SERIAL_DEBUG = 0, |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
173 OPT_VERBOSE_LEVEL |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
174 } cyg_option_t; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
175 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
176 typedef enum { |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
177 NONE = 0, |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
178 PROTOCOL_PROGRESS, |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
179 PROTOCOL_DATA, |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
180 } cyg_verbosity_level_t; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
181 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
182 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
183 // A few predifined option macros. Use after test_ping(). |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
184 #define TEST_OPTIONS(__handle, __array) \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
185 test_options(__handle, sizeof(__array)/8, __array) |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
186 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
187 #define TEST_HOST_DEBUG(__handle) \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
188 CYG_MACRO_START \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
189 cyg_uint32 __options[] = {OPT_SERIAL_DEBUG, 1}; \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
190 test_options((__handle), sizeof(__options)/8, \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
191 __options); \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
192 CYG_MACRO_END |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
193 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
194 #define TEST_HOST_PROGRESS(__handle) \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
195 CYG_MACRO_START \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
196 cyg_uint32 __options[] = \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
197 {OPT_SERIAL_DEBUG, 1, \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
198 OPT_VERBOSE_LEVEL, PROTOCOL_PROGRESS}; \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
199 test_options((__handle), sizeof(__options)/8, \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
200 __options); \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
201 CYG_MACRO_END |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
202 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
203 #define TEST_HOST_DATA(__handle) \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
204 CYG_MACRO_START \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
205 cyg_uint32 __options[] = \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
206 {OPT_SERIAL_DEBUG, 1, \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
207 OPT_VERBOSE_LEVEL, PROTOCOL_DATA}; \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
208 test_options((__handle), sizeof(__options)/8, \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
209 __options); \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
210 CYG_MACRO_END |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
211 |
| 2 | 212 //---------------------------------------------------------------------------- |
| 213 // A few predefined configurations. These must all be valid for any | |
| 214 // given target until change_config is behaving correctly. | |
| 215 cyg_ser_cfg_t test_configs[] = { | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
216 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && !defined(CYGPKG_HAL_ARM_PID) |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
217 { CYGNUM_SERIAL_BAUD_9600, CYGNUM_SERIAL_WORD_LENGTH_8, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
218 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE }, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
219 #endif |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
220 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
221 { CYGNUM_SERIAL_BAUD_14400, CYGNUM_SERIAL_WORD_LENGTH_8, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
222 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE }, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
223 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
224 { CYGNUM_SERIAL_BAUD_19200, CYGNUM_SERIAL_WORD_LENGTH_8, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
225 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE }, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
226 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
227 #if !defined(CYGPKG_HAL_SPARCLITE_SLEB) && \ |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
228 !defined(CYGPKG_HAL_ARM_AEB) |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
229 { CYGNUM_SERIAL_BAUD_38400, CYGNUM_SERIAL_WORD_LENGTH_8, |
| 2 | 230 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE }, |
| 231 #endif | |
| 232 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
233 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && \ |
| 2 | 234 !defined(CYGPKG_HAL_ARM_AEB) && \ |
| 235 !defined(CYGPKG_HAL_SPARCLITE_SLEB) | |
| 236 { CYGNUM_SERIAL_BAUD_57600, CYGNUM_SERIAL_WORD_LENGTH_8, | |
| 237 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE }, | |
| 238 #endif | |
| 239 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
240 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && \ |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
241 !defined(CYGPKG_HAL_ARM_PID) && \ |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
242 !defined(CYGPKG_HAL_ARM_AEB) && \ |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
243 !defined(CYGPKG_HAL_MN10300_STDEVAL1) && \ |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
244 !defined(CYGPKG_HAL_SPARCLITE_SLEB) |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
245 { CYGNUM_SERIAL_BAUD_115200, CYGNUM_SERIAL_WORD_LENGTH_8, |
| 2 | 246 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE }, |
| 247 #endif | |
| 248 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
249 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && \ |
| 2 | 250 !defined(CYGPKG_HAL_ARM_AEB) && \ |
| 251 !defined(CYGPKG_HAL_ARM_PID) | |
| 252 // One stop bit, even parity | |
| 253 { CYGNUM_SERIAL_BAUD_19200, CYGNUM_SERIAL_WORD_LENGTH_8, | |
| 254 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_EVEN }, | |
| 255 #endif | |
| 256 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
257 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && \ |
| 2 | 258 !defined(CYGPKG_HAL_ARM_AEB) && \ |
| 259 !defined(CYGPKG_HAL_ARM_PID) | |
| 260 // Two stop bits, even parity | |
| 261 { CYGNUM_SERIAL_BAUD_19200, CYGNUM_SERIAL_WORD_LENGTH_8, | |
| 262 CYGNUM_SERIAL_STOP_2, CYGNUM_SERIAL_PARITY_EVEN }, | |
| 263 #endif | |
| 264 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
265 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) |
| 2 | 266 // Two stop bits, no parity |
| 267 { CYGNUM_SERIAL_BAUD_19200, CYGNUM_SERIAL_WORD_LENGTH_8, | |
| 268 CYGNUM_SERIAL_STOP_2, CYGNUM_SERIAL_PARITY_NONE }, | |
| 269 #endif | |
| 270 }; | |
| 271 | |
| 272 //---------------------------------------------------------------------------- | |
| 273 // Macros to help extract values from the argument string. | |
| 274 // Note: This is probably not an ideal solution, but it was easy to make :) | |
| 275 | |
| 276 #define INIT_VALUE(__args) \ | |
| 277 unsigned int v; \ | |
| 278 char *__ptr1, *__ptr2 = (__args) | |
| 279 | |
| 280 #define SET_VALUE(__slot) \ | |
| 281 do { \ | |
| 282 __ptr1 = index(__ptr2, (int) ':'); \ | |
| 283 if (__ptr1) \ | |
| 284 *__ptr1 = 0; \ | |
| 285 v = atoi(__ptr2); \ | |
| 286 __ptr2 = __ptr1+1; \ | |
| 287 (__slot) = v; \ | |
| 288 } while (0) | |
| 289 | |
| 290 | |
| 291 //---------------------------------------------------------------------------- | |
| 292 // CRC magic - it's a bit of a hack for now. | |
| 293 // FIXME: standard definition? | |
| 294 #define ADD_CRC_BYTE(__crc, __c) \ | |
| 295 CYG_MACRO_START \ | |
| 296 (__crc) = ((__crc) << 1) ^ (__c); \ | |
| 297 CYG_MACRO_END | |
| 298 | |
| 299 // FIXME: Hack to allow easy ASCII transfer. | |
| 300 #define FIX_CRC(__crc, __icrc) \ | |
| 301 CYG_MACRO_START \ | |
| 302 __icrc = (int) (__crc); \ | |
| 303 if (__icrc < 0) \ | |
| 304 __icrc = -__icrc; \ | |
| 305 CYG_MACRO_END | |
| 306 | |
| 307 //---------------------------------------------------------------------------- | |
| 308 // Macros for read/write to serial with error cheking. | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
309 static volatile cyg_uint32 r_stamp; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
310 static volatile int aborted; |
| 2 | 311 |
| 312 // This routine will be called if the read "times out" | |
| 313 static void | |
| 314 do_abort(void *handle) | |
| 315 { | |
| 316 cyg_io_handle_t io_handle = (cyg_io_handle_t)handle; | |
| 317 cyg_int32 len = 1; // Need something here | |
| 318 cyg_io_get_config(io_handle, CYG_IO_GET_CONFIG_SERIAL_ABORT, 0, &len); | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
319 aborted = 1; |
| 2 | 320 } |
| 321 #include "timeout.inl" | |
| 322 | |
| 323 // Read with timeout (__t = timeout in ticks, int* __r = result) | |
| 324 #define Tcyg_io_read_timeout(__h, __d, __l, __t, __r) \ | |
| 325 CYG_MACRO_START \ | |
| 326 int __res; \ | |
| 327 r_stamp = timeout((__t), do_abort, (__h)); \ | |
| 328 __res = cyg_io_read((__h), (__d), (__l)); \ | |
| 329 CYG_TEST_CHECK((ENOERR == __res || -EINTR == __res),"cyg_io_read failed");\ | |
| 330 *(__r) = __res; \ | |
| 331 untimeout(r_stamp); \ | |
| 332 CYG_MACRO_END | |
| 333 | |
| 334 #define Tcyg_io_read(__h, __d, __l) \ | |
| 335 CYG_MACRO_START \ | |
| 336 int __res = cyg_io_read((__h), (__d), (__l)); \ | |
| 337 CYG_TEST_CHECK(ENOERR == __res, "cyg_io_read failed"); \ | |
| 338 CYG_MACRO_END | |
| 339 | |
| 340 #define Tcyg_io_write(__h, __d, __l) \ | |
| 341 CYG_MACRO_START \ | |
| 342 int __res; \ | |
| 343 cyg_uint32 __len = 1; \ | |
| 344 __res = cyg_io_write((__h), (__d), (__l)); \ | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
345 if (ENOERR != __res) diag_printf("[%d]\n", __res); \ |
| 2 | 346 CYG_TEST_CHECK(ENOERR == __res, "cyg_io_write failed"); \ |
| 347 __res = cyg_io_get_config((__h), \ | |
| 348 CYG_IO_GET_CONFIG_SERIAL_OUTPUT_DRAIN, \ | |
| 349 0, &__len); \ | |
| 350 CYG_TEST_CHECK(ENOERR == __res, "DRAIN failed"); \ | |
| 351 CYG_MACRO_END | |
| 352 | |
| 353 | |
| 354 //---------------------------------------------------------------------------- | |
| 355 // Some libc like functions that are handy to have around. | |
| 356 static int | |
| 357 strlen(const char *c) | |
| 358 { | |
| 359 int l = 0; | |
| 360 while (*c++) l++; | |
| 361 return l; | |
| 362 } | |
| 363 | |
| 364 static char* | |
| 365 strcpy(char* dest, const char* src) | |
| 366 { | |
| 367 char c; | |
| 368 while ((c = *src++)) { | |
| 369 *dest++ = c; | |
| 370 } | |
| 371 *dest = c; | |
| 372 | |
| 373 return dest; | |
| 374 } | |
| 375 | |
| 376 static char* | |
| 377 itoa(char* dest, int v) | |
| 378 { | |
| 379 char b[16]; | |
| 380 char* p = &b[16]; | |
| 381 | |
| 382 *--p = 0; | |
| 383 if (v) { | |
| 384 while (v){ | |
| 385 *--p = (v % 10) + '0'; | |
| 386 v = v / 10; | |
| 387 } | |
| 388 } else | |
| 389 *--p = '0'; | |
| 390 | |
| 391 return strcpy(dest, p); | |
| 392 } | |
| 393 | |
| 394 #define min(_a, _b) ((_a) < (_b)) ? (_a) : (_b) | |
| 395 | |
| 396 void | |
| 397 hang(void) | |
| 398 { | |
| 399 while (1); | |
| 400 } | |
| 401 | |
| 402 //----------------------------------------------------------------------------- | |
| 403 // Configuration changing function. | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
404 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
405 // First change to the new config and back again to determine if the driver |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
406 // can handle the config. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
407 // If not, return error. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
408 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
409 // Then query the host for its capability to use the config: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
410 // Format out: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
411 // "@CONFIG:<baud rate code>:<#data bits>:<#stop bits>:<parity on/off>!" |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
412 // Format in: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
413 // OK/ER |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
414 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
415 // On ER, return error. |
| 2 | 416 // |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
417 // On OK, change to the new configuration. Resynchronize with the host: |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
418 // Target waits for host to send S(ync) |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
419 // [host will delay at least .1 secs after changing baud rate so the |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
420 // line has time to settle.] |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
421 // |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
422 // When receiving S(ync), target replies OK to the host which then |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
423 // acknowledges with D(one). |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
424 // |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
425 // Host can also send R(esync) which means it didn't receieve the OK. If |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
426 // so the target resends its S(ync) message. |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
427 // |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
428 // If the synchronization has not succeeded within 1 second |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
429 // (configurable in the protocol), both host and target will revert to |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
430 // the previous configuration and attempt to synchronize again. If |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
431 // this fails, this call will hang and the host will consider the test |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
432 // a failure. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
433 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
434 // To Do: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
435 // Host&protocol currently only supports: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
436 // - no/even parity |
| 2 | 437 int |
| 438 change_config(cyg_io_handle_t handle, cyg_ser_cfg_t* cfg) | |
| 439 { | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
440 cyg_serial_info_t old_cfg, new_cfg; |
| 2 | 441 const char cmd[] = "@CONFIG:"; |
| 442 char reply[2]; | |
| 443 int msglen; | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
444 int res, len; |
| 2 | 445 cyg_uint8 *p1; |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
446 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
447 // Prepare the command. |
| 2 | 448 p1 = &cmd_buffer[0]; |
| 449 p1 = strcpy(p1, &cmd[0]); | |
| 450 p1 = itoa(p1, cfg->baud_rate); | |
| 451 *p1++ = ':'; | |
| 452 p1 = itoa(p1, cfg->data_bits); | |
| 453 *p1++ = ':'; | |
| 454 p1 = itoa(p1, cfg->stop_bits); | |
| 455 *p1++ = ':'; | |
| 456 p1 = itoa(p1, cfg->parity); | |
| 457 *p1++ = '!'; | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
458 *p1 = 0; // note: we may append to this later |
| 2 | 459 |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
460 // Tell user what we're up to. |
| 2 | 461 CYG_TEST_INFO(&cmd_buffer[1]); |
| 462 | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
463 // Change to new config and then back to determine if the driver likes it. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
464 len = sizeof(old_cfg); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
465 res = cyg_io_get_config(handle, CYG_IO_GET_CONFIG_SERIAL_INFO, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
466 &old_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
467 res = cyg_io_get_config(handle, CYG_IO_GET_CONFIG_SERIAL_INFO, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
468 &new_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
469 if (res != ENOERR) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
470 diag_printf("Can't get serial config - DEVIO error: %d\n", res); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
471 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
472 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
473 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
474 new_cfg.baud = cfg->baud_rate; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
475 new_cfg.word_length = cfg->data_bits; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
476 new_cfg.stop = cfg->stop_bits; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
477 new_cfg.parity = cfg->parity; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
478 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
479 res = cyg_io_set_config(handle, CYG_IO_SET_CONFIG_SERIAL_INFO, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
480 &new_cfg, &len); |
|
20
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
16
diff
changeset
|
481 cyg_thread_delay(10); // Some chips don't like changes to happen to fast... |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
482 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
483 // Driver didn't like it. It will not have changed anything, so it's |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
484 // safe to return now. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
485 if (ENOERR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
486 // Let user know that the config was skipped due to the target. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
487 const char txt_tskipped[] = "- skipped by target!"; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
488 p1 = strcpy(p1, txt_tskipped); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
489 *p1 = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
490 CYG_TEST_INFO(&cmd_buffer[1]); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
491 return res; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
492 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
493 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
494 // Succeeded. Change back to the original config so we can communicate |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
495 // with the host. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
496 res = cyg_io_set_config(handle, CYG_IO_SET_CONFIG_SERIAL_INFO, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
497 &old_cfg, &len); |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
498 cyg_thread_delay(10); // Some chips don't like changes to happen to fast... |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
499 if (ENOERR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
500 diag_printf("change_config: set_config failed/1 (%d)\n", res); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
501 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
502 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
503 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
504 // Send command to host and read host's reply. |
| 2 | 505 msglen = strlen(&cmd_buffer[0]); |
| 506 Tcyg_io_write(handle, &cmd_buffer[0], &msglen); | |
| 507 msglen = 2; | |
| 508 Tcyg_io_read(handle, &reply[0], &msglen); | |
| 509 | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
510 // Did host accept configuration? |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
511 if ('O' != reply[0] || 'K' != reply[1]) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
512 // Let user know that the config was skipped due to the host. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
513 const char txt_hskipped[] = "- skipped by host!"; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
514 p1 = strcpy(p1, txt_hskipped); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
515 *p1 = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
516 CYG_TEST_INFO(&cmd_buffer[1]); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
517 diag_printf("Host didn't accept config (%02x, %02x).\n", |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
518 reply[0], reply[1]); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
519 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
520 res = ENOSUPP; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
521 return res; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
522 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
523 |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
524 // Now change config and wait for host to send us a S(ync) |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
525 // character. |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
526 // Loop until protocol exchange completed. This may hang (as seen |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
527 // from the host), but only when we get totally lost, in which |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
528 // case there's not much else to do really. In this case the host |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
529 // will consider the test a FAIL. |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
530 len = sizeof(new_cfg); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
531 res = cyg_io_set_config(handle, CYG_IO_SET_CONFIG_SERIAL_INFO, |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
532 &new_cfg, &len); |
|
20
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
16
diff
changeset
|
533 cyg_thread_delay(10); // Some chips don't like changes to happen to fast... |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
534 if (ENOERR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
535 diag_printf("change_config: set_config failed/2 (%d)\n", res); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
536 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
537 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
538 |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
539 { |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
540 int change_succeeded = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
541 int using_old_config = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
542 char in_buf[1]; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
543 int len; |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
544 int saw_host_sync; |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
545 |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
546 for (;;) { |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
547 aborted = 0; // global abort flag |
| 2 | 548 |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
549 // FIXME: Timeout time needs to be configurable, and needs to |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
550 // be sent to the host before getting here. That would allow |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
551 // changing the timeout by just rebuilding the test - without |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
552 // changing the host software. |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
553 saw_host_sync = 0; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
554 r_stamp = timeout(100, do_abort, handle); |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
555 while(!aborted) { |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
556 len = 1; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
557 in_buf[0] = 0; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
558 res = cyg_io_read(handle, in_buf, &len); |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
559 if (ENOERR != res && -EINTR != res) { |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
560 // We may have to reset the driver here if the fail |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
561 // was due to a framing or parity error. |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
562 break; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
563 } |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
564 |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
565 if ('R' == in_buf[0]) { |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
566 // Resync - host didn't see our message. Try again. |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
567 saw_host_sync = 0; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
568 } else if ('S' == in_buf[0] && !saw_host_sync) { |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
569 // In sync - reply to host if we haven't already |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
570 char ok_msg[2] = "OK"; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
571 int ok_len = 2; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
572 Tcyg_io_write(handle, ok_msg, &ok_len); |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
573 saw_host_sync = 1; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
574 } else if ('D' == in_buf[0] && saw_host_sync) { |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
575 // Done - exchange completed. |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
576 change_succeeded = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
577 break; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
578 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
579 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
580 untimeout(r_stamp); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
581 |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
582 if (change_succeeded) { |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
583 // If we had to revert to the old configuration, return error. |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
584 if (using_old_config) |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
585 return -EIO; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
586 else |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
587 return ENOERR; |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
588 } |
| 2 | 589 |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
590 // We didn't synchronize with the host. Due to an IO error? |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
591 if (ENOERR != res && -EINTR != res) { |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
592 // We may have to reset the driver if the fail was due to |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
593 // a framing or parity error. |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
594 } |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
595 |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
596 // Revert to the old configuration and try again. |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
597 len = sizeof(old_cfg); |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
598 res = cyg_io_set_config(handle, CYG_IO_SET_CONFIG_SERIAL_INFO, |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
599 &old_cfg, &len); |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
600 cyg_thread_delay(10); // Some chips don't like changes to happen to fast... |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
601 if (res != ENOERR) { |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
602 diag_printf("change_config: set_config failed/3 (%d)\n", res); |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
603 hang(); |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
604 } |
|
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
605 using_old_config = 1; |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
606 } |
| 2 | 607 |
|
22
53104bbd5f99
Merge from eCos master repository on 1999-07-09-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
608 } |
| 2 | 609 } |
| 610 | |
| 611 | |
| 612 //----------------------------------------------------------------------------- | |
| 613 // Host sends CRC in decimal ASCII, terminated with ! | |
| 614 int | |
| 615 read_host_crc(cyg_io_handle_t handle) | |
| 616 { | |
| 617 int crc, len; | |
| 618 cyg_uint8 ch; | |
| 619 | |
| 620 crc = 0; | |
| 621 while (1) { | |
| 622 len = 1; | |
| 623 Tcyg_io_read(handle, &ch, &len); | |
| 624 if ('!' == ch) | |
| 625 break; | |
| 626 | |
| 627 #ifdef __DEVELOPER__ | |
| 628 if (!((ch >= '0' && ch <= '9'))){ | |
| 629 diag_printf("CHAR: %02x\n", ch); | |
| 630 } | |
| 631 #endif | |
| 632 | |
| 633 CYG_TEST_CHECK((ch >= '0' && ch <= '9'), | |
| 634 "Illegal CRC format from host"); | |
| 635 | |
| 636 crc = crc*10 + (ch - '0'); | |
| 637 } | |
| 638 | |
| 639 return crc; | |
| 640 } | |
| 641 | |
| 642 //--------------------------------------------------------------------------- | |
| 643 // Test binary data transmission. | |
| 644 // Format out: | |
| 645 // "@BINARY:<byte size>:<mode>!" | |
| 646 // Format in: | |
| 647 // <checksum>!<#size bytes data> | |
| 648 // For echo modes, also: | |
| 649 // Format out: | |
| 650 // <#size bytes data> | |
| 651 // Format in: | |
| 652 // OK/ER | |
| 653 // Format out: | |
| 654 // DONE | |
| 655 // | |
| 656 // The last DONE allows the host to eat bytes if target is sending too many. | |
| 657 // | |
| 658 // Mode: | |
| 659 // MODE_NO_ECHO: | |
| 660 // Just receive data and verify CRC. | |
| 661 // MODE_EOP_ECHO: | |
| 662 // Receive data, verify CRC, resend data. | |
| 663 // Expect OK/ER reply from host when done. | |
| 664 // MODE_DUPLEX_ECHO: | |
| 665 // Receive data, echo data, verify CRC. | |
| 666 // Expect OK/ER reply from host when done. | |
| 667 // | |
| 668 // Note: | |
| 669 // Using diag_printf while talking with the host may cause some funky | |
| 670 // errors (bytes from the host side being lost!?!?) | |
| 671 // | |
| 672 // To Do: | |
| 673 // MODE_DUPLEX_ECHO: | |
| 674 // The current implementation is simple and may not stress the | |
| 675 // driver enough. Also, it's command packet format doesn't match | |
| 676 // that of the other modes. | |
| 677 cyg_test_return_t | |
| 678 test_binary(cyg_io_handle_t handle, int size, cyg_mode_t mode) | |
| 679 { | |
| 680 const char cmd[] = "@BINARY:"; | |
| 681 int msglen; | |
| 682 cyg_uint32 xcrc; | |
| 683 int icrc, host_crc; | |
| 684 cyg_uint8 *p1; | |
| 685 cyg_int8 host_status = 'O'; // host is happy by default | |
| 686 | |
| 687 // Verify that the test can be run with available ressources. | |
| 688 if (MODE_EOP_ECHO == mode && size > IN_BUFFER_SIZE) | |
| 689 return TEST_RETURN_NA; | |
| 690 | |
| 691 // Prepare and send the command. | |
| 692 p1 = &cmd_buffer[0]; | |
| 693 p1 = strcpy(p1, &cmd[0]); | |
| 694 p1 = itoa(p1, size); | |
| 695 *p1++ = ':'; | |
| 696 p1 = itoa(p1, mode); | |
| 697 *p1++ = '!'; | |
| 698 *p1++ = 0; | |
| 699 | |
| 700 CYG_TEST_INFO(&cmd_buffer[1]); | |
| 701 | |
| 702 msglen = strlen(&cmd_buffer[0]); | |
| 703 Tcyg_io_write(handle, &cmd_buffer[0], &msglen); | |
| 704 | |
| 705 // Get CRC back. | |
| 706 host_crc = read_host_crc(handle); | |
| 707 | |
| 708 // Depending on mode, start reading data. | |
| 709 xcrc = 0; | |
| 710 switch (mode) { | |
| 711 case MODE_NO_ECHO: | |
| 712 { | |
| 713 // Break transfers into chunks no larger than the buffer size. | |
| 714 int tx_len, chunk_len, i; | |
| 715 while (size > 0) { | |
| 716 chunk_len = min(IN_BUFFER_SIZE, size); | |
| 717 tx_len = chunk_len; | |
| 718 size -= chunk_len; | |
| 719 | |
| 720 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 721 | |
| 722 for (i = 0; i < tx_len; i++) { | |
| 723 ADD_CRC_BYTE(xcrc, in_buffer[i]); | |
| 724 } | |
| 725 } | |
| 726 | |
| 727 // Reply that we have completed the test. | |
| 728 { | |
| 729 const char msg_done[] = "DONE"; | |
| 730 | |
| 731 chunk_len = strlen(&msg_done[0]); | |
| 732 Tcyg_io_write(handle, &msg_done[0], &chunk_len); | |
| 733 } | |
| 734 | |
| 735 } | |
| 736 break; | |
| 737 case MODE_EOP_ECHO: | |
| 738 { | |
| 739 // We have already checked that the in buffer is large enough. | |
| 740 int i, tx_len, chunk_len; | |
| 741 chunk_len = tx_len = size; | |
| 742 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 743 | |
| 744 for (i = 0; i < tx_len; i++) { | |
| 745 ADD_CRC_BYTE(xcrc, in_buffer[i]); | |
| 746 } | |
| 747 | |
| 748 // Echo data back. | |
| 749 chunk_len = size; | |
| 750 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 751 | |
| 752 // Now read host side's status | |
| 753 chunk_len = 2; | |
| 754 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 755 host_status = in_buffer[0]; | |
| 756 | |
| 757 // Reply that we have completed the test. | |
| 758 { | |
| 759 const char msg_done[] = "DONE"; | |
| 760 | |
| 761 chunk_len = strlen(&msg_done[0]); | |
| 762 Tcyg_io_write(handle, &msg_done[0], &chunk_len); | |
| 763 } | |
| 764 } | |
| 765 break; | |
| 766 case MODE_DUPLEX_ECHO: | |
| 767 { | |
| 768 int chunk_len; | |
| 769 int block_size = 64; | |
| 770 | |
| 771 // This is a simple implementation (maybe too simple). | |
| 772 // Host sends 4 packets with the same size (64 bytes atm). | |
| 773 // Target echoes in this way: | |
| 774 // packet1 -> packet1 | |
| 775 // packet2 -> packet2, packet2 | |
| 776 // packet3 -> packet3 | |
| 777 // packet4 -> /dev/null | |
| 778 // | |
| 779 // The reads/writes are interleaved in a way that should ensure | |
| 780 // the target out buffer to be full before the target starts to read | |
| 781 // packet3. That is, the target should be both receiving (packet3) | |
| 782 // and sending (packet2) at the same time. | |
| 783 | |
| 784 while (size--) { | |
| 785 // block_size -> block_size | |
| 786 chunk_len = block_size; | |
| 787 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 788 chunk_len = block_size; | |
| 789 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 790 | |
| 791 // block_size -> 2 x block_size | |
| 792 chunk_len = block_size; | |
| 793 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 794 chunk_len = block_size; | |
| 795 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 796 chunk_len = block_size; | |
| 797 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 798 | |
| 799 // block_size -> block_size | |
| 800 chunk_len = block_size; | |
| 801 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 802 chunk_len = block_size; | |
| 803 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 804 | |
| 805 // block_size -> 0 | |
| 806 chunk_len = block_size; | |
| 807 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 808 } | |
| 809 | |
| 810 // Kill the CRC. Leave packet verification to the host for now. | |
| 811 xcrc = host_crc = 0; | |
| 812 | |
| 813 // Now read host side's status | |
| 814 chunk_len = 2; | |
| 815 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 816 host_status = in_buffer[0]; | |
| 817 | |
| 818 // Reply that we have completed the test. | |
| 819 { | |
| 820 const char msg_done[] = "DONE"; | |
| 821 | |
| 822 chunk_len = strlen(&msg_done[0]); | |
| 823 Tcyg_io_write(handle, &msg_done[0], &chunk_len); | |
| 824 } | |
| 825 } | |
| 826 break; | |
| 827 default: | |
| 828 CYG_TEST_CHECK(0, "unknown mode"); | |
| 829 } | |
| 830 | |
| 831 | |
| 832 // Verify that the CRC matches the one from the host. | |
| 833 FIX_CRC(xcrc, icrc); | |
| 834 #ifdef __DEVELOPER__ | |
| 835 if (host_crc != icrc) | |
| 836 diag_printf("%d != %d\n", icrc, host_crc); | |
| 837 #endif | |
| 838 CYG_TEST_CHECK(host_crc == icrc, "CRC failed!"); | |
| 839 | |
| 840 // Verify that the host is happy with the data we echoed. | |
| 841 CYG_TEST_CHECK('O' == host_status, "Host failed checksum on echoed data"); | |
| 842 | |
| 843 CYG_TEST_PASS("Binary test completed"); | |
| 844 return TEST_RETURN_OK; | |
| 845 } | |
| 846 | |
| 847 //--------------------------------------------------------------------------- | |
| 848 // Test transformations on text transmissions | |
| 849 // Format out: | |
| 850 // "@TEXT:<mode>!<4 bytes binary checksum><C string>" | |
| 851 // Format in: | |
| 852 // "<C string>" | |
| 853 // OK/ER | |
| 854 // | |
| 855 // Mode: | |
| 856 // MODE_EOP_ECHO: | |
| 857 // Receive data, verify CRC, resend data. | |
| 858 // Expect OK/ER reply from host when done. | |
| 859 // MODE_DUPLEX_ECHO: | |
| 860 // Receive data, echo data, verify CRC. | |
| 861 // Expect OK/ER reply from host when done. | |
| 862 // | |
| 863 cyg_test_return_t | |
| 864 test_text(cyg_io_handle_t handle, cyg_mode_t mode, const char* s_base, | |
| 865 const char* s_out, const char* s_in) | |
| 866 { | |
| 867 return TEST_RETURN_NA; | |
| 868 } | |
| 869 | |
| 870 //--------------------------------------------------------------------------- | |
| 871 // Send PING to host, verifying the filter's presence. | |
| 872 // Format out: | |
| 873 // "@PING!" | |
| 874 // Format in: | |
| 875 // "OK" | |
| 876 // or | |
| 877 // No response if directly connected to GDB. | |
| 878 // | |
| 879 // This call only returns if the ser_filter is listening. Otherwise it | |
| 880 // sends N/A and hangs. | |
| 881 void | |
| 882 test_ping(cyg_io_handle_t handle) | |
| 883 { | |
| 884 char msg[] = "@PING:!"; | |
| 885 char msg2[] = "\n"; | |
| 886 int msglen = strlen(msg); | |
| 887 int res; | |
| 888 | |
| 889 msglen = strlen(msg); | |
| 890 Tcyg_io_write(handle, msg, &msglen); | |
| 891 | |
| 892 // Now read host side's status | |
| 893 msglen = 2; | |
| 894 Tcyg_io_read_timeout(handle, &in_buffer[0], &msglen, 100, &res); | |
| 895 if (ENOERR == res && 'O' == in_buffer[0] && 'K' == in_buffer[1]) | |
| 896 return; | |
| 897 | |
| 898 msglen = strlen(msg2); | |
| 899 Tcyg_io_write(handle, msg2, &msglen); | |
| 900 | |
| 901 CYG_TEST_NA("No host side testing harness detected."); | |
| 902 } | |
| 903 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
904 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
905 //--------------------------------------------------------------------------- |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
906 // Send OPT to host, setting options in the filter. |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
907 // Format out: |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
908 // "@OPT:option1,value1:...:optionN,valueN!" |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
909 // Format in: |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
910 // "OK" |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
911 // |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
912 // Only integer values can be used. Any option not recognized by the |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
913 // filter will be silently ignored. |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
914 void |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
915 test_options(cyg_io_handle_t handle, int count, cyg_uint32* options) |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
916 { |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
917 const char cmd[] = "@OPT:"; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
918 int msglen; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
919 cyg_uint8 *p1; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
920 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
921 // Prepare and send the command. |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
922 p1 = &cmd_buffer[0]; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
923 p1 = strcpy(p1, &cmd[0]); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
924 while(count--) { |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
925 p1 = itoa(p1, *options++); // option |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
926 *p1++ = ':'; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
927 p1 = itoa(p1, *options++); // value |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
928 *p1++ = ':'; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
929 } |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
930 *(p1-1) = '!'; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
931 *p1++ = 0; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
932 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
933 CYG_TEST_INFO(&cmd_buffer[1]); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
934 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
935 msglen = strlen(&cmd_buffer[0]); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
936 Tcyg_io_write(handle, &cmd_buffer[0], &msglen); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
937 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
938 // Now read host side's status |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
939 msglen = 2; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
940 Tcyg_io_read(handle, &in_buffer[0], &msglen); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
941 } |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
942 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
943 |
| 2 | 944 //--------------------------------------------------------------------------- |
| 945 // Some helper functions to get a test started. | |
| 946 void | |
| 947 test_open_ser( cyg_io_handle_t* handle ) | |
| 948 { | |
| 949 #ifndef SER_NOP_TEST | |
| 950 Cyg_ErrNo res; | |
| 951 | |
| 952 if (cyg_test_is_simulator) | |
| 953 CYG_TEST_NA("Cannot run from simulator"); | |
| 954 | |
| 955 #if defined(HAL_VSR_SET_TO_ECOS_HANDLER) | |
| 956 # if defined(SER_OVERRIDE_INT_1) | |
| 957 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_1, NULL); | |
| 958 # endif | |
| 959 # if defined(SER_OVERRIDE_INT_2) | |
| 960 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_2, NULL); | |
| 961 # endif | |
| 962 #endif | |
| 963 | |
| 964 res = cyg_io_lookup(TEST_SER_DEV, handle); | |
| 965 if (res != ENOERR) { | |
| 966 CYG_TEST_FAIL_FINISH("Can't lookup " TEST_SER_DEV); | |
| 967 } | |
| 968 #else | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
969 CYG_TEST_NA(NA_MSG); |
| 2 | 970 #endif |
| 971 } | |
| 972 | |
| 973 void | |
| 974 test_open_tty( cyg_io_handle_t* handle ) | |
| 975 { | |
| 976 #ifndef TTY_NOP_TEST | |
| 977 Cyg_ErrNo res; | |
| 978 | |
| 979 if (cyg_test_is_simulator) | |
| 980 CYG_TEST_NA("Cannot run from simulator"); | |
| 981 | |
| 982 #if defined(HAL_VSR_SET_TO_ECOS_HANDLER) | |
| 983 # if defined(SER_OVERRIDE_INT_1) | |
| 984 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_1, NULL); | |
| 985 # endif | |
| 986 # if defined(SER_OVERRIDE_INT_2) | |
| 987 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_2, NULL); | |
| 988 # endif | |
| 989 #endif | |
| 990 | |
| 991 res = cyg_io_lookup(TEST_TTY_DEV, handle); | |
| 992 if (res != ENOERR) { | |
| 993 CYG_TEST_FAIL_FINISH("Can't lookup " TEST_TTY_DEV); | |
| 994 } | |
| 995 #else | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
996 CYG_TEST_NA(NA_MSG); |
| 2 | 997 #endif |
| 998 } | |
| 999 | |
| 1000 //--------------------------------------------------------------------------- | |
| 1001 // end of ser_test_protocol.inl |
