source: rtems/testsuites/libtests/termios01/termios_testdriver.c

Last change on this file was 1c6926c1, checked in by Kevin Kirspel <kevin-kirspel@…>, on Mar 21, 2017 at 7:39:48 PM

termios: Synchronize with latest FreeBSD headers

Adding modified FreeBSD headers to synchronize RTEMS termios with
FreeBSD. Modify termios to support dedicated input and output baud for
termios structure. Updated BSPs to use dedicated input and output baud
in termios structure. Updated tools to use dedicated input and output
baud in termios structure. Updated termios testsuites to use dedicated
input and output baud in termios structure.

Close #2897.

  • Property mode set to 100644
File size: 5.7 KB
Line 
1/**
2 *  @file
3 *
4 *  This file contains a test fixture termios device driver.
5 */
6
7/*
8 *  COPYRIGHT (c) 1989-2012.
9 *  On-Line Applications Research Corporation (OAR).
10 *
11 *  The license and distribution terms for this file may be
12 *  found in the file LICENSE in this distribution or at
13 *  http://www.rtems.org/license/LICENSE.
14 */
15
16#ifdef HAVE_CONFIG_H
17#include "config.h"
18#endif
19
20#include "tmacros.h"
21#include <rtems/libio.h>
22#include <stdlib.h>
23#include <termios.h>
24#include <rtems/termiostypes.h>
25#include <rtems/libcsupport.h>
26#include <rtems/malloc.h>
27#include "termios_testdriver.h"
28
29/* forward declarations to avoid warnings */
30int termios_test_driver_inbyte_nonblocking(int port);
31void termios_test_driver_outbyte_polled(int port, char ch);
32ssize_t termios_test_driver_write_support(
33  int         minor,
34  const char *buf,
35  size_t      len
36);
37int termios_test_driver_set_attributes(
38  int                   minor,
39  const struct termios *t
40);
41
42int termios_test_driver_inbyte_nonblocking( int port )
43{
44  return -1;
45}
46
47void termios_test_driver_outbyte_polled(
48  int  port,
49  char ch
50)
51{
52}
53
54ssize_t termios_test_driver_write_support(
55  int         minor,
56  const char *buf,
57  size_t      len
58)
59{
60  size_t nwrite = 0;
61
62  while (nwrite < len) {
63#if (TERMIOS_TEST_DRIVER_USE_INTERRUPTS)
64    termios_test_driver_outbyte_interrupt( minor, *buf++ );
65#else
66    termios_test_driver_outbyte_polled( minor, *buf++ );
67#endif
68    nwrite++;
69  }
70  return nwrite;
71}
72
73
74/*
75 *  Set Attributes Handler
76 */
77int termios_test_driver_set_attributes(
78  int                   minor,
79  const struct termios *t
80)
81{
82  int                    baud_requested;
83  int                    number;
84  const char            *parity = "NONE";
85  const char            *char_size = "5";
86  const char            *stop = "NONE";
87
88  baud_requested = t->c_ispeed;
89
90  number = rtems_termios_baud_to_number( baud_requested );
91
92  /*
93   *  Parity
94   */
95  if (t->c_cflag & PARENB) {
96    parity = "EVEN";
97    if (!(t->c_cflag & PARODD))
98      parity = "ODD";
99  }
100
101  /*
102   *  Character Size
103   */
104  if (t->c_cflag & CSIZE) {
105    switch (t->c_cflag & CSIZE) {
106      case CS5:  char_size = "5"; break;
107      case CS6:  char_size = "6"; break;
108      case CS7:  char_size = "7"; break;
109      case CS8:  char_size = "8"; break;
110    }
111  }
112
113  /*
114   *  Stop Bits
115   */
116  if (t->c_cflag & CSTOPB)
117    stop = "2";
118  else
119    stop = "1";
120
121  printf(
122    "set_attributes - B%d %s-%s-%s\n",
123    number,
124    char_size,
125    parity,
126    stop
127  );
128  return 0;
129}
130
131/*
132 *  Test Device Driver Entry Points
133 */
134rtems_device_driver termios_test_driver_initialize(
135  rtems_device_major_number  major,
136  rtems_device_minor_number  minor,
137  void                      *arg
138)
139{
140  rtems_status_code sc;
141
142  rtems_termios_initialize();
143
144  /*
145   *  Register Device Names
146   */
147  puts(
148    "Termios_test_driver - rtems_io_register "
149      TERMIOS_TEST_DRIVER_DEVICE_NAME " - OK"
150  );
151  sc = rtems_io_register_name( TERMIOS_TEST_DRIVER_DEVICE_NAME, major, 0 );
152  directive_failed( sc, "rtems_io_register_name" );
153
154  return RTEMS_SUCCESSFUL;
155}
156
157rtems_device_driver termios_test_driver_open(
158  rtems_device_major_number major,
159  rtems_device_minor_number minor,
160  void                    * arg
161)
162{
163  rtems_status_code sc;
164  int               rc;
165  rtems_libio_open_close_args_t *args = arg;
166  static bool firstCall = true;
167
168  static const rtems_termios_callbacks Callbacks = {
169    NULL,                                    /* firstOpen */
170    NULL,                                    /* lastClose */
171    termios_test_driver_inbyte_nonblocking,  /* pollRead */
172    termios_test_driver_write_support,       /* write */
173    termios_test_driver_set_attributes,      /* setAttributes */
174    NULL,                                    /* stopRemoteTx */
175    NULL,                                    /* startRemoteTx */
176    0                                        /* outputUsesInterrupts */
177  };
178
179  if ( minor > 2 ) {
180    puts( "ERROR - Termios_testdriver - only 1 minor supported" );
181    rtems_test_exit(0);
182  }
183
184  if( firstCall ) {
185    static const uintptr_t allocSizes [] = {
186      sizeof( struct rtems_termios_tty ),
187      128,
188      64,
189      256
190    };
191
192    size_t i;
193
194    firstCall = false;
195
196    for (i = 0; i < sizeof( allocSizes ) / sizeof( allocSizes [0] ); ++i) {
197      void *opaque = rtems_heap_greedy_allocate( allocSizes, i );
198
199      sc = rtems_termios_open( major, minor, arg, &Callbacks );
200      rtems_test_assert( sc == RTEMS_NO_MEMORY );
201
202      rtems_heap_greedy_free( opaque );
203    }
204  }
205 
206  sc = rtems_termios_open (major, minor, arg, &Callbacks);
207  directive_failed( sc, "rtems_termios_open" );
208
209  puts( "Termios_test_driver - rtems_set_initial_baud - bad baud - OK" );
210  rc = rtems_termios_set_initial_baud( args->iop->data1, 5000 );
211  if ( rc != -1 ) {
212    printf( "ERROR - return %d\n", rc );
213    rtems_test_exit(0);
214  }
215
216  puts( "Termios_test_driver - rtems_set_initial_baud - 38400 - OK" );
217  rc = rtems_termios_set_initial_baud( args->iop->data1, 38400 );
218  if ( rc ) {
219    printf( "ERROR - return %d\n", rc );
220    rtems_test_exit(0);
221  }
222
223  return RTEMS_SUCCESSFUL;
224}
225
226rtems_device_driver termios_test_driver_close(
227  rtems_device_major_number major,
228  rtems_device_minor_number minor,
229  void                    * arg
230)
231{
232  return rtems_termios_close (arg);
233}
234
235rtems_device_driver termios_test_driver_read(
236  rtems_device_major_number major,
237  rtems_device_minor_number minor,
238  void                    * arg
239)
240{
241  return rtems_termios_read (arg);
242}
243
244rtems_device_driver termios_test_driver_write(
245  rtems_device_major_number major,
246  rtems_device_minor_number minor,
247  void                    * arg
248)
249{
250  return rtems_termios_write (arg);
251}
252
253rtems_device_driver termios_test_driver_control(
254  rtems_device_major_number major,
255  rtems_device_minor_number minor,
256  void                    * arg
257)
258{
259  return rtems_termios_ioctl (arg);
260}
Note: See TracBrowser for help on using the repository browser.