Estoy tratando de transferir un código HID personalizado que funcione desde el periférico estándar a HAL. Estoy enviando dos informes consecutivos en un solo ciclo while. En el código periférico estándar, se llama dos veces a lo siguiente para enviar informes alternativos al host (Arch-linux):
uint8_t USBD_HID_SendReport ( USB_OTG_CORE_HANDLE * pdev , uint8_t * report , uint16_t len )
{
if ( pdev -> dev . device_status == USB_OTG_CONFIGURED )
{ DCD_EP_Tx ( pdev , HID_IN_EP , report , len );
}
return USBD_OK ;
}
Pero, intentando lo mismo con HAL es decir,
uint8_t USBD_HID_SendReport ( USBD_HandleTypeDef * pdev , uint8_t * report , uint16_t len )
{ USBD_HID_HandleTypeDef * hhid = ( USBD_HID_HandleTypeDef *) pdev -> pClassData ;
if ( pdev -> dev_state == USBD_STATE_CONFIGURED )
{
if ( hhid -> state == HID_IDLE )
{ hhid -> state = HID_BUSY ; USBD_LL_Transmit ( pdev , HID_EPIN_ADDR , report , len );
}
}
return USBD_OK ;
}
conduce a que falten paquetes en el lado del host y no se reciben como informes alternativos.
¿Alguien podría señalar cuál podría ser el problema? ¿Es un problema relacionado con el búfer o algo?
Chris te dio el punto de que la segunda llamada no tendrá ningún efecto. En realidad, no necesita cambiar manualmente el estado ocupado. Será actualizado por USB ISR. Por lo tanto, solo necesita sondear el estado hhid-> y esperar hasta que se vuelva inactivo. Sin embargo, no lo haga en USB ISR u otros ISR con prioridad igual o superior a USB. En tal caso, el controlador USB-TX nunca se servirá y su programa quedará bloqueado.
Chris Stratton
S Sreejit
Chris Stratton
S Sreejit
Chris Stratton