diff options
author | Patrick Georgi <patrick.georgi@coresystems.de> | 2010-01-06 19:09:40 +0000 |
---|---|---|
committer | Patrick Georgi <patrick.georgi@coresystems.de> | 2010-01-06 19:09:40 +0000 |
commit | 4417bed5a515d9a1ff28af0cbc5d8661d94d3e27 (patch) | |
tree | ec6d0b820d2d153b32743d1d466ead3196fd677d | |
parent | 27ad83348dcd2077dff41d270a88380ce462bb9e (diff) | |
download | flashrom-4417bed5a515d9a1ff28af0cbc5d8661d94d3e27.zip flashrom-4417bed5a515d9a1ff28af0cbc5d8661d94d3e27.tar.gz |
Multiple unrelated changes
- replace the hand written serial input flush routine with the termios one.
- serialport_discard_read isn't necessary anymore - it just wrapped
sp_flush_incoming with no extra value.
- serialport_read and serialport_write would misbehave if read or write
didn't process everything in one go.
- sp_flush_incoming should be #define'd out for FAKE_COMMUNICATION like
serialport_discard_read was
Corresponding to flashrom svn r831.
Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Acked-by: Sean Nelson <audiohacked@gmail.com>
-rw-r--r-- | buspirate_spi.c | 6 | ||||
-rw-r--r-- | flash.h | 1 | ||||
-rw-r--r-- | serial.c | 38 |
3 files changed, 11 insertions, 34 deletions
diff --git a/buspirate_spi.c b/buspirate_spi.c index 62433d4..3006aa1 100644 --- a/buspirate_spi.c +++ b/buspirate_spi.c @@ -40,7 +40,7 @@ int buspirate_serialport_setup(char *dev) #define serialport_shutdown(...) 0 #define serialport_write(...) 0 #define serialport_read(...) 0 -#define serialport_discard_read(...) 0 +#define sp_flush_incoming(...) 0 #endif int buspirate_sendrecv(unsigned char *buf, unsigned int writecnt, unsigned int readcnt) @@ -144,9 +144,7 @@ int buspirate_spi_init(void) if (ret) return ret; /* Read any response and discard it. */ - ret = serialport_discard_read(); - if (ret) - return ret; + sp_flush_incoming(); } /* Enter raw bitbang mode */ buf[0] = 0x00; @@ -598,7 +598,6 @@ extern int sp_fd; int serialport_shutdown(void); int serialport_write(unsigned char *buf, unsigned int writecnt); int serialport_read(unsigned char *buf, unsigned int readcnt); -int serialport_discard_read(void); #include "chipdrivers.h" @@ -129,16 +129,7 @@ int sp_openserport(char *dev, unsigned int baud) void sp_flush_incoming(void) { - int i; - for (i=0;i<100;i++) { /* In case the device doesnt do EAGAIN, just read 0 */ - unsigned char flush[16]; - ssize_t rv; - rv = read(sp_fd, flush, sizeof(flush)); - if ((rv == -1) && (errno == EAGAIN)) - break; - if (rv == -1) - sp_die("flush read"); - } + tcflush(sp_fd, TCIFLUSH); return; } @@ -152,12 +143,14 @@ int serialport_write(unsigned char *buf, unsigned int writecnt) { int tmp = 0; - while (tmp != writecnt) { - tmp = write(sp_fd, buf + tmp, writecnt - tmp); + while (writecnt > 0) { + tmp = write(sp_fd, buf, writecnt); if (tmp == -1) return 1; if (!tmp) printf_debug("Empty write\n"); + writecnt -= tmp; + buf += tmp; } return 0; @@ -167,28 +160,15 @@ int serialport_read(unsigned char *buf, unsigned int readcnt) { int tmp = 0; - while (tmp != readcnt) { - tmp = read(sp_fd, buf + tmp, readcnt - tmp); + while (readcnt > 0) { + tmp = read(sp_fd, buf, readcnt); if (tmp == -1) return 1; if (!tmp) printf_debug("Empty read\n"); + readcnt -= tmp; + buf += tmp; } return 0; } - -int serialport_discard_read(void) -{ - int flags; - - printf_debug("%s\n", __func__); - flags = fcntl(sp_fd, F_GETFL); - flags |= O_NONBLOCK; - fcntl(sp_fd, F_SETFL, flags); - sp_flush_incoming(); - flags &= ~O_NONBLOCK; - fcntl(sp_fd, F_SETFL, flags); - - return 0; -} |