make the code make sense for w, e, q, p, c control messages even if they don't work. tidy Reference: /n/atom/patch/applied/usbserialclean Date: Wed Apr 9 23:05:23 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/usb/serial/ftdi.c Wed Apr 9 23:03:47 2014 +++ /sys/src/cmd/usb/serial/ftdi.c Wed Apr 9 23:03:48 2014 @@ -201,6 +201,7 @@ { PAPOUCHVid, PAPOUCHTMUDid }, { FTVid, FTACGHFDUALDid }, { FT8U232AMDid, FT4232HDid }, + { FTVid, AMONKEYDid }, { 0, 0 }, }; @@ -686,7 +687,7 @@ epreader(void *u) { int dfd, rcount, cl, ntries, recov; - char err[40]; + char err[ERRMAX]; Areader *a; Channel *c; Packser *pk; @@ -710,6 +711,7 @@ if (pk == nil) pk = emallocz(sizeof(Packser), 1); Eagain: + err[0] = 0; rcount = read(dfd, pk->b, sizeof pk->b); if(serialdebug > 5) dsprint(2, "%d %#ux%#ux ", rcount, p->data[0], @@ -723,6 +725,7 @@ qunlock(ser); if(recov >= 0) goto Eagain; + rerrstr(err, sizeof err); } if(rcount == 0) continue; --- /sys/src/cmd/usb/serial/ftdi.h Wed Apr 9 23:03:50 2014 +++ /sys/src/cmd/usb/serial/ftdi.h Wed Apr 9 23:03:51 2014 @@ -386,6 +386,10 @@ */ FT4232HDid = 0x6011, /* FTDI FT4232H based device */ + /* + * Amontec JTAGkey (http://www.amontec.com/) + */ + AMONKEYDid = 0xCFF8, }; /* Commands */ --- /sys/src/cmd/usb/serial/prolific.c Wed Apr 9 23:03:53 2014 +++ /sys/src/cmd/usb/serial/prolific.c Wed Apr 9 23:03:54 2014 @@ -73,11 +73,7 @@ static void dumpbuf(uchar *buf, int bufsz) { - int i; - - for(i=0; is; - dsprint(2, "serial: vendorread val: 0x%x idx:%d buf:%p\n", - val, index, buf); + dsprint(2, "serial: vendorread val: 0x%x idx:%d\n", val, index); res = usbcmd(ser->dev, Rd2h | Rvendor | Rdev, VendorReadReq, val, index, buf, 1); dsprint(2, "serial: vendorread res:%d\n", res); @@ -354,7 +349,7 @@ plreadstatus(Serialport *p) { int nr, dfd; - char err[40]; + char err[ERRMAX]; uchar buf[VendorReqSz]; Serial *ser; @@ -393,7 +388,7 @@ p->novererr++; } else dsprint(2, "serial: bad status read %d\n", nr); - dsprint(2, "serial: finished read from interrupt %d\n", nr); + dsprint(2, "serial: finished read %d from interrupt\n", nr); qunlock(ser); return 0; } --- /sys/src/cmd/usb/serial/serial.c Wed Apr 9 23:03:55 2014 +++ /sys/src/cmd/usb/serial/serial.c Wed Apr 9 23:03:57 2014 @@ -174,23 +174,19 @@ set++; break; case 'c': - p->dcd = n; - // lines++; - ++nop; + p->hup_dcd = n; break; case 'd': p->dtr = n; lines++; break; case 'e': - p->dsr = n; - // lines++; - ++nop; + p->hup_dsr = n; break; - case 'f': /* flush the pipes */ + case 'f': /* flush output pipe (this impl is wrong; it flushes input) */ drain++; break; - case 'h': /* hangup?? */ + case 'h': /* hangup */ p->rts = p->dtr = 0; lines++; fprint(2, "serial: %c, unsure ctl\n", c); @@ -216,13 +212,11 @@ if(n == 0) p->cts = 0; break; - case 'n': + case 'n': /* this is wrong qnoblock() */ p->blocked = n; ++nop; break; case 'p': /* extended... */ - if(strlen(f[i]) != 2) - return -1; drain++; par = f[i][1]; if(par == 'n') @@ -240,7 +234,6 @@ set++; break; case 'q': - // drain++; p->limit = n; ++nop; break; @@ -255,9 +248,7 @@ set++; break; case 'w': - /* ?? how do I put this */ - p->timer = n * 100000LL; - ++nop; + nop++; break; case 'x': if(n == 0) @@ -494,6 +485,7 @@ case Qdata: if(count > ser->maxread) count = ser->maxread; + dsprint(2, "serial: reading from data\n"); do { err[0] = 0; @@ -533,13 +525,13 @@ dsprint(2, "serial: read: %s %ld\n", err, rcount); } while(rcount < 0 && strstr(err, "timed out") != nil); - dsprint(2, "serial: read from bulk %ld, %10.10s\n", rcount, err); + dsprint(2, "serial: read %ld bytes from bulk, %10.10s\n", rcount, err); if(rcount < 0){ dsprint(2, "serial: need to recover, data read %ld %r\n", count); serialrecover(ser, p, p->epin, err); } - dsprint(2, "serial: read from bulk %ld\n", rcount); + dsprint(2, "serial: read %ld bytes from bulk\n", rcount); count = rcount; break; case Qctl: @@ -563,7 +555,7 @@ altwrite(Serialport *p, uchar *buf, long count) { int nw, dfd; - char err[128]; + char err[ERRMAX]; Serial *ser; ser = p->s; --- /sys/src/cmd/usb/serial/serial.h Wed Apr 9 23:03:58 2014 +++ /sys/src/cmd/usb/serial/serial.h Wed Apr 9 23:03:59 2014 @@ -51,6 +51,10 @@ int dtr; int rlsd; + char hup_dcd; + char hup_dsr; + char dohup; + vlong timer; int blocked; /* for sw flow ctl. BUG: not implemented yet */ int nbreakerr;