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; }
void USBKeyboardDeviceCompletionRoutine (TUSBRequest *pURB, void *pParam, void *pContext) { TUSBKeyboardDevice *pThis = (TUSBKeyboardDevice *) pContext; assert (pThis != 0); assert (pURB != 0); assert (pThis->m_pURB == pURB); if ( USBRequestGetStatus (pURB) != 0 && USBRequestGetResultLength (pURB) == BOOT_REPORT_SIZE) { if (pThis->m_pKeyStatusHandlerRaw != 0) { (*pThis->m_pKeyStatusHandlerRaw) (USBKeyboardDeviceGetModifiers (pThis), pThis->m_pReportBuffer+2); } else { u8 ucPhyCode = USBKeyboardDeviceGetKeyCode (pThis); if (ucPhyCode == pThis->m_ucLastPhyCode) { ucPhyCode = 0; } else { pThis->m_ucLastPhyCode = ucPhyCode; } if (ucPhyCode != 0) { USBKeyboardDeviceGenerateKeyEvent (pThis, ucPhyCode); #ifdef REPEAT_ENABLE if (pThis->m_hTimer != 0) { CancelKernelTimer (pThis->m_hTimer); } pThis->m_hTimer = StartKernelTimer (REPEAT_DELAY, USBKeyboardDeviceTimerHandler, 0, pThis); assert (pThis->m_hTimer != 0); #endif } else if (pThis->m_hTimer != 0) { CancelKernelTimer (pThis->m_hTimer); pThis->m_hTimer = 0; } } } _USBRequest (pThis->m_pURB); free (pThis->m_pURB); pThis->m_pURB = 0; USBKeyboardDeviceStartRequest (pThis); }