Notice: We have migrated to GitLab launching 2024-05-01 see here: https://gitlab.rtems.org/

NewTicket: console-io.c

File console-io.c, 4.4 KB (added by ostyche, on 02/09/22 at 13:46:27)
Line 
1/*
2 *  This file contains the RBTX4925 console IO package.
3 */
4
5#include <bsp.h>
6#include <rtems/bspIo.h>
7#include <rtems/libio.h>
8#include <ctype.h>
9#include <rtems/termiostypes.h>
10#include <libcpu/loongson3a.h>
11
12//BSP_CONSOLE_PORT_VGA¡¢BSP_CONSOLE_PORT_COM1¡¢BSP_CONSOLE_PORT_COM2
13int BSPConsolePort = BSP_CONSOLE_PORT_VGA;
14int BSPPrintkPort=BSP_CONSOLE_PORT_COM1;
15int BSPUartBaud=115200;
16
17
18extern int BSP_kbd_polled_read( int minor );
19extern void video_putc( const char c );
20extern int fb_init( void );
21extern void BSP_uart_init( int uart, unsigned long baud, unsigned long databits, unsigned long parity, unsigned long stopbits, int hwFlow );
22extern void BSP_uart_polled_write( int uart, int val );
23extern int  BSP_uart_polled_read( int uart );
24
25
26static int loongson3a_first_open( int major, int minor, void *arg )
27{
28        return 0;
29}
30
31static int loongson3a_last_close( int major, int minor, void *arg )
32{
33        return 0;
34}
35
36static int loongson3a_poll_read( int minor )
37{
38        if(BSPConsolePort==BSP_CONSOLE_PORT_VGA)
39        {
40                return BSP_kbd_polled_read(BSPConsolePort);
41        }
42        else
43        {
44                return BSP_uart_polled_read(BSPConsolePort);
45        }
46}
47
48static int loongson3a_poll_write( int minor, const char *buf, int n )
49{
50        int i=0;
51       
52        if(BSPConsolePort==BSP_CONSOLE_PORT_VGA)
53        {
54                for ( i = 0; i < n; i++ )
55                {
56                        video_putc( buf[i] );
57                }
58        }
59        else
60        {
61                for ( i = 0; i < n; i++ )
62                {
63                        BSP_uart_polled_write( BSPConsolePort,buf[i] );
64                }
65        }
66        return 0;
67}
68
69static int loongson3a_set_attributes( int minor, const struct termios *t )
70{
71        return 0;
72}
73
74
75/*  console_initialize
76 *
77 *  This routine initializes the console IO driver.
78 */
79rtems_device_driver console_initialize(
80  rtems_device_major_number  major,
81  rtems_device_minor_number  minor,
82  void                      *arg
83)
84{
85  rtems_status_code status;
86  rtems_termios_initialize();
87
88  status = rtems_io_register_name(
89    "/dev/console",
90    major,
91    (rtems_device_minor_number) 0
92  );
93
94  if (status != RTEMS_SUCCESSFUL)
95    rtems_fatal_error_occurred(status);
96
97  if(BSPConsolePort == BSP_CONSOLE_PORT_VGA)
98  {
99        fb_init();
100  }
101  else
102  {
103        BSP_uart_init( BSPConsolePort, BSPUartBaud, 8, 0, 0, 0 );
104  }
105 
106  return RTEMS_SUCCESSFUL;
107}
108
109
110/*
111 *  Open entry point
112 */
113rtems_device_driver console_open(
114  rtems_device_major_number major,
115  rtems_device_minor_number minor,
116  void                    * arg
117)
118{
119        static rtems_termios_callbacks callbacks =
120        {
121                loongson3a_first_open,                                            /* firstOpen */
122                loongson3a_last_close,                                            /* lastClose */
123                loongson3a_poll_read,                             /* pollRead */
124                loongson3a_poll_write,                    /* write */
125                loongson3a_set_attributes,              /* setAttributes */
126                NULL,                                             /* stopRemoteTx */
127                NULL,                                             /* startRemoteTx */
128                TERMIOS_POLLED                                                    /* outputUsesInterrupts */
129         
130        };
131        return rtems_termios_open( major, minor, arg, &callbacks);
132}
133
134/*
135 *  Close entry point
136 */
137rtems_device_driver console_close(
138  rtems_device_major_number major,
139  rtems_device_minor_number minor,
140  void                    * arg
141)
142{
143  return rtems_termios_close( arg );
144}
145
146/*
147 * read bytes from the serial port. We only have stdin.
148 */
149rtems_device_driver console_read(
150  rtems_device_major_number major,
151  rtems_device_minor_number minor,
152  void                    * arg
153)
154{
155  return rtems_termios_read( arg );
156}
157
158/*
159 * write bytes to the serial port. Stdout and stderr are the same.
160 */
161rtems_device_driver console_write(
162  rtems_device_major_number major,
163  rtems_device_minor_number minor,
164  void                    * arg
165)
166{
167        return rtems_termios_write ( arg );
168}
169
170/*
171 *  IO Control entry point
172 */
173rtems_device_driver console_control(
174  rtems_device_major_number major,
175  rtems_device_minor_number minor,
176  void                    * arg
177)
178{
179  return rtems_termios_ioctl( arg );
180}
181
182void Loongson3a_output_char( char c )
183{
184        //outbyte( c );
185        if(BSPPrintkPort==BSP_CONSOLE_PORT_VGA)
186        {
187                video_putc(c);
188        }
189        else
190        {
191                BSP_uart_polled_write(BSPPrintkPort,c);
192        }
193}
194char Loongson3a_input_char( void )
195{
196        //return inbyte();
197        int tmp;
198        if(BSPPrintkPort==BSP_CONSOLE_PORT_VGA)
199        {
200                tmp=BSP_kbd_polled_read(BSPPrintkPort);
201        }
202        else
203        {
204                tmp=BSP_uart_polled_read(BSPPrintkPort);
205        }
206        tmp=tmp&0xff;
207        return (char)tmp;
208}
209BSP_output_char_function_type                   BSP_output_char = Loongson3a_output_char;
210BSP_polling_getchar_function_type       BSP_poll_char = Loongson3a_input_char;
211