1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 16:52:14 +02:00

serial: sh: Add DEBUG_UART support

Add support for debug output very early during boot using the DEBUG_UART
mechanism. This uses a static fixed UART port configuration selected via
Kconfig options and dedicated print functions from debug_uart.h. This is
useful e.g. when debugging problems so early during boot, that not even
the DM is initialized at that point, and thus DM_SERIAL is not available
either.

This functionality is disabled by default. To activate it, define the
following Kconfig options and select SCIF type using CFG_SCI/CFG_SCIF_A/
CFG_HSCIF/<nothing for regular SCIF>:

CONFIG_DEBUG_UART=y
CONFIG_DEBUG_UART_SCIF=y
CONFIG_DEBUG_UART_BASE=0xe6540000
CONFIG_DEBUG_UART_CLOCK=24000000

The later two options define the SCIF physical base address and SCIF
input clock in Hz. Optionally, to validate DEBUG_UART works, enable
the following as well to get early serial output message by default:

CONFIG_DEBUG_UART_ANNOUNCE=y

Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
This commit is contained in:
Marek Vasut
2023-02-28 22:17:22 +01:00
parent 5e12d7d00b
commit 836d1bfffa
2 changed files with 68 additions and 25 deletions

View File

@@ -415,6 +415,14 @@ config DEBUG_UART_SEMIHOSTING
start up driver model. The driver will be available until the real start up driver model. The driver will be available until the real
driver model serial is running. driver model serial is running.
config DEBUG_UART_SCIF
bool "Renesas SCIF UART"
depends on SH || ARCH_RMOBILE
help
Select this to enable a debug UART using the serial_sh driver. You
will need to provide parameters to make this work. The driver will
be available until the real driver-model serial is running.
config DEBUG_UART_SIFIVE config DEBUG_UART_SIFIVE
bool "SiFive UART" bool "SiFive UART"
depends on SIFIVE_SERIAL depends on SIFIVE_SERIAL

View File

@@ -249,9 +249,40 @@ U_BOOT_DRIVER(serial_sh) = {
#endif #endif
.priv_auto = sizeof(struct uart_port), .priv_auto = sizeof(struct uart_port),
}; };
#endif
#else /* CONFIG_DM_SERIAL */ #if !CONFIG_IS_ENABLED(DM_SERIAL) || IS_ENABLED(CONFIG_DEBUG_UART_SCIF)
#if defined(CFG_SCIF_A)
#define SCIF_BASE_PORT PORT_SCIFA
#elif defined(CFG_SCI)
#define SCIF_BASE_PORT PORT_SCI
#else
#define SCIF_BASE_PORT PORT_SCIF
#endif
static void sh_serial_init_nodm(struct uart_port *port)
{
sh_serial_init_generic(port);
serial_setbrg();
}
static void sh_serial_putc_nondm(struct uart_port *port, const char c)
{
if (c == '\n') {
while (1) {
if (serial_raw_putc(port, '\r') != -EAGAIN)
break;
}
}
while (1) {
if (serial_raw_putc(port, c) != -EAGAIN)
break;
}
}
#endif
#if !CONFIG_IS_ENABLED(DM_SERIAL)
#if defined(CONFIG_CONS_SCIF0) #if defined(CONFIG_CONS_SCIF0)
# define SCIF_BASE SCIF0_BASE # define SCIF_BASE SCIF0_BASE
#elif defined(CONFIG_CONS_SCIF1) #elif defined(CONFIG_CONS_SCIF1)
@@ -274,14 +305,6 @@ U_BOOT_DRIVER(serial_sh) = {
# error "Default SCIF doesn't set....." # error "Default SCIF doesn't set....."
#endif #endif
#if defined(CFG_SCIF_A)
#define SCIF_BASE_PORT PORT_SCIFA
#elif defined(CFG_SCI)
#define SCIF_BASE_PORT PORT_SCI
#else
#define SCIF_BASE_PORT PORT_SCIF
#endif
static struct uart_port sh_sci = { static struct uart_port sh_sci = {
.membase = (unsigned char *)SCIF_BASE, .membase = (unsigned char *)SCIF_BASE,
.mapbase = SCIF_BASE, .mapbase = SCIF_BASE,
@@ -301,28 +324,14 @@ static void sh_serial_setbrg(void)
static int sh_serial_init(void) static int sh_serial_init(void)
{ {
struct uart_port *port = &sh_sci; sh_serial_init_nodm(&sh_sci);
sh_serial_init_generic(port);
serial_setbrg();
return 0; return 0;
} }
static void sh_serial_putc(const char c) static void sh_serial_putc(const char c)
{ {
struct uart_port *port = &sh_sci; sh_serial_putc_nondm(&sh_sci, c);
if (c == '\n') {
while (1) {
if (serial_raw_putc(port, '\r') != -EAGAIN)
break;
}
}
while (1) {
if (serial_raw_putc(port, c) != -EAGAIN)
break;
}
} }
static int sh_serial_tstc(void) static int sh_serial_tstc(void)
@@ -367,3 +376,29 @@ __weak struct serial_device *default_serial_console(void)
return &sh_serial_drv; return &sh_serial_drv;
} }
#endif /* CONFIG_DM_SERIAL */ #endif /* CONFIG_DM_SERIAL */
#ifdef CONFIG_DEBUG_UART_SCIF
#include <debug_uart.h>
static struct uart_port debug_uart_sci = {
.membase = (unsigned char *)CONFIG_DEBUG_UART_BASE,
.mapbase = CONFIG_DEBUG_UART_BASE,
.type = SCIF_BASE_PORT,
#ifdef CFG_SCIF_USE_EXT_CLK
.clk_mode = EXT_CLK,
#endif
};
static inline void _debug_uart_init(void)
{
sh_serial_init_nodm(&debug_uart_sci);
}
static inline void _debug_uart_putc(int c)
{
sh_serial_putc_nondm(&debug_uart_sci, c);
}
DEBUG_UART_FUNCS
#endif