aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/karalabe/gousb/usb/iso.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/karalabe/gousb/usb/iso.c')
-rw-r--r--vendor/github.com/karalabe/gousb/usb/iso.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/vendor/github.com/karalabe/gousb/usb/iso.c b/vendor/github.com/karalabe/gousb/usb/iso.c
new file mode 100644
index 000000000..054486318
--- /dev/null
+++ b/vendor/github.com/karalabe/gousb/usb/iso.c
@@ -0,0 +1,79 @@
+#include "libusb.h"
+#include <stdio.h>
+#include <string.h>
+
+void print_xfer(struct libusb_transfer *xfer);
+void iso_callback(void *);
+
+void callback(struct libusb_transfer *xfer) {
+ //printf("Callback!\n");
+ //print_xfer(xfer);
+ iso_callback(xfer->user_data);
+}
+
+int submit(struct libusb_transfer *xfer) {
+ xfer->callback = &callback;
+ xfer->status = -1;
+ //print_xfer(xfer);
+ //printf("Transfer submitted\n");
+
+ /* fake
+ strcpy(xfer->buffer, "hello");
+ xfer->actual_length = 5;
+ callback(xfer);
+ return 0; */
+ return libusb_submit_transfer(xfer);
+}
+
+void print_xfer(struct libusb_transfer *xfer) {
+ int i;
+
+ printf("Transfer:\n");
+ printf(" dev_handle: %p\n", xfer->dev_handle);
+ printf(" flags: %08x\n", xfer->flags);
+ printf(" endpoint: %x\n", xfer->endpoint);
+ printf(" type: %x\n", xfer->type);
+ printf(" timeout: %dms\n", xfer->timeout);
+ printf(" status: %x\n", xfer->status);
+ printf(" length: %d (act: %d)\n", xfer->length, xfer->actual_length);
+ printf(" callback: %p\n", xfer->callback);
+ printf(" user_data: %p\n", xfer->user_data);
+ printf(" buffer: %p\n", xfer->buffer);
+ printf(" num_iso_pkts: %d\n", xfer->num_iso_packets);
+ printf(" packets:\n");
+ for (i = 0; i < xfer->num_iso_packets; i++) {
+ printf(" [%04d] %d (act: %d) %x\n", i,
+ xfer->iso_packet_desc[i].length,
+ xfer->iso_packet_desc[i].actual_length,
+ xfer->iso_packet_desc[i].status);
+ }
+}
+
+int extract_data(struct libusb_transfer *xfer, void *raw, int max, unsigned char *status) {
+ int i;
+ int copied = 0;
+ unsigned char *in = xfer->buffer;
+ unsigned char *out = raw;
+ for (i = 0; i < xfer->num_iso_packets; i++) {
+ struct libusb_iso_packet_descriptor pkt = xfer->iso_packet_desc[i];
+
+ // Copy the data
+ int len = pkt.actual_length;
+ if (len > max) {
+ len = max;
+ }
+ memcpy(out, in, len);
+ copied += len;
+
+ // Increment offsets
+ in += pkt.length;
+ out += len;
+
+ // Extract first error
+ if (pkt.status == 0 || *status != 0) {
+ continue;
+ }
+ *status = pkt.status;
+ }
+ return copied;
+}