From 2054618e7526eccc11f132d68a00dbc4aaf4657c Mon Sep 17 00:00:00 2001 From: David Given Date: Thu, 30 May 2013 23:19:55 +0100 Subject: [PATCH] Add basic termios to the rpi platform to allow echoing/newline translation to be controlled. --HG-- branch : dtrg-videocore rename : plat/rpi/include/unistd.h => plat/rpi/include/termios.h rename : plat/rpi/libsys/write.c => plat/rpi/libsys/tcgetattr.c rename : plat/rpi/libsys/write.c => plat/rpi/libsys/tcsetattr.c --- plat/rpi/build.mk | 5 ++++- plat/rpi/include/termios.h | 31 +++++++++++++++++++++++++++++++ plat/rpi/libsys/libsys.h | 2 +- plat/rpi/libsys/read.c | 10 +++------- plat/rpi/libsys/tcgetattr.c | 21 +++++++++++++++++++++ plat/rpi/libsys/tcsetattr.c | 19 +++++++++++++++++++ plat/rpi/libsys/write.c | 9 ++++----- 7 files changed, 83 insertions(+), 14 deletions(-) create mode 100644 plat/rpi/include/termios.h create mode 100644 plat/rpi/libsys/tcgetattr.c create mode 100644 plat/rpi/libsys/tcsetattr.c diff --git a/plat/rpi/build.mk b/plat/rpi/build.mk index 7bbf007e4..4ddaeb489 100644 --- a/plat/rpi/build.mk +++ b/plat/rpi/build.mk @@ -13,6 +13,7 @@ D := plat/rpi/ platform-headers := \ unistd.h \ + termios.h \ pi.h \ ack/config.h @@ -33,7 +34,9 @@ platform-libsys := \ kill.c \ lseek.c \ time.c \ - signal.c + signal.c \ + tcgetattr.c \ + tcsetattr.c $(eval $(call build-platform)) diff --git a/plat/rpi/include/termios.h b/plat/rpi/include/termios.h new file mode 100644 index 000000000..67bf98a48 --- /dev/null +++ b/plat/rpi/include/termios.h @@ -0,0 +1,31 @@ +/* + * Raspberry Pi support library for the ACK + * © 2013 David Given + * This file is redistributable under the terms of the 3-clause BSD license. + * See the file 'Copying' in the root of the distribution for the full text. + */ + +#ifndef _TERMIOS_H +#define _TERMIOS_H + +typedef unsigned char tcflag_t; + +struct termios +{ + tcflag_t c_iflag; + tcflag_t c_oflag; + tcflag_t c_lflag; +}; + +#define ONLCR 1 +#define ECHO 2 +#define INLCR 4 + +#define TCSANOW 0 +#define TCSADRAIN 1 +#define TCSAFLUSH 2 + +extern int tcgetattr(int fd, struct termios* t); +extern int tcsetattr(int fd, int actions, struct termios* t); + +#endif diff --git a/plat/rpi/libsys/libsys.h b/plat/rpi/libsys/libsys.h index e9bff7e1a..bd9d91880 100644 --- a/plat/rpi/libsys/libsys.h +++ b/plat/rpi/libsys/libsys.h @@ -13,6 +13,6 @@ extern unsigned char _sys_rawread(void); extern void _sys_write_tty(char c); -/* extern int _sys_ttyflags; */ +extern int _sys_ttyflags; #endif diff --git a/plat/rpi/libsys/read.c b/plat/rpi/libsys/read.c index 476689320..227c89997 100644 --- a/plat/rpi/libsys/read.c +++ b/plat/rpi/libsys/read.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "libsys.h" int read(int fd, void* buffer, size_t count) @@ -30,16 +31,11 @@ int read(int fd, void* buffer, size_t count) /* Read one byte. */ i = _sys_rawread(); -#if 0 - if ((i == '\r') && !(_sys_ttyflags & RAW)) + if ((i == '\r') && !(_sys_ttyflags & INLCR)) i = '\n'; if (_sys_ttyflags & ECHO) _sys_write_tty(i); -#endif - if (i == '\r') - i = '\n'; - _sys_write_tty(i); - + *(char*)buffer = i; return 1; } diff --git a/plat/rpi/libsys/tcgetattr.c b/plat/rpi/libsys/tcgetattr.c new file mode 100644 index 000000000..08c73f36b --- /dev/null +++ b/plat/rpi/libsys/tcgetattr.c @@ -0,0 +1,21 @@ +/* + * Raspberry Pi support library for the ACK + * © 2013 David Given + * This file is redistributable under the terms of the 3-clause BSD license. + * See the file 'Copying' in the root of the distribution for the full text. + */ + +#include +#include +#include +#include +#include "libsys.h" + +int tcgetattr(int fd, struct termios* t) +{ + t->c_iflag = _sys_ttyflags & INLCR; + t->c_oflag = _sys_ttyflags & ONLCR; + t->c_lflag = _sys_ttyflags & ECHO; + return 0; +} + diff --git a/plat/rpi/libsys/tcsetattr.c b/plat/rpi/libsys/tcsetattr.c new file mode 100644 index 000000000..1943d33e0 --- /dev/null +++ b/plat/rpi/libsys/tcsetattr.c @@ -0,0 +1,19 @@ +/* + * Raspberry Pi support library for the ACK + * © 2013 David Given + * This file is redistributable under the terms of the 3-clause BSD license. + * See the file 'Copying' in the root of the distribution for the full text. + */ + +#include +#include +#include +#include +#include "libsys.h" + +int tcsetattr(int fd, int actions, struct termios* t) +{ + _sys_ttyflags = t->c_iflag | t->c_oflag | t->c_lflag; + return 0; +} + diff --git a/plat/rpi/libsys/write.c b/plat/rpi/libsys/write.c index 9a765b04c..0fba49884 100644 --- a/plat/rpi/libsys/write.c +++ b/plat/rpi/libsys/write.c @@ -8,16 +8,15 @@ #include #include #include +#include #include "libsys.h" +int _sys_ttyflags = ONLCR | INLCR | ECHO; + void _sys_write_tty(char c) { _sys_rawwrite(c); -#if 0 - if ((c == '\n') && !(_sys_ttyflags & RAW)) - _sys_rawwrite('\r'); -#endif - if (c == '\n') + if ((c == '\n') && (_sys_ttyflags & ONLCR)) _sys_rawwrite('\r'); }