Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:41

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * @file
0005  *
0006  * @ingroup Console
0007  *
0008  * @brief printk support routines
0009  *
0010  * This file contains the required printk support.
0011  */
0012 
0013 /*
0014  *  COPYRIGHT (c) 1989-2012.
0015  *  On-Line Applications Research Corporation (OAR).
0016  *
0017  * Redistribution and use in source and binary forms, with or without
0018  * modification, are permitted provided that the following conditions
0019  * are met:
0020  * 1. Redistributions of source code must retain the above copyright
0021  *    notice, this list of conditions and the following disclaimer.
0022  * 2. Redistributions in binary form must reproduce the above copyright
0023  *    notice, this list of conditions and the following disclaimer in the
0024  *    documentation and/or other materials provided with the distribution.
0025  *
0026  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0027  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0028  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0029  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0030  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0031  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0032  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0033  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0034  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0035  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0036  * POSSIBILITY OF SUCH DAMAGE.
0037  */
0038 
0039 #include <rtems.h>
0040 #include <rtems/bspIo.h>
0041 #if BSP_ENABLE_VGA
0042   #include <rtems/keyboard.h>
0043 #endif
0044 #include <bsp.h>
0045 #include <libchip/serial.h>
0046 #include <libchip/ns16550.h>
0047 #include "../../shared/dev/serial/legacy-console.h"
0048 
0049 rtems_device_minor_number BSPPrintkPort = 0;
0050 
0051 static bool serialInit;
0052 static bool serialOK;
0053 
0054 static bool serialValid(console_tbl *port)
0055 {
0056   if (port->pDeviceFns) {
0057     if (!serialInit) {
0058       serialOK = true;
0059       if (port->pDeviceFns->deviceProbe != NULL) {
0060         if (!port->pDeviceFns->deviceProbe( BSPPrintkPort ))
0061           serialOK = false;
0062         else if (port->pDeviceFns->deviceInitialize != NULL)
0063           port->pDeviceFns->deviceInitialize( BSPPrintkPort );
0064         else
0065           serialOK = false;
0066       }
0067       serialInit = true;
0068     }
0069   }
0070   return serialOK;
0071 }
0072 
0073 void BSP_outch(char ch);
0074 int BSP_inch(void);
0075 
0076 void BSP_outch(char ch)
0077 {
0078   #if BSP_ENABLE_VGA
0079     bool isVga =  BSPPrintkPort == BSP_CONSOLE_VGA;
0080   #else
0081     bool isVga = false;
0082   #endif
0083 
0084   if ( !isVga ) {
0085     console_tbl *port = Console_Port_Tbl[BSPPrintkPort];
0086     if (serialValid(port)) {
0087       if (port->pDeviceFns->deviceWritePolled) {
0088         port->pDeviceFns->deviceWritePolled( BSPPrintkPort, ch );
0089       }
0090       return;
0091     }
0092   }
0093 
0094   #if BSP_ENABLE_VGA
0095     _IBMPC_outch( ch );
0096   #endif
0097 }
0098 
0099 int BSP_inch(void)
0100 {
0101   #if BSP_ENABLE_VGA
0102     bool isVga =  BSPPrintkPort == BSP_CONSOLE_VGA;
0103   #else
0104     bool isVga = false;
0105   #endif
0106 
0107   int result = -1;
0108 
0109   if ( !isVga ) {
0110     console_tbl *port = Console_Port_Tbl[BSPPrintkPort];
0111     if (serialValid(port)) {
0112       if (port->pDeviceFns->deviceRead) {
0113         do {
0114           result = port->pDeviceFns->deviceRead( BSPPrintkPort );
0115         } while (result == -1);
0116         return result;
0117       }
0118     }
0119   }
0120 
0121   #if BSP_ENABLE_VGA
0122     result = BSP_wait_polled_input();
0123   #endif
0124 
0125   return result;
0126 }
0127 
0128 BSP_output_char_function_type     BSP_output_char = BSP_outch;
0129 BSP_polling_getchar_function_type BSP_poll_char = BSP_inch;