]> git.sur5r.net Git - u-boot/blobdiff - drivers/serial/sandbox.c
mmc: support the correct card version for eMMC
[u-boot] / drivers / serial / sandbox.c
index cb19401df6c42e61a6ec1a7743be256099a2281a..b73520ca940740351e69aea3e4f3ece04f94336f 100644 (file)
 #include <serial.h>
 #include <linux/compiler.h>
 
+/*
+ *
+ *   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);
@@ -50,18 +63,37 @@ static void sandbox_serial_puts(const char *str)
        os_write(1, str, strlen(str));
 }
 
-static int sandbox_serial_getc(void)
+static unsigned int increment_buffer_index(unsigned int index)
+{
+       return (index + 1) % ARRAY_SIZE(serial_buf);
+}
+
+static int sandbox_serial_tstc(void)
 {
-       char buf;
+       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;
 }
 
-static int sandbox_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 = {