]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - drivers/serial/sandbox.c
Update from 2013.01 to 2013.07
[karo-tx-uboot.git] / drivers / serial / sandbox.c
index cb19401df6c42e61a6ec1a7743be256099a2281a..ffff5e149774bb6950ec6f9097ea1c6730fa5261 100644 (file)
@@ -1,22 +1,7 @@
 /*
  * Copyright (c) 2011 The Chromium OS Authors.
- * See file CREDITS for list of people who contributed to this
- * project.
  *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
- * MA 02111-1307 USA
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 /*
 #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 +48,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 = {