⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rndis.c

📁 Windows CE 6.0 BSP for the Beagle Board.
💻 C
📖 第 1 页 / 共 4 页
字号:
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 + -