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

4.11
Last change on this file since c499856 was c499856, checked in by Chris Johns <chrisj@…>, on Mar 20, 2014 at 9:10:47 PM

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 5.8 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_cflag & CBAUD;
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.