diff options
author | Stu Grossman <grossman@cygnus> | 1993-04-06 05:50:54 +0000 |
---|---|---|
committer | Stu Grossman <grossman@cygnus> | 1993-04-06 05:50:54 +0000 |
commit | 4e772f4426b2e004da8aaa4cccc7ea483eadf794 (patch) | |
tree | 52ef0674eefe2186020a8ccc68265c6cd2a0d9ab /gdb/ser-termios.c | |
parent | 9acdb2dc824dfdfbd94bbd4481473dc3b9c2c09b (diff) | |
download | ppe42-binutils-4e772f4426b2e004da8aaa4cccc7ea483eadf794.tar.gz ppe42-binutils-4e772f4426b2e004da8aaa4cccc7ea483eadf794.zip |
* Makefile.in (SFILES OBS): Add serial.[co] & ser-hardwire.[co].
These implement a new serial line interface for talking to remote
targets.
* configure.in: Link ser-hardwire.c to ser-unix.c for all hosts,
EXCEPT go32, which gets ser-go32.c.
* remote.c: Use new serial interface. More remote-xxx's to be
converted later.
* ser-bsd.c, ser-termios.c: Removed.
* serial.c: New. Implements common operations for all serial
types.
* ser-unix.c: New. Unix specific serial operations for various
flavors of Unix (Posix, SysV, BSD).
* serial.h: Generic serial interface defs.
* config/i386/go32.mh, config/i386/i386bsd.h,
config/m68k/apollo68b.mh, config/sparc/sun4os4.mh: Remove
ser-bsd.o from XDEPFILES. All the magic is now handled in
configure.in.
Diffstat (limited to 'gdb/ser-termios.c')
-rw-r--r-- | gdb/ser-termios.c | 223 |
1 files changed, 0 insertions, 223 deletions
diff --git a/gdb/ser-termios.c b/gdb/ser-termios.c index b759632f8a..e69de29bb2 100644 --- a/gdb/ser-termios.c +++ b/gdb/ser-termios.c @@ -1,223 +0,0 @@ -/* Remote serial interface for OS's with termios, for GDB. - Copyright 1992 Free Software Foundation, Inc. - -This file is part of GDB. - -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., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "defs.h" -#include <fcntl.h> -#include <sys/time.h> -#include "serial.h" - -static int desc = -1; - -void -serial_raw(fd, oldstate) - int fd; - struct ttystate *oldstate; -{ - struct termios termios; - - oldstate->flags = fcntl(fd, F_GETFL, 0); - - fcntl(fd, F_SETFL, oldstate->flags|FNDELAY); - - if (tcgetattr(fd, &termios)) - { - fprintf(stderr, "tcgetattr failed: %s\n", safe_strerror(errno)); - } - - oldstate->termios = termios; - - termios.c_iflag = 0; - termios.c_oflag = 0; - termios.c_lflag = 0; - termios.c_cc[VMIN] = 0; - termios.c_cc[VTIME] = 0; - - if (tcsetattr(fd, TCSANOW, &termios)) - { - fprintf(stderr, "tcsetattr failed: %s\n", safe_strerror(errno)); - } -} - -void -serial_restore(fd, oldstate) - int fd; - struct ttystate *oldstate; -{ - fcntl(fd, F_SETFL, oldstate->flags); - - tcsetattr(fd, TCSANOW, &oldstate->termios); -} - -static struct ttystate oldstate; - -static fd_set readfds; - -int -serial_open(name) - const char *name; -{ - struct termios termios; - - desc = open (name, O_RDWR); - if (desc < 0) - error("Open of %s failed: %s", name, safe_strerror(errno)); - - serial_raw(desc, &oldstate); - -/* Setup constant stuff for select */ - - FD_ZERO(&readfds); - - return desc; -} - -/* Read a character with user-specified timeout. TIMEOUT is number of seconds - to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns - char if successful. Returns -2 if timeout expired, EOF if line dropped - dead, or -3 for any other error (see errno in that case). */ - -int -serial_readchar(timeout) - int timeout; -{ - static unsigned char buf[BUFSIZ]; - static unsigned char *bufp; - static int bufcnt = 0; - int numfds; - struct timeval tv; - - if (bufcnt-- > 0) - return *bufp++; - - tv.tv_sec = timeout; - tv.tv_usec = 0; - - FD_SET(desc, &readfds); - - if (timeout >= 0) - numfds = select(desc+1, &readfds, 0, 0, &tv); - else - numfds = select(desc+1, &readfds, 0, 0, 0); - - if (numfds <= 0) - if (numfds == 0) - return -2; /* Timeout */ - else - return -3; /* Got an error from select */ - - bufcnt = read(desc, buf, BUFSIZ); - - if (bufcnt <= 0) - if (bufcnt == 0) - return EOF; /* 0 chars means end of file */ - else - return -3; /* Got an error from read */ - - bufcnt--; - bufp = buf; - return *bufp++; -} - -/* Translate baud rates from integers to damn B_codes. Unix should - have outgrown this crap years ago, but even POSIX wouldn't buck it. */ - -static struct -{ - int rate; - int code; -} baudtab[] = { - {50, B50}, - {75, B75}, - {110, B110}, - {134, B134}, - {150, B150}, - {200, B200}, - {300, B300}, - {600, B600}, - {1200, B1200}, - {1800, B1800}, - {2400, B2400}, - {4800, B4800}, - {9600, B9600}, - {19200, B19200}, - {38400, B38400}, - {-1, -1}, -}; - -static int -rate_to_code(rate) - int rate; -{ - int i; - - for (i = 0; baudtab[i].rate != -1; i++) - if (rate == baudtab[i].rate) - return baudtab[i].code; - - return -1; -} - -int -serial_setbaudrate(rate) - int rate; -{ - struct termios termios; - - if (tcgetattr(desc, &termios)) - error("tcgetattr failed: %s\n", safe_strerror(errno)); - - cfsetospeed(&termios, rate_to_code(rate)); - cfsetispeed(&termios, rate_to_code(rate)); - - if (tcsetattr(desc, TCSANOW, &termios)) - error("tcsetattr failed: %s\n", safe_strerror(errno)); - - return 1; -} - -int -serial_write(str, len) - const char *str; - int len; -{ - int cc; - - while (len > 0) - { - cc = write(desc, str, len); - - if (cc < 0) - return 0; - len -= cc; - str += cc; - } - return 1; -} - -void -serial_close() -{ - if (desc < 0) - return; - - serial_restore(desc, &oldstate); - - close(desc); - desc = -1; -} |