boolean SMSC951xDeviceReceiveFrame (TSMSC951xDevice *pThis, void *pBuffer, unsigned *pResultLength) { assert (pThis != 0); assert (pThis->m_pEndpointBulkIn != 0); assert (pBuffer != 0); TUSBRequest URB; USBRequest (&URB, pThis->m_pEndpointBulkIn, pBuffer, FRAME_BUFFER_SIZE, 0); if (!DWHCIDeviceSubmitBlockingRequest (USBDeviceGetHost (&pThis->m_USBDevice), &URB)) { _USBRequest (&URB); return FALSE; } u32 nResultLength = USBRequestGetResultLength (&URB); if (nResultLength < 4) // should not happen with HW_CFG_BIR set { _USBRequest (&URB); return FALSE; } u32 nRxStatus = *(u32 *) pBuffer; if (nRxStatus & RX_STS_ERROR) { LogWrite (FromSMSC951x, LOG_WARNING, "RX error (status 0x%X)", nRxStatus); _USBRequest (&URB); return FALSE; } u32 nFrameLength = RX_STS_FRAMELEN (nRxStatus); assert (nFrameLength == nResultLength-4); assert (nFrameLength > 4); if (nFrameLength <= 4) { _USBRequest (&URB); return FALSE; } nFrameLength -= 4; // ignore CRC //LogWrite (FromSMSC951x, LOG_DEBUG, "Frame received (status 0x%X)", nRxStatus); memcpy (pBuffer, (u8 *) pBuffer + 4, nFrameLength); // overwrite RX status assert (pResultLength != 0); *pResultLength = nFrameLength; _USBRequest (&URB); return TRUE; }
boolean USBKeyboardDeviceStartRequest (TUSBKeyboardDevice *pThis) { assert (pThis != 0); assert (pThis->m_pReportEndpoint != 0); assert (pThis->m_pReportBuffer != 0); assert (pThis->m_pURB == 0); pThis->m_pURB = malloc (sizeof (TUSBRequest)); assert (pThis->m_pURB != 0); USBRequest (pThis->m_pURB, pThis->m_pReportEndpoint, pThis->m_pReportBuffer, BOOT_REPORT_SIZE, 0); USBRequestSetCompletionRoutine (pThis->m_pURB, USBKeyboardDeviceCompletionRoutine, 0, pThis); return DWHCIDeviceSubmitAsyncRequest (USBDeviceGetHost (&pThis->m_USBDevice), pThis->m_pURB); }