Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:09

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RTEMSBSPsX8664AMD64
0007  *
0008  * @brief Console implementation
0009  */
0010 
0011 /*
0012  * Copyright (c) 2018 Amaan Cheval <amaan.cheval@gmail.com>
0013  *
0014  * Redistribution and use in source and binary forms, with or without
0015  * modification, are permitted provided that the following conditions
0016  * are met:
0017  * 1. Redistributions of source code must retain the above copyright
0018  *    notice, this list of conditions and the following disclaimer.
0019  * 2. Redistributions in binary form must reproduce the above copyright
0020  *    notice, this list of conditions and the following disclaimer in the
0021  *    documentation and/or other materials provided with the distribution.
0022  *
0023  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
0024  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0025  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0026  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
0027  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
0028  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
0029  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
0030  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
0031  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
0032  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
0033  * SUCH DAMAGE.
0034  */
0035 
0036 #include <libchip/ns16550.h>
0037 #include <rtems/bspIo.h>
0038 #include <bsp.h>
0039 #include <bsp/console-termios.h>
0040 #include <rtems/score/cpuimpl.h>
0041 
0042 void
0043 uart0_output_char(char);
0044 
0045 static uint8_t amd64_uart_get_register(uintptr_t addr, uint8_t i)
0046 {
0047   return inport_byte(addr + i);
0048 }
0049 
0050 static void amd64_uart_set_register(uintptr_t addr, uint8_t i, uint8_t val)
0051 {
0052   outport_byte(addr + i, val);
0053 }
0054 
0055 static ns16550_context amd64_uart_context = {
0056   .base = RTEMS_TERMIOS_DEVICE_CONTEXT_INITIALIZER("UART"),
0057   .get_reg = amd64_uart_get_register,
0058   .set_reg = amd64_uart_set_register,
0059   .port = (uintptr_t) COM1_BASE_IO,
0060   .initial_baud = COM1_CLOCK_RATE
0061 };
0062 
0063 /*
0064  * XXX: We should use the interrupt based handler once interrupts are supported
0065  */
0066 const console_device console_device_table[] = {
0067   {
0068     .device_file = "/dev/ttyS0",
0069     .probe = console_device_probe_default,
0070     .handler = &ns16550_handler_polled,
0071     .context = &amd64_uart_context.base
0072   }
0073 };
0074 const size_t console_device_count = RTEMS_ARRAY_SIZE(console_device_table);
0075 
0076 void uart0_output_char(char c)
0077 {
0078   rtems_termios_device_context *ctx = console_device_table[0].context;
0079 
0080   ns16550_polled_putchar(ctx, c);
0081 }
0082 
0083 #ifndef BSP_USE_EFI_BOOT_SERVICES
0084 
0085 BSP_output_char_function_type BSP_output_char   = uart0_output_char;
0086 BSP_polling_getchar_function_type BSP_poll_char = NULL;
0087 
0088 #endif