From 57769ec4371df6ceabacf11aa130c4e8f4eb0240 Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Tue, 10 Sep 2013 14:09:09 +0200 Subject: Reducing timeout to 0.5 seconds --- Tools/com | Bin 0 -> 13632 bytes Tools/com.c | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++ Tools/px_uploader.py | 2 +- 3 files changed, 192 insertions(+), 1 deletion(-) create mode 100755 Tools/com create mode 100644 Tools/com.c (limited to 'Tools') diff --git a/Tools/com b/Tools/com new file mode 100755 index 000000000..1d80d4aa5 Binary files /dev/null and b/Tools/com differ diff --git a/Tools/com.c b/Tools/com.c new file mode 100644 index 000000000..fa52dcb61 --- /dev/null +++ b/Tools/com.c @@ -0,0 +1,191 @@ +/* + * Building: cc -o com com.c + * Usage : ./com /dev/device [speed] + * Example : ./com /dev/ttyS0 [115200] + * Keys : Ctrl-A - exit, Ctrl-X - display control lines status + * Darcs : darcs get http://tinyserial.sf.net/ + * Homepage: http://tinyserial.sourceforge.net + * Version : 2009-03-05 + * + * Ivan Tikhonov, http://www.brokestream.com, kefeer@brokestream.com + * Patches by Jim Kou, Henry Nestler, Jon Miner, Alan Horstmann + * + */ + + +/* Copyright (C) 2007 Ivan Tikhonov + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Ivan Tikhonov, kefeer@brokestream.com + +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int transfer_byte(int from, int to, int is_control); + +typedef struct {char *name; int flag; } speed_spec; + + +void print_status(int fd) { + int status; + unsigned int arg; + status = ioctl(fd, TIOCMGET, &arg); + fprintf(stderr, "[STATUS]: "); + if(arg & TIOCM_RTS) fprintf(stderr, "RTS "); + if(arg & TIOCM_CTS) fprintf(stderr, "CTS "); + if(arg & TIOCM_DSR) fprintf(stderr, "DSR "); + if(arg & TIOCM_CAR) fprintf(stderr, "DCD "); + if(arg & TIOCM_DTR) fprintf(stderr, "DTR "); + if(arg & TIOCM_RNG) fprintf(stderr, "RI "); + fprintf(stderr, "\r\n"); +} + +int main(int argc, char *argv[]) +{ + int comfd; + struct termios oldtio, newtio; //place for old and new port settings for serial port + struct termios oldkey, newkey; //place tor old and new port settings for keyboard teletype + char *devicename = argv[1]; + int need_exit = 0; + speed_spec speeds[] = + { + {"1200", B1200}, + {"2400", B2400}, + {"4800", B4800}, + {"9600", B9600}, + {"19200", B19200}, + {"38400", B38400}, + {"57600", B57600}, + {"115200", B115200}, + {NULL, 0} + }; + int speed = B9600; + + if(argc < 2) { + fprintf(stderr, "example: %s /dev/ttyS0 [115200]\n", argv[0]); + exit(1); + } + + comfd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK); + if (comfd < 0) + { + perror(devicename); + exit(-1); + } + + if(argc > 2) { + speed_spec *s; + for(s = speeds; s->name; s++) { + if(strcmp(s->name, argv[2]) == 0) { + speed = s->flag; + fprintf(stderr, "setting speed %s\n", s->name); + break; + } + } + } + + fprintf(stderr, "C-a exit, C-x modem lines status\n"); + + tcgetattr(STDIN_FILENO,&oldkey); + newkey.c_cflag = B9600 | CRTSCTS | CS8 | CLOCAL | CREAD; + newkey.c_iflag = IGNPAR; + newkey.c_oflag = 0; + newkey.c_lflag = 0; + newkey.c_cc[VMIN]=1; + newkey.c_cc[VTIME]=0; + tcflush(STDIN_FILENO, TCIFLUSH); + tcsetattr(STDIN_FILENO,TCSANOW,&newkey); + + + tcgetattr(comfd,&oldtio); // save current port settings + newtio.c_cflag = speed | CS8 | CLOCAL | CREAD; + newtio.c_iflag = IGNPAR; + newtio.c_oflag = 0; + newtio.c_lflag = 0; + newtio.c_cc[VMIN]=1; + newtio.c_cc[VTIME]=0; + tcflush(comfd, TCIFLUSH); + tcsetattr(comfd,TCSANOW,&newtio); + + print_status(comfd); + + while(!need_exit) { + fd_set fds; + int ret; + + FD_ZERO(&fds); + FD_SET(STDIN_FILENO, &fds); + FD_SET(comfd, &fds); + + + ret = select(comfd+1, &fds, NULL, NULL, NULL); + if(ret == -1) { + perror("select"); + } else if (ret > 0) { + if(FD_ISSET(STDIN_FILENO, &fds)) { + need_exit = transfer_byte(STDIN_FILENO, comfd, 1); + } + if(FD_ISSET(comfd, &fds)) { + need_exit = transfer_byte(comfd, STDIN_FILENO, 0); + } + } + } + + tcsetattr(comfd,TCSANOW,&oldtio); + tcsetattr(STDIN_FILENO,TCSANOW,&oldkey); + close(comfd); + + return 0; +} + + +int transfer_byte(int from, int to, int is_control) { + char c; + int ret; + do { + ret = read(from, &c, 1); + } while (ret < 0 && errno == EINTR); + if(ret == 1) { + if(is_control) { + if(c == '\x01') { // C-a + return -1; + } else if(c == '\x18') { // C-x + print_status(to); + return 0; + } + } + while(write(to, &c, 1) == -1) { + if(errno!=EAGAIN && errno!=EINTR) { perror("write failed"); break; } + } + } else { + fprintf(stderr, "\nnothing to read. probably port disconnected.\n"); + return -2; + } + return 0; +} + diff --git a/Tools/px_uploader.py b/Tools/px_uploader.py index cab3c2fd0..52d089360 100755 --- a/Tools/px_uploader.py +++ b/Tools/px_uploader.py @@ -436,7 +436,7 @@ while True: print("attempting reboot on %s..." % port) up.send_reboot() # wait for the reboot, without we might run into Serial I/O Error 5 - time.sleep(1.5) + time.sleep(0.5) continue try: -- cgit v1.2.3