summaryrefslogtreecommitdiffstats
path: root/testsuites/libtests/termios01/init.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2009-08-15 17:54:48 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2009-08-15 17:54:48 +0000
commit4d5b156c2c10ed52a17cce558eea6bb685b2b154 (patch)
tree891fd30beace80e223f6454942e9d6e2ee514046 /testsuites/libtests/termios01/init.c
parent2009-08-13 Santosh G Vattam <vattam.santosh@gmail.com> (diff)
downloadrtems-4d5b156c2c10ed52a17cce558eea6bb685b2b154.tar.bz2
2009-08-15 Joel Sherrill <joel.sherrill@oarcorp.com>
* Makefile.am, configure.ac: Add new test to exercise tcgetattr and tcsetattr. Does a variety of baud, parity, stop bits, and bits per character with the assistance of a special test driver which prints the requests. * termios01/.cvsignore, termios01/Makefile.am, termios01/init.c, termios01/termios01.doc, termios01/termios01.scn, termios01/termios_testdriver.c, termios01/termios_testdriver.h: New files.
Diffstat (limited to 'testsuites/libtests/termios01/init.c')
-rw-r--r--testsuites/libtests/termios01/init.c493
1 files changed, 493 insertions, 0 deletions
diff --git a/testsuites/libtests/termios01/init.c b/testsuites/libtests/termios01/init.c
new file mode 100644
index 0000000000..f12c54fe0c
--- /dev/null
+++ b/testsuites/libtests/termios01/init.c
@@ -0,0 +1,493 @@
+/*
+ * 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$
+ */
+
+#include "tmacros.h"
+#include <assert.h>
+#include <termios.h>
+#include <rtems/termiostypes.h>
+#include <fcntl.h>
+#include <sys/errno.h>
+
+/*
+ * Termios Test Driver
+ */
+#include "termios_testdriver.h"
+
+rtems_driver_address_table test_driver = TERMIOS_TEST_DRIVER_TABLE_ENTRY;
+
+/*
+ * Baud Rate Constant Mapping Entry
+ */
+typedef struct {
+ int constant;
+ int baud;
+} termios_baud_test_r;
+
+/*
+ * Baud Rate Constant Mapping Table
+ */
+termios_baud_test_r baud_table[] = {
+ { B0, 0 },
+ { B50, 50 },
+ { B75, 75 },
+ { B110, 110 },
+ { B134, 134 },
+ { B150, 150 },
+ { B200, 200 },
+ { B300, 300 },
+ { B600, 600 },
+ { B1200, 1200 },
+ { B1800, 1800 },
+ { B2400, 2400 },
+ { B4800, 4800 },
+ { B9600, 9600 },
+ { B19200, 19200 },
+ { B38400, 38400 },
+ { B57600, 57600 },
+ { B115200, 115200 },
+ { B230400, 230400 },
+ { B460800, 460800 },
+ { -1, -1 }
+};
+
+/*
+ * Character Size Constant Mapping Entry
+ */
+typedef struct {
+ int constant;
+ int bits;
+} termios_character_size_test_r;
+
+/*
+ * Character Size Constant Mapping Table
+ */
+termios_character_size_test_r char_size_table[] = {
+ { CS5, 5 },
+ { CS6, 6 },
+ { CS7, 7 },
+ { CS8, 8 },
+ { -1, -1 }
+};
+
+/*
+ * Parity Constant Mapping Entry
+ */
+typedef struct {
+ int constant;
+ const char parity[5];
+} termios_parity_test_r;
+
+/*
+ * Parity Constant Mapping Table
+ */
+termios_parity_test_r parity_table[] = {
+ { 0, "none" },
+ { PARENB, "even" },
+ { PARENB | PARODD, "odd" },
+ { -1, -1 }
+};
+
+/*
+ * Stop Bit Constant Mapping Entry
+ */
+typedef struct {
+ int constant;
+ int stop;
+} termios_stop_bits_test_r;
+
+/*
+ * Stop Bit Constant Mapping Table
+ */
+termios_stop_bits_test_r stop_bits_table[] = {
+ { 0, 1 },
+ { CSTOPB, 2 },
+ { -1, -1 }
+};
+
+/*
+ * Test converting baud rate into an index
+ */
+void test_termios_baud2index(void)
+{
+ int i;
+ int index;
+
+ puts(
+ "\n"
+ "Test termios_baud2index..."
+ );
+ for (i=0 ; baud_table[i].constant != -1 ; i++ ) {
+ printf( "termios_baud_to_index(B%d) - OK\n", baud_table[i].baud );
+ index = termios_baud_to_index( baud_table[i].constant );
+ if ( index != i ) {
+ printf( "ERROR - returned %d should be %d\n", index, i );
+ rtems_test_exit(0);
+ }
+ }
+}
+
+/*
+ * Test converting termios baud constant to baud number
+ */
+void test_termios_baud2number(void)
+{
+ int i;
+ int number;
+
+ puts(
+ "\n"
+ "Test termios_baud2number..."
+ );
+ for (i=0 ; baud_table[i].constant != -1 ; i++ ) {
+ printf( "termios_baud_to_number(B%d) - OK\n", baud_table[i].baud );
+ number = termios_baud_to_number( baud_table[i].constant );
+ if ( number != baud_table[i].baud ) {
+ printf(
+ "ERROR - returned %d should be %d\n",
+ number,
+ baud_table[i].baud
+ );
+ rtems_test_exit(0);
+ }
+ }
+}
+
+/*
+ * Test converting baud number to termios baud constant
+ */
+void test_termios_number_to_baud(void)
+{
+ int i;
+ int termios_baud;
+
+ puts(
+ "\n"
+ "Test termios_number_to_baud..."
+ );
+ for (i=0 ; baud_table[i].constant != -1 ; i++ ) {
+ printf( "termios_number_to_baud(B%d) - OK\n", baud_table[i].baud );
+ termios_baud = termios_number_to_baud( baud_table[i].baud );
+ if ( termios_baud != baud_table[i].constant ) {
+ printf(
+ "ERROR - returned %d should be %d\n",
+ termios_baud,
+ baud_table[i].constant
+ );
+ rtems_test_exit(0);
+ }
+ }
+}
+
+/*
+ * Test all the baud rate options
+ */
+void test_termios_set_baud(
+ int test
+)
+{
+ int sc;
+ int i;
+ int number;
+ struct termios attr;
+
+ puts( "Test termios setting device baud rate..." );
+ for (i=0 ; baud_table[i].constant != -1 ; i++ ) {
+ sc = tcgetattr( test, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+
+ attr.c_cflag &= ~CBAUD;
+ attr.c_cflag |= baud_table[i].constant;
+
+ printf( "tcsetattr(TCSANOW, B%d) - OK\n", baud_table[i].baud );
+ sc = tcsetattr( test, TCSANOW, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+
+ printf( "tcsetattr(TCSADRAIN, B%d) - OK\n", baud_table[i].baud );
+ sc = tcsetattr( test, TCSANOW, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+ }
+}
+
+/*
+ * Test all the character size options
+ */
+void test_termios_set_charsize(
+ int test
+)
+{
+ int sc;
+ int i;
+ int number;
+ struct termios attr;
+
+ puts(
+ "\n"
+ "Test termios setting device character size ..."
+ );
+ for (i=0 ; char_size_table[i].constant != -1 ; i++ ) {
+ sc = tcgetattr( test, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+
+ attr.c_cflag &= ~CSIZE;
+ attr.c_cflag |= char_size_table[i].constant;
+
+ printf( "tcsetattr(TCSANOW, CS%d) - OK\n", char_size_table[i].bits );
+ sc = tcsetattr( test, TCSANOW, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+
+ printf( "tcsetattr(TCSADRAIN, CS%d) - OK\n", char_size_table[i].bits );
+ sc = tcsetattr( test, TCSANOW, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+ }
+}
+
+/*
+ * Test all the parity options
+ */
+void test_termios_set_parity(
+ int test
+)
+{
+ int sc;
+ int i;
+ int number;
+ struct termios attr;
+
+ puts(
+ "\n"
+ "Test termios setting device parity ..."
+ );
+ for (i=0 ; parity_table[i].constant != -1 ; i++ ) {
+ sc = tcgetattr( test, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+
+ attr.c_cflag &= ~(PARENB|PARODD);
+ attr.c_cflag |= parity_table[i].constant;
+
+ printf( "tcsetattr(TCSANOW, %s) - OK\n", parity_table[i].parity );
+ sc = tcsetattr( test, TCSANOW, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+
+ printf( "tcsetattr(TCSADRAIN, %s) - OK\n", parity_table[i].parity );
+ sc = tcsetattr( test, TCSANOW, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+ }
+}
+
+/*
+ * Test all the stop bit options
+ */
+void test_termios_set_stop_bits(
+ int test
+)
+{
+ int sc;
+ int i;
+ int number;
+ struct termios attr;
+
+ puts(
+ "\n"
+ "Test termios setting device character size ..."
+ );
+ for (i=0 ; stop_bits_table[i].constant != -1 ; i++ ) {
+ sc = tcgetattr( test, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+
+ attr.c_cflag &= ~CSTOPB;
+ attr.c_cflag |= stop_bits_table[i].constant;
+
+ printf( "tcsetattr(TCSANOW, %d bit%s) - OK\n",
+ stop_bits_table[i].stop,
+ ((stop_bits_table[i].stop == 1) ? "" : "s")
+ );
+ sc = tcsetattr( test, TCSANOW, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+
+ printf( "tcsetattr(TCSADRAIN, %d bits) - OK\n", stop_bits_table[i].stop );
+ sc = tcsetattr( test, TCSANOW, &attr );
+ if ( sc != 0 ) {
+ printf( "ERROR - return %d\n", sc );
+ rtems_test_exit(0);
+ }
+ }
+}
+
+rtems_task Init(
+ rtems_task_argument ignored
+)
+{
+ int rc;
+ rtems_status_code sc;
+ rtems_device_major_number registered;
+ int test;
+
+ puts( "\n\n*** TEST TERMIOS 01 ***" );
+
+ test_termios_baud2index();
+ test_termios_baud2number();
+ test_termios_number_to_baud();
+
+ puts(
+ "\n"
+ "Init - rtems_io_register_driver - Termios Test Driver - OK"
+ );
+ sc = rtems_io_register_driver( 0, &test_driver, &registered );
+ printf( "Init - Major slot returned = %d\n", (int) registered );
+ directive_failed( sc, "rtems_io_register_driver" );
+
+ /*
+ * Test baud rate
+ */
+ puts( "Init - open - " TERMIOS_TEST_DRIVER_DEVICE_NAME " - OK" );
+ test = open( TERMIOS_TEST_DRIVER_DEVICE_NAME, O_RDWR );
+ if ( test == -1 ) {
+ printf( "ERROR - baud opening test device (%d)\n", test );
+ rtems_test_exit(0);
+ }
+
+ test_termios_set_baud(test);
+
+ puts( "Init - close - " TERMIOS_TEST_DRIVER_DEVICE_NAME " - OK" );
+ rc = close( test );
+ if ( rc != 0 ) {
+ printf( "ERROR - baud close test device (%d) %s\n", test, strerror(errno) );
+ rtems_test_exit(0);
+ }
+
+ /*
+ * Test character size
+ */
+ puts(
+ "\n"
+ "Init - open - " TERMIOS_TEST_DRIVER_DEVICE_NAME " - OK"
+ );
+ test = open( TERMIOS_TEST_DRIVER_DEVICE_NAME, O_RDWR );
+ if ( test == -1 ) {
+ printf( "ERROR - size open test device (%d) %s\n", test, strerror(errno) );
+ rtems_test_exit(0);
+ }
+
+ test_termios_set_charsize(test);
+
+ puts( "Init - close - " TERMIOS_TEST_DRIVER_DEVICE_NAME " - OK" );
+ rc = close( test );
+ if ( rc != 0 ) {
+ printf( "ERROR - size close test device (%d) %s\n", test, strerror(errno) );
+ rtems_test_exit(0);
+ }
+
+ /*
+ * Test parity
+ */
+ puts(
+ "\n"
+ "Init - open - " TERMIOS_TEST_DRIVER_DEVICE_NAME " - OK"
+ );
+ test = open( TERMIOS_TEST_DRIVER_DEVICE_NAME, O_RDWR );
+ if ( test == -1 ) {
+ printf( "ERROR - parity open test device (%d) %s\n",
+ test, strerror(errno) );
+ rtems_test_exit(0);
+ }
+
+ test_termios_set_parity(test);
+
+ puts( "Init - close - " TERMIOS_TEST_DRIVER_DEVICE_NAME " - OK" );
+ rc = close( test );
+ if ( rc != 0 ) {
+ printf( "ERROR - parity close test device (%d) %s\n",
+ test, strerror(errno) );
+ rtems_test_exit(0);
+ }
+
+ /*
+ * Test stop bits
+ */
+ puts(
+ "\n"
+ "Init - open - " TERMIOS_TEST_DRIVER_DEVICE_NAME " - OK"
+ );
+ test = open( TERMIOS_TEST_DRIVER_DEVICE_NAME, O_RDWR );
+ if ( test == -1 ) {
+ printf( "ERROR - stop bits open test device (%d) %s\n",
+ test, strerror(errno) );
+ rtems_test_exit(0);
+ }
+
+ test_termios_set_stop_bits(test);
+
+ puts( "Init - close - " TERMIOS_TEST_DRIVER_DEVICE_NAME " - OK" );
+ rc = close( test );
+ if ( rc != 0 ) {
+ printf( "ERROR - stop bits close test device (%d) %s\n",
+ test, strerror(errno) );
+ rtems_test_exit(0);
+ }
+
+ puts( "*** END OF TEST TERMIOS 01 ***" );
+ rtems_test_exit(0);
+}
+
+/* configuration information */
+
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+/* 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 2
+
+/* we need to be able to open the test device */
+#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4
+
+#define CONFIGURE_MAXIMUM_TASKS 1
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT
+#include <rtems/confdefs.h>
+
+/* global variables */