X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=drivers%2Fserial%2Fserial_sh.c;h=ee1f2d768a14f936d3979f5c12bfdff0ba2aac99;hb=7a8e739cd5bc0c48511d343f469af89a88a3294d;hp=13919c623baa2501aea7027db67d1bfe984755ef;hpb=99744b7e342014082609572af01bb6964e0f5a5a;p=u-boot diff --git a/drivers/serial/serial_sh.c b/drivers/serial/serial_sh.c index 13919c623b..ee1f2d768a 100644 --- a/drivers/serial/serial_sh.c +++ b/drivers/serial/serial_sh.c @@ -22,6 +22,8 @@ #include #include #include "serial_sh.h" +#include +#include #if defined(CONFIG_CONS_SCIF0) # define SCIF_BASE SCIF0_BASE @@ -55,13 +57,13 @@ static struct uart_port sh_sci = { .type = SCIF_BASE_PORT, }; -void serial_setbrg(void) +static void sh_serial_setbrg(void) { DECLARE_GLOBAL_DATA_PTR; sci_out(&sh_sci, SCBRR, SCBRR_VALUE(gd->baudrate, CONFIG_SYS_CLK_FREQ)); } -int serial_init(void) +static int sh_serial_init(void) { sci_out(&sh_sci, SCSCR , SCSCR_INIT(&sh_sci)); sci_out(&sh_sci, SCSCR , SCSCR_INIT(&sh_sci)); @@ -115,6 +117,14 @@ static int serial_rx_fifo_level(void) return scif_rxfill(&sh_sci); } +static void handle_error(void) +{ + sci_in(&sh_sci, SCxSR); + sci_out(&sh_sci, SCxSR, SCxSR_ERROR_CLEAR(&sh_sci)); + sci_in(&sh_sci, SCLSR); + sci_out(&sh_sci, SCLSR, 0x00); +} + void serial_raw_putc(const char c) { while (1) { @@ -127,32 +137,23 @@ void serial_raw_putc(const char c) sci_out(&sh_sci, SCxSR, sci_in(&sh_sci, SCxSR) & ~SCxSR_TEND(&sh_sci)); } -void serial_putc(const char c) +static void sh_serial_putc(const char c) { if (c == '\n') serial_raw_putc('\r'); serial_raw_putc(c); } -void serial_puts(const char *s) +static int sh_serial_tstc(void) { - char c; - while ((c = *s++) != 0) - serial_putc(c); -} + if (sci_in(&sh_sci, SCxSR) & SCIF_ERRORS) { + handle_error(); + return 0; + } -int serial_tstc(void) -{ return serial_rx_fifo_level() ? 1 : 0; } -void handle_error(void) -{ - sci_in(&sh_sci, SCxSR); - sci_out(&sh_sci, SCxSR, SCxSR_ERROR_CLEAR(&sh_sci)); - sci_in(&sh_sci, SCLSR); - sci_out(&sh_sci, SCLSR, 0x00); -} int serial_getc_check(void) { @@ -167,7 +168,7 @@ int serial_getc_check(void) return status & (SCIF_DR | SCxSR_RDxF(&sh_sci)); } -int serial_getc(void) +static int sh_serial_getc(void) { unsigned short status; char ch; @@ -187,3 +188,24 @@ int serial_getc(void) handle_error(); return ch; } + +static struct serial_device sh_serial_drv = { + .name = "sh_serial", + .start = sh_serial_init, + .stop = NULL, + .setbrg = sh_serial_setbrg, + .putc = sh_serial_putc, + .puts = default_serial_puts, + .getc = sh_serial_getc, + .tstc = sh_serial_tstc, +}; + +void sh_serial_initialize(void) +{ + serial_register(&sh_serial_drv); +} + +__weak struct serial_device *default_serial_console(void) +{ + return &sh_serial_drv; +}