64 static void LIBUSB_CALL
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);
185 err = LIBUSB_ERROR_NO_MEM;
189 for (xferIndex = 0; xferIndex < numTransfers; xferIndex++)
191 struct libusb_transfer *transfer;
193 transfer = libusb_alloc_transfer(0);
194 transfers[xferIndex] = transfer;
197 err = LIBUSB_ERROR_NO_MEM;
201 libusb_fill_bulk_transfer(transfer, ftdi->
usb_dev, ftdi->
out_ep,
202 malloc(bufferSize), bufferSize,
206 if (!transfer->buffer)
208 err = LIBUSB_ERROR_NO_MEM;
212 transfer->status = -1;
213 err = libusb_submit_transfer(transfer);
225 fprintf(stderr,
"Can't set synchronous fifo mode: %s\n",
239 const double progressInterval = 1.0;
243 int err = libusb_handle_events_timeout(ftdi->
usb_ctx, &timeout);
244 if (err == LIBUSB_ERROR_INTERRUPTED)
246 err = libusb_handle_events_timeout(ftdi->
usb_ctx, &timeout);
257 gettimeofday(&now, NULL);
258 if (TimevalDiff(&now, &progress->
current.
time) >= progressInterval)
291 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
struct libusb_device_handle * usb_dev
unsigned int max_packet_size
char * ftdi_get_error_string(struct ftdi_context *ftdi)
int ftdi_usb_purge_buffers(struct ftdi_context *ftdi)