Mercurial > ecos
annotate packages/io/serial/current/tests/ser_test_protocol.inl @ 16:4f2df4ab82c8 ecos-sw-1999-06-18
Merge from eCos master repository on 1999-06-18-15:25:04-BST
| author | jlarmour |
|---|---|
| date | Fri, 18 Jun 1999 07:59:09 +0000 |
| parents | d3fbcdfa1b2f |
| children | 5f5102441818 |
| 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: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
418 // Write 'T'-chars to the host. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
419 // The host will echo anything it reads until it sees a 'O' character. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
420 // Continue until four 'T'-chars has been read back. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
421 // Then send a single 'O'-character. This will signal success to the host. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
422 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
423 // If the synchronization has not succeeded within 100 ticks |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
424 // (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
|
425 // 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
|
426 // 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
|
427 // a failure. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
428 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
429 // To Do: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
430 // Host&protocol currently only supports: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
431 // - no/even parity |
| 2 | 432 int |
| 433 change_config(cyg_io_handle_t handle, cyg_ser_cfg_t* cfg) | |
| 434 { | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
435 cyg_serial_info_t old_cfg, new_cfg; |
| 2 | 436 const char cmd[] = "@CONFIG:"; |
| 437 char reply[2]; | |
| 438 int msglen; | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
439 int res, len; |
| 2 | 440 cyg_uint8 *p1; |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
441 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
442 // Prepare the command. |
| 2 | 443 p1 = &cmd_buffer[0]; |
| 444 p1 = strcpy(p1, &cmd[0]); | |
| 445 p1 = itoa(p1, cfg->baud_rate); | |
| 446 *p1++ = ':'; | |
| 447 p1 = itoa(p1, cfg->data_bits); | |
| 448 *p1++ = ':'; | |
| 449 p1 = itoa(p1, cfg->stop_bits); | |
| 450 *p1++ = ':'; | |
| 451 p1 = itoa(p1, cfg->parity); | |
| 452 *p1++ = '!'; | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
453 *p1 = 0; // note: we may append to this later |
| 2 | 454 |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
455 // Tell user what we're up to. |
| 2 | 456 CYG_TEST_INFO(&cmd_buffer[1]); |
| 457 | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
458 // 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
|
459 len = sizeof(old_cfg); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
460 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
|
461 &old_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
462 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
|
463 &new_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
464 if (res != ENOERR) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
465 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
|
466 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
467 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
468 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
469 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
|
470 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
|
471 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
|
472 new_cfg.parity = cfg->parity; |
|
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 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
|
475 &new_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
476 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
477 // 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
|
478 // safe to return now. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
479 if (ENOERR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
480 // 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
|
481 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
|
482 p1 = strcpy(p1, txt_tskipped); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
483 *p1 = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
484 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
|
485 return res; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
486 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
487 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
488 // 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
|
489 // with the host. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
490 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
|
491 &old_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
492 if (ENOERR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
493 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
|
494 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
495 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
496 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
497 // Send command to host and read host's reply. |
| 2 | 498 msglen = strlen(&cmd_buffer[0]); |
| 499 Tcyg_io_write(handle, &cmd_buffer[0], &msglen); | |
| 500 msglen = 2; | |
| 501 Tcyg_io_read(handle, &reply[0], &msglen); | |
| 502 | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
503 // Did host accept configuration? |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
504 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
|
505 // 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
|
506 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
|
507 p1 = strcpy(p1, txt_hskipped); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
508 *p1 = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
509 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
|
510 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
|
511 reply[0], reply[1]); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
512 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
513 res = ENOSUPP; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
514 return res; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
515 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
516 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
517 // Now test the new configuration: Loop until we read what we |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
518 // write. This may hang (as seen from the host), but only when we |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
519 // get totally lost, in which case there's not much else to do |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
520 // really. In this case the host will consider the test a FAIL. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
521 len = sizeof(new_cfg); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
522 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
|
523 &new_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
524 if (ENOERR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
525 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
|
526 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
527 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
528 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
529 // Note: Only sends a single char - a string wuld be safer, but if |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
530 // there's not a 1-1 relationship between outgoing and incoming |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
531 // chars, the reader needs to be smarter. Compensate by |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
532 // requirering the char to be read 4 times in succession. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
533 for (;;) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
534 int change_succeeded = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
535 int using_old_config = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
536 int matches = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
537 char in_buf[1]; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
538 int len; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
539 char out_buf[1]; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
540 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
541 out_buf[0] = 'a'; |
| 2 | 542 |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
543 aborted = 0; // global abort flag |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
544 // FIXME: Timeout time needs to be configurable, and needs to |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
545 // be sent to the host before getting here. That would allow |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
546 // changing the timeout by just rebuilding the test - without |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
547 // changing the host software. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
548 r_stamp = timeout(100, do_abort, handle); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
549 while (!aborted) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
550 len = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
551 res = cyg_io_write(handle, out_buf, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
552 if (ENOERR != res && -EINTR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
553 // We may have to reset the driver here if the fail |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
554 // was due to a framing or parity error. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
555 break; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
556 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
557 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
558 len = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
559 res = cyg_io_read(handle, in_buf, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
560 if (ENOERR != res && -EINTR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
561 // We may have to reset the driver here if the fail |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
562 // was due to a framing or parity error. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
563 break; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
564 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
565 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
566 // Check for match. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
567 if (out_buf[0] == in_buf[0]) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
568 matches++; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
569 // We want 4 in succession before we accept it. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
570 if (4 == matches) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
571 change_succeeded = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
572 break; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
573 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
574 } else |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
575 matches = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
576 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
577 untimeout(r_stamp); |
|
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 // Did we succeed? |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
580 if (change_succeeded) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
581 // Yup! Send 'O' to host so it knows we're OK. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
582 const char ok_str[1] = "O"; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
583 len = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
584 res = cyg_io_write(handle, ok_str, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
585 if (res != ENOERR) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
586 diag_printf("write failed - DEVIO error: %d\n", res); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
587 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
588 } |
| 2 | 589 |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
590 // Now wait for the 'O' to be echoed so we know both lines |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
591 // have been emptied. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
592 r_stamp = timeout(100, do_abort, handle); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
593 do { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
594 len = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
595 res = cyg_io_read(handle, in_buf, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
596 CYG_ASSERT(ENOERR == res, "Failed when waiting for 'O'"); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
597 } while ('O' != in_buf[0]); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
598 untimeout(r_stamp); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
599 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
600 // If we had to revert to the old configuration, return error. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
601 if (using_old_config) |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
602 return -EIO; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
603 else |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
604 return ENOERR; |
| 2 | 605 } |
| 606 | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
607 // We didn't. Due to an IO error? |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
608 if (ENOERR != res && -EINTR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
609 // We may have to reset the driver if the fail was due to |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
610 // a framing or parity error. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
611 } |
| 2 | 612 |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
613 // Revert to the old configuration and try again. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
614 len = sizeof(old_cfg); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
615 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
|
616 &old_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
617 if (res != ENOERR) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
618 diag_printf("change_config: set_config failed/3 (%d)\n", res); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
619 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
620 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
621 out_buf[0] = 't'; // change the char so a developer can |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
622 // see this has happened by the chars |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
623 // being written. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
624 using_old_config = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
625 } |
| 2 | 626 } |
| 627 | |
| 628 | |
| 629 //----------------------------------------------------------------------------- | |
| 630 // Host sends CRC in decimal ASCII, terminated with ! | |
| 631 int | |
| 632 read_host_crc(cyg_io_handle_t handle) | |
| 633 { | |
| 634 int crc, len; | |
| 635 cyg_uint8 ch; | |
| 636 | |
| 637 crc = 0; | |
| 638 while (1) { | |
| 639 len = 1; | |
| 640 Tcyg_io_read(handle, &ch, &len); | |
| 641 if ('!' == ch) | |
| 642 break; | |
| 643 | |
| 644 #ifdef __DEVELOPER__ | |
| 645 if (!((ch >= '0' && ch <= '9'))){ | |
| 646 diag_printf("CHAR: %02x\n", ch); | |
| 647 } | |
| 648 #endif | |
| 649 | |
| 650 CYG_TEST_CHECK((ch >= '0' && ch <= '9'), | |
| 651 "Illegal CRC format from host"); | |
| 652 | |
| 653 crc = crc*10 + (ch - '0'); | |
| 654 } | |
| 655 | |
| 656 return crc; | |
| 657 } | |
| 658 | |
| 659 //--------------------------------------------------------------------------- | |
| 660 // Test binary data transmission. | |
| 661 // Format out: | |
| 662 // "@BINARY:<byte size>:<mode>!" | |
| 663 // Format in: | |
| 664 // <checksum>!<#size bytes data> | |
| 665 // For echo modes, also: | |
| 666 // Format out: | |
| 667 // <#size bytes data> | |
| 668 // Format in: | |
| 669 // OK/ER | |
| 670 // Format out: | |
| 671 // DONE | |
| 672 // | |
| 673 // The last DONE allows the host to eat bytes if target is sending too many. | |
| 674 // | |
| 675 // Mode: | |
| 676 // MODE_NO_ECHO: | |
| 677 // Just receive data and verify CRC. | |
| 678 // MODE_EOP_ECHO: | |
| 679 // Receive data, verify CRC, resend data. | |
| 680 // Expect OK/ER reply from host when done. | |
| 681 // MODE_DUPLEX_ECHO: | |
| 682 // Receive data, echo data, verify CRC. | |
| 683 // Expect OK/ER reply from host when done. | |
| 684 // | |
| 685 // Note: | |
| 686 // Using diag_printf while talking with the host may cause some funky | |
| 687 // errors (bytes from the host side being lost!?!?) | |
| 688 // | |
| 689 // To Do: | |
| 690 // MODE_DUPLEX_ECHO: | |
| 691 // The current implementation is simple and may not stress the | |
| 692 // driver enough. Also, it's command packet format doesn't match | |
| 693 // that of the other modes. | |
| 694 cyg_test_return_t | |
| 695 test_binary(cyg_io_handle_t handle, int size, cyg_mode_t mode) | |
| 696 { | |
| 697 const char cmd[] = "@BINARY:"; | |
| 698 int msglen; | |
| 699 cyg_uint32 xcrc; | |
| 700 int icrc, host_crc; | |
| 701 cyg_uint8 *p1; | |
| 702 cyg_int8 host_status = 'O'; // host is happy by default | |
| 703 | |
| 704 // Verify that the test can be run with available ressources. | |
| 705 if (MODE_EOP_ECHO == mode && size > IN_BUFFER_SIZE) | |
| 706 return TEST_RETURN_NA; | |
| 707 | |
| 708 // Prepare and send the command. | |
| 709 p1 = &cmd_buffer[0]; | |
| 710 p1 = strcpy(p1, &cmd[0]); | |
| 711 p1 = itoa(p1, size); | |
| 712 *p1++ = ':'; | |
| 713 p1 = itoa(p1, mode); | |
| 714 *p1++ = '!'; | |
| 715 *p1++ = 0; | |
| 716 | |
| 717 CYG_TEST_INFO(&cmd_buffer[1]); | |
| 718 | |
| 719 msglen = strlen(&cmd_buffer[0]); | |
| 720 Tcyg_io_write(handle, &cmd_buffer[0], &msglen); | |
| 721 | |
| 722 // Get CRC back. | |
| 723 host_crc = read_host_crc(handle); | |
| 724 | |
| 725 // Depending on mode, start reading data. | |
| 726 xcrc = 0; | |
| 727 switch (mode) { | |
| 728 case MODE_NO_ECHO: | |
| 729 { | |
| 730 // Break transfers into chunks no larger than the buffer size. | |
| 731 int tx_len, chunk_len, i; | |
| 732 while (size > 0) { | |
| 733 chunk_len = min(IN_BUFFER_SIZE, size); | |
| 734 tx_len = chunk_len; | |
| 735 size -= chunk_len; | |
| 736 | |
| 737 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 738 | |
| 739 for (i = 0; i < tx_len; i++) { | |
| 740 ADD_CRC_BYTE(xcrc, in_buffer[i]); | |
| 741 } | |
| 742 } | |
| 743 | |
| 744 // Reply that we have completed the test. | |
| 745 { | |
| 746 const char msg_done[] = "DONE"; | |
| 747 | |
| 748 chunk_len = strlen(&msg_done[0]); | |
| 749 Tcyg_io_write(handle, &msg_done[0], &chunk_len); | |
| 750 } | |
| 751 | |
| 752 } | |
| 753 break; | |
| 754 case MODE_EOP_ECHO: | |
| 755 { | |
| 756 // We have already checked that the in buffer is large enough. | |
| 757 int i, tx_len, chunk_len; | |
| 758 chunk_len = tx_len = size; | |
| 759 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 760 | |
| 761 for (i = 0; i < tx_len; i++) { | |
| 762 ADD_CRC_BYTE(xcrc, in_buffer[i]); | |
| 763 } | |
| 764 | |
| 765 // Echo data back. | |
| 766 chunk_len = size; | |
| 767 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 768 | |
| 769 // Now read host side's status | |
| 770 chunk_len = 2; | |
| 771 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 772 host_status = in_buffer[0]; | |
| 773 | |
| 774 // Reply that we have completed the test. | |
| 775 { | |
| 776 const char msg_done[] = "DONE"; | |
| 777 | |
| 778 chunk_len = strlen(&msg_done[0]); | |
| 779 Tcyg_io_write(handle, &msg_done[0], &chunk_len); | |
| 780 } | |
| 781 } | |
| 782 break; | |
| 783 case MODE_DUPLEX_ECHO: | |
| 784 { | |
| 785 int chunk_len; | |
| 786 int block_size = 64; | |
| 787 | |
| 788 // This is a simple implementation (maybe too simple). | |
| 789 // Host sends 4 packets with the same size (64 bytes atm). | |
| 790 // Target echoes in this way: | |
| 791 // packet1 -> packet1 | |
| 792 // packet2 -> packet2, packet2 | |
| 793 // packet3 -> packet3 | |
| 794 // packet4 -> /dev/null | |
| 795 // | |
| 796 // The reads/writes are interleaved in a way that should ensure | |
| 797 // the target out buffer to be full before the target starts to read | |
| 798 // packet3. That is, the target should be both receiving (packet3) | |
| 799 // and sending (packet2) at the same time. | |
| 800 | |
| 801 while (size--) { | |
| 802 // block_size -> block_size | |
| 803 chunk_len = block_size; | |
| 804 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 805 chunk_len = block_size; | |
| 806 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 807 | |
| 808 // block_size -> 2 x block_size | |
| 809 chunk_len = block_size; | |
| 810 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 811 chunk_len = block_size; | |
| 812 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 813 chunk_len = block_size; | |
| 814 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 815 | |
| 816 // block_size -> block_size | |
| 817 chunk_len = block_size; | |
| 818 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 819 chunk_len = block_size; | |
| 820 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 821 | |
| 822 // block_size -> 0 | |
| 823 chunk_len = block_size; | |
| 824 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 825 } | |
| 826 | |
| 827 // Kill the CRC. Leave packet verification to the host for now. | |
| 828 xcrc = host_crc = 0; | |
| 829 | |
| 830 // Now read host side's status | |
| 831 chunk_len = 2; | |
| 832 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 833 host_status = in_buffer[0]; | |
| 834 | |
| 835 // Reply that we have completed the test. | |
| 836 { | |
| 837 const char msg_done[] = "DONE"; | |
| 838 | |
| 839 chunk_len = strlen(&msg_done[0]); | |
| 840 Tcyg_io_write(handle, &msg_done[0], &chunk_len); | |
| 841 } | |
| 842 } | |
| 843 break; | |
| 844 default: | |
| 845 CYG_TEST_CHECK(0, "unknown mode"); | |
| 846 } | |
| 847 | |
| 848 | |
| 849 // Verify that the CRC matches the one from the host. | |
| 850 FIX_CRC(xcrc, icrc); | |
| 851 #ifdef __DEVELOPER__ | |
| 852 if (host_crc != icrc) | |
| 853 diag_printf("%d != %d\n", icrc, host_crc); | |
| 854 #endif | |
| 855 CYG_TEST_CHECK(host_crc == icrc, "CRC failed!"); | |
| 856 | |
| 857 // Verify that the host is happy with the data we echoed. | |
| 858 CYG_TEST_CHECK('O' == host_status, "Host failed checksum on echoed data"); | |
| 859 | |
| 860 CYG_TEST_PASS("Binary test completed"); | |
| 861 return TEST_RETURN_OK; | |
| 862 } | |
| 863 | |
| 864 //--------------------------------------------------------------------------- | |
| 865 // Test transformations on text transmissions | |
| 866 // Format out: | |
| 867 // "@TEXT:<mode>!<4 bytes binary checksum><C string>" | |
| 868 // Format in: | |
| 869 // "<C string>" | |
| 870 // OK/ER | |
| 871 // | |
| 872 // Mode: | |
| 873 // MODE_EOP_ECHO: | |
| 874 // Receive data, verify CRC, resend data. | |
| 875 // Expect OK/ER reply from host when done. | |
| 876 // MODE_DUPLEX_ECHO: | |
| 877 // Receive data, echo data, verify CRC. | |
| 878 // Expect OK/ER reply from host when done. | |
| 879 // | |
| 880 cyg_test_return_t | |
| 881 test_text(cyg_io_handle_t handle, cyg_mode_t mode, const char* s_base, | |
| 882 const char* s_out, const char* s_in) | |
| 883 { | |
| 884 return TEST_RETURN_NA; | |
| 885 } | |
| 886 | |
| 887 //--------------------------------------------------------------------------- | |
| 888 // Send PING to host, verifying the filter's presence. | |
| 889 // Format out: | |
| 890 // "@PING!" | |
| 891 // Format in: | |
| 892 // "OK" | |
| 893 // or | |
| 894 // No response if directly connected to GDB. | |
| 895 // | |
| 896 // This call only returns if the ser_filter is listening. Otherwise it | |
| 897 // sends N/A and hangs. | |
| 898 void | |
| 899 test_ping(cyg_io_handle_t handle) | |
| 900 { | |
| 901 char msg[] = "@PING:!"; | |
| 902 char msg2[] = "\n"; | |
| 903 int msglen = strlen(msg); | |
| 904 int res; | |
| 905 | |
| 906 msglen = strlen(msg); | |
| 907 Tcyg_io_write(handle, msg, &msglen); | |
| 908 | |
| 909 // Now read host side's status | |
| 910 msglen = 2; | |
| 911 Tcyg_io_read_timeout(handle, &in_buffer[0], &msglen, 100, &res); | |
| 912 if (ENOERR == res && 'O' == in_buffer[0] && 'K' == in_buffer[1]) | |
| 913 return; | |
| 914 | |
| 915 msglen = strlen(msg2); | |
| 916 Tcyg_io_write(handle, msg2, &msglen); | |
| 917 | |
| 918 CYG_TEST_NA("No host side testing harness detected."); | |
| 919 } | |
| 920 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
921 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
922 //--------------------------------------------------------------------------- |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
923 // 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
|
924 // Format out: |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
925 // "@OPT:option1,value1:...:optionN,valueN!" |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
926 // Format in: |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
927 // "OK" |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
928 // |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
929 // 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
|
930 // filter will be silently ignored. |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
931 void |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
932 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
|
933 { |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
934 const char cmd[] = "@OPT:"; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
935 int msglen; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
936 cyg_uint8 *p1; |
|
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 // Prepare and send the command. |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
939 p1 = &cmd_buffer[0]; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
940 p1 = strcpy(p1, &cmd[0]); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
941 while(count--) { |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
942 p1 = itoa(p1, *options++); // option |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
943 *p1++ = ':'; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
944 p1 = itoa(p1, *options++); // value |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
945 *p1++ = ':'; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
946 } |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
947 *(p1-1) = '!'; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
948 *p1++ = 0; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
949 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
950 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
|
951 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
952 msglen = strlen(&cmd_buffer[0]); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
953 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
|
954 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
955 // 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
|
956 msglen = 2; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
957 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
|
958 } |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
959 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
960 |
| 2 | 961 //--------------------------------------------------------------------------- |
| 962 // Some helper functions to get a test started. | |
| 963 void | |
| 964 test_open_ser( cyg_io_handle_t* handle ) | |
| 965 { | |
| 966 #ifndef SER_NOP_TEST | |
| 967 Cyg_ErrNo res; | |
| 968 | |
| 969 if (cyg_test_is_simulator) | |
| 970 CYG_TEST_NA("Cannot run from simulator"); | |
| 971 | |
| 972 #if defined(HAL_VSR_SET_TO_ECOS_HANDLER) | |
| 973 # if defined(SER_OVERRIDE_INT_1) | |
| 974 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_1, NULL); | |
| 975 # endif | |
| 976 # if defined(SER_OVERRIDE_INT_2) | |
| 977 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_2, NULL); | |
| 978 # endif | |
| 979 #endif | |
| 980 | |
| 981 res = cyg_io_lookup(TEST_SER_DEV, handle); | |
| 982 if (res != ENOERR) { | |
| 983 CYG_TEST_FAIL_FINISH("Can't lookup " TEST_SER_DEV); | |
| 984 } | |
| 985 #else | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
986 CYG_TEST_NA(NA_MSG); |
| 2 | 987 #endif |
| 988 } | |
| 989 | |
| 990 void | |
| 991 test_open_tty( cyg_io_handle_t* handle ) | |
| 992 { | |
| 993 #ifndef TTY_NOP_TEST | |
| 994 Cyg_ErrNo res; | |
| 995 | |
| 996 if (cyg_test_is_simulator) | |
| 997 CYG_TEST_NA("Cannot run from simulator"); | |
| 998 | |
| 999 #if defined(HAL_VSR_SET_TO_ECOS_HANDLER) | |
| 1000 # if defined(SER_OVERRIDE_INT_1) | |
| 1001 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_1, NULL); | |
| 1002 # endif | |
| 1003 # if defined(SER_OVERRIDE_INT_2) | |
| 1004 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_2, NULL); | |
| 1005 # endif | |
| 1006 #endif | |
| 1007 | |
| 1008 res = cyg_io_lookup(TEST_TTY_DEV, handle); | |
| 1009 if (res != ENOERR) { | |
| 1010 CYG_TEST_FAIL_FINISH("Can't lookup " TEST_TTY_DEV); | |
| 1011 } | |
| 1012 #else | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
1013 CYG_TEST_NA(NA_MSG); |
| 2 | 1014 #endif |
| 1015 } | |
| 1016 | |
| 1017 //--------------------------------------------------------------------------- | |
| 1018 // end of ser_test_protocol.inl |
