X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/usb-driver/blobdiff_plain/4af4753dc42ce756e91d803da1824478e11695f0..3f5287b7f725b0e90b8a29b4ed3e16cfdc8d6fbe:/jtagkey.c diff --git a/jtagkey.c b/jtagkey.c index 2be1954..04cfb4c 100644 --- a/jtagkey.c +++ b/jtagkey.c @@ -114,9 +114,9 @@ int jtagkey_transfer(WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, int len; DPRINTF("writing %d bytes due to %d following reads in %d chunks or full buffer\n", writepos-writebuf, nread, num); - len = writepos-pos; - while (pos < writepos) { + len = writepos-pos; + if (len > usb_maxlen) len = usb_maxlen; @@ -208,8 +208,35 @@ int jtagkey_transfer(WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, { DPRINTF("writing %d bytes\n", writepos-writebuf); for (i=0; i 0 && + tr[combine-1].cmdTrans == PP_READ) { + break; + } else { + combine++; + } + } while (combine < writepos-writebuf); + + DPRINTF("combined writes before read: %d\n", combine); + + if ((combine-i)-1 > 0) { + ftdi_write_data(&ftdic, writebuf+i, (combine-i)-1); + i = combine-1; + } +#endif + ftdi_write_data(&ftdic, writebuf+i, 1); - ftdi_read_pins(&ftdic, readbuf+i); + + if (i > 0 && tr[i].cmdTrans == PP_WRITE && tr[i-1].cmdTrans == PP_READ) + ftdi_read_pins(&ftdic, readbuf+i); + + if (i == (writepos-writebuf)-1 && tr[i].cmdTrans == PP_READ) { + ftdi_write_data(&ftdic, writebuf+i, 1); + ftdi_read_pins(&ftdic, readbuf+i+1); + } } #ifdef DEBUG @@ -225,7 +252,6 @@ int jtagkey_transfer(WD_TRANSFER *tr, int fd, unsigned int request, int ppbase, } readpos = readbuf; - readpos += 0; for (i = 0; i < num; i++) { DPRINTF("dwPort: 0x%lx, cmdTrans: %lu, dwbytes: %ld, fautoinc: %ld, dwoptions: %ld\n",