Опишу проблему подробнее.
Есть драйвер, который работает с устройством, имеющем следующие дескрипторы конечных точек
Код
sizeof(S_usb_endpoint_descriptor), // Size of this descriptor in bytes
USB_ENDPOINT_DESCRIPTOR, // ENDPOINT descriptor type
0x82, // IN endpoint, address = 0x01
ENDPOINT_TYPE_BULK, // Bulk endpoint
64, // Endpoint size is 64 bytes
0x00 // Must be 0x00 for full-speed bulk
// endpoints
sizeof(S_usb_endpoint_descriptor), // Size of this descriptor in bytes
USB_ENDPOINT_DESCRIPTOR, // ENDPOINT descriptor type
0x02, // OUT endpoint, address = 0x02
ENDPOINT_TYPE_BULK, // Bulk endpoint
64, // Endpoint size is 64 bytes
0x00 // Must be 0x00 for full-speed bulk
Получается одна и та же конечная точка работает и на чтение и на передачу.
За основу я взял AT91USBFramework.
Компьютером устройство определятся нормально, драйвер устанавливается.
В устройстве я жду пакет от компа (не USB пакет, а пакет протокола) переключаю конечную точку. Для этого
добавил такую функцию
Код
void STD_Reconfig_Endpoin( S_std_class *pClass )
{
S_usb_endpoint_descriptor *pEpDesc;
S_usb_endpoint *pEndpoint;
uint32_t tmp_UDP_CSR[2];
if( SER_EPT_DATA_OUT == 0x02 )
{
SER_EPT_DATA_OUT = 0x01;
SER_EPT_DATA_IN = 0x02;
pEpDesc = (S_usb_endpoint_descriptor*)(pClass->pDescriptors->pEndpoints[0]);
pEpDesc->bEndpointAddress = 0x02;
//USB_ConfigureEndpoint(pClass->pUsb, pEpDesc);
pEpDesc = (S_usb_endpoint_descriptor*)(pClass->pDescriptors->pEndpoints[1]);
pEpDesc->bEndpointAddress = 0x82;
//USB_ConfigureEndpoint(pClass->pUsb, pEpDesc);
}else{
SER_EPT_DATA_OUT = 0x02;
SER_EPT_DATA_IN = 0x01;
pEpDesc = (S_usb_endpoint_descriptor*)(pClass->pDescriptors->pEndpoints[0]);
pEpDesc->bEndpointAddress = 0x82;
// USB_ConfigureEndpoint(pClass->pUsb, pEpDesc);
pEpDesc = (S_usb_endpoint_descriptor*)(pClass->pDescriptors->pEndpoints[1]);
pEpDesc->bEndpointAddress = 0x02;
// USB_ConfigureEndpoint(pClass->pUsb, pEpDesc);
};
AT91C_BASE_UDP->UDP_CSR[SER_EPT_DATA_OUT] &= ~(AT91C_UDP_EPTYPE);
AT91C_BASE_UDP->UDP_CSR[SER_EPT_DATA_OUT] |= AT91C_UDP_EPTYPE_BULK_OUT;
AT91C_BASE_UDP->UDP_CSR[SER_EPT_DATA_IN] &= ~(AT91C_UDP_EPTYPE);
AT91C_BASE_UDP->UDP_CSR[SER_EPT_DATA_IN] |= AT91C_UDP_EPTYPE_BULK_IN;
// Enter the Configured state
USB_SetConfiguration(pClass->pUsb);
USB_ConfigureEndpoint(pClass->pUsb,
pClass->pDescriptors->pEndpoints[0]);
USB_ConfigureEndpoint(pClass->pUsb,
pClass->pDescriptors->pEndpoints[1]);
}
Далее пытаюсь отправить пакет компьютеру. И ничего не отправляется. Даже в прерывание конечной точки не попадает, хотя они разрешены и настроены.