diff packages/io/serial/current/tests/README @ 34:29bc183297e1 ecos-sw-1999-09-02

Merge from eCos master repository on 1999-09-02-16:26:10-BST
author jlarmour
date Thu, 02 Sep 1999 16:11:22 +0000
parents
children
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/io/serial/current/tests/README
@@ -0,0 +1,285 @@
+		    Serial Testing with ser_filter
+
+Rationale
+~~~~~~~~~
+ Since some targets only have one serial connection, a serial testing
+ harness needs to be able to share the connection with GDB (however,
+ the test and GDB can also run on separate lines).
+
+ The serial filter (ser_filter) sits between the serial port and GDB
+ and monitors the exchange of data between GDB and the
+ target. Normally, no changes are made to the data.
+
+ When a test request packet is sent from the test on the target, it is
+ intercepted by the filter. The filter and target then enter a loop,
+ exchanging protocol data between them which GDB never sees.
+
+ In the event of a timeout, or a crash on the target, the filter falls
+ back into its pass-through mode. If this happens due to a crash it
+ should be possible to start regular debugging with GDB. The filter
+ will then stay in the pass-though mode until GDB disconnects.
+
+
+Adding A New Platform
+~~~~~~~~~~~~~~~~~~~~~
+ The file ser_test_protocol.inl contains information about how to run
+ the serial tests on supported platforms. When adding a new serial
+ driver to eCos, ser_test_protocol.inl should be updated accordingly
+ so the driver can be tested.
+
+ The definitions TEST_SER_DEV and TEST_TTY_DEV are set according to
+ platform:
+
+  TEST_SER_DEV is the name of the serial device over which the serial
+  test protocol runs. The definition should be conditional on all
+  required configuration options.
+
+  TEST_TTY_DEV is the name of the TTY device over which the TTY test
+  protocol runs. The definition should be conditional on all required
+  configuration options. Note that this device is layered on top of a
+  serial device and must be conditional on that device's config
+  options as well as its own.
+
+ Here's an example for the PowerPC/Cogent where GDB is connected via
+ serial connector B:
+ 
+#if defined(CYGPKG_HAL_POWERPC_COGENT)                          \
+    && defined(CYGPKG_IO_SERIAL_POWERPC_COGENT)                 \
+    && defined(CYGPKG_IO_SERIAL_POWERPC_COGENT_SERIAL_B)
+# define TEST_SER_DEV CYGDAT_IO_SERIAL_POWERPC_COGENT_SERIAL_B_NAME
+# if defined(CYGPKG_IO_SERIAL_TTY_TTY2)
+#  define TEST_TTY_DEV CYGDAT_IO_SERIAL_TTY_TTY2_DEV
+# endif
+#endif
+
+ 
+ On some targets it may also be necessary to intialize interrupt
+ vectors which are otherwise used by CygMon or an eCos GDB stub to
+ monitor characters from the host (looking for Control-C):
+
+#  define SER_OVERRIDE_INT_1 CYGNUM_HAL_INTERRUPT_9
+#  define SER_OVERRIDE_INT_2 CYGNUM_HAL_INTERRUPT_10
+
+ These definitions cause the serial test to restore the eCos handler
+ on the specified vectors before opening the serial device.
+
+
+ The file ser_test_protocol.inl also contains an array of serial
+ configurations (test_configs). It may be necessary to comment some of
+ these out for the platform if the driver or hardware cannot handle
+ all the given serial configurations.
+
+
+The Protocol
+~~~~~~~~~~~~
+ The protocol commands are prefixed with an @-character which the
+ serial filter is looking for. The protocol commands include:
+
+  PING
+   Allows the test on the target to probe for the filter. The filter
+   responds with OK, while GDB would just ignore the command. This
+   allows the tests to do nothing if they require the filter and it is
+   not present.
+
+  CONFIG
+   Requests a change of serial line configuration. Arguments of the
+   command specify baud rate, data bits, stop bits, and parity.
+
+  OPT
+   Requests changes in the filter's options. This allows various
+   amounts of tracing to be recorded when running tests without
+   requiring the filter to be restarted.
+
+  BINARY
+   Requests data to be sent from the filter to the target. The data is
+   checksummed, allowing errors in the transfer to be detected.
+   Sub-options of this command control how the data transfer is made:
+
+    NO_ECHO (serial driver receive test)
+     Just send data from the filter to the target. The test verifies
+     the checksum and PASS/FAIL depending on the result.
+
+    EOP_ECHO (serial driver half-duplex receive and send test)
+     As NO_ECHO but the test echoes back the data to the filter. The
+     filter does a checksum on the received data and sends the result
+     to the target. The test PASS/FAIL depending on the result of both
+     checksum verifications.
+
+    DUPLEX_ECHO (serial driver duplex receive and send test)
+     Smaller packets of data are sent back and forth in a pattern that
+     ensures that the serial driver will be both sending and receiving
+     at the same time. Again, checksums are computed and verified
+     resulting in PASS/FAIL.
+
+  TEXT
+   This is a test of the text translations in the TTY layer.
+   Requests a transfer of text data from the target to the filter and
+   possibly back again. The filter treats this as a binary transfer,
+   while the target may be doing translations on the data. The target
+   provides the filter with checksums for what it should expect to
+   see.
+   [This test is not implemented yet]
+
+ The above commands may be extended, and new commands added, as
+ required to test (new) parts of the serial drivers in eCos. 
+
+ See ser_test_protocol.inl for further details on the protocols.
+
+
+The Serial Tests
+~~~~~~~~~~~~~~~~
+ The serial tests are built as any other eCos test. After running the
+ 'make tests' command, the tests can be found in:
+
+ install/tests/io_serial/
+
+ serial1
+  A simple API test.
+
+ serial2
+  A simple serial send test. It writes out two strings, one raw and
+  one encoded as a GDB O-packet.
+
+ serial3 [requires the serial filter]
+  This tests the half-duplex send and receive capabilities of the
+  serial driver.
+ 
+ serial4 [requires the serial filter]
+  This test attempts to use a few different serial configurations,
+  testing the driver's configuration/setup functionality.
+
+ serial5 [requires the serial filter]
+  This tests the duplex send and receive capabilities of the serial
+  driver.
+
+ All tests should complete in less than 30 seconds.
+
+
+Serial Filter Usage
+~~~~~~~~~~~~~~~~~~~
+ Running the ser_filter program with no (or wrong) arguments results
+ in the below output:
+
+  Usage: ser_filter [-t -c -g -S] TcpIPport SerialPort BaudRate
+   or:   ser_filter -n [-t -c -g -S] SerialPort BaudRate
+   -t: Enable tracing.
+   -f: Enable filter output tracing.
+   -g: Enable GDB tracing.
+   -S: Output data read from serial line.
+   -c: Output data on console instead of via GDB.
+   -n: No GDB.
+
+ The normal way to use it with GDB is to start the filter:
+
+  ser_filter -t 9000 com1 38400
+
+ In this case, the filter will be listening on port 9000 and connect
+ to the target via the serial port COM1 at 38400 baud. On a UNIX host,
+ replace "com1" with a device such as "/dev/ttyS0".
+
+ The '-t' option enables tracing which will cause the filter to
+ describe its actions on the console.
+
+ Now start GDB with one of the tests as an argument:
+
+  $ mips-tx39-elf-gdb -nw install/tests/io_serial/serial3
+ 
+ Then connect to the filter:
+
+  (gdb) target remote localhost:9000
+
+ This should result in a connection in exactly the same way as if you
+ had connected directly to the target on the serial line.
+
+  (gdb) load
+  ...
+  (gdb) cont
+
+ Which should result in output similar to the below:
+
+  Continuing.
+  INFO:<BINARY:16:1!>
+  PASS:<Binary test completed>
+  INFO:<BINARY:128:1!>
+  PASS:<Binary test completed>
+  INFO:<BINARY:256:1!>
+  PASS:<Binary test completed>
+  INFO:<BINARY:1024:1!>
+  PASS:<Binary test completed>
+  INFO:<BINARY:512:0!>
+  PASS:<Binary test completed>
+  ...
+  PASS:<Binary test completed>
+  INFO:<BINARY:16384:0!>
+  PASS:<Binary test completed>
+  PASS:<serial3 test OK>
+  EXIT:<done>
+
+ If any of the individual tests fail the testing will terminate with
+ a FAIL.
+
+ With tracing enabled, you would also see the filter's status output: 
+
+ The PING command sent from the target to determine the presence of
+ the filter:
+  [400 11:35:16] Dispatching command PING
+  [400 11:35:16] Responding with status OK
+
+ Each of the binary commands result in output similar to:
+  [400 11:35:16] Dispatching command BINARY
+  [400 11:35:16] Binary data (Size:16, Flags:1).
+  [400 11:35:16] Sending CRC: '170231!', len: 7.
+  [400 11:35:16] Reading 16 bytes from target.
+  [400 11:35:16] Done. in_crc 170231, out_crc 170231.
+  [400 11:35:16] Responding with status OK
+  [400 11:35:16] Received DONE from target.
+
+ This tracing output is normally sent as O-packets to GDB which will
+ display the tracing text. By using the -c option, the tracing text
+ can be redirected to the console from which ser_filter was started.
+
+
+ The trace options -f, -g, and -S cause data sent from filter, GDB or
+ target to be output in hexadecimal form.
+
+
+A Note on Failures
+~~~~~~~~~~~~~~~~~~
+ A serial connection (especially when driven at a high baud rate) can
+ garble the transmitted data because of noise from the environment. It
+ is not the job of the serial driver to ensure data integrity - that
+ is the job of protocols layering on top of the serial driver.
+
+ In the current implementation the serial tests and the serial filter
+ are not resilient to such data errors. This means that the test may
+ crash or hang (possibly without reporting a FAIL). It also means that
+ you should be aware of random errors - a FAIL is not necessarily
+ caused by a bug in the serial driver.
+
+ Ideally, the serial testing infrastructure should be able to
+ distinguish random errors from consistent errors - the former are
+ most likely due to noise in the transfer medium, while the latter are
+ more likely to be caused by faulty drivers. The current
+ implementation of the infrastructure does not have this capability.
+
+
+Debugging
+~~~~~~~~~
+ If a test fails, the serial filter's output may provide some hints
+ about what the problem is. If the option '-S' is used when starting
+ the filter, data received from the target is printed out:
+
+  [400 11:35:16] 0000 50 41 53 53 3a 3c 42 69 'PASS:<Bi'
+  [400 11:35:16] 0008 6e 61 72 79 20 74 65 73 'nary.tes'
+  [400 11:35:16] 0010 74 20 63 6f 6d 70 6c 65 't.comple'
+  [400 11:35:16] 0018 74 65 64 3e 0d 0a 49 4e 'ted>..IN'
+  [400 11:35:16] 0020 46 4f 3a 3c 42 49 4e 41 'FO:<BINA'
+  [400 11:35:16] 0028 52 59 3a 31 32 38 3a 31 'RY:128:1'
+  [400 11:35:16] 0030 21 3e 0d 0a 40 42 49 4e '!>..@BIN'
+  [400 11:35:16] 0038 41 52 59 3a 31 32 38 3a 'ARY:128:'
+  [400 11:35:16] 0040 31 21 .. .. .. .. .. .. '1!'
+
+ In the case of an error during a testing command the data received by
+ the filter will be printed out, as will the data that was
+ expected. This allows the two data sets to be compared which may give
+ some idea of what the problem is.