source: rtems/c/src/lib/libbsp/nios2/nios2_iss/console/console.c @ 2692a20

4.104.114.95
Last change on this file since 2692a20 was 2692a20, checked in by Joel Sherrill <joel.sherrill@…>, on 12/04/07 at 22:21:28

2007-12-04 Joel Sherrill <joel.sherrill@…>

  • console/console.c, include/bsp.h, startup/bspstart.c: Move interrupt_stack_size field from CPU Table to Configuration Table. Eliminate CPU Table from all ports. Delete references to CPU Table in all forms.
  • Property mode set to 100644
File size: 4.6 KB
Line 
1/*
2 *  This file implements simple console IO via JTAG UART.
3 *
4 *  Based on no_cpu/console.c
5 *  COPYRIGHT (c) 1989-1999.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  Altera-specific code is
9 *  COPYRIGHT (c) 2005-2006 Kolja Waschk, rtemsdev/ixo.de
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.com/license/LICENSE.
14 *
15 *  $Id$
16 */
17
18#define NO_BSP_INIT
19
20#include <bsp.h>
21#include <rtems/libio.h>
22
23/* #define JTAG_UART_REGS ((altera_avalon_jtag_uart_regs*)NIOS2_IO_BASE(JTAG_UART_BASE)) */
24
25#if 0
26#define XOFFchar              0x13
27#define XONchar               0x11
28#endif
29
30/*  console_initialize
31 *
32 *  This routine initializes the console IO driver.
33 *
34 *  Input parameters: NONE
35 *
36 *  Output parameters:  NONE
37 *
38 *  Return values:
39 */
40
41rtems_device_driver console_initialize(
42  rtems_device_major_number  major,
43  rtems_device_minor_number  minor,
44  void                      *arg
45)
46{
47  rtems_status_code status;
48
49  status = rtems_io_register_name(
50    "/dev/console",
51    major,
52    (rtems_device_minor_number) 0
53  );
54
55  if (status != RTEMS_SUCCESSFUL)
56    rtems_fatal_error_occurred(status);
57
58  return RTEMS_SUCCESSFUL;
59}
60
61/*  is_character_ready
62 *
63 *  If a character is available, this routine reads it and stores
64 *  it in
65 *  reads the character and stores
66 *
67 *  Input parameters: NONE
68 *
69 *  Output parameters:  NONE
70 *
71 *  Return values:
72 */
73
74rtems_boolean is_character_ready(
75  char *ch
76)
77{
78    altera_avalon_jtag_uart_regs *ajur = NIOS2_IO_BASE(JTAG_UART_BASE);
79    unsigned int data = ajur->data;
80
81    if (data & ALTERA_AVALON_JTAG_UART_DATA_RVALID_MSK)
82    {
83        *ch = (data & ALTERA_AVALON_JTAG_UART_DATA_DATA_MSK)
84              >> ALTERA_AVALON_JTAG_UART_DATA_DATA_OFST;
85        return TRUE;
86    };
87
88    return FALSE;
89}
90
91/*  inbyte
92 *
93 *  This routine reads a character from the SOURCE.
94 *
95 *  Input parameters: NONE
96 *
97 *  Output parameters:  NONE
98 *
99 *  Return values:
100 *    character read from SOURCE
101 */
102
103char inbyte( void )
104{
105    /*
106     *  Wait until a character is available.
107     */
108    char ch;
109    while(!is_character_ready(&ch));
110    return ch;
111}
112
113/*  outbyte
114 *
115 *  This routine transmits a character out the SOURCE.  It may support
116 *  XON/XOFF flow control.
117 *
118 *  Input parameters:
119 *    ch  - character to be transmitted
120 *
121 *  Output parameters:  NONE
122 */
123
124void outbyte(
125  char ch
126)
127{
128  altera_avalon_jtag_uart_regs *ajur = NIOS2_IO_BASE(JTAG_UART_BASE);
129  /*
130   *  Carriage Return/New line translation.
131   */
132
133  if ( ch == '\n' )
134    outbyte( '\r' );
135
136  /*
137   *  Wait for the transmitter to be ready.
138   *  Check for flow control requests and process.
139   *  Then output the character.
140   */
141
142  while ((ajur->control & ALTERA_AVALON_JTAG_UART_CONTROL_WSPACE_MSK) == 0);
143
144  ajur->data = ch;
145}
146
147/*
148 *  Open entry point
149 */
150
151rtems_device_driver console_open(
152  rtems_device_major_number major,
153  rtems_device_minor_number minor,
154  void                    * arg
155)
156{
157  return RTEMS_SUCCESSFUL;
158}
159
160/*
161 *  Close entry point
162 */
163
164rtems_device_driver console_close(
165  rtems_device_major_number major,
166  rtems_device_minor_number minor,
167  void                    * arg
168)
169{
170  return RTEMS_SUCCESSFUL;
171}
172
173/*
174 * read bytes from the serial port. We only have stdin.
175 */
176
177rtems_device_driver console_read(
178  rtems_device_major_number major,
179  rtems_device_minor_number minor,
180  void                    * arg
181)
182{
183  rtems_libio_rw_args_t *rw_args;
184  char *buffer;
185  int maximum;
186  int count = 0;
187
188  rw_args = (rtems_libio_rw_args_t *) arg;
189
190  buffer = rw_args->buffer;
191  maximum = rw_args->count;
192
193  for (count = 0; count < maximum; count++) {
194    buffer[ count ] = inbyte();
195    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
196      buffer[ count++ ]  = '\n';
197      break;
198    }
199  }
200
201  rw_args->bytes_moved = count;
202  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
203}
204
205/*
206 * write bytes to the serial port. Stdout and stderr are the same.
207 */
208
209rtems_device_driver console_write(
210  rtems_device_major_number major,
211  rtems_device_minor_number minor,
212  void                    * arg
213)
214{
215  int count;
216  int maximum;
217  rtems_libio_rw_args_t *rw_args;
218  char *buffer;
219
220  rw_args = (rtems_libio_rw_args_t *) arg;
221
222  buffer = rw_args->buffer;
223  maximum = rw_args->count;
224
225  for (count = 0; count < maximum; count++) {
226    if ( buffer[ count ] == '\n') {
227      outbyte('\r');
228    }
229    outbyte( buffer[ count ] );
230  }
231
232  rw_args->bytes_moved = maximum;
233  return 0;
234}
235
236/*
237 *  IO Control entry point
238 */
239
240rtems_device_driver console_control(
241  rtems_device_major_number major,
242  rtems_device_minor_number minor,
243  void                    * arg
244)
245{
246  return RTEMS_SUCCESSFUL;
247}
Note: See TracBrowser for help on using the repository browser.