Don’t know how libusb works, but the software stops here:
libusb_fill_bulk_transfer(xferBulkIn, devHandle, BULK_READ_ENDPOINT, ch341inBuffer,
EEPROM_READ_BULKIN_BUF_SZ, cbBulkIn, NULL, DEFAULT_TIMEOUT);
libusb_fill_bulk_transfer(xferBulkOut, devHandle, BULK_WRITE_ENDPOINT,
ch341outBuffer, EEPROM_READ_BULKOUT_BUF_SZ,cbBulkOut, NULL, DEFAULT_TIMEOUT);
fprintf(debugout, "Filled USB transfer structures\n");
libusb_submit_transfer(xferBulkIn);
fprintf(debugout, "Submitted BULK IN start packet\n");
libusb_submit_transfer(xferBulkOut);
fprintf(debugout, "Submitted BULK OUT setup packet\n");
readbuf = buffer;
byteoffset = 0;
while (byteoffset < bytestoread) {
fprintf(stdout, "Read [%d] of [%d] bytes \r", byteoffset, bytestoread);
ret = libusb_handle_events_timeout(NULL, &tv);
if (ret < 0 || getnextpkt == -1) { // indicates an error
fprintf(stderr, "ret from libusb_handle_timeout = %d\n", ret);
fprintf(stderr, "getnextpkt = %d\n", getnextpkt);
fprintf(stderr, "USB read error : %s\n", strerror(-ret));
goto out_deinit;
}
if(getnextpkt == 1) { // callback function reports a new BULK IN packet received
getnextpkt = 0; // reset the flag
readpktcount++; // increment the read packet counter
byteoffset += EEPROM_READ_BULKIN_BUF_SZ;
fprintf(debugout, "\nRe-submitting transfer request to BULK IN endpoint\n");
libusb_submit_transfer(xferBulkIn); // re-submit request for next BULK IN packet of EEPROM data
if(syncackpkt)
syncackpkt = 0;
// if 4th packet received, we are at end of 0x80 byte data block,
// if it is not the last block, then resubmit request for data
if(readpktcount==4 && byteoffset < bytestoread) {
fprintf(debugout, "\nSubmitting next transfer request to BULK OUT endpoint\n");
readpktcount = 0;
memcpy(ch341outBuffer, CH341_EEPROM_READ_NEXT_CMD, CH341_EEPROM_READ_CMD_SZ);
ch341outBuffer[4] = (uint8_t) (byteoffset >> 8 & 0xff); // MSB (big-endian) byte address
ch341outBuffer[5] = (uint8_t) (byteoffset & 0xff); // LSB of 16-bit byte address
libusb_fill_bulk_transfer(xferBulkOut, devHandle, BULK_WRITE_ENDPOINT, ch341outBuffer,
EEPROM_READ_BULKOUT_BUF_SZ, cbBulkOut, NULL, DEFAULT_TIMEOUT);
libusb_submit_transfer(xferBulkOut);// update transfer struct (with new EEPROM page offset)
// and re-submit next transfer request to BULK OUT endpoint
in this while loop :
while (byteoffset < bytestoread)
getnextpkt remain at 0, so the while keep waiting…
Of the two callback function :
// Callback function for async bulk in comms
void cbBulkIn(struct libusb_transfer *transfer) {
int i;
switch(transfer->status) {
case LIBUSB_TRANSFER_COMPLETED:
// display the contents of the BULK IN data buffer
fprintf(debugout,"\ncbBulkIn(): status %d - Read %d bytes\n",transfer->status,transfer->actual_length);
for(i=0; i < transfer->actual_length; i++) {
if(!(i%16))
fprintf(debugout, "\n ");
fprintf(debugout, "%02x ", transfer->buffer[i]);
}
fprintf(debugout, "\n");
// copy read data to our EEPROM buffer
memcpy(readbuf + byteoffset, transfer->buffer, transfer->actual_length);
getnextpkt = 1;
break;
default:
fprintf(stderr, "\ncbBulkIn: error : %d\n", transfer->status);
getnextpkt = -1;
}
return;
}
// Callback function for async bulk out comms
void cbBulkOut(struct libusb_transfer *transfer) {
syncackpkt = 1;
fprintf(debugout, "\ncbBulkOut(): Sync/Ack received: status %d\n", transfer->status);
return;
}
cbBulkIn is never called. (I put a fprintf in to check.)