[PATCH 04/05] Adding USB Serial test

Kevin Kirspel kevin-kirspel at idexx.com
Fri Apr 7 20:13:49 UTC 2017


---
 testsuite/usbserial01/init.c | 380 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 380 insertions(+)
 create mode 100644 testsuite/usbserial01/init.c

diff --git a/testsuite/usbserial01/init.c b/testsuite/usbserial01/init.c
new file mode 100644
index 0000000..bbefb5f
--- /dev/null
+++ b/testsuite/usbserial01/init.c
@@ -0,0 +1,380 @@
+/*
+ * Copyright (c) 2010, 2016 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems at embedded-brains.de>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * This test requires a USB serial adapater with a loopback plug attached to be
+ * plugged into a USB port.
+ */
+
+#include <sys/malloc.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <rtems/console.h>
+#include <rtems/shell.h>
+#include <rtems/bsd/bsd.h>
+
+#define TEST_NAME "LIBBSD USB SERIAL"
+
+#define USB_SERIAL_TEST_BUFFER_SIZE 48
+#define PRIO_OPEN  (RTEMS_MAXIMUM_PRIORITY - 12)
+#define PRIO_READ  (RTEMS_MAXIMUM_PRIORITY - 11)
+#define PRIO_WRITE (RTEMS_MAXIMUM_PRIORITY - 10)
+
+typedef struct
+{
+  int fd;
+  char rbuf[USB_SERIAL_TEST_BUFFER_SIZE];
+  char wbuf[USB_SERIAL_TEST_BUFFER_SIZE];
+}usb_test_message_t;
+
+static rtems_id oid, rid, wid, omid, rmid, wmid;
+static volatile bool kill_otask, kill_rtask, kill_wtask;
+static volatile bool otask_active, rtask_active, wtask_active;
+
+static void
+usb_serial_read_task(rtems_task_argument arg)
+{
+  usb_test_message_t msg;
+  uint32_t size, end_time;
+  int bytes, index;
+
+  rtask_active = true;
+  kill_rtask = false;
+  while(!kill_rtask)
+  {
+    rtems_message_queue_receive( rmid, &msg, &size, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
+    index = 0;
+    msg.rbuf[0] = 0;
+    end_time = rtems_clock_get_ticks_since_boot() + RTEMS_MILLISECONDS_TO_TICKS(500);
+    while(( rtems_clock_get_ticks_since_boot() < end_time ) && ( index < sizeof(msg.rbuf)))
+    {
+      bytes = read(msg.fd, &msg.rbuf[index], sizeof(msg.rbuf) - index - 1);
+      if( bytes < 0)
+      {
+        msg.fd = -1;
+        rtems_message_queue_send( omid, &msg, sizeof( msg ));
+        printf( "serial device read error: %d\n", errno );
+      }
+      else if( bytes > 0)
+      {
+        index += bytes;
+        msg.rbuf[index] = 0;
+        if( strcmp( msg.rbuf, msg.wbuf ) == 0 )
+        {
+          break;
+        }
+      }
+      rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(10));
+    }
+    printf( "serial device read: %s - %s\n", msg.rbuf, strcmp( msg.rbuf, msg.wbuf ) == 0 ? "PASS" : "FAIL" );
+  }
+  rtask_active = false;
+}
+
+static void
+usb_serial_write_task(rtems_task_argument arg)
+{
+  usb_test_message_t msg;
+  uint32_t size;
+  int bytes, write_len, count = 0;
+
+  wtask_active = true;
+  kill_wtask = false;
+  while(!kill_wtask)
+  {
+    rtems_message_queue_receive( wmid, &msg, &size, RTEMS_WAIT, RTEMS_NO_TIMEOUT );
+    count++;
+    sprintf( msg.wbuf, "Hello World %d", count );
+    write_len = strlen( msg.wbuf );
+    bytes = write(msg.fd, msg.wbuf, write_len);
+    if( bytes < 0)
+    {
+      msg.fd = -1;
+      rtems_message_queue_send( omid, &msg, sizeof( msg ));
+      printf( "serial device write error: %d\n", errno );
+    }
+    else if( bytes != write_len)
+    {
+      printf( "serial device failed to write all bytes: %d\n", bytes );
+    }
+    else
+    {
+      printf( "serial device write: %s\n", msg.wbuf );
+      rtems_message_queue_send( rmid, &msg, sizeof( msg ));
+    }
+  }
+  wtask_active = false;
+}
+
+static void
+usb_serial_open_task(rtems_task_argument arg)
+{
+  rtems_status_code sc;
+  usb_test_message_t msg;
+  struct termios t;
+  uint32_t size;
+  int fd, iret;
+
+  fd = -2;
+  otask_active = true;
+  kill_otask = false;
+  while(!kill_otask)
+  {
+    sc = rtems_message_queue_receive( omid, &msg, &size, RTEMS_WAIT, RTEMS_MILLISECONDS_TO_TICKS(1000));
+    if(sc == RTEMS_SUCCESSFUL)
+    {
+      if(fd >= 0)
+      {
+        close(fd);
+        printf( "serial device closed\n" );
+      }
+      fd = msg.fd;
+    }
+    if(fd == -1)
+    {
+      fd = open( "/dev/ttyU0", LIBIO_FLAGS_READ_WRITE );
+      if( fd != -1 )
+      {
+        printf( "serial device opened\n" );
+        //get terminal settings
+        iret = tcgetattr ( fd, &t );
+        assert( iret != -1 );
+        //set timeouts to zero for non-blocking mode
+        t.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
+        //t.c_iflag &= ~(BRKINT | ICRNL | INLCR | PARMRK | INPCK | ISTRIP);
+        //t.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP);
+        t.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
+        t.c_iflag |= IXON;    // Enable XON/XOFF flow control on output.
+        t.c_cflag &= ~(CSIZE | PARENB);
+        t.c_oflag &= ~(OPOST);
+        t.c_cflag |= ( CS8 | CREAD );
+        t.c_cc[VMIN] = 0;
+        t.c_cc[VTIME] = 0;
+        //save settings
+        iret = tcsetattr ( fd, TCSANOW, &t );
+        assert( iret != -1 );
+        msg.fd = fd;
+        rtems_message_queue_send( wmid, &msg, sizeof( msg ));
+      }
+    }
+    else
+    {
+      msg.fd = fd;
+      rtems_message_queue_send( wmid, &msg, sizeof( msg ));
+    }
+  }
+  otask_active = false;
+}
+
+static void
+Init(rtems_task_argument arg)
+{
+  rtems_status_code sc;
+  usb_test_message_t msg;
+  int ii;
+
+  (void) arg;
+  puts( "*** " TEST_NAME " TEST ***" );
+
+  sc = rtems_message_queue_create(
+    rtems_build_name ( 'M', 'U', 'O', 'P' ),
+    16,
+    sizeof(usb_test_message_t),
+    RTEMS_PRIORITY,
+    &omid
+  );
+  assert( sc == RTEMS_SUCCESSFUL );
+
+  sc = rtems_message_queue_create(
+    rtems_build_name ( 'M', 'U', 'R', 'D' ),
+    16,
+    sizeof(usb_test_message_t),
+    RTEMS_PRIORITY,
+    &rmid
+  );
+  assert( sc == RTEMS_SUCCESSFUL );
+
+  sc = rtems_message_queue_create(
+    rtems_build_name ( 'M', 'U', 'W', 'R' ),
+    16,
+    sizeof(usb_test_message_t),
+    RTEMS_PRIORITY,
+    &wmid
+  );
+  assert( sc == RTEMS_SUCCESSFUL );
+
+  sc = rtems_task_create(
+    rtems_build_name('U', 'S', 'B', 'R'),
+    PRIO_READ,
+    RTEMS_MINIMUM_STACK_SIZE,
+    RTEMS_DEFAULT_MODES,
+    RTEMS_FLOATING_POINT,
+    &rid
+  );
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_task_create(
+    rtems_build_name('U', 'S', 'B', 'W'),
+    PRIO_WRITE,
+    RTEMS_MINIMUM_STACK_SIZE,
+    RTEMS_DEFAULT_MODES,
+    RTEMS_FLOATING_POINT,
+    &wid
+  );
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_task_create(
+    rtems_build_name('U', 'S', 'B', 'O'),
+    PRIO_OPEN,
+    RTEMS_MINIMUM_STACK_SIZE,
+    RTEMS_DEFAULT_MODES,
+    RTEMS_FLOATING_POINT,
+    &oid
+  );
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_task_start(rid, usb_serial_read_task, NULL);
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_task_start(oid, usb_serial_open_task, NULL);
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_task_start(wid, usb_serial_write_task, NULL);
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_bsd_initialize();
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  msg.fd = -1;
+  rtems_message_queue_send( omid, &msg, sizeof( msg ));
+
+  sc = rtems_shell_init("SHLL", 16 * 1024, 1, CONSOLE_DEVICE_NAME,
+      false, true, NULL);
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  kill_otask = true;
+  kill_rtask = true;
+  kill_wtask = true;
+  while(otask_active || rtask_active || wtask_active)
+  {
+    rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(10));
+  }
+
+  sc = rtems_message_queue_delete(wmid);
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_message_queue_delete(rmid);
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  sc = rtems_message_queue_delete(omid);
+  assert(sc == RTEMS_SUCCESSFUL);
+
+  exit(0);
+}
+
+#define CONFIGURE_MICROSECONDS_PER_TICK 1000
+
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_STUB_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_ZERO_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK
+
+#define CONFIGURE_MAXIMUM_DRIVERS 32
+
+#define CONFIGURE_FILESYSTEM_DOSFS
+
+#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 32
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+
+#define CONFIGURE_UNLIMITED_OBJECTS
+#define CONFIGURE_UNIFIED_WORK_AREAS
+
+#define CONFIGURE_STACK_CHECKER_ENABLED
+
+#define CONFIGURE_BDBUF_BUFFER_MAX_SIZE (64 * 1024)
+#define CONFIGURE_BDBUF_CACHE_MEMORY_SIZE (256 * 1024)
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_INIT_TASK_STACK_SIZE (32 * 1024)
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
+
+#define CONFIGURE_INIT
+
+#include <rtems/confdefs.h>
+
+#include <bsp/nexus-devices.h>
+
+SYSINIT_DRIVER_REFERENCE(uplcom, uhub);
+
+#define CONFIGURE_SHELL_COMMANDS_INIT
+
+#include <bsp/irq-info.h>
+
+#include <rtems/netcmds-config.h>
+
+#define CONFIGURE_SHELL_USER_COMMANDS \
+  &bsp_interrupt_shell_command, \
+  &rtems_shell_STTY_Command, \
+  &rtems_shell_SYSCTL_Command
+
+#define CONFIGURE_SHELL_COMMAND_CPUUSE
+#define CONFIGURE_SHELL_COMMAND_PERIODUSE
+#define CONFIGURE_SHELL_COMMAND_STACKUSE
+#define CONFIGURE_SHELL_COMMAND_PROFREPORT
+
+#define CONFIGURE_SHELL_COMMAND_CP
+#define CONFIGURE_SHELL_COMMAND_PWD
+#define CONFIGURE_SHELL_COMMAND_LS
+#define CONFIGURE_SHELL_COMMAND_LN
+#define CONFIGURE_SHELL_COMMAND_LSOF
+#define CONFIGURE_SHELL_COMMAND_CHDIR
+#define CONFIGURE_SHELL_COMMAND_CD
+#define CONFIGURE_SHELL_COMMAND_MKDIR
+#define CONFIGURE_SHELL_COMMAND_RMDIR
+#define CONFIGURE_SHELL_COMMAND_CAT
+#define CONFIGURE_SHELL_COMMAND_MV
+#define CONFIGURE_SHELL_COMMAND_RM
+#define CONFIGURE_SHELL_COMMAND_MALLOC_INFO
+
+#define CONFIGURE_SHELL_COMMAND_BLKSTATS
+#define CONFIGURE_SHELL_COMMAND_BLKSYNC
+#define CONFIGURE_SHELL_COMMAND_MOUNT
+#define CONFIGURE_SHELL_COMMAND_UNMOUNT
+
+#include <rtems/shellconfig.h>
\ No newline at end of file
-- 
1.9.1



More information about the devel mailing list