📄 rndis.c
字号:
void PDD_SendRndisPacket(PDATA_WRAPPER pDataWrapper)
{
OALMSG(OAL_ETHER&&OAL_FUNC, (L"+RNDIS_USBFN_PDD_SendRndisPacket\r\n"));
OALMSG(OAL_ETHER&&OAL_FUNC, (
L"Got SendPacket Request [%d bytes]\r\n", pDataWrapper->dwDataSize
));
if (g_RndisKitlDev.pTxDataWrapper != NULL) {
//
// BAD!
// This should never happen!!
// Return the packet immediately..
//
OALMSG(OAL_ERROR, (L"****Multiple pending send rndis packet!!\r\n"));
MddSendRndisPacketComplete(pDataWrapper);
}
// save the data wrapper pointer so we can return later it in TxComplete call
g_RndisKitlDev.pTxDataWrapper = pDataWrapper;
// g_EP2Transfer.dwCallerPermissions;
g_EP2Transfer.dwFlags = USB_REQUEST_DEVICE_TO_HOST;
g_EP2Transfer.pvBuffer = pDataWrapper->pucData;
// g_EP2Transfer.dwBufferPhysicalAddress; // not used
g_EP2Transfer.cbBuffer = pDataWrapper->dwDataSize;
g_EP2Transfer.cbTransferred = 0;
g_EP2Transfer.dwUsbError = UFN_NOT_COMPLETE_ERROR; // Possible values are in usbfntypes.h
g_EP2Transfer.pvPddData = NULL;
g_EP2Transfer.pvPddTransferInfo = NULL;
g_EP2TransferState = TS_SENDING_PACKET;
g_pddInterface.pfnIssueTransfer( g_pddInterface.pvPddContext, 2, &g_EP2Transfer );
OALMSG(OAL_ETHER&&OAL_FUNC, (L"-RNDIS_USBFN_PDD_SendRndisPacket\r\n"));
}
////////////////////////////////////////////////////////////////////////////////
// PDD_Set()
//
// Routine Description:
//
// This routine is used by the MDD to set misc aspects of USB
// communication.
//
// Arguments:
//
// uiRequestId :: As defined in rndismini.h
// pvData :: What to set to.
// ulDataLength :: The length of data pointed to by pvData.
//
// Return Value:
//
// TRUE :: If successful.
// FALSE :: otherwise..
//
BOOL PDD_Set(
IN UINT uiRequestId,
IN PVOID pvData,
IN ULONG ulDataLength)
{
BOOL fRet = TRUE;
OALMSG(OAL_ETHER&&OAL_FUNC, (L"+RNDIS_USBFN_PDD_Set\r\n"));
// TODO: finish all requests here
switch(uiRequestId) {
case REQ_ID_HARD_RESET:
OALMSG(OAL_ETHER&&OAL_FUNC, (L"PDD_Set:REQ_ID_HARD_RESET\r\n"));
break;
case REQ_ID_SOFT_RESET:
OALMSG(OAL_ETHER&&OAL_FUNC, (L"PDD_Set:REQ_ID_SOFT_RESET\r\n"));
break;
case REQ_ID_ENABLE_INT:
OALMSG(OAL_ETHER&&OAL_FUNC, (L"PDD_Set:REQ_ID_ENABLE_INT\r\n"));
break;
case REQ_ID_DISABLE_INT:
OALMSG(OAL_ETHER&&OAL_FUNC, (L"PDD_Set:REQ_ID_DISABLE_INT\r\n"));
break;
default:
OALMSG(OAL_ETHER&&OAL_FUNC, (
L"PDD_Set:Unknown request:0x%x\r\n", uiRequestId
));
fRet = FALSE;
break;
}
OALMSG(OAL_ETHER&&OAL_FUNC, (L"-RNDIS_USBFN_PDD_Set\r\n"));
return fRet;
}
////////////////////////////////////////////////////////////////////////////////
// PDD_Get()
//
// Routine Description:
//
// This routine is used by MDD to query information pertaining to
// PDD (like vendor ID, Vendor description, etc).
//
// Arguments:
//
// uiRequestId :: as defined in RndisMini.h
// pvData :: The return buffer.
// ulDataLength :: Length of the buffer.
// ulRequiredLength :: Return by us if the passed in buffer is not enough.
//
// Return Value:
//
// TRUE :: If successful.
// FALSE :: otherwise..
//
BOOL PDD_Get(
IN UINT uiRequestId,
IN PVOID pvData,
IN ULONG ulDataLength,
OUT ULONG *pulRequiredLength)
{
BOOL fRet = FALSE;
ULONG GenericUlong;
ULONG ulTotalBytes;
PUCHAR pucBuffer;
OALMSG(OAL_ETHER&&OAL_FUNC, (L"+RNDIS_USBFN_PDD_Get\r\n"));
switch(uiRequestId) {
case REQ_ID_VENDOR_ID:
pucBuffer = pucVendorID;
ulTotalBytes = strlen(pucVendorID);
break;
case REQ_ID_VENDOR_DESCRIPTION:
pucBuffer = pucVendorDescription;
ulTotalBytes = strlen(pucVendorDescription);
break;
case REQ_ID_DEVICE_MAX_RX:
GenericUlong = MAX_INCOMING_BUFFER;
pucBuffer = (UCHAR *)&GenericUlong;
ulTotalBytes = sizeof(GenericUlong);
break;
case REQ_ID_DEVICE_MACADDR:
pucBuffer = g_RndisMacAddress;
ulTotalBytes = sizeof(g_RndisMacAddress);
break;
default:
OALMSG(OAL_ETHER&&OAL_FUNC, (
L"-PDD_Get: unknown request 0x%x\r\n", uiRequestId
));
pucBuffer = NULL;
ulTotalBytes = 0;
break;
}
if (pucBuffer) {
if (pulRequiredLength)
*pulRequiredLength = ulTotalBytes;
if (ulTotalBytes <= ulDataLength) {
memcpy(pvData, pucBuffer, ulTotalBytes);
fRet = TRUE;
}
}
OALMSG(OAL_ETHER&&OAL_FUNC, (L"-RNDIS_USBFN_PDD_Get\r\n"));
return fRet;
}
////////////////////////////////////////////////////////////////////////////////
// PDD_ISR()
//
// Routine Description:
//
// This function handles the USB interrupt.
//
// Arguments:
//
// pdwWaitTime :: The next time out value while waiting for interrupt..
//
// Return Value:
//
// TRUE :: We want more interrupt coming..
// FALSE :: We have enough, getting outta here!!! that's the end of
// eveything.. (in theory, should never be used..).
//
BOOL PDD_ISR(PDWORD pdwWaitTime)
{
InterruptThread( g_pddInterface.pvPddContext );
return TRUE;
} // PDD_ISR()
////////////////////////////////////////////////////////////////////////////////
// PDD_IndicateRndisPacketComplete()
//
// Routine Description:
//
// Called by MDD when the data passed to it via MddIndicateRndisPacket is
// completed.
//
// Arguments:
//
// pucBuffer :: Buffer passed in MddIndicateRndisPacket.
// uiBufferSize :: Size of the buffer.
//
// Return Value:
//
// None.
//
void PDD_IndicateRndisPacketComplete(PDATA_WRAPPER pDataWrapper)
{
OALMSG(OAL_ETHER&&OAL_FUNC, (
L"+RNDIS_USBFN_PDD_IndicateRndisPacketComplete\r\n"
));
MDDFreeMem(pDataWrapper->pucData);
MDDFreeDataWrapper(pDataWrapper);
OALMSG(OAL_ETHER&&OAL_FUNC, (
L"-RNDIS_USBFN_PDD_IndicateRndisPacketComplete\r\n"
));
}
// compute a unique MAC address
void SetRNDISMACAddress(void)
{
DWORD udId = GetUniqueDeviceID();
g_RndisMacAddress[2] = (UCHAR)(udId);
g_RndisMacAddress[3] = (UCHAR)(udId >> 8);
g_RndisMacAddress[4] = (UCHAR)(udId >> 16);
g_RndisMacAddress[5] = (UCHAR)(udId >> 24);
}
// compute a unique device serial number
void SetRNDISSerialNumber(void)
{
BYTE b;
int i;
BYTE *pIdBytes;
DWORD dwBytesReturned = 0;
DWORD udId = GetUniqueDeviceID();
pIdBytes = (BYTE*)&udId;
for (i=0; i< sizeof(udId); i++) {
b = pIdBytes[i] & 0xff;
gs_SerialNumber.ptcbString[i * 2] = DigitTable[b % 16];
gs_SerialNumber.ptcbString[(i * 2) + 1] = DigitTable[b / 16];
}
gs_SerialNumber.ptcbString[ (DWORD)(sizeof(udId)) * 2 ] = '\0';
gs_SerialNumber.ucbLength = sizeof(gs_SerialNumber);
gs_SerialNumber.udbDescriptorType = USB_STRING_DESCRIPTOR_TYPE;
OALMSG(OAL_ETHER&&OAL_FUNC, (
L"RNDIS Serial Number=[%s]\r\n", gs_SerialNumber.ptcbString
));
}
void PDD_Dump(DWORD * context)
{
OMAP2420_USBD_REGS *pPdd=(OMAP2420_USBD_REGS *) context;
EdbgOutputDebugString("Dump USBD registers\r\n");
EdbgOutputDebugString("\tREV=%x\r\n",INREG32(&pPdd->REV)); // 0000 - Revision
EdbgOutputDebugString("\tEP_NUM=%x\r\n",INREG32(&pPdd->EP_NUM)); // 0004 - Endpoint selection
EdbgOutputDebugString("\tDATA=%x\r\n",INREG32(&pPdd->DATA)); // 0008 - Data
EdbgOutputDebugString("\tCTRL=%x\r\n",INREG32(&pPdd->CTRL)); // 000C - Control
EdbgOutputDebugString("\tSTAT_FLG=%x\r\n",INREG32(&pPdd->STAT_FLG)); // 0010 - Status
EdbgOutputDebugString("\tRXFSTAT=%x\r\n",INREG32(&pPdd->RXFSTAT)); // 0014 - Receive FIFO status
EdbgOutputDebugString("\tSYSCON1=%x\r\n",INREG32(&pPdd->SYSCON1)); // 0018 - System configuration 1
EdbgOutputDebugString("\tSYSCON2=%x\r\n",INREG32(&pPdd->SYSCON2)); // 001C - System configuration 2
EdbgOutputDebugString("\tDEVSTAT=%x\r\n",INREG32(&pPdd->DEVSTAT)); // 0020 - Device status
EdbgOutputDebugString("\tSOF=%x\r\n",INREG32(&pPdd->SOF)); // 0024 - Start of frame
EdbgOutputDebugString("\tIRQ_EN=%x\r\n",INREG32(&pPdd->IRQ_EN)); // 0028 - Interrupt enable
EdbgOutputDebugString("\tDMA_IRQ_EN=%x\r\n",INREG32(&pPdd->DMA_IRQ_EN)); // 002C - DMA interrupt enable
EdbgOutputDebugString("\tIRQ_SRC=%x\r\n",INREG32(&pPdd->IRQ_SRC)); // 0030 - Interrupt source
EdbgOutputDebugString("\tEP_STAT=%x\r\n",INREG32(&pPdd->EP_STAT)); // 0034 - Non-ISO endpoint interrupt enable
EdbgOutputDebugString("\tDMA_STAT=%x\r\n",INREG32(&pPdd->DMA_STAT)); // 0038 - Non-ISO DMA interrupt enable
EdbgOutputDebugString("\tRXDMA_CFG=%x\r\n",INREG32(&pPdd->RXDMA_CFG)); // 0040 - DMA receive channels config
EdbgOutputDebugString("\tTXDMA_CFG=%x\r\n",INREG32(&pPdd->TXDMA_CFG)); // 0044 - DMA transmit channels config
EdbgOutputDebugString("\tDATA_DMA=%x\r\n",INREG32(&pPdd->DATA_DMA)); // 0048 - DMA FIFO data
EdbgOutputDebugString("\tTXDMA0=%x\r\n",INREG32(&pPdd->TXDMA0)); // 0050 - Transmit DMA control 0
EdbgOutputDebugString("\tTXDMA1=%x\r\n",INREG32(&pPdd->TXDMA1)); // 0054 - Transmit DMA control 1
EdbgOutputDebugString("\tTXDMA2=%x\r\n",INREG32(&pPdd->TXDMA2)); // 0058 - Transmit DMA control 2
EdbgOutputDebugString("\tRXDMA0%x\r\n",INREG32(&pPdd->RXDMA0)); // 0060 - Receive DMA control 0
EdbgOutputDebugString("\tRXDMA1=%x\r\n",INREG32(&pPdd->RXDMA1)); // 0064 - Receive DMA control 0
EdbgOutputDebugString("\tRXDMA2=%x\r\n",INREG32(&pPdd->RXDMA2)); // 0068 - Receive DMA control 0
EdbgOutputDebugString("\tEP0=%x\r\n",INREG32(&pPdd->EP0)); // 0080 - Endpoint 0 configuration
EdbgOutputDebugString("\tEP_RX[0]=%x\r\n",INREG32(&pPdd->EP_RX[0])); // 0080 - Endpoint 0 configuration
EdbgOutputDebugString("\tEP_RX[1]=%x\r\n",INREG32(&pPdd->EP_RX[1])); // 0080 - Endpoint 0 configuration
EdbgOutputDebugString("\tEP_RX[2]=%x\r\n",INREG32(&pPdd->EP_RX[2])); // 0080 - Endpoint 0 configuration
EdbgOutputDebugString("\tEP_RX[3]=%x\r\n",INREG32(&pPdd->EP_RX[3])); // 0080 - Endpoint 0 configuration
EdbgOutputDebugString("\tEP_TX[0]=%x\r\n",INREG32(&pPdd->EP_TX[0])); // 0080 - Endpoint 0 configuration
EdbgOutputDebugString("\tEP_TX[1]=%x\r\n",INREG32(&pPdd->EP_TX[1])); // 0080 - Endpoint 0 configuration
EdbgOutputDebugString("\tEP_TX[2]=%x\r\n",INREG32(&pPdd->EP_TX[2])); // 0080 - Endpoint 0 configuration
EdbgOutputDebugString("\tEP_TX[3]=%x\r\n",INREG32(&pPdd->EP_TX[3])); // 0080 - Endpoint 0 configuration
{
// OMAP2420_ULPD_REGS * pStatus = OALPAtoUA(OMAP2420_ULPD_REGS_PA);
// EdbgOutputDebugString("Dump UPLD registers\r\n");
// EdbgOutputDebugString("\tSTATUS_REQ=%x\r\n",INREG32(&pStatus->STATUS_REQ));
}
{
OMAP2420_OTG_REGS * pOtg = OALPAtoUA(OMAP3_USB_HS_OTG_REG_PA);
EdbgOutputDebugString("Dump OTG registers\r\n");
EdbgOutputDebugString("\tREV=%x\r\n",INREG32(&pOtg->REV));
EdbgOutputDebugString("\tSYSCON_1=%x\r\n",INREG32(&pOtg->SYSCON_1));
EdbgOutputDebugString("\tSYSCON_2=%x\r\n",INREG32(&pOtg->SYSCON_2));
EdbgOutputDebugString("\tCTRL=%x\r\n",INREG32(&pOtg->CTRL));
EdbgOutputDebugString("\tIRQ_EN=%x\r\n",INREG32(&pOtg->IRQ_EN));
EdbgOutputDebugString("\tIRQ_SRC=%x\r\n",INREG32(&pOtg->IRQ_SRC));
EdbgOutputDebugString("\tOUTCTRL=%x\r\n",INREG32(&pOtg->OUTCTRL));
EdbgOutputDebugString("\tTEST=%x\r\n",INREG32(&pOtg->TEST));
}
}
#pragma optimize ( "", on )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -