
USB_COMMON_DESCRIPTOR * USBH_X_GetNextDescriptor(
USB_COMMON_DESCRIPTOR * pbCommDescriptor,
U32 * wNextDescriptorOffset )
{
USB_COMMON_DESCRIPTOR * pNextCommDescriptor;
U8 bLength = pbCommDescriptor->bLength;
*wNextDescriptorOffset += bLength;
pNextCommDescriptor = (USB_COMMON_DESCRIPTOR *) ( ( (U8 *) pbCommDescriptor ) + bLength );
return pNextCommDescriptor;
}
void USBH_X_SetEpDescriptor(
TUSBH_X_DEVICE * pDevice,
U8 bIfNumber,
U8 bEpNumber,
USB_ENDPOINT_DESCRIPTOR * pEpDescriptor )
{
pDevice->pEndpointDescriptorArray[ bIfNumber ][ bEpNumber ] = pEpDescriptor;
}
void USBH_X_SetIfDescriptor(
TUSBH_X_DEVICE * pDevice,
U8 bIfNumber,
USB_INTERFACE_DESCRIPTOR * pIfDescriptor )
{
pDevice->pInterfaceDescriptorArray[ bIfNumber ] = pIfDescriptor;
}
void USBH_X_SetCfgDescriptor(
TUSBH_X_DEVICE * pDevice )
{
U32 interfaceIndex = 0;
U32 endpointIndex = 0;
// Points to the current configuration descriptor
USB_COMMON_DESCRIPTOR * pNextDescriptor;
USB_CONFIGURATION_DESCRIPTOR * pCfgDescriptor;
USB_INTERFACE_DESCRIPTOR * pIfDescriptor;
USB_ENDPOINT_DESCRIPTOR * pEpDescriptor;
pCfgDescriptor = (USB_CONFIGURATION_DESCRIPTOR*) ( ( pDevice->pUsbDevice->pConfigDescriptor ) );
pNextDescriptor = (USB_COMMON_DESCRIPTOR*) ( pCfgDescriptor );
U32 wTotalLength = pCfgDescriptor->wTotalLength;
U32 wNextDescriptorOffset = USB_CONFIGURATION_DESCRIPTOR_LENGTH;
pDevice->pCurrentConfigurationDescriptor = pCfgDescriptor;
interfaceIndex = 0;
while ( wNextDescriptorOffset < wTotalLength )
{
pNextDescriptor = USBH_X_GetNextDescriptor( pNextDescriptor, &wNextDescriptorOffset );
if ( pNextDescriptor->bDescriptorType == USB_DESC_TYPE_INTERFACE )
{
pIfDescriptor = (USB_INTERFACE_DESCRIPTOR*) pNextDescriptor;
if ( pIfDescriptor->bAlternateSetting == 0 )
{
USBH_X_SetIfDescriptor( pDevice, interfaceIndex, pIfDescriptor );
// Parse Ep descriptors relative to the current interface
endpointIndex = 0;
while ( endpointIndex < pIfDescriptor->bNumEndpoints )
{
pNextDescriptor = USBH_X_GetNextDescriptor( pNextDescriptor, &wNextDescriptorOffset );
if ( pNextDescriptor->bDescriptorType == USB_DESC_TYPE_ENDPOINT )
{
pEpDescriptor = (USB_ENDPOINT_DESCRIPTOR *) pNextDescriptor;
USBH_X_SetEpDescriptor( pDevice, interfaceIndex, endpointIndex, pEpDescriptor );
endpointIndex++;
if ( ( endpointIndex == USBH_X_DEV_MAX_ENDPOINT )|| ( endpointIndex == pIfDescriptor->bNumEndpoints) )
break;
}
}
interfaceIndex++;
if ( ( interfaceIndex == USBH_X_DEV_MAX_IF )||( interfaceIndex == pDevice->pUsbDevice->InterfaceCount) )
return;
}
}
}
}
void USBH_X_SetDevDescriptor(
TUSBH_X_DEVICE * pDevice )
{
pDevice->pDeviceDescriptor = (USBH_DEVICE_DESCRIPTOR*) ( &( pDevice->pUsbDevice->DeviceDescriptor ) );
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本