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

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@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);

On Wed, Oct 26, 2011 at 3:21 AM, Mike Frysinger vapier@gentoo.org wrote:
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@gentoo.org
Tested-by: Simon Glass sjg@chromium.org
Thanks Mike
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

Dear Mike Frysinger,
In message 1319624489-32009-1-git-send-email-vapier@gentoo.org you wrote:
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@gentoo.org
arch/sandbox/cpu/os.c | 34 ++++++++++++++++++++++++++++++++++ drivers/serial/sandbox.c | 1 + include/os.h | 5 +++++ 3 files changed, 40 insertions(+), 0 deletions(-)
Applied, thanks.
Best regards,
Wolfgang Denk
participants (3)
-
Mike Frysinger
-
Simon Glass
-
Wolfgang Denk