started working on adding isochronous support
diff --git a/gyro_board/src/libusb-driver/libusb_wrap.cc b/gyro_board/src/libusb-driver/libusb_wrap.cc
index a297a9b..83cf245 100644
--- a/gyro_board/src/libusb-driver/libusb_wrap.cc
+++ b/gyro_board/src/libusb-driver/libusb_wrap.cc
@@ -163,4 +163,29 @@
callback_(this, user_data_);
}
+IsochronousTransfer::IsochronousTransfer(size_t packet_length,
+ int num_packets,
+ void (*callback)(Transfer *, void *),
+ void *user_data)
+ : Transfer(packet_length * num_packets, callback, user_data),
+ 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_,
+ device->dev_handle_,
+ endpoint,
+ data_,
+ data_length_,
+ num_packets_,
+ StaticTransferCallback,
+ this,
+ timeout);*/
+}
+
} // namespace libusb
diff --git a/gyro_board/src/libusb-driver/libusb_wrap.h b/gyro_board/src/libusb-driver/libusb_wrap.h
index 9713534..261cded 100644
--- a/gyro_board/src/libusb-driver/libusb_wrap.h
+++ b/gyro_board/src/libusb-driver/libusb_wrap.h
@@ -8,6 +8,7 @@
class LibUSBDeviceHandle;
namespace libusb {
class Transfer;
+class IsochronousTransfer;
}
class LibUSB {
@@ -41,6 +42,7 @@
private:
friend class LibUSB; // For constructor
friend class libusb::Transfer; // for access to dev_handle_
+ friend class libusb::IsochronousTransfer; // for access to dev_handle_
// Takes ownership of the device handle and frees it when destructed.
explicit LibUSBDeviceHandle(libusb_device_handle *dev_handle);
libusb_device_handle *dev_handle_;
@@ -74,10 +76,12 @@
const uint8_t *data() { return data_; }
- private:
+ protected:
static void StaticTransferCallback(libusb_transfer *self) {
static_cast<Transfer *>(self->user_data)->TransferCallback();
}
+
+ private:
void TransferCallback();
libusb_transfer *const transfer_;
@@ -91,6 +95,21 @@
DISALLOW_COPY_AND_ASSIGN(Transfer);
};
+class IsochronousTransfer : public Transfer {
+ public:
+ IsochronousTransfer(size_t packet_length,
+ int num_packets,
+ void (*callback)(Transfer *, void *),
+ void *user_data);
+
+ void FillIsochronous(LibUSBDeviceHandle *device,
+ unsigned char endpoint,
+ unsigned int timeout);
+
+ private:
+ const int num_packets_;
+};
+
} // namespace libusb
#endif // LIBUSB_H_
diff --git a/gyro_board/src/usb/LPCUSB/USB_SENSOR_STREAM.c b/gyro_board/src/usb/LPCUSB/USB_SENSOR_STREAM.c
index 576977f..4609c96 100644
--- a/gyro_board/src/usb/LPCUSB/USB_SENSOR_STREAM.c
+++ b/gyro_board/src/usb/LPCUSB/USB_SENSOR_STREAM.c
@@ -38,19 +38,24 @@
#include "LPC17xx.h"
+#include "analog.h"
+
#define usbMAX_SEND_BLOCK ( 20 / portTICK_RATE_MS )
#define usbRXBUFFER_LEN ( 80 )
#define usbTXBUFFER_LEN ( 600 )
-#define INT_IN_EP 0x81 //read manual for picking these...
+#define INT_IN_EP 0x81 //read manual for picking these...
#define INT_OUT_EP 0x04
#define BULK_IN_EP 0x82
-#define BULK_OUT_EP 0x05
+#define BULK_OUT_EP 0x05
+#define ISOC_IN_EP 0x83
#define MAX_PACKET_SIZE 64
#define LE_WORD(x) ((x)&0xFF),((x)>>8)
+static struct DataStruct usbPacket;
+
static xQueueHandle xRxedChars = NULL, xCharsForTx = NULL;
static const unsigned char abDescriptors[] = {
@@ -85,7 +90,7 @@
DESC_INTERFACE,
0x00, // bInterfaceNumber
0x00, // bAlternateSetting
- 0x04, // bNumEndPoints
+ 0x05, // bNumEndPoints
0x0A, // bInterfaceClass = data
0x00, // bInterfaceSubClass
0x00, // bInterfaceProtocol
@@ -118,6 +123,14 @@
0x03, // bmAttributes = intr
LE_WORD(MAX_PACKET_SIZE), // wMaxPacketSize
0x01, // bInterval
+
+ // isoc data EP IN
+ 0x07,
+ DESC_ENDPOINT,
+ ISOC_IN_EP, // bEndpointAddress
+ 0x0D, // bmAttributes = isoc, synchronous, data endpoint
+ LE_WORD(MAX_PACKET_SIZE), // wMaxPacketSize
+ 0x01, // bInterval
// string descriptors
0x04,
@@ -217,11 +230,10 @@
iLen = USBHwEPRead(bEP, abDataBuf, sizeof(abDataBuf));
portEND_SWITCHING_ISR(lHigherPriorityTaskWoken);
}
-#include "analog.h"
-static struct DataStruct usbPacket;
+
static void DataIn(unsigned char bEP, unsigned char bEPStatus) {
long lHigherPriorityTaskWoken = pdFALSE;
- fillSensorPacket(&usbPacket);
+ fillSensorPacket(&usbPacket);
USBHwEPWrite(bEP, (unsigned char *)&usbPacket, sizeof(usbPacket));
portEND_SWITCHING_ISR(lHigherPriorityTaskWoken);
}
@@ -248,7 +260,7 @@
// Don't block if not connected to USB.
if (xQueueSend(xCharsForTx, &cc,
- USBIsConnected() ? usbMAX_SEND_BLOCK : 0) == pdPASS) {
+ USBIsConnected() ? usbMAX_SEND_BLOCK : 0) == pdPASS) {
return c;
} else {
return EOF;
@@ -271,7 +283,6 @@
return -1;
}
-
/**
* Interrupt handler
*
@@ -281,21 +292,22 @@
USBHwISR();
}
-
static void USBFrameHandler(unsigned short wFrame) {
(void) wFrame;
- if(uxQueueMessagesWaitingFromISR(xCharsForTx) > 0){
- // data available, enable NAK interrupt on bulk in
+ if (uxQueueMessagesWaitingFromISR(xCharsForTx) > 0) {
+ // data available, enable interrupt instead of NAK on bulk in too
USBHwNakIntEnable(INACK_BI | INACK_II);
- }else{
+ } else {
USBHwNakIntEnable(INACK_II);
}
+
+ fillSensorPacket(&usbPacket);
+ USBHwEPWrite(ISOC_IN_EP, (unsigned char *)&usbPacket, sizeof(usbPacket));
}
void vUSBTask(void *pvParameters) {
portTickType xLastFlashTime;
- /* Just to prevent compiler warnings about the unused parameter. */
(void) pvParameters;
DBG("Initialising USB stack\n");