65 ftdi_readstream_cb(
struct libusb_transfer *transfer)
71 if (transfer->status == LIBUSB_TRANSFER_COMPLETED)
74 uint8_t *ptr = transfer->buffer;
75 int length = transfer->actual_length;
76 int numPackets = (length + packet_size - 1) / packet_size;
79 for (i = 0; i < numPackets; i++)
82 int packetLen = length;
84 if (packetLen > packet_size)
85 packetLen = packet_size;
87 payloadLen = packetLen - 2;
90 res = state->
callback(ptr + 2, payloadLen,
98 free(transfer->buffer);
99 libusb_free_transfer(transfer);
103 transfer->status = -1;
104 state->
result = libusb_submit_transfer(transfer);
109 fprintf(stderr,
"unknown status %d\n",transfer->status);
110 state->
result = LIBUSB_ERROR_IO;
121 TimevalDiff(
const struct timeval *a,
const struct timeval *b)
123 return (a->tv_sec - b->tv_sec) + 1e-6 * (a->tv_usec - b->tv_usec);
149 int packetsPerTransfer,
int numTransfers)
151 struct libusb_transfer **transfers;
160 fprintf(stderr,
"Device doesn't support synchronous FIFO mode\n");
167 fprintf(stderr,
"Can't reset mode\n");
174 fprintf(stderr,
"Can't Purge\n");
182 transfers = calloc(numTransfers,
sizeof *transfers);
184 err = LIBUSB_ERROR_NO_MEM;
188 for (xferIndex = 0; xferIndex < numTransfers; xferIndex++)
190 struct libusb_transfer *transfer;
192 transfer = libusb_alloc_transfer(0);
193 transfers[xferIndex] = transfer;
195 err = LIBUSB_ERROR_NO_MEM;
199 libusb_fill_bulk_transfer(transfer, ftdi->
usb_dev, ftdi->
out_ep,
200 malloc(bufferSize), bufferSize,
204 if (!transfer->buffer) {
205 err = LIBUSB_ERROR_NO_MEM;
209 transfer->status = -1;
210 err = libusb_submit_transfer(transfer);
222 fprintf(stderr,
"Can't set synchronous fifo mode: %s\n",
236 const double progressInterval = 1.0;
240 int err = libusb_handle_events_timeout(ftdi->
usb_ctx, &timeout);
241 if (err == LIBUSB_ERROR_INTERRUPTED)
243 err = libusb_handle_events_timeout(ftdi->
usb_ctx, &timeout);
254 gettimeofday(&now, NULL);
255 if (TimevalDiff(&now, &progress->
current.
time) >= progressInterval)
288 fprintf(stderr,
"cleanup\n");