From b6eaf42933bdcd8abf3c8460ad34bc9a3c9d5fb7 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 28 Jun 2010 14:23:19 +0000 Subject: 2010-06-28 Joel Sherrill * Makefile.am, configure.ac: Add new test to exercise termios RX and TX interrupt driven IO support. * termios04/.cvsignore, termios04/Makefile.am, termios04/init.c, termios04/termios04.doc, termios04/termios04.scn, termios04/termios_testdriver_intr.c, termios04/termios_testdriver_intr.h: New files. --- testsuites/libtests/ChangeLog | 9 + testsuites/libtests/Makefile.am | 2 +- testsuites/libtests/configure.ac | 1 + testsuites/libtests/termios04/.cvsignore | 2 + testsuites/libtests/termios04/Makefile.am | 26 +++ testsuites/libtests/termios04/init.c | 147 +++++++++++++++ testsuites/libtests/termios04/termios04.doc | 23 +++ testsuites/libtests/termios04/termios04.scn | 33 ++++ .../libtests/termios04/termios_testdriver_intr.c | 201 +++++++++++++++++++++ .../libtests/termios04/termios_testdriver_intr.h | 168 +++++++++++++++++ 10 files changed, 611 insertions(+), 1 deletion(-) create mode 100644 testsuites/libtests/termios04/.cvsignore create mode 100644 testsuites/libtests/termios04/Makefile.am create mode 100644 testsuites/libtests/termios04/init.c create mode 100644 testsuites/libtests/termios04/termios04.doc create mode 100644 testsuites/libtests/termios04/termios04.scn create mode 100644 testsuites/libtests/termios04/termios_testdriver_intr.c create mode 100644 testsuites/libtests/termios04/termios_testdriver_intr.h (limited to 'testsuites/libtests') diff --git a/testsuites/libtests/ChangeLog b/testsuites/libtests/ChangeLog index 0a475b8988..c774242524 100644 --- a/testsuites/libtests/ChangeLog +++ b/testsuites/libtests/ChangeLog @@ -1,3 +1,12 @@ +2010-06-28 Joel Sherrill + + * Makefile.am, configure.ac: Add new test to exercise termios RX and TX + interrupt driven IO support. + * termios04/.cvsignore, termios04/Makefile.am, termios04/init.c, + termios04/termios04.doc, termios04/termios04.scn, + termios04/termios_testdriver_intr.c, + termios04/termios_testdriver_intr.h: New files. + 2010-06-28 Joel Sherrill * termios03/init.c, termios03/termios03.doc, termios03/termios03.scn, diff --git a/testsuites/libtests/Makefile.am b/testsuites/libtests/Makefile.am index 569d68ab52..4ca02f5077 100644 --- a/testsuites/libtests/Makefile.am +++ b/testsuites/libtests/Makefile.am @@ -8,7 +8,7 @@ SUBDIRS = POSIX SUBDIRS += bspcmdline01 cpuuse malloctest malloc02 malloc03 heapwalk \ putenvtest monitor monitor02 rtmonuse stackchk stackchk01 \ - termios termios01 termios02 termios03 \ + termios termios01 termios02 termios03 termios04 \ rtems++ tztest block01 block02 block03 block04 block05 block06 block07 \ block08 block09 block10 stringto01 diff --git a/testsuites/libtests/configure.ac b/testsuites/libtests/configure.ac index f0c00233d6..e361ae7791 100644 --- a/testsuites/libtests/configure.ac +++ b/testsuites/libtests/configure.ac @@ -61,6 +61,7 @@ termios/Makefile termios01/Makefile termios02/Makefile termios03/Makefile +termios04/Makefile tztest/Makefile POSIX/Makefile ]) diff --git a/testsuites/libtests/termios04/.cvsignore b/testsuites/libtests/termios04/.cvsignore new file mode 100644 index 0000000000..282522db03 --- /dev/null +++ b/testsuites/libtests/termios04/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/testsuites/libtests/termios04/Makefile.am b/testsuites/libtests/termios04/Makefile.am new file mode 100644 index 0000000000..c17550eb45 --- /dev/null +++ b/testsuites/libtests/termios04/Makefile.am @@ -0,0 +1,26 @@ +## +## $Id$ +## + +MANAGERS = all + +rtems_tests_PROGRAMS = termios04 +termios04_SOURCES = init.c termios_testdriver_intr.c + +dist_rtems_tests_DATA = termios04.scn +dist_rtems_tests_DATA += termios04.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(termios04_OBJECTS) $(termios04_LDADD) +LINK_LIBS = $(termios04_LDLIBS) + +termios04$(EXEEXT): $(termios04_OBJECTS) $(termios04_DEPENDENCIES) + @rm -f termios04$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/libtests/termios04/init.c b/testsuites/libtests/termios04/init.c new file mode 100644 index 0000000000..8f570b002d --- /dev/null +++ b/testsuites/libtests/termios04/init.c @@ -0,0 +1,147 @@ +/* + * COPYRIGHT (c) 1989-2010. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#include +#include "test_support.h" +#include "termios_testdriver_intr.h" + +#include +#include +#include +#include +#include +#include + +void write_helper( + int fd, + const char *c +) +{ + size_t len; + int rc; + + len = strlen( c ); + printf( "Writing: %s", c ); + + rc = write( fd, c, len ); + rtems_test_assert( rc == len ); + + termios_test_driver_dump_tx("Transmitted"); +} + +uint8_t read_helper_buffer[256]; + +void read_helper( + int fd, + const char *expected +) +{ + int rc; + size_t len; + + len = strlen( expected ); + + termios_test_driver_set_rx( expected, len ); + printf( "\nReading (expected):\n" ); + rtems_print_buffer( (unsigned char *)expected, len-1 ); + + rc = read( fd, read_helper_buffer, sizeof(read_helper_buffer) ); + rtems_test_assert( rc != -1 ); + + printf( "Read %d bytes from read(2)\n", rc ); + rtems_print_buffer( read_helper_buffer, rc ); + + termios_test_driver_dump_tx("As Read"); +} + +int Test_fd; + +void open_it(void) +{ + /* open the file */ + puts( "open(" TERMIOS_TEST_DRIVER_DEVICE_NAME ") - OK " ); + Test_fd = open( TERMIOS_TEST_DRIVER_DEVICE_NAME, O_RDWR ); + rtems_test_assert( Test_fd != -1 ); +} + +void close_it(void) +{ + int rc; + + puts( "close(" TERMIOS_TEST_DRIVER_DEVICE_NAME ") - OK " ); + rc = close( Test_fd ); + rtems_test_assert( rc == 0 ); +} + +void change_iflag( const char *desc, int mask, int new ) +{ + int rc; + struct termios attr; + + printf( "Changing c_iflag to: %s\n", desc ); + rc = tcgetattr( Test_fd, &attr ); + rtems_test_assert( rc == 0 ); + + attr.c_iflag &= ~mask; + attr.c_iflag |= new; + + rc = tcsetattr( Test_fd, TCSANOW, &attr ); + rtems_test_assert( rc == 0 ); +} + +const char ExpectedOutput_1[] = "This is interrupt driven test output.\n"; +const char ExpectedInput_1[] = "Blocking interrupt driven read.\n"; +const char ExpectedInput_2[] = "Non-Blocking interrupt driven read.\n"; + +rtems_task Init( + rtems_task_argument argument +) +{ + puts( "\n\n*** TEST TERMIOS04 ***" ); + + open_it(); + + /* some basic cases */ + write_helper( Test_fd, ExpectedOutput_1 ); + read_helper( Test_fd, ExpectedInput_1 ); + termios_test_driver_set_rx_enqueue_now( true ); + read_helper( Test_fd, ExpectedInput_2 ); + + close_it(); + + puts( "*** END OF TEST TERMIOS04 ***" ); + + rtems_test_exit(0); +} + +/* configuration information */ + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_EXTRA_DRIVERS \ + TERMIOS_TEST_DRIVER_TABLE_ENTRY + +/* include an extra slot for registering the termios one dynamically */ +#define CONFIGURE_MAXIMUM_DRIVERS 3 + +/* one for the console and one for the test port */ +#define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 3 + +/* we need to be able to open the test device */ +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4 +#define CONFIGURE_MAXIMUM_TASKS 1 +#define CONFIGURE_MAXIMUM_TIMERS 2 +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT + +#include +/* end of file */ diff --git a/testsuites/libtests/termios04/termios04.doc b/testsuites/libtests/termios04/termios04.doc new file mode 100644 index 0000000000..e70a5d2f02 --- /dev/null +++ b/testsuites/libtests/termios04/termios04.doc @@ -0,0 +1,23 @@ +# +# $Id$ +# +# COPYRIGHT (c) 1989-2010. +# On-Line Applications Research Corporation (OAR). +# +# The license and distribution terms for this file may be +# found in the file LICENSE in this distribution or at +# http://www.rtems.com/license/LICENSE. +# + +This file describes the directives and concepts tested by this test set. + +test set name: termios04 + +directives: + + + various termios code fragments supporting interrupt driven transmit + and receive support + +concepts: + ++ termios interrupt driven transmit and receive support diff --git a/testsuites/libtests/termios04/termios04.scn b/testsuites/libtests/termios04/termios04.scn new file mode 100644 index 0000000000..99b8eb01f5 --- /dev/null +++ b/testsuites/libtests/termios04/termios04.scn @@ -0,0 +1,33 @@ +*** TEST TERMIOS04 *** +open(/dev/test) - OK +Writing: This is interrupt driven test output. +Transmitted 39 characters +54 68 69 73 20 69 73 20 69 6e 74 65 72 72 75 70 |This is interrup| +74 20 64 72 69 76 65 6e 20 74 65 73 74 20 6f 75 |t driven test ou| +74 70 75 74 2e 0d 0a |tput... | + +Reading (expected): +42 6c 6f 63 6b 69 6e 67 20 69 6e 74 65 72 72 75 |Blocking interru| +70 74 20 64 72 69 76 65 6e 20 72 65 61 64 2e |pt driven read. | +Read 32 bytes from read(2) +42 6c 6f 63 6b 69 6e 67 20 69 6e 74 65 72 72 75 |Blocking interru| +70 74 20 64 72 69 76 65 6e 20 72 65 61 64 2e 0a |pt driven read..| +As Read 33 characters +42 6c 6f 63 6b 69 6e 67 20 69 6e 74 65 72 72 75 |Blocking interru| +70 74 20 64 72 69 76 65 6e 20 72 65 61 64 2e 0d |pt driven read..| +0a |. | + +Reading (expected): +4e 6f 6e 2d 42 6c 6f 63 6b 69 6e 67 20 69 6e 74 |Non-Blocking int| +65 72 72 75 70 74 20 64 72 69 76 65 6e 20 72 65 |errupt driven re| +61 64 2e |ad. | +Read 36 bytes from read(2) +4e 6f 6e 2d 42 6c 6f 63 6b 69 6e 67 20 69 6e 74 |Non-Blocking int| +65 72 72 75 70 74 20 64 72 69 76 65 6e 20 72 65 |errupt driven re| +61 64 2e 0a |ad.. | +As Read 37 characters +4e 6f 6e 2d 42 6c 6f 63 6b 69 6e 67 20 69 6e 74 |Non-Blocking int| +65 72 72 75 70 74 20 64 72 69 76 65 6e 20 72 65 |errupt driven re| +61 64 2e 0d 0a |ad... | +close(/dev/test) - OK +*** END OF TEST TERMIOS04 *** diff --git a/testsuites/libtests/termios04/termios_testdriver_intr.c b/testsuites/libtests/termios04/termios_testdriver_intr.c new file mode 100644 index 0000000000..1ac57f0909 --- /dev/null +++ b/testsuites/libtests/termios04/termios_testdriver_intr.c @@ -0,0 +1,201 @@ +/* + * This file contains a test fixture termios device driver + * + * COPYRIGHT (c) 1989-2010. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#include "tmacros.h" +#include +#include +#include +#include +#include +#include "termios_testdriver_intr.h" + +rtems_id Timer; + +#define TX_MAX 1024 +uint8_t Tx_Buffer[TX_MAX]; +int Tx_Index = 0; +struct rtems_termios_tty *Ttyp; + +void termios_test_driver_dump_tx(const char *c) +{ + printf( "%s %d characters\n", c, Tx_Index ); + rtems_print_buffer( Tx_Buffer, Tx_Index ); + Tx_Index = 0; +} + +const uint8_t *Rx_Buffer; +int Rx_Index = 0; +int Rx_Length = 0; +bool Rx_FirstTime = true; +bool Rx_EnqueueNow = false; + +rtems_timer_service_routine Rx_ISR( + rtems_id ignored_id, + void *ignored_address +) +{ + uint8_t ch; + + if ( Rx_Index >= Rx_Length ) + return; + + ch = Rx_Buffer[ Rx_Index++ ]; + rtems_termios_enqueue_raw_characters (Ttyp, (char *)&ch, 1); + + (void) rtems_timer_fire_after( Timer, 10, Rx_ISR, NULL ); +} + +void termios_test_driver_set_rx_enqueue_now( + bool value +) +{ + Rx_EnqueueNow = value; +} + +void termios_test_driver_set_rx( + const void *p, + size_t len +) +{ + Rx_Buffer = p; + Rx_Length = len; + Rx_Index = 0; + + if ( Rx_EnqueueNow == false) { + (void) rtems_timer_fire_after( Timer, 10, Rx_ISR, NULL ); + return; + } + + do { + uint8_t ch; + ch = Rx_Buffer[ Rx_Index++ ]; + rtems_termios_enqueue_raw_characters (Ttyp, (char *)&ch, 1); + } while (Rx_Index < Rx_Length ); +} + +ssize_t termios_test_driver_write_helper( + int port, + const char *buf, + size_t len +) +{ + size_t i; + + for (i=0 ; i 2 ) { + puts( "ERROR - Termios_testdriver - only 1 minor supported" ); + rtems_test_exit(0); + } + + sc = rtems_termios_open (major, minor, arg, &Callbacks); + + Ttyp = args->iop->data1; /* Keep cookie returned by termios_open */ + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver termios_test_driver_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_close (arg); +} + +rtems_device_driver termios_test_driver_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_read (arg); +} + +rtems_device_driver termios_test_driver_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_write (arg); +} + +rtems_device_driver termios_test_driver_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_ioctl (arg); +} diff --git a/testsuites/libtests/termios04/termios_testdriver_intr.h b/testsuites/libtests/termios04/termios_testdriver_intr.h new file mode 100644 index 0000000000..c019ada642 --- /dev/null +++ b/testsuites/libtests/termios04/termios_testdriver_intr.h @@ -0,0 +1,168 @@ +/** + * @file termios_testdriver.h + */ + +/* + * COPYRIGHT (c) 1989-2009. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#ifndef _TERMIOS_TESTDRIVER_H +#define _TERMIOS_TESTDRIVER_H + +#ifdef __cplusplus +extern "C" { +#endif + +void termios_test_driver_set_rx( + const void *p, + size_t len +); + +void termios_test_driver_set_rx_enqueue_now( + bool value +); + +void termios_test_driver_dump_tx(const char *c); + +/** + * This macro defines the standard name for the Termios Test device + * that is available to applications. + */ +#define TERMIOS_TEST_DRIVER_DEVICE_NAME "/dev/test" + +/** + * This macro defines the standard device driver table entry for + * a Termios Test device driver. + */ +#define TERMIOS_TEST_DRIVER_TABLE_ENTRY \ + { termios_test_driver_initialize, termios_test_driver_open, \ + termios_test_driver_close, termios_test_driver_read, \ + termios_test_driver_write, termios_test_driver_control } + +/** + * @brief Console Initialization Entry Point + * + * This method initializes the Termios Test device driver. + * + * @param[in] major is the device driver major number + * @param[in] minor is the device driver minor number + * @param[in] arg is the parameters to this call + * + * @return This method returns RTEMS_SUCCESSFUL when + * the device driver is successfully initialized. + */ +rtems_device_driver termios_test_driver_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +); + +/** + * @brief Console Open Entry Point + * + * This method opens a specific device supported by the + * Termios Test device driver. + * + * @param[in] major is the device driver major number + * @param[in] minor is the device driver minor number + * @param[in] arg is the parameters to this call + * + * @return This method returns RTEMS_SUCCESSFUL when + * the device driver is successfully opened. + */ +rtems_device_driver termios_test_driver_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +); + +/** + * @brief Console Close Entry Point + * + * This method closes a specific device supported by the + * Termios Test device driver. + * + * @param[in] major is the device driver major number + * @param[in] minor is the device driver minor number + * @param[in] arg is the parameters to this call + * + * @return This method returns RTEMS_SUCCESSFUL when + * the device is successfully closed. + */ +rtems_device_driver termios_test_driver_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +); + +/** + * @brief Console Read Entry Point + * + * This method reads from a specific device supported by the + * Termios Test device driver. + * + * @param[in] major is the device driver major number + * @param[in] minor is the device driver minor number + * @param[in] arg is the parameters to this call + * + * @return This method returns RTEMS_SUCCESSFUL when + * the device is successfully read from. + */ +rtems_device_driver termios_test_driver_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +); + +/** + * @brief Console Write Entry Point + * + * This method writes to a specific device supported by the + * Termios Test device driver. + * + * @param[in] major is the device driver major number + * @param[in] minor is the device driver minor number + * @param[in] arg is the parameters to this call + * + * @return This method returns RTEMS_SUCCESSFUL when + * the device is successfully written. + */ +rtems_device_driver termios_test_driver_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +); + +/** + * @brief Console IO Control Entry Point + * + * This method performs an IO Control operation on a + * specific device supported by the Termios Test device driver. + * + * @param[in] major is the device driver major number + * @param[in] minor is the device driver minor number + * @param[in] arg is the parameters to this call + * + * @return This method returns RTEMS_SUCCESSFUL when + * the device driver IO control operation is + * successfully performed. + */ +rtems_device_driver termios_test_driver_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +); + +#ifdef __cplusplus +} +#endif + +#endif +/* end of include file */ -- cgit v1.2.3