# HG changeset patch # User Michael Spacefalcon # Date 1371955996 0 # Node ID 54392d1ea4742030459dabb6014565a1ef026e93 # Parent 38664e0b7c328df2147568bedc459fc947a3528d loadtools: first beginnings for the baud rate switching logic diff -r 38664e0b7c32 -r 54392d1ea474 loadtools/baudrate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/loadtools/baudrate.h Sun Jun 23 02:53:16 2013 +0000 @@ -0,0 +1,7 @@ +/* this header file defines the data structure for baud rate machinations */ + +struct baudrate { + char *name; + speed_t termios_code; + int bootrom_code; +}; diff -r 38664e0b7c32 -r 54392d1ea474 loadtools/romload.c --- a/loadtools/romload.c Sun Jun 23 01:13:03 2013 +0000 +++ b/loadtools/romload.c Sun Jun 23 02:53:16 2013 +0000 @@ -13,14 +13,17 @@ #include #include #include +#include "baudrate.h" #include "srecreader.h" extern int errno; extern char *target_ttydev; extern int target_fd; +extern struct baudrate baud_rate_table[]; struct srecreader iramimage; +struct baudrate *romload_baud_rate = baud_rate_table; /* 1st entry default */ static int beacon_interval = 13; /* in milliseconds */ @@ -153,6 +156,7 @@ usleep(SERIAL_FLUSH_DELAY * 1000); tcflush(target_fd, TCIFLUSH); + param_cmd[2] = romload_baud_rate->bootrom_code; write(target_fd, param_cmd, sizeof param_cmd); resp = expect_response(INTERMEDIATE_TIMEOUT); if (resp != 'p') { @@ -168,8 +172,9 @@ resp); exit(1); } - printf("

name); + switch_baud_rate(romload_baud_rate); usleep(SERIAL_FLUSH_DELAY * 1000); tcflush(target_fd, TCIFLUSH); diff -r 38664e0b7c32 -r 54392d1ea474 loadtools/sercomm.c --- a/loadtools/sercomm.c Sun Jun 23 01:13:03 2013 +0000 +++ b/loadtools/sercomm.c Sun Jun 23 02:53:16 2013 +0000 @@ -10,11 +10,27 @@ #include #include #include +#include "baudrate.h" char *target_ttydev; int target_fd; struct termios target_termios; +struct baudrate baud_rate_table[] = { + /* the first listed rate will be our default */ + {"115200", B115200, 0}, + {"57600", B57600, 1}, + {"38400", B38400, 2}, + {"19200", B19200, 4}, + /* non-standard high baud rates "remapped" by CP2102 usb2serial IC */ + {"812500", B921600, -1}, + {"406250", B460800, -1}, + {"203125", B230400, -1}, + /* table search terminator */ + {NULL, B0, -1}, +}; +struct baudrate *current_baud_rate; + open_target_serial() { target_fd = open(target_ttydev, O_RDWR|O_NONBLOCK); @@ -38,12 +54,14 @@ return 0; } -switch_baud_rate(code) +switch_baud_rate(br) + struct baudrate *br; { - cfsetispeed(&target_termios, code); - cfsetospeed(&target_termios, code); + cfsetispeed(&target_termios, br->termios_code); + cfsetospeed(&target_termios, br->termios_code); if (tcsetattr(target_fd, TCSAFLUSH, &target_termios) < 0) { perror("tcsetattr to switch baud rate"); exit(1); } + current_baud_rate = br; }