Hello!
I am designing a device which is used as a hub, connecting several serial devices to a computer as USB CDC devices. This device uses usblib to create a composite device with required nomber of CDC devices.
It works perfectly with up to 3 devices, but when I am trying to add more devices, I face the following issue: when I receive data from host and my underlying device is sending back some response, it is never received by host.
Debugging the application I see the device structure has iCDCTxState field set to eCDCStateWaitData, and reading usbcdc.c I see this field should be set to eCDCStateIdle by ProcessDataToHost() function, which is called by HandleEndpoints() function, but HandleEndpoints() is called only while receiving from host, but never after ScheduleNextTransmission() is called from USB buffer.
The CDC devices are all initialized in the same way:
int i;
for(i = 0; i < nPorts; i++)
{
g_sCompDevice.psDevices[i].pvInstance =
USBDCDCCompositeInit(0, &g_psCDCDevice[i], &g_psCompEntries[i]);
USBBufferInit(&g_psTxBuffer[i]);
USBBufferInit(&g_psRxBuffer[i]);
}
g_sCompDevice.ui32NumDevices = nPorts;
pCompInst = USBDCompositeInit(0, (tUSBDCompositeDevice *)&g_sCompDevice, COMPOSITE_DCDC_SIZE * nPorts,
g_pucDescriptorData);
The structures are declared as:
extern tUSBBuffer g_psTxBuffer[MAX_SERIAL_DEVICES];
extern tUSBBuffer g_psRxBuffer[MAX_SERIAL_DEVICES];
extern tUSBDCDCDevice g_psCDCDevice[MAX_SERIAL_DEVICES];
extern uint8_t g_pui8USBTxBuffer[];
extern uint8_t g_pui8USBRxBuffer[];
extern uint32_t ControlHandler(void *pvCBData, uint32_t ui32Event,
uint32_t ui32MsgValue, void *pvMsgData);
extern uint32_t RxHandlerCDC(void *pvCBData, uint32_t ui32Event,
uint32_t ui32MsgValue, void *pvMsgData);
extern uint32_t TxHandlerCDC(void *pvlCBData, uint32_t ui32Event,
uint32_t ui32MsgValue, void *pvMsgData);
#define CDC_DEV_STRUCT(n) \
{ \
USB_VID_TI_1CBE, \
USB_PID_SERIAL, \
0, \
USB_CONF_ATTR_BUS_PWR, \
ControlHandler, \
(void *)&g_psCDCDevice[n], \
USBBufferEventCallback, \
(void *)&g_psRxBuffer[n], \
USBBufferEventCallback, \
(void *)&g_psTxBuffer[n], \
g_pui8StringDescriptorsCDC, \
NUM_STRING_DESCRIPTORS \
}
tUSBDCDCDevice g_psCDCDevice[MAX_SERIAL_DEVICES] =
{
CDC_DEV_STRUCT(0),
CDC_DEV_STRUCT(1),
CDC_DEV_STRUCT(2),
CDC_DEV_STRUCT(3),
CDC_DEV_STRUCT(4),
CDC_DEV_STRUCT(5),
CDC_DEV_STRUCT(6),
CDC_DEV_STRUCT(7),
CDC_DEV_STRUCT(8),
CDC_DEV_STRUCT(9),
CDC_DEV_STRUCT(10),
CDC_DEV_STRUCT(11),
CDC_DEV_STRUCT(12),
CDC_DEV_STRUCT(13),
CDC_DEV_STRUCT(14),
CDC_DEV_STRUCT(15)
};
#define CDC_RX_BUFFER(n) \
{ \
false, \
RxHandlerCDC, \
(void *)&g_psCDCDevice[n], \
USBDCDCPacketRead, \
USBDCDCRxPacketAvailable, \
(void *)&g_psCDCDevice[n], \
g_ppui8USBRxBuffer[n], \
UART_BUFFER_SIZE, \
}
uint8_t g_ppui8USBRxBuffer[MAX_SERIAL_DEVICES][UART_BUFFER_SIZE];
tUSBBuffer g_psRxBuffer[MAX_SERIAL_DEVICES] =
{
CDC_RX_BUFFER(0),
CDC_RX_BUFFER(1),
CDC_RX_BUFFER(2),
CDC_RX_BUFFER(3),
CDC_RX_BUFFER(4),
CDC_RX_BUFFER(5),
CDC_RX_BUFFER(6),
CDC_RX_BUFFER(7),
CDC_RX_BUFFER(8),
CDC_RX_BUFFER(9),
CDC_RX_BUFFER(10),
CDC_RX_BUFFER(11),
CDC_RX_BUFFER(12),
CDC_RX_BUFFER(13),
CDC_RX_BUFFER(14),
CDC_RX_BUFFER(15)
};
#define CDC_TX_BUFFER(n) \
{ \
true, \
TxHandlerCDC, \
(void *)&g_psCDCDevice[n], \
USBDCDCPacketWrite, \
USBDCDCTxPacketAvailable, \
(void *)&g_psCDCDevice[n], \
g_ppcUSBTxBuffer[n], \
UART_BUFFER_SIZE, \
}
uint8_t g_ppcUSBTxBuffer[MAX_SERIAL_DEVICES][UART_BUFFER_SIZE];
tUSBBuffer g_psTxBuffer[MAX_SERIAL_DEVICES] =
{
CDC_TX_BUFFER(0),
CDC_TX_BUFFER(1),
CDC_TX_BUFFER(2),
CDC_TX_BUFFER(3),
CDC_TX_BUFFER(4),
CDC_TX_BUFFER(5),
CDC_TX_BUFFER(6),
CDC_TX_BUFFER(7),
CDC_TX_BUFFER(8),
CDC_TX_BUFFER(9),
CDC_TX_BUFFER(10),
CDC_TX_BUFFER(11),
CDC_TX_BUFFER(12),
CDC_TX_BUFFER(13),
CDC_TX_BUFFER(14),
CDC_TX_BUFFER(15)
};
Is there any limitation on number of endpoints or something?