diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2010-06-28 14:23:19 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2010-06-28 14:23:19 +0000 |
commit | b6eaf42933bdcd8abf3c8460ad34bc9a3c9d5fb7 (patch) | |
tree | 32c06265b0778d060cd11f4691fb363356fb0fd5 /testsuites/libtests/termios04 | |
parent | 2010-06-26 Bharath Suri <bharath.s.jois@gmail.com> (diff) | |
download | rtems-b6eaf42933bdcd8abf3c8460ad34bc9a3c9d5fb7.tar.bz2 |
2010-06-28 Joel Sherrill <joel.sherrill@oarcorp.com>
* 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.
Diffstat (limited to 'testsuites/libtests/termios04')
-rw-r--r-- | testsuites/libtests/termios04/.cvsignore | 2 | ||||
-rw-r--r-- | testsuites/libtests/termios04/Makefile.am | 26 | ||||
-rw-r--r-- | testsuites/libtests/termios04/init.c | 147 | ||||
-rw-r--r-- | testsuites/libtests/termios04/termios04.doc | 23 | ||||
-rw-r--r-- | testsuites/libtests/termios04/termios04.scn | 33 | ||||
-rw-r--r-- | testsuites/libtests/termios04/termios_testdriver_intr.c | 201 | ||||
-rw-r--r-- | testsuites/libtests/termios04/termios_testdriver_intr.h | 168 |
7 files changed, 600 insertions, 0 deletions
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 <tmacros.h> +#include "test_support.h" +#include "termios_testdriver_intr.h" + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <termios.h> +#include <rtems/dumpbuf.h> + +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 <rtems/confdefs.h> +/* 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 <rtems/libio.h> +#include <stdlib.h> +#include <termios.h> +#include <rtems/termiostypes.h> +#include <rtems/dumpbuf.h> +#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<len ; i++ ) + Tx_Buffer[Tx_Index++] = (uint8_t) buf[i]; + + return len; +} + +/* + * Set Attributes Handler + */ +int termios_test_driver_set_attributes( + int minor, + const struct termios *t +) +{ + return 0; +} + +/* + * Test Device Driver Entry Points + */ +rtems_device_driver termios_test_driver_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + rtems_status_code status; + + rtems_termios_initialize(); + + /* + * Register Device Names + */ + (void) rtems_io_register_name( TERMIOS_TEST_DRIVER_DEVICE_NAME, major, 0 ); + + status = rtems_timer_create( rtems_build_name('T', 'M', '0', '1'), &Timer ); + if ( status ) + rtems_fatal_error_occurred(1);; + + return RTEMS_SUCCESSFUL; +} + +rtems_device_driver termios_test_driver_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_status_code sc; + rtems_libio_open_close_args_t *args = arg; + static const rtems_termios_callbacks Callbacks = { + NULL, /* firstOpen */ + NULL, /* lastClose */ + NULL, /* pollRead */ + termios_test_driver_write_helper, /* write */ + termios_test_driver_set_attributes, /* setAttributes */ + NULL, /* stopRemoteTx */ + NULL, /* startRemoteTx */ + 0 /* outputUsesInterrupts */ + }; + + if ( minor > 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 */ |