X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=drivers%2Fserial%2Fsandbox.c;h=b73520ca940740351e69aea3e4f3ece04f94336f;hb=64f4a6192f0670de2d9af98900b750a3e7bf8ce6;hp=0d65587f71aa230ad15982d266eee17a479abbd1;hpb=7accb6ea56738adb538eedbe19d5089624cf8860;p=u-boot diff --git a/drivers/serial/sandbox.c b/drivers/serial/sandbox.c index 0d65587f71..b73520ca94 100644 --- a/drivers/serial/sandbox.c +++ b/drivers/serial/sandbox.c @@ -27,37 +27,92 @@ #include #include +#include +#include -int serial_init(void) +/* + * + * serial_buf: A buffer that holds keyboard characters for the + * Sandbox U-boot. + * + * invariants: + * serial_buf_write == serial_buf_read -> empty buffer + * (serial_buf_write + 1) % 16 == serial_buf_read -> full buffer + */ +static char serial_buf[16]; +static unsigned int serial_buf_write; +static unsigned int serial_buf_read; + +static int sandbox_serial_init(void) { + os_tty_raw(0); return 0; } -void serial_setbrg(void) +static void sandbox_serial_setbrg(void) { } -void serial_putc(const char ch) +static void sandbox_serial_putc(const char ch) { os_write(1, &ch, 1); } -void serial_puts(const char *str) +static void sandbox_serial_puts(const char *str) { - while (*str) - serial_putc(*str++); + os_write(1, str, strlen(str)); } -int serial_getc(void) +static unsigned int increment_buffer_index(unsigned int index) { - char buf; - int count; + return (index + 1) % ARRAY_SIZE(serial_buf); +} + +static int sandbox_serial_tstc(void) +{ + const unsigned int next_index = + increment_buffer_index(serial_buf_write); + ssize_t count; - count = os_read(0, &buf, 1); - return count == 1 ? buf : 0; + os_usleep(100); + if (next_index == serial_buf_read) + return 1; /* buffer full */ + + count = os_read_no_block(0, &serial_buf[serial_buf_write], 1); + if (count == 1) + serial_buf_write = next_index; + return serial_buf_write != serial_buf_read; } -int serial_tstc(void) +static int sandbox_serial_getc(void) { - return 0; + int result; + + while (!sandbox_serial_tstc()) + ; /* buffer empty */ + + result = serial_buf[serial_buf_read]; + serial_buf_read = increment_buffer_index(serial_buf_read); + return result; +} + +static struct serial_device sandbox_serial_drv = { + .name = "sandbox_serial", + .start = sandbox_serial_init, + .stop = NULL, + .setbrg = sandbox_serial_setbrg, + .putc = sandbox_serial_putc, + .puts = sandbox_serial_puts, + .getc = sandbox_serial_getc, + .tstc = sandbox_serial_tstc, +}; + +void sandbox_serial_initialize(void) +{ + serial_register(&sandbox_serial_drv); +} + +__weak struct serial_device *default_serial_console(void) +{ + return &sandbox_serial_drv; }