[U-Boot] [PATCH] sandbox: put stdin into raw mode

Mike Frysinger vapier at gentoo.org
Wed Oct 26 12:21:29 CEST 2011


This allows us to act like a serial device: we get tab chars and CTRL+C
and respond appropriately.

Signed-off-by: Mike Frysinger <vapier at gentoo.org>
---
 arch/sandbox/cpu/os.c    |   34 ++++++++++++++++++++++++++++++++++
 drivers/serial/sandbox.c |    1 +
 include/os.h             |    5 +++++
 3 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c
index 6c175d4..f80faac 100644
--- a/arch/sandbox/cpu/os.c
+++ b/arch/sandbox/cpu/os.c
@@ -21,6 +21,7 @@
 
 #include <fcntl.h>
 #include <stdlib.h>
+#include <termios.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -53,3 +54,36 @@ void os_exit(int exit_code)
 {
 	exit(exit_code);
 }
+
+/* Restore tty state when we exit */
+static struct termios orig_term;
+
+static void os_fd_restore(void)
+{
+	tcsetattr(0, TCSANOW, &orig_term);
+}
+
+/* Put tty into raw mode so <tab> and <ctrl+c> work */
+void os_tty_raw(int fd)
+{
+	static int setup = 0;
+	struct termios term;
+
+	if (setup)
+		return;
+	setup = 1;
+
+	/* If not a tty, don't complain */
+	if (tcgetattr(fd, &orig_term))
+		return;
+
+	term = orig_term;
+	term.c_iflag = IGNBRK | IGNPAR;
+	term.c_oflag = OPOST | ONLCR;
+	term.c_cflag = CS8 | CREAD | CLOCAL;
+	term.c_lflag = 0;
+	if (tcsetattr(fd, TCSANOW, &term))
+		return;
+
+	atexit(os_fd_restore);
+}
diff --git a/drivers/serial/sandbox.c b/drivers/serial/sandbox.c
index 814a0f9..1927c16 100644
--- a/drivers/serial/sandbox.c
+++ b/drivers/serial/sandbox.c
@@ -30,6 +30,7 @@
 
 int serial_init(void)
 {
+	os_tty_raw(0);
 	return 0;
 }
 
diff --git a/include/os.h b/include/os.h
index 3ea6d2d..d5df22f 100644
--- a/include/os.h
+++ b/include/os.h
@@ -71,3 +71,8 @@ int os_close(int fd);
  * @param exit_code	exit code for U-Boot
  */
 void os_exit(int exit_code);
+
+/**
+ * Put tty into raw mode to mimic serial console better
+ */
+void os_tty_raw(int fd);
-- 
1.7.6.1



More information about the U-Boot mailing list