OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [io/] [serial/] [current/] [tests/] [README] - Blame information for rev 825

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
                    Serial Testing with ser_filter
2
 
3
Rationale
4
~~~~~~~~~
5
 Since some targets only have one serial connection, a serial testing
6
 harness needs to be able to share the connection with GDB (however,
7
 the test and GDB can also run on separate lines).
8
 
9
 The serial filter (ser_filter) sits between the serial port and GDB
10
 and monitors the exchange of data between GDB and the
11
 target. Normally, no changes are made to the data.
12
 
13
 When a test request packet is sent from the test on the target, it is
14
 intercepted by the filter. The filter and target then enter a loop,
15
 exchanging protocol data between them which GDB never sees.
16
 
17
 In the event of a timeout, or a crash on the target, the filter falls
18
 back into its pass-through mode. If this happens due to a crash it
19
 should be possible to start regular debugging with GDB. The filter
20
 will then stay in the pass-though mode until GDB disconnects.
21
 
22
 
23
Adding A New Platform
24
~~~~~~~~~~~~~~~~~~~~~
25
 The file ser_test_protocol.inl contains information about how to run
26
 the serial tests on supported platforms. When adding a new serial
27
 driver to eCos, ser_test_protocol.inl should be updated accordingly
28
 so the driver can be tested.
29
 
30
 The definitions TEST_SER_DEV and TEST_TTY_DEV are set according to
31
 platform:
32
 
33
  TEST_SER_DEV is the name of the serial device over which the serial
34
  test protocol runs. The definition should be conditional on all
35
  required configuration options.
36
 
37
  TEST_TTY_DEV is the name of the TTY device over which the TTY test
38
  protocol runs. The definition should be conditional on all required
39
  configuration options. Note that this device is layered on top of a
40
  serial device and must be conditional on that device's config
41
  options as well as its own.
42
 
43
 Here's an example for the PowerPC/Cogent where GDB is connected via
44
 serial connector B:
45
 
46
#if defined(CYGPKG_HAL_POWERPC_COGENT)                          \
47
    && defined(CYGPKG_IO_SERIAL_POWERPC_COGENT)                 \
48
    && defined(CYGPKG_IO_SERIAL_POWERPC_COGENT_SERIAL_B)
49
# define TEST_SER_DEV CYGDAT_IO_SERIAL_POWERPC_COGENT_SERIAL_B_NAME
50
# if defined(CYGPKG_IO_SERIAL_TTY_TTY2)
51
#  define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY2_DEV
52
# endif
53
#endif
54
 
55
 
56
 On some targets it may also be necessary to intialize interrupt
57
 vectors which are otherwise used by CygMon or an eCos GDB stub to
58
 monitor characters from the host (looking for Control-C):
59
 
60
#  define SER_OVERRIDE_INT_1 CYGNUM_HAL_INTERRUPT_9
61
#  define SER_OVERRIDE_INT_2 CYGNUM_HAL_INTERRUPT_10
62
 
63
 These definitions cause the serial test to restore the eCos handler
64
 on the specified vectors before opening the serial device.
65
 
66
 
67
 The file ser_test_protocol.inl also contains an array of serial
68
 configurations (test_configs). It may be necessary to comment some of
69
 these out for the platform if the driver or hardware cannot handle
70
 all the given serial configurations.
71
 
72
 
73
The Protocol
74
~~~~~~~~~~~~
75
 The protocol commands are prefixed with an @-character which the
76
 serial filter is looking for. The protocol commands include:
77
 
78
  PING
79
   Allows the test on the target to probe for the filter. The filter
80
   responds with OK, while GDB would just ignore the command. This
81
   allows the tests to do nothing if they require the filter and it is
82
   not present.
83
 
84
  CONFIG
85
   Requests a change of serial line configuration. Arguments of the
86
   command specify baud rate, data bits, stop bits, and parity.
87
 
88
  OPT
89
   Requests changes in the filter's options. This allows various
90
   amounts of tracing to be recorded when running tests without
91
   requiring the filter to be restarted.
92
 
93
  BINARY
94
   Requests data to be sent from the filter to the target. The data is
95
   checksummed, allowing errors in the transfer to be detected.
96
   Sub-options of this command control how the data transfer is made:
97
 
98
    NO_ECHO (serial driver receive test)
99
     Just send data from the filter to the target. The test verifies
100
     the checksum and PASS/FAIL depending on the result.
101
 
102
    EOP_ECHO (serial driver half-duplex receive and send test)
103
     As NO_ECHO but the test echoes back the data to the filter. The
104
     filter does a checksum on the received data and sends the result
105
     to the target. The test PASS/FAIL depending on the result of both
106
     checksum verifications.
107
 
108
    DUPLEX_ECHO (serial driver duplex receive and send test)
109
     Smaller packets of data are sent back and forth in a pattern that
110
     ensures that the serial driver will be both sending and receiving
111
     at the same time. Again, checksums are computed and verified
112
     resulting in PASS/FAIL.
113
 
114
  TEXT
115
   This is a test of the text translations in the TTY layer.
116
   Requests a transfer of text data from the target to the filter and
117
   possibly back again. The filter treats this as a binary transfer,
118
   while the target may be doing translations on the data. The target
119
   provides the filter with checksums for what it should expect to
120
   see.
121
   [This test is not implemented yet]
122
 
123
 The above commands may be extended, and new commands added, as
124
 required to test (new) parts of the serial drivers in eCos.
125
 
126
 See ser_test_protocol.inl for further details on the protocols.
127
 
128
 
129
The Serial Tests
130
~~~~~~~~~~~~~~~~
131
 The serial tests are built as any other eCos test. After running the
132
 'make tests' command, the tests can be found in:
133
 
134
 install/tests/io_serial/
135
 
136
 serial1
137
  A simple API test.
138
 
139
 serial2
140
  A simple serial send test. It writes out two strings, one raw and
141
  one encoded as a GDB O-packet.
142
 
143
 serial3 [requires the serial filter]
144
  This tests the half-duplex send and receive capabilities of the
145
  serial driver.
146
 
147
 serial4 [requires the serial filter]
148
  This test attempts to use a few different serial configurations,
149
  testing the driver's configuration/setup functionality.
150
 
151
 serial5 [requires the serial filter]
152
  This tests the duplex send and receive capabilities of the serial
153
  driver.
154
 
155
 All tests should complete in less than 30 seconds.
156
 
157
 
158
Serial Filter Usage
159
~~~~~~~~~~~~~~~~~~~
160
 Running the ser_filter program with no (or wrong) arguments results
161
 in the below output:
162
 
163
  Usage: ser_filter [-t -c -g -S] TcpIPport SerialPort BaudRate
164
   or:   ser_filter -n [-t -c -g -S] SerialPort BaudRate
165
   -t: Enable tracing.
166
   -f: Enable filter output tracing.
167
   -g: Enable GDB tracing.
168
   -S: Output data read from serial line.
169
   -c: Output data on console instead of via GDB.
170
   -n: No GDB.
171
 
172
 The normal way to use it with GDB is to start the filter:
173
 
174
  ser_filter -t 9000 com1 38400
175
 
176
 In this case, the filter will be listening on port 9000 and connect
177
 to the target via the serial port COM1 at 38400 baud. On a UNIX host,
178
 replace "com1" with a device such as "/dev/ttyS0".
179
 
180
 The '-t' option enables tracing which will cause the filter to
181
 describe its actions on the console.
182
 
183
 Now start GDB with one of the tests as an argument:
184
 
185
  $ mips-tx39-elf-gdb -nw install/tests/io_serial/serial3
186
 
187
 Then connect to the filter:
188
 
189
  (gdb) target remote localhost:9000
190
 
191
 This should result in a connection in exactly the same way as if you
192
 had connected directly to the target on the serial line.
193
 
194
  (gdb) load
195
  ...
196
  (gdb) cont
197
 
198
 Which should result in output similar to the below:
199
 
200
  Continuing.
201
  INFO:
202
  PASS:
203
  INFO:
204
  PASS:
205
  INFO:
206
  PASS:
207
  INFO:
208
  PASS:
209
  INFO:
210
  PASS:
211
  ...
212
  PASS:
213
  INFO:
214
  PASS:
215
  PASS:
216
  EXIT:
217
 
218
 If any of the individual tests fail the testing will terminate with
219
 a FAIL.
220
 
221
 With tracing enabled, you would also see the filter's status output:
222
 
223
 The PING command sent from the target to determine the presence of
224
 the filter:
225
  [400 11:35:16] Dispatching command PING
226
  [400 11:35:16] Responding with status OK
227
 
228
 Each of the binary commands result in output similar to:
229
  [400 11:35:16] Dispatching command BINARY
230
  [400 11:35:16] Binary data (Size:16, Flags:1).
231
  [400 11:35:16] Sending CRC: '170231!', len: 7.
232
  [400 11:35:16] Reading 16 bytes from target.
233
  [400 11:35:16] Done. in_crc 170231, out_crc 170231.
234
  [400 11:35:16] Responding with status OK
235
  [400 11:35:16] Received DONE from target.
236
 
237
 This tracing output is normally sent as O-packets to GDB which will
238
 display the tracing text. By using the -c option, the tracing text
239
 can be redirected to the console from which ser_filter was started.
240
 
241
 
242
 The trace options -f, -g, and -S cause data sent from filter, GDB or
243
 target to be output in hexadecimal form.
244
 
245
 
246
A Note on Failures
247
~~~~~~~~~~~~~~~~~~
248
 A serial connection (especially when driven at a high baud rate) can
249
 garble the transmitted data because of noise from the environment. It
250
 is not the job of the serial driver to ensure data integrity - that
251
 is the job of protocols layering on top of the serial driver.
252
 
253
 In the current implementation the serial tests and the serial filter
254
 are not resilient to such data errors. This means that the test may
255
 crash or hang (possibly without reporting a FAIL). It also means that
256
 you should be aware of random errors - a FAIL is not necessarily
257
 caused by a bug in the serial driver.
258
 
259
 Ideally, the serial testing infrastructure should be able to
260
 distinguish random errors from consistent errors - the former are
261
 most likely due to noise in the transfer medium, while the latter are
262
 more likely to be caused by faulty drivers. The current
263
 implementation of the infrastructure does not have this capability.
264
 
265
 
266
Debugging
267
~~~~~~~~~
268
 If a test fails, the serial filter's output may provide some hints
269
 about what the problem is. If the option '-S' is used when starting
270
 the filter, data received from the target is printed out:
271
 
272
  [400 11:35:16] 0000 50 41 53 53 3a 3c 42 69 'PASS:
273
  [400 11:35:16] 0008 6e 61 72 79 20 74 65 73 'nary.tes'
274
  [400 11:35:16] 0010 74 20 63 6f 6d 70 6c 65 't.comple'
275
  [400 11:35:16] 0018 74 65 64 3e 0d 0a 49 4e 'ted>..IN'
276
  [400 11:35:16] 0020 46 4f 3a 3c 42 49 4e 41 'FO:
277
  [400 11:35:16] 0028 52 59 3a 31 32 38 3a 31 'RY:128:1'
278
  [400 11:35:16] 0030 21 3e 0d 0a 40 42 49 4e '!>..@BIN'
279
  [400 11:35:16] 0038 41 52 59 3a 31 32 38 3a 'ARY:128:'
280
  [400 11:35:16] 0040 31 21 .. .. .. .. .. .. '1!'
281
 
282
 In the case of an error during a testing command the data received by
283
 the filter will be printed out, as will the data that was
284
 expected. This allows the two data sets to be compared which may give
285
 some idea of what the problem is.

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.