Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
}