Mercurial > ecos
annotate packages/io/serial/current/tests/ser_test_protocol.inl @ 10:d3fbcdfa1b2f ecos-sw-1999-05-29
Merge from eCos master repository on 1999-05-29-00:13:11-BST
| author | jlarmour |
|---|---|
| date | Fri, 28 May 1999 16:43:09 +0000 |
| parents | d376b777e2ce |
| children | 4f2df4ab82c8 |
| 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[] = { | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
216 |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
217 #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
|
218 { 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
|
219 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
|
220 #endif |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
221 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
222 { 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
|
223 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
|
224 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
225 { 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
|
226 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
|
227 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
228 #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
|
229 !defined(CYGPKG_HAL_ARM_AEB) |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
230 { CYGNUM_SERIAL_BAUD_38400, CYGNUM_SERIAL_WORD_LENGTH_8, |
| 2 | 231 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE }, |
| 232 #endif | |
| 233 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
234 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && \ |
| 2 | 235 !defined(CYGPKG_HAL_ARM_AEB) && \ |
| 236 !defined(CYGPKG_HAL_SPARCLITE_SLEB) | |
| 237 { CYGNUM_SERIAL_BAUD_57600, CYGNUM_SERIAL_WORD_LENGTH_8, | |
| 238 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE }, | |
| 239 #endif | |
| 240 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
241 #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
|
242 !defined(CYGPKG_HAL_ARM_PID) && \ |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
243 !defined(CYGPKG_HAL_ARM_AEB) && \ |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
244 !defined(CYGPKG_HAL_MN10300_STDEVAL1) && \ |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
245 !defined(CYGPKG_HAL_SPARCLITE_SLEB) |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
246 { CYGNUM_SERIAL_BAUD_115200, CYGNUM_SERIAL_WORD_LENGTH_8, |
| 2 | 247 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_NONE }, |
| 248 #endif | |
| 249 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
250 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && \ |
| 2 | 251 !defined(CYGPKG_HAL_ARM_AEB) && \ |
| 252 !defined(CYGPKG_HAL_ARM_PID) | |
| 253 // One stop bit, even parity | |
| 254 { CYGNUM_SERIAL_BAUD_19200, CYGNUM_SERIAL_WORD_LENGTH_8, | |
| 255 CYGNUM_SERIAL_STOP_1, CYGNUM_SERIAL_PARITY_EVEN }, | |
| 256 #endif | |
| 257 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
258 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) && \ |
| 2 | 259 !defined(CYGPKG_HAL_ARM_AEB) && \ |
| 260 !defined(CYGPKG_HAL_ARM_PID) | |
| 261 // Two stop bits, even parity | |
| 262 { CYGNUM_SERIAL_BAUD_19200, CYGNUM_SERIAL_WORD_LENGTH_8, | |
| 263 CYGNUM_SERIAL_STOP_2, CYGNUM_SERIAL_PARITY_EVEN }, | |
| 264 #endif | |
| 265 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
266 #if !defined(CYGPKG_HAL_MIPS_TX39_JMR3904) |
| 2 | 267 // Two stop bits, no parity |
| 268 { CYGNUM_SERIAL_BAUD_19200, CYGNUM_SERIAL_WORD_LENGTH_8, | |
| 269 CYGNUM_SERIAL_STOP_2, CYGNUM_SERIAL_PARITY_NONE }, | |
| 270 #endif | |
| 271 }; | |
| 272 | |
| 273 //---------------------------------------------------------------------------- | |
| 274 // Macros to help extract values from the argument string. | |
| 275 // Note: This is probably not an ideal solution, but it was easy to make :) | |
| 276 | |
| 277 #define INIT_VALUE(__args) \ | |
| 278 unsigned int v; \ | |
| 279 char *__ptr1, *__ptr2 = (__args) | |
| 280 | |
| 281 #define SET_VALUE(__slot) \ | |
| 282 do { \ | |
| 283 __ptr1 = index(__ptr2, (int) ':'); \ | |
| 284 if (__ptr1) \ | |
| 285 *__ptr1 = 0; \ | |
| 286 v = atoi(__ptr2); \ | |
| 287 __ptr2 = __ptr1+1; \ | |
| 288 (__slot) = v; \ | |
| 289 } while (0) | |
| 290 | |
| 291 | |
| 292 //---------------------------------------------------------------------------- | |
| 293 // CRC magic - it's a bit of a hack for now. | |
| 294 // FIXME: standard definition? | |
| 295 #define ADD_CRC_BYTE(__crc, __c) \ | |
| 296 CYG_MACRO_START \ | |
| 297 (__crc) = ((__crc) << 1) ^ (__c); \ | |
| 298 CYG_MACRO_END | |
| 299 | |
| 300 // FIXME: Hack to allow easy ASCII transfer. | |
| 301 #define FIX_CRC(__crc, __icrc) \ | |
| 302 CYG_MACRO_START \ | |
| 303 __icrc = (int) (__crc); \ | |
| 304 if (__icrc < 0) \ | |
| 305 __icrc = -__icrc; \ | |
| 306 CYG_MACRO_END | |
| 307 | |
| 308 //---------------------------------------------------------------------------- | |
| 309 // 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
|
310 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
|
311 static volatile int aborted; |
| 2 | 312 |
| 313 // This routine will be called if the read "times out" | |
| 314 static void | |
| 315 do_abort(void *handle) | |
| 316 { | |
| 317 cyg_io_handle_t io_handle = (cyg_io_handle_t)handle; | |
| 318 cyg_int32 len = 1; // Need something here | |
| 319 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
|
320 aborted = 1; |
| 2 | 321 } |
| 322 #include "timeout.inl" | |
| 323 | |
| 324 // Read with timeout (__t = timeout in ticks, int* __r = result) | |
| 325 #define Tcyg_io_read_timeout(__h, __d, __l, __t, __r) \ | |
| 326 CYG_MACRO_START \ | |
| 327 int __res; \ | |
| 328 r_stamp = timeout((__t), do_abort, (__h)); \ | |
| 329 __res = cyg_io_read((__h), (__d), (__l)); \ | |
| 330 CYG_TEST_CHECK((ENOERR == __res || -EINTR == __res),"cyg_io_read failed");\ | |
| 331 *(__r) = __res; \ | |
| 332 untimeout(r_stamp); \ | |
| 333 CYG_MACRO_END | |
| 334 | |
| 335 #define Tcyg_io_read(__h, __d, __l) \ | |
| 336 CYG_MACRO_START \ | |
| 337 int __res = cyg_io_read((__h), (__d), (__l)); \ | |
| 338 CYG_TEST_CHECK(ENOERR == __res, "cyg_io_read failed"); \ | |
| 339 CYG_MACRO_END | |
| 340 | |
| 341 #define Tcyg_io_write(__h, __d, __l) \ | |
| 342 CYG_MACRO_START \ | |
| 343 int __res; \ | |
| 344 cyg_uint32 __len = 1; \ | |
| 345 __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
|
346 if (ENOERR != __res) diag_printf("[%d]\n", __res); \ |
| 2 | 347 CYG_TEST_CHECK(ENOERR == __res, "cyg_io_write failed"); \ |
| 348 __res = cyg_io_get_config((__h), \ | |
| 349 CYG_IO_GET_CONFIG_SERIAL_OUTPUT_DRAIN, \ | |
| 350 0, &__len); \ | |
| 351 CYG_TEST_CHECK(ENOERR == __res, "DRAIN failed"); \ | |
| 352 CYG_MACRO_END | |
| 353 | |
| 354 | |
| 355 //---------------------------------------------------------------------------- | |
| 356 // Some libc like functions that are handy to have around. | |
| 357 static int | |
| 358 strlen(const char *c) | |
| 359 { | |
| 360 int l = 0; | |
| 361 while (*c++) l++; | |
| 362 return l; | |
| 363 } | |
| 364 | |
| 365 static char* | |
| 366 strcpy(char* dest, const char* src) | |
| 367 { | |
| 368 char c; | |
| 369 while ((c = *src++)) { | |
| 370 *dest++ = c; | |
| 371 } | |
| 372 *dest = c; | |
| 373 | |
| 374 return dest; | |
| 375 } | |
| 376 | |
| 377 static char* | |
| 378 itoa(char* dest, int v) | |
| 379 { | |
| 380 char b[16]; | |
| 381 char* p = &b[16]; | |
| 382 | |
| 383 *--p = 0; | |
| 384 if (v) { | |
| 385 while (v){ | |
| 386 *--p = (v % 10) + '0'; | |
| 387 v = v / 10; | |
| 388 } | |
| 389 } else | |
| 390 *--p = '0'; | |
| 391 | |
| 392 return strcpy(dest, p); | |
| 393 } | |
| 394 | |
| 395 #define min(_a, _b) ((_a) < (_b)) ? (_a) : (_b) | |
| 396 | |
| 397 void | |
| 398 hang(void) | |
| 399 { | |
| 400 while (1); | |
| 401 } | |
| 402 | |
| 403 //----------------------------------------------------------------------------- | |
| 404 // Configuration changing function. | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
405 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
406 // 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
|
407 // can handle the config. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
408 // If not, return error. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
409 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
410 // 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
|
411 // Format out: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
412 // "@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
|
413 // Format in: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
414 // OK/ER |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
415 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
416 // On ER, return error. |
| 2 | 417 // |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
418 // 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
|
419 // 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
|
420 // 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
|
421 // 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
|
422 // 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
|
423 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
424 // 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
|
425 // (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
|
426 // 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
|
427 // 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
|
428 // a failure. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
429 // |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
430 // To Do: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
431 // Host&protocol currently only supports: |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
432 // - no/even parity |
| 2 | 433 int |
| 434 change_config(cyg_io_handle_t handle, cyg_ser_cfg_t* cfg) | |
| 435 { | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
436 cyg_serial_info_t old_cfg, new_cfg; |
| 2 | 437 const char cmd[] = "@CONFIG:"; |
| 438 char reply[2]; | |
| 439 int msglen; | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
440 int res, len; |
| 2 | 441 cyg_uint8 *p1; |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
442 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
443 // Prepare the command. |
| 2 | 444 p1 = &cmd_buffer[0]; |
| 445 p1 = strcpy(p1, &cmd[0]); | |
| 446 p1 = itoa(p1, cfg->baud_rate); | |
| 447 *p1++ = ':'; | |
| 448 p1 = itoa(p1, cfg->data_bits); | |
| 449 *p1++ = ':'; | |
| 450 p1 = itoa(p1, cfg->stop_bits); | |
| 451 *p1++ = ':'; | |
| 452 p1 = itoa(p1, cfg->parity); | |
| 453 *p1++ = '!'; | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
454 *p1 = 0; // note: we may append to this later |
| 2 | 455 |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
456 // Tell user what we're up to. |
| 2 | 457 CYG_TEST_INFO(&cmd_buffer[1]); |
| 458 | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
459 // 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
|
460 len = sizeof(old_cfg); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
461 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
|
462 &old_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
463 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
|
464 &new_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
465 if (res != ENOERR) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
466 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
|
467 hang(); |
|
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 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
470 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
|
471 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
|
472 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
|
473 new_cfg.parity = cfg->parity; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
474 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
475 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
|
476 &new_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
477 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
478 // 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
|
479 // safe to return now. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
480 if (ENOERR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
481 // 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
|
482 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
|
483 p1 = strcpy(p1, txt_tskipped); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
484 *p1 = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
485 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
|
486 return res; |
|
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 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
489 // 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
|
490 // with the host. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
491 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
|
492 &old_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
493 if (ENOERR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
494 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
|
495 hang(); |
|
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 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
498 // Send command to host and read host's reply. |
| 2 | 499 msglen = strlen(&cmd_buffer[0]); |
| 500 Tcyg_io_write(handle, &cmd_buffer[0], &msglen); | |
| 501 msglen = 2; | |
| 502 Tcyg_io_read(handle, &reply[0], &msglen); | |
| 503 | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
504 // Did host accept configuration? |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
505 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
|
506 // 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
|
507 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
|
508 p1 = strcpy(p1, txt_hskipped); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
509 *p1 = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
510 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
|
511 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
|
512 reply[0], reply[1]); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
513 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
514 res = ENOSUPP; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
515 return res; |
|
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 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
518 // 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
|
519 // 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
|
520 // 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
|
521 // 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
|
522 len = sizeof(new_cfg); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
523 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
|
524 &new_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
525 if (ENOERR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
526 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
|
527 hang(); |
|
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 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
530 // 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
|
531 // 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
|
532 // 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
|
533 // 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
|
534 for (;;) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
535 int change_succeeded = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
536 int using_old_config = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
537 int matches = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
538 char in_buf[1]; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
539 int len; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
540 char out_buf[1]; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
541 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
542 out_buf[0] = 'a'; |
| 2 | 543 |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
544 aborted = 0; // global abort flag |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
545 // 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
|
546 // 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
|
547 // 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
|
548 // changing the host software. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
549 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
|
550 while (!aborted) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
551 len = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
552 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
|
553 if (ENOERR != res && -EINTR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
554 // 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
|
555 // 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
|
556 break; |
|
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 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
559 len = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
560 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
|
561 if (ENOERR != res && -EINTR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
562 // 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
|
563 // 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
|
564 break; |
|
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 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
567 // Check for match. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
568 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
|
569 matches++; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
570 // 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
|
571 if (4 == matches) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
572 change_succeeded = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
573 break; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
574 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
575 } else |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
576 matches = 0; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
577 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
578 untimeout(r_stamp); |
|
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 // Did we succeed? |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
581 if (change_succeeded) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
582 // 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
|
583 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
|
584 len = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
585 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
|
586 if (res != ENOERR) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
587 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
|
588 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
589 } |
| 2 | 590 |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
591 // 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
|
592 // have been emptied. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
593 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
|
594 do { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
595 len = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
596 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
|
597 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
|
598 } while ('O' != in_buf[0]); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
599 untimeout(r_stamp); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
600 |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
601 // 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
|
602 if (using_old_config) |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
603 return -EIO; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
604 else |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
605 return ENOERR; |
| 2 | 606 } |
| 607 | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
608 // 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
|
609 if (ENOERR != res && -EINTR != res) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
610 // 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
|
611 // a framing or parity error. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
612 } |
| 2 | 613 |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
614 // 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
|
615 len = sizeof(old_cfg); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
616 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
|
617 &old_cfg, &len); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
618 if (res != ENOERR) { |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
619 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
|
620 hang(); |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
621 } |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
622 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
|
623 // 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
|
624 // being written. |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
625 using_old_config = 1; |
|
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
626 } |
| 2 | 627 } |
| 628 | |
| 629 | |
| 630 //----------------------------------------------------------------------------- | |
| 631 // Host sends CRC in decimal ASCII, terminated with ! | |
| 632 int | |
| 633 read_host_crc(cyg_io_handle_t handle) | |
| 634 { | |
| 635 int crc, len; | |
| 636 cyg_uint8 ch; | |
| 637 | |
| 638 crc = 0; | |
| 639 while (1) { | |
| 640 len = 1; | |
| 641 Tcyg_io_read(handle, &ch, &len); | |
| 642 if ('!' == ch) | |
| 643 break; | |
| 644 | |
| 645 #ifdef __DEVELOPER__ | |
| 646 if (!((ch >= '0' && ch <= '9'))){ | |
| 647 diag_printf("CHAR: %02x\n", ch); | |
| 648 } | |
| 649 #endif | |
| 650 | |
| 651 CYG_TEST_CHECK((ch >= '0' && ch <= '9'), | |
| 652 "Illegal CRC format from host"); | |
| 653 | |
| 654 crc = crc*10 + (ch - '0'); | |
| 655 } | |
| 656 | |
| 657 return crc; | |
| 658 } | |
| 659 | |
| 660 //--------------------------------------------------------------------------- | |
| 661 // Test binary data transmission. | |
| 662 // Format out: | |
| 663 // "@BINARY:<byte size>:<mode>!" | |
| 664 // Format in: | |
| 665 // <checksum>!<#size bytes data> | |
| 666 // For echo modes, also: | |
| 667 // Format out: | |
| 668 // <#size bytes data> | |
| 669 // Format in: | |
| 670 // OK/ER | |
| 671 // Format out: | |
| 672 // DONE | |
| 673 // | |
| 674 // The last DONE allows the host to eat bytes if target is sending too many. | |
| 675 // | |
| 676 // Mode: | |
| 677 // MODE_NO_ECHO: | |
| 678 // Just receive data and verify CRC. | |
| 679 // MODE_EOP_ECHO: | |
| 680 // Receive data, verify CRC, resend data. | |
| 681 // Expect OK/ER reply from host when done. | |
| 682 // MODE_DUPLEX_ECHO: | |
| 683 // Receive data, echo data, verify CRC. | |
| 684 // Expect OK/ER reply from host when done. | |
| 685 // | |
| 686 // Note: | |
| 687 // Using diag_printf while talking with the host may cause some funky | |
| 688 // errors (bytes from the host side being lost!?!?) | |
| 689 // | |
| 690 // To Do: | |
| 691 // MODE_DUPLEX_ECHO: | |
| 692 // The current implementation is simple and may not stress the | |
| 693 // driver enough. Also, it's command packet format doesn't match | |
| 694 // that of the other modes. | |
| 695 cyg_test_return_t | |
| 696 test_binary(cyg_io_handle_t handle, int size, cyg_mode_t mode) | |
| 697 { | |
| 698 const char cmd[] = "@BINARY:"; | |
| 699 int msglen; | |
| 700 cyg_uint32 xcrc; | |
| 701 int icrc, host_crc; | |
| 702 cyg_uint8 *p1; | |
| 703 cyg_int8 host_status = 'O'; // host is happy by default | |
| 704 | |
| 705 // Verify that the test can be run with available ressources. | |
| 706 if (MODE_EOP_ECHO == mode && size > IN_BUFFER_SIZE) | |
| 707 return TEST_RETURN_NA; | |
| 708 | |
| 709 // Prepare and send the command. | |
| 710 p1 = &cmd_buffer[0]; | |
| 711 p1 = strcpy(p1, &cmd[0]); | |
| 712 p1 = itoa(p1, size); | |
| 713 *p1++ = ':'; | |
| 714 p1 = itoa(p1, mode); | |
| 715 *p1++ = '!'; | |
| 716 *p1++ = 0; | |
| 717 | |
| 718 CYG_TEST_INFO(&cmd_buffer[1]); | |
| 719 | |
| 720 msglen = strlen(&cmd_buffer[0]); | |
| 721 Tcyg_io_write(handle, &cmd_buffer[0], &msglen); | |
| 722 | |
| 723 // Get CRC back. | |
| 724 host_crc = read_host_crc(handle); | |
| 725 | |
| 726 // Depending on mode, start reading data. | |
| 727 xcrc = 0; | |
| 728 switch (mode) { | |
| 729 case MODE_NO_ECHO: | |
| 730 { | |
| 731 // Break transfers into chunks no larger than the buffer size. | |
| 732 int tx_len, chunk_len, i; | |
| 733 while (size > 0) { | |
| 734 chunk_len = min(IN_BUFFER_SIZE, size); | |
| 735 tx_len = chunk_len; | |
| 736 size -= chunk_len; | |
| 737 | |
| 738 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 739 | |
| 740 for (i = 0; i < tx_len; i++) { | |
| 741 ADD_CRC_BYTE(xcrc, in_buffer[i]); | |
| 742 } | |
| 743 } | |
| 744 | |
| 745 // Reply that we have completed the test. | |
| 746 { | |
| 747 const char msg_done[] = "DONE"; | |
| 748 | |
| 749 chunk_len = strlen(&msg_done[0]); | |
| 750 Tcyg_io_write(handle, &msg_done[0], &chunk_len); | |
| 751 } | |
| 752 | |
| 753 } | |
| 754 break; | |
| 755 case MODE_EOP_ECHO: | |
| 756 { | |
| 757 // We have already checked that the in buffer is large enough. | |
| 758 int i, tx_len, chunk_len; | |
| 759 chunk_len = tx_len = size; | |
| 760 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 761 | |
| 762 for (i = 0; i < tx_len; i++) { | |
| 763 ADD_CRC_BYTE(xcrc, in_buffer[i]); | |
| 764 } | |
| 765 | |
| 766 // Echo data back. | |
| 767 chunk_len = size; | |
| 768 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 769 | |
| 770 // Now read host side's status | |
| 771 chunk_len = 2; | |
| 772 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 773 host_status = in_buffer[0]; | |
| 774 | |
| 775 // Reply that we have completed the test. | |
| 776 { | |
| 777 const char msg_done[] = "DONE"; | |
| 778 | |
| 779 chunk_len = strlen(&msg_done[0]); | |
| 780 Tcyg_io_write(handle, &msg_done[0], &chunk_len); | |
| 781 } | |
| 782 } | |
| 783 break; | |
| 784 case MODE_DUPLEX_ECHO: | |
| 785 { | |
| 786 int chunk_len; | |
| 787 int block_size = 64; | |
| 788 | |
| 789 // This is a simple implementation (maybe too simple). | |
| 790 // Host sends 4 packets with the same size (64 bytes atm). | |
| 791 // Target echoes in this way: | |
| 792 // packet1 -> packet1 | |
| 793 // packet2 -> packet2, packet2 | |
| 794 // packet3 -> packet3 | |
| 795 // packet4 -> /dev/null | |
| 796 // | |
| 797 // The reads/writes are interleaved in a way that should ensure | |
| 798 // the target out buffer to be full before the target starts to read | |
| 799 // packet3. That is, the target should be both receiving (packet3) | |
| 800 // and sending (packet2) at the same time. | |
| 801 | |
| 802 while (size--) { | |
| 803 // block_size -> block_size | |
| 804 chunk_len = block_size; | |
| 805 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 806 chunk_len = block_size; | |
| 807 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 808 | |
| 809 // block_size -> 2 x block_size | |
| 810 chunk_len = block_size; | |
| 811 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 812 chunk_len = block_size; | |
| 813 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 814 chunk_len = block_size; | |
| 815 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 816 | |
| 817 // block_size -> block_size | |
| 818 chunk_len = block_size; | |
| 819 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 820 chunk_len = block_size; | |
| 821 Tcyg_io_write(handle, &in_buffer[0], &chunk_len); | |
| 822 | |
| 823 // block_size -> 0 | |
| 824 chunk_len = block_size; | |
| 825 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 826 } | |
| 827 | |
| 828 // Kill the CRC. Leave packet verification to the host for now. | |
| 829 xcrc = host_crc = 0; | |
| 830 | |
| 831 // Now read host side's status | |
| 832 chunk_len = 2; | |
| 833 Tcyg_io_read(handle, &in_buffer[0], &chunk_len); | |
| 834 host_status = in_buffer[0]; | |
| 835 | |
| 836 // Reply that we have completed the test. | |
| 837 { | |
| 838 const char msg_done[] = "DONE"; | |
| 839 | |
| 840 chunk_len = strlen(&msg_done[0]); | |
| 841 Tcyg_io_write(handle, &msg_done[0], &chunk_len); | |
| 842 } | |
| 843 } | |
| 844 break; | |
| 845 default: | |
| 846 CYG_TEST_CHECK(0, "unknown mode"); | |
| 847 } | |
| 848 | |
| 849 | |
| 850 // Verify that the CRC matches the one from the host. | |
| 851 FIX_CRC(xcrc, icrc); | |
| 852 #ifdef __DEVELOPER__ | |
| 853 if (host_crc != icrc) | |
| 854 diag_printf("%d != %d\n", icrc, host_crc); | |
| 855 #endif | |
| 856 CYG_TEST_CHECK(host_crc == icrc, "CRC failed!"); | |
| 857 | |
| 858 // Verify that the host is happy with the data we echoed. | |
| 859 CYG_TEST_CHECK('O' == host_status, "Host failed checksum on echoed data"); | |
| 860 | |
| 861 CYG_TEST_PASS("Binary test completed"); | |
| 862 return TEST_RETURN_OK; | |
| 863 } | |
| 864 | |
| 865 //--------------------------------------------------------------------------- | |
| 866 // Test transformations on text transmissions | |
| 867 // Format out: | |
| 868 // "@TEXT:<mode>!<4 bytes binary checksum><C string>" | |
| 869 // Format in: | |
| 870 // "<C string>" | |
| 871 // OK/ER | |
| 872 // | |
| 873 // Mode: | |
| 874 // MODE_EOP_ECHO: | |
| 875 // Receive data, verify CRC, resend data. | |
| 876 // Expect OK/ER reply from host when done. | |
| 877 // MODE_DUPLEX_ECHO: | |
| 878 // Receive data, echo data, verify CRC. | |
| 879 // Expect OK/ER reply from host when done. | |
| 880 // | |
| 881 cyg_test_return_t | |
| 882 test_text(cyg_io_handle_t handle, cyg_mode_t mode, const char* s_base, | |
| 883 const char* s_out, const char* s_in) | |
| 884 { | |
| 885 return TEST_RETURN_NA; | |
| 886 } | |
| 887 | |
| 888 //--------------------------------------------------------------------------- | |
| 889 // Send PING to host, verifying the filter's presence. | |
| 890 // Format out: | |
| 891 // "@PING!" | |
| 892 // Format in: | |
| 893 // "OK" | |
| 894 // or | |
| 895 // No response if directly connected to GDB. | |
| 896 // | |
| 897 // This call only returns if the ser_filter is listening. Otherwise it | |
| 898 // sends N/A and hangs. | |
| 899 void | |
| 900 test_ping(cyg_io_handle_t handle) | |
| 901 { | |
| 902 char msg[] = "@PING:!"; | |
| 903 char msg2[] = "\n"; | |
| 904 int msglen = strlen(msg); | |
| 905 int res; | |
| 906 | |
| 907 msglen = strlen(msg); | |
| 908 Tcyg_io_write(handle, msg, &msglen); | |
| 909 | |
| 910 // Now read host side's status | |
| 911 msglen = 2; | |
| 912 Tcyg_io_read_timeout(handle, &in_buffer[0], &msglen, 100, &res); | |
| 913 if (ENOERR == res && 'O' == in_buffer[0] && 'K' == in_buffer[1]) | |
| 914 return; | |
| 915 | |
| 916 msglen = strlen(msg2); | |
| 917 Tcyg_io_write(handle, msg2, &msglen); | |
| 918 | |
| 919 CYG_TEST_NA("No host side testing harness detected."); | |
| 920 } | |
| 921 | |
|
10
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 //--------------------------------------------------------------------------- |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
924 // 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
|
925 // Format out: |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
926 // "@OPT:option1,value1:...:optionN,valueN!" |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
927 // Format in: |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
928 // "OK" |
|
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 // 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
|
931 // filter will be silently ignored. |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
932 void |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
933 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
|
934 { |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
935 const char cmd[] = "@OPT:"; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
936 int msglen; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
937 cyg_uint8 *p1; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
938 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
939 // Prepare and send the command. |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
940 p1 = &cmd_buffer[0]; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
941 p1 = strcpy(p1, &cmd[0]); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
942 while(count--) { |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
943 p1 = itoa(p1, *options++); // option |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
944 *p1++ = ':'; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
945 p1 = itoa(p1, *options++); // value |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
946 *p1++ = ':'; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
947 } |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
948 *(p1-1) = '!'; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
949 *p1++ = 0; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
950 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
951 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
|
952 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
953 msglen = strlen(&cmd_buffer[0]); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
954 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
|
955 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
956 // 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
|
957 msglen = 2; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
958 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
|
959 } |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
960 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
961 |
| 2 | 962 //--------------------------------------------------------------------------- |
| 963 // Some helper functions to get a test started. | |
| 964 void | |
| 965 test_open_ser( cyg_io_handle_t* handle ) | |
| 966 { | |
| 967 #ifndef SER_NOP_TEST | |
| 968 Cyg_ErrNo res; | |
| 969 | |
| 970 if (cyg_test_is_simulator) | |
| 971 CYG_TEST_NA("Cannot run from simulator"); | |
| 972 | |
| 973 #if defined(HAL_VSR_SET_TO_ECOS_HANDLER) | |
| 974 # if defined(SER_OVERRIDE_INT_1) | |
| 975 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_1, NULL); | |
| 976 # endif | |
| 977 # if defined(SER_OVERRIDE_INT_2) | |
| 978 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_2, NULL); | |
| 979 # endif | |
| 980 #endif | |
| 981 | |
| 982 res = cyg_io_lookup(TEST_SER_DEV, handle); | |
| 983 if (res != ENOERR) { | |
| 984 CYG_TEST_FAIL_FINISH("Can't lookup " TEST_SER_DEV); | |
| 985 } | |
| 986 #else | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
987 CYG_TEST_NA(NA_MSG); |
| 2 | 988 #endif |
| 989 } | |
| 990 | |
| 991 void | |
| 992 test_open_tty( cyg_io_handle_t* handle ) | |
| 993 { | |
| 994 #ifndef TTY_NOP_TEST | |
| 995 Cyg_ErrNo res; | |
| 996 | |
| 997 if (cyg_test_is_simulator) | |
| 998 CYG_TEST_NA("Cannot run from simulator"); | |
| 999 | |
| 1000 #if defined(HAL_VSR_SET_TO_ECOS_HANDLER) | |
| 1001 # if defined(SER_OVERRIDE_INT_1) | |
| 1002 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_1, NULL); | |
| 1003 # endif | |
| 1004 # if defined(SER_OVERRIDE_INT_2) | |
| 1005 HAL_VSR_SET_TO_ECOS_HANDLER(SER_OVERRIDE_INT_2, NULL); | |
| 1006 # endif | |
| 1007 #endif | |
| 1008 | |
| 1009 res = cyg_io_lookup(TEST_TTY_DEV, handle); | |
| 1010 if (res != ENOERR) { | |
| 1011 CYG_TEST_FAIL_FINISH("Can't lookup " TEST_TTY_DEV); | |
| 1012 } | |
| 1013 #else | |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
1014 CYG_TEST_NA(NA_MSG); |
| 2 | 1015 #endif |
| 1016 } | |
| 1017 | |
| 1018 //--------------------------------------------------------------------------- | |
| 1019 // end of ser_test_protocol.inl |
