--- lpctool-0.8/lpctool_serial.c 2007-09-18 03:32:42.000000000 +0200 +++ lpctool-0.8.hacked/lpctool_serial.c 2007-09-21 23:21:29.000000000 +0200 @@ -9,9 +9,13 @@ #include #include #include +#include #include "infohelper.h" +#define MAX(x,y) ((x) > (y) ? (x) : (y)) +#define MIN(x,y) ((x) < (y) ? (x) : (y)) + static int serialDev = -1; static struct termios term; @@ -60,7 +64,7 @@ void setBaud(unsigned int baud) void setFlow(unsigned char flow) { if(flow == 0) - { + { term.c_iflag&=~(IXON|IXOFF|IXANY|INLCR|ICRNL); } else @@ -94,32 +98,32 @@ int openSerial(unsigned char *dev) term.c_cflag = (term.c_cflag & ~CSIZE) | CS8; term.c_cflag |= CLOCAL | CREAD; - + term.c_cflag &= ~(PARENB | PARODD); term.c_cflag &= ~CSTOPB; term.c_iflag=IGNBRK; - + term.c_iflag |= IXON | IXOFF; - + term.c_lflag=0; - + term.c_oflag=0; - - + + setTimeout(30); - + if (tcsetattr(serialDev, TCSANOW, &term)!=0) return printError("setattr stage 1 failed"); - + if (tcgetattr(serialDev, &term)!=0) return printError("getattr failed"); - + term.c_cflag &= ~CRTSCTS; - + if (tcsetattr(serialDev, TCSANOW, &term)!=0) return printError("setattr stage 2 failed"); - + return serialDev; } @@ -135,13 +139,13 @@ int closeSerial(void) return serialDev; } -int reconfSerial(unsigned int baud, unsigned char flow, unsigned char tout) +int reconfSerial(unsigned int baud, unsigned char flow, unsigned char tout) { if(serialDev > 0) { - + setFlow(flow); - setBaud(baud); + setBaud(baud); setTimeout(tout); return tcsetattr(serialDev,TCSANOW,&term); } @@ -154,21 +158,20 @@ int reconfSerial(unsigned int baud, unsi int sendBuf(unsigned int len, unsigned char *buf) { unsigned int boff; + int ret; + if(serialDev > 0) { boff = 0; - while(len >= XFERSIZE) - { - if(write(serialDev, buf+boff, XFERSIZE) == 0) - return 0; - len -= XFERSIZE; - boff +=XFERSIZE; - } - while(len--) + while (boff < len) { - if(write(serialDev, buf+boff, 1) == 0) + ret = write (serialDev, buf+boff, MIN (len - boff, XFERSIZE)); + if (ret < 0 && errno != EAGAIN) + { + perror ("error writing to serial port"); return 0; - boff ++; + } + boff += ret; } return boff; } @@ -176,28 +179,27 @@ int sendBuf(unsigned int len, unsigned c } int sendBufE(unsigned int len, unsigned char *buf) -{ +{ return(getBuf(sendBuf(len,buf), buf)); } int getBuf(unsigned int len, unsigned char *buf) { unsigned int boff; + int ret; + if(serialDev > 0) { boff = 0; - while(len >= XFERSIZE) - { - if(read(serialDev, buf+boff, XFERSIZE) < 0) - return 0; - len -= XFERSIZE; - boff +=XFERSIZE; - } - while(len--) + while (boff < len) { - if(read(serialDev, buf+boff, 1) < 0) + ret = read (serialDev, buf+boff, MIN (len - boff, XFERSIZE)); + if (ret < 0 && errno != EAGAIN) + { + perror ("error reading from serial port"); return 0; - boff ++; + } + boff += ret; } return boff; }