File indexing completed on 2025-05-11 08:23:59
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 #include <stdarg.h>
0073 #include <stdio.h>
0074 #include <termios.h>
0075
0076 #include <rtems/console.h>
0077 #include <rtems/bspIo.h>
0078 #include <rtems/libio.h>
0079 #include <bsp.h> /* Must be before libio.h */
0080
0081 static void _BSP_output_char( char c );
0082 static rtems_status_code do_poll_read( rtems_device_major_number major, rtems_device_minor_number minor, void * arg);
0083 static rtems_status_code do_poll_write( rtems_device_major_number major, rtems_device_minor_number minor, void * arg);
0084
0085 static void _BSP_null_char( char c ) {return;}
0086
0087 BSP_output_char_function_type BSP_output_char = _BSP_null_char;
0088 BSP_polling_getchar_function_type BSP_poll_char = NULL;
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113 static rtems_status_code do_poll_read(
0114 rtems_device_major_number major,
0115 rtems_device_minor_number minor,
0116 void * arg
0117 )
0118 {
0119 rtems_libio_rw_args_t *rw_args = arg;
0120 int c;
0121
0122 while( (c = m5xx_uart_pollRead(minor)) == -1 );
0123 rw_args->buffer[0] = (uint8_t)c;
0124 if( rw_args->buffer[0] == '\r' )
0125 rw_args->buffer[0] = '\n';
0126 rw_args->bytes_moved = 1;
0127
0128 return RTEMS_SUCCESSFUL;
0129 }
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152 static rtems_status_code do_poll_write(
0153 rtems_device_major_number major,
0154 rtems_device_minor_number minor,
0155 void * arg
0156 )
0157 {
0158 rtems_libio_rw_args_t *rw_args = arg;
0159 uint32_t i;
0160 char cr ='\r';
0161
0162 for( i = 0; i < rw_args->count; i++ ) {
0163 m5xx_uart_pollWrite(minor, &(rw_args->buffer[i]), 1);
0164 if ( rw_args->buffer[i] == '\n' )
0165 m5xx_uart_pollWrite(minor, &cr, 1);
0166 }
0167 rw_args->bytes_moved = i;
0168
0169 return RTEMS_SUCCESSFUL;
0170 }
0171
0172
0173
0174
0175
0176 static void _BSP_output_char( char c )
0177 {
0178 char cr = '\r';
0179
0180
0181
0182
0183
0184
0185 m5xx_uart_pollWrite( PRINTK_MINOR, &c, 1 );
0186 if( c == '\n' )
0187 m5xx_uart_pollWrite( PRINTK_MINOR, &cr, 1 );
0188 }
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201 rtems_device_driver console_initialize(
0202 rtems_device_major_number major,
0203 rtems_device_minor_number minor,
0204 void *arg
0205 )
0206 {
0207 rtems_status_code status;
0208
0209
0210
0211
0212 #if UARTS_USE_TERMIOS == 1
0213 rtems_termios_initialize ();
0214 #endif
0215
0216
0217
0218
0219 BSP_output_char = _BSP_output_char;
0220
0221 m5xx_uart_initialize(SCI1_MINOR);
0222 status = rtems_io_register_name ("/dev/tty0", major, SCI1_MINOR);
0223 if (status != RTEMS_SUCCESSFUL)
0224 rtems_fatal_error_occurred (status);
0225
0226 m5xx_uart_initialize(SCI2_MINOR);
0227 status = rtems_io_register_name ("/dev/tty1", major, SCI2_MINOR);
0228 if (status != RTEMS_SUCCESSFUL)
0229 rtems_fatal_error_occurred (status);
0230
0231
0232 status = rtems_io_register_name ("/dev/console", major, CONSOLE_MINOR);
0233 if (status != RTEMS_SUCCESSFUL)
0234 rtems_fatal_error_occurred (status);
0235
0236 return RTEMS_SUCCESSFUL;
0237 }
0238
0239
0240
0241
0242 rtems_device_driver console_open(
0243 rtems_device_major_number major,
0244 rtems_device_minor_number minor,
0245 void *arg
0246 )
0247 {
0248 rtems_status_code sc;
0249
0250 if ( minor > NUM_PORTS - 1 )
0251 return RTEMS_INVALID_NUMBER;
0252
0253 #if (UARTS_USE_TERMIOS == 1)
0254 {
0255 #if (UARTS_IO_MODE == 1)
0256
0257 static const rtems_termios_callbacks callbacks = {
0258 m5xx_uart_firstOpen,
0259 m5xx_uart_lastClose,
0260 NULL,
0261 m5xx_uart_write,
0262 m5xx_uart_setAttributes,
0263 NULL,
0264 NULL,
0265 TERMIOS_IRQ_DRIVEN
0266 };
0267 sc = rtems_termios_open( major, minor, arg, &callbacks );
0268
0269 #else
0270
0271 static const rtems_termios_callbacks callbacks = {
0272 m5xx_uart_firstOpen,
0273 m5xx_uart_lastClose,
0274 m5xx_uart_pollRead,
0275 m5xx_uart_pollWrite,
0276 m5xx_uart_setAttributes,
0277 NULL,
0278 NULL,
0279 TERMIOS_POLLED
0280 };
0281 sc = rtems_termios_open( major, minor, arg, &callbacks );
0282
0283 #endif
0284
0285 return sc;
0286 }
0287
0288 #else
0289 {
0290 sc = RTEMS_SUCCESSFUL;
0291 }
0292 #endif
0293
0294 return sc;
0295 }
0296
0297
0298
0299
0300 rtems_device_driver console_close(
0301 rtems_device_major_number major,
0302 rtems_device_minor_number minor,
0303 void *arg
0304 )
0305 {
0306 if ( minor > NUM_PORTS-1 )
0307 return RTEMS_INVALID_NUMBER;
0308
0309 #if UARTS_USE_TERMIOS == 1
0310 return rtems_termios_close( arg );
0311 #else
0312 return RTEMS_SUCCESSFUL;
0313 #endif
0314 }
0315
0316
0317
0318
0319 rtems_device_driver console_read(
0320 rtems_device_major_number major,
0321 rtems_device_minor_number minor,
0322 void *arg
0323 )
0324 {
0325 if ( minor > NUM_PORTS-1 )
0326 return RTEMS_INVALID_NUMBER;
0327
0328 #if UARTS_USE_TERMIOS == 1
0329 return rtems_termios_read( arg );
0330 #else
0331 return do_poll_read( major, minor, arg );
0332 #endif
0333 }
0334
0335
0336
0337
0338 rtems_device_driver console_write(
0339 rtems_device_major_number major,
0340 rtems_device_minor_number minor,
0341 void *arg
0342 )
0343 {
0344 if ( minor > NUM_PORTS-1 )
0345 return RTEMS_INVALID_NUMBER;
0346
0347 #if UARTS_USE_TERMIOS == 1
0348 return rtems_termios_write( arg );
0349 #else
0350 return do_poll_write( major, minor, arg );
0351 #endif
0352 }
0353
0354
0355
0356
0357 rtems_device_driver console_control(
0358 rtems_device_major_number major,
0359 rtems_device_minor_number minor,
0360 void *arg
0361 )
0362 {
0363 if ( minor > NUM_PORTS-1 )
0364 return RTEMS_INVALID_NUMBER;
0365
0366 #if UARTS_USE_TERMIOS == 1
0367 return rtems_termios_ioctl( arg );
0368 #else
0369 return RTEMS_SUCCESSFUL;
0370 #endif
0371 }