moved back to our custom libusb wrappers instead of glibusb
Glibusb's model is too simplified to work very well at all with
isochronous, so I had to go back to our custom wrapper (which still
needed isochronous support to be finished).
diff --git a/gyro_board/src/libusb-driver/libusb-driver.gyp b/gyro_board/src/libusb-driver/libusb-driver.gyp
index 1c50633..ab2bf70 100644
--- a/gyro_board/src/libusb-driver/libusb-driver.gyp
+++ b/gyro_board/src/libusb-driver/libusb-driver.gyp
@@ -11,6 +11,10 @@
'<(AOS)/common/util/util.gyp:thread',
'libusb_wrap',
'<(AOS)/build/aos.gyp:logging',
+ '<(AOS)/common/common.gyp:time',
+ ],
+ 'export_dependent_settings': [
+ '<(AOS)/common/common.gyp:time',
],
},
{
diff --git a/gyro_board/src/libusb-driver/libusb_wrap.cc b/gyro_board/src/libusb-driver/libusb_wrap.cc
index 83cf245..0026ef3 100644
--- a/gyro_board/src/libusb-driver/libusb_wrap.cc
+++ b/gyro_board/src/libusb-driver/libusb_wrap.cc
@@ -1,5 +1,7 @@
#include "libusb_wrap.h"
+#include <string.h>
+
#include <iostream>
#include "aos/common/logging/logging.h"
@@ -115,8 +117,9 @@
Transfer::Transfer(size_t data_length,
void (*callback)(Transfer *, void *),
- void *user_data)
- : transfer_(libusb_alloc_transfer(0)),
+ void *user_data,
+ int num_iso_packets)
+ : transfer_(libusb_alloc_transfer(num_iso_packets)),
data_(new uint8_t[data_length]),
data_length_(data_length),
callback_(callback),
@@ -146,16 +149,16 @@
if (ret == LIBUSB_ERROR_BUSY) {
LOG(FATAL, "transfer %p already submitted\n", this);
}
- LOG(FATAL, "libusb error %d submitting transfer %p\n",
- ret, this);
+ LOG(FATAL, "libusb error %d submitting transfer %p. errno %d: %s\n",
+ ret, this, errno, strerror(errno));
}
}
void Transfer::Cancel() {
int ret = libusb_cancel_transfer(transfer_);
if (ret != 0) {
- LOG(FATAL, "libusb error %d cancelling transfer %p\n",
- ret, this);
+ LOG(FATAL, "libusb error %d cancelling transfer %p. errno %d: %s\n",
+ ret, this, errno, strerror(errno));
}
}
@@ -167,17 +170,14 @@
int num_packets,
void (*callback)(Transfer *, void *),
void *user_data)
- : Transfer(packet_length * num_packets, callback, user_data),
+ : Transfer(packet_length * num_packets, callback, user_data, num_packets),
num_packets_(num_packets) {
}
void IsochronousTransfer::FillIsochronous(LibUSBDeviceHandle *device,
unsigned char endpoint,
- unsigned int timeout) {
- (void)device;
- (void)endpoint;
- (void)timeout;
- /*libusb_fill_iso_transfer(transfer_,
+ const ::aos::time::Time &timeout) {
+ libusb_fill_iso_transfer(transfer_,
device->dev_handle_,
endpoint,
data_,
@@ -185,7 +185,8 @@
num_packets_,
StaticTransferCallback,
this,
- timeout);*/
+ timeout.ToMSec());
+ transfer_->iso_packet_desc[0].length = data_length_;
}
} // namespace libusb
diff --git a/gyro_board/src/libusb-driver/libusb_wrap.h b/gyro_board/src/libusb-driver/libusb_wrap.h
index 261cded..6056c66 100644
--- a/gyro_board/src/libusb-driver/libusb_wrap.h
+++ b/gyro_board/src/libusb-driver/libusb_wrap.h
@@ -4,6 +4,7 @@
#include <libusb-1.0/libusb.h>
#include "aos/common/macros.h"
+#include "aos/common/time.h"
class LibUSBDeviceHandle;
namespace libusb {
@@ -61,7 +62,8 @@
public:
Transfer(size_t data_length,
void (*callback)(Transfer *, void *),
- void *user_data);
+ void *user_data,
+ int num_iso_packets = 0);
~Transfer();
void FillInterrupt(LibUSBDeviceHandle *device,
@@ -72,7 +74,7 @@
void Cancel();
libusb_transfer_status status() { return transfer_->status; }
- int read_bytes() { return transfer_->actual_length; }
+ virtual int read_bytes() { return transfer_->actual_length; }
const uint8_t *data() { return data_; }
@@ -81,20 +83,22 @@
static_cast<Transfer *>(self->user_data)->TransferCallback();
}
- private:
- void TransferCallback();
-
+ protected:
libusb_transfer *const transfer_;
uint8_t *const data_;
size_t data_length_;
+ private:
+ void TransferCallback();
+
void (*const callback_)(Transfer *, void *);
void *const user_data_;
DISALLOW_COPY_AND_ASSIGN(Transfer);
};
+// TODO(brians): Make this actually work for num_packets != 1.
class IsochronousTransfer : public Transfer {
public:
IsochronousTransfer(size_t packet_length,
@@ -104,7 +108,11 @@
void FillIsochronous(LibUSBDeviceHandle *device,
unsigned char endpoint,
- unsigned int timeout);
+ const ::aos::time::Time &timeout);
+
+ virtual int read_bytes() {
+ return transfer_->iso_packet_desc[0].actual_length;
+ }
private:
const int num_packets_;