65 static void LIBUSB_CALL
66 ftdi_readstream_cb(
struct libusb_transfer *transfer)
72 if (transfer->status == LIBUSB_TRANSFER_COMPLETED)
75 uint8_t *ptr = transfer->buffer;
76 int length = transfer->actual_length;
77 int numPackets = (length + packet_size - 1) / packet_size;
80 for (i = 0; i < numPackets; i++)
83 int packetLen = length;
85 if (packetLen > packet_size)
86 packetLen = packet_size;
88 payloadLen = packetLen - 2;
91 res = state->
callback(ptr + 2, payloadLen,
99 free(transfer->buffer);
100 libusb_free_transfer(transfer);
104 transfer->status = -1;
105 state->
result = libusb_submit_transfer(transfer);
110 fprintf(stderr,
"unknown status %d\n",transfer->status);
111 state->
result = LIBUSB_ERROR_IO;
122 TimevalDiff(
const struct timeval *a,
const struct timeval *b)
124 return (a->tv_sec - b->tv_sec) + 1e-6 * (a->tv_usec - b->tv_usec);
150 int packetsPerTransfer,
int numTransfers)
152 struct libusb_transfer **transfers;
161 fprintf(stderr,
"Device doesn't support synchronous FIFO mode\n");
168 fprintf(stderr,
"Can't reset mode\n");
175 fprintf(stderr,
"Can't Purge\n");
183 transfers = calloc(numTransfers,
sizeof *transfers);
186 err = LIBUSB_ERROR_NO_MEM;
190 for (xferIndex = 0; xferIndex < numTransfers; xferIndex++)
192 struct libusb_transfer *transfer;
194 transfer = libusb_alloc_transfer(0);
195 transfers[xferIndex] = transfer;
198 err = LIBUSB_ERROR_NO_MEM;
202 libusb_fill_bulk_transfer(transfer, ftdi->
usb_dev, ftdi->
out_ep,
203 malloc(bufferSize), bufferSize,
207 if (!transfer->buffer)
209 err = LIBUSB_ERROR_NO_MEM;
213 transfer->status = -1;
214 err = libusb_submit_transfer(transfer);
226 fprintf(stderr,
"Can't set synchronous fifo mode: %s\n",
240 const double progressInterval = 1.0;
244 int err = libusb_handle_events_timeout(ftdi->
usb_ctx, &timeout);
245 if (err == LIBUSB_ERROR_INTERRUPTED)
247 err = libusb_handle_events_timeout(ftdi->
usb_ctx, &timeout);
258 gettimeofday(&now, NULL);
259 if (TimevalDiff(&now, &progress->
current.
time) >= progressInterval)
292 fprintf(stderr,
"cleanup\n");
int ftdi_readstream(struct ftdi_context *ftdi, FTDIStreamCallback *callback, void *userdata, int packetsPerTransfer, int numTransfers)
Main context structure for all libftdi functions.
int ftdi_set_bitmode(struct ftdi_context *ftdi, unsigned char bitmask, unsigned char mode)
struct size_and_time prev
struct size_and_time current
FTDIProgressInfo progress
int() FTDIStreamCallback(uint8_t *buffer, int length, FTDIProgressInfo *progress, void *userdata)
struct size_and_time first
struct libusb_context * usb_ctx
FTDIStreamCallback * callback
const char * ftdi_get_error_string(struct ftdi_context *ftdi)
struct libusb_device_handle * usb_dev
unsigned int max_packet_size
int ftdi_usb_purge_buffers(struct ftdi_context *ftdi)