Hi,
I'm having an issue with occasional lost interrupt transfers.
On a USB analyser I can see the problem occurs when two interrupt transfers
come in fairly close to each other (approx 1ms gap).
Currently I am stacking up several (10) interrupt transfer
requests at initialisation and then just resubmitting them every time I get a
callback.
Setup -
#define HID_RX_BUFFER_SIZE 512
static void vRequestHIDData(int iIndex)
{
libusb_device_handle *ptDeviceHandle = [poUSBDevice
ptGetDeviceHandle];
unsigned int uiHIDEndpoint = [poUSBDevice uiGetHIDEndpoint];
struct libusb_transfer *ptTransfer =
g_atHIDRxTransfers[iIndex].ptTransfer;
u8 *pu8Buffer = g_atHIDRxTransfers[iIndex].pu8Data;
// Reload the transfer
libusb_fill_interrupt_transfer(ptTransfer,
// transfer
ptDeviceHandle,
// dev_handle
uiHIDEndpoint, // endpoint
pu8Buffer, //
buffer
HID_RX_BUFFER_SIZE, // length
vHIDRxCallback, // callback
(void *)iIndex, // user_data
500
// timeout
);
libusb_submit_transfer(ptTransfer);
}
Resubmission:
static
void vHIDRxCallback(struct libusb_transfer *ptTransfer)
{
int iLength = ptTransfer->actual_length;
int iIndex = (int)ptTransfer->user_data;
if (ptTransfer->status != LIBUSB_TRANSFER_TIMED_OUT)
{
vLOG_STATIC_FUNC_VA("### HID RX (%d) l=%d s=%d
###", iIndex, iLength, ptTransfer->status);
if (bLOG_IsLoggingEnabledHere())
vUTL_DumpHex(ptTransfer->buffer, iLength);
}
// Send it on to main app thread
write(iWriteFD, ptTransfer->buffer, iLength);
// and set up to receive more HID data
libusb_submit_transfer(ptTransfer);
}
If
I set different timeouts for each transfer i can see the previously missing
transfers. eg
static void vRequestHIDData(int iIndex)
{
libusb_device_handle *ptDeviceHandle = [poUSBDevice
ptGetDeviceHandle];
unsigned int uiHIDEndpoint = [poUSBDevice uiGetHIDEndpoint];
struct libusb_transfer *ptTransfer =
g_atHIDRxTransfers[iIndex].ptTransfer;
u8 *pu8Buffer = g_atHIDRxTransfers[iIndex].pu8Data;
// Reload the transfer
libusb_fill_interrupt_transfer(ptTransfer,
// transfer
ptDeviceHandle,
// dev_handle
uiHIDEndpoint, // endpoint
pu8Buffer, //
buffer
HID_RX_BUFFER_SIZE, // length
vHIDRxCallback, // callback
(void *)iIndex, // user_data
(100*iIndex)
// timeout
);
libusb_submit_transfer(ptTransfer);
}
I
suspect my initial attempty was failing due to all 10 transfers timing out at
approx the same time and not being resubmitted quick enough ?
Is
there an example somewhere showing interrupt transfers stacked up and
resubmitted ? Although setting different timeouts is getting me past this
problem I suspect I might need to recalculate the timeout on each resubmission
to ensure there are a certain number outstanding at all times ?
Thanks,
John
Audio Partnership PLC, Gallery Court, Hankey Place, London SE1 4BB, UK
Reg No. 2953313
This e-mail is confidential and for the addressee only.
Please refer to