halether.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 977 行 · 第 1/3 页

C
977
字号
 * Return Value:
 *    Return TRUE if frame has been received, FALSE if not.
 */
UCHAR   pucBuffer[1518];

BOOL
OEMEthGetFrame(
              BYTE *pData,       // OUT - Receives frame data
              UINT16 *pwLength)  // IN  - Length of Rx buffer
                                 // OUT - Number of bytes received
{

#if IMGSHAREETH
    BOOL    bStatus;
    BOOL    bTaken; 
    UINT16  uiLength;
    
    while (1)
    {
        uiLength = 1518;
        bStatus  = pfnEDbgGetFrame(pucBuffer, &uiLength);       
        
        if (bStatus)
        {
            VBridgeKIndicateOneRxBuffer(pucBuffer, uiLength, FALSE, &bTaken);
            if (!bTaken)
            {
                if (*pwLength >= uiLength)
                    *pwLength = uiLength;               
                
                memcpy (pData, pucBuffer, *pwLength);               
                return bStatus;
            }
        }
        else
            break;
    }

    return (FALSE);
#else

    return (pfnEDbgGetFrame(pData, pwLength));

#endif
}

/* OEMEthSendFrame
 *
 *   Send Ethernet frame.  
 *
 *  Return Value:
 *   TRUE if frame successfully sent, FALSE otherwise.
 */
BOOL
OEMEthSendFrame(
               BYTE *pData,     // IN - Data buffer
               DWORD dwLength)  // IN - Length of buffer    
{
    int retries = 0;
    while ( retries++ < 4 ) {
        if ( !pfnEDbgSendFrame(pData, dwLength) )
        {

#if IMGSHAREETH
{
            PBYTE   pVMiniData;
            DWORD   dwVMiniDataLength;

            ////////////////////////////////////////////////////////////////////
            //  Consume all the client packets.
            //
            while (VBridgeKGetOneTxBuffer(&pVMiniData, &dwVMiniDataLength) == TRUE)
            {
                pfnEDbgSendFrame (pVMiniData, dwVMiniDataLength);
                VBridgeKGetOneTxBufferComplete(pVMiniData);
            }       
}
#endif

            return (TRUE);
        }
        else
            EdbgOutputDebugString("!OEMEthSendFrame failure, retry %u\n",retries);
    }
    return (FALSE);
}

/* OEMEthQueryClientInfo
 *
 *    Return address information for default ethernet services, plus a buffer pool to use
 *    for formatting and receiving EDBG packets (single buffer pool specified, divided in
 *    two for Rx and Tx buffers).  By specifying a smaller window size, less memory can be
 *    used (but the protocol will be less efficient...).  The amount of memory required per
 *    client is (2*WindowSize*1500) bytes.
 *
 *    For Odo, we reserve 3 buffer pools worth of memory in the bib file, based on the IMGEBOOT
 *    flag being set.
 *
 *  Return Value:
 *    If client can be configured, return TRUE and fill in addressing and buffer info. Otherwise
 *    return FALSE.  For Odo, configure clients based on the flags set by Eshell (received in the
 *    JUMPIMG command by eboot, and placed in the uninitalized driver globals section).
 */
BOOL
OEMEthQueryClientInfo(
                     UCHAR Service,         // IN - Service ID (one of EDBG_SVC defs from ethdbg.h).
                     EDBG_ADDR *pPeerAddr,  // OUT -Filled in with the peer Ether/IP address and UDP port number.
                     PUCHAR  pWindowSize,   // OUT -Filled in with the client window size.
                     PUCHAR *ppBufferPool)  // OUT -Filled in with the packet buffer pool address.
{

    // We use the default window size (8) for all services
    *pWindowSize = EDBG_WINDOW_SIZE;

    switch ( Service ) {
    // Check the flag in driver globals (set by eboot when it receives the JUMPIMG command)
    case EDBG_SVC_DBGMSG:
        if ( ! (pBootArgs->ucEshellFlags & EDBG_FL_DBGMSG) ) {
            return (FALSE);
        }
        memcpy(pPeerAddr, &pBootArgs->DbgHostAddr,sizeof(EDBG_ADDR));
        *ppBufferPool = (UCHAR *)EDBG_PHYSICAL_MEMORY_START;
        break;
    case EDBG_SVC_PPSH:
        if ( ! (pBootArgs->ucEshellFlags & EDBG_FL_PPSH) ) {
            return (FALSE);
        }
        memcpy(pPeerAddr, &pBootArgs->CeshHostAddr,sizeof(EDBG_ADDR));
        *ppBufferPool = (UCHAR *)EDBG_PHYSICAL_MEMORY_START + EDBG_DFLT_BUFFER_POOL_SIZE;
        break;
    case EDBG_SVC_KDBG:
        if ( ! (pBootArgs->ucEshellFlags & EDBG_FL_KDBG) ) {
            return (FALSE);
        }
        memcpy(pPeerAddr, &pBootArgs->KdbgHostAddr,sizeof(EDBG_ADDR));    
        *ppBufferPool = (UCHAR *)EDBG_PHYSICAL_MEMORY_START + 2*EDBG_DFLT_BUFFER_POOL_SIZE;
        break;            
    default:
        return (FALSE);
    }
    return (TRUE);
}



/* OEMEthGetSecs
 *
 *  Return a count of seconds from some arbitrary time (the absolute value is not important,
 *  so long as it increments appropriately). Read this value from the RTC values in CMOS. Note
 *  that reading the CMOS requires multiple register operations, so this function must be called
 *  only when scheduling is disabled.
 */
static DWORD dwLastTime;  // For making sure we aren't running backward
extern BOOL fRTCInit;
extern BOOL Bare_GetRealTime(LPSYSTEMTIME lpst);
extern volatile DWORD CurMSec;

DWORD
OEMEthGetSecs()
{
    SYSTEMTIME st;
    DWORD dwRet;
    static DWORD dwBias;

    if (!fRTCInit) {
        Bare_GetRealTime( &st );
        dwRet = ((60UL * (60UL * (24UL * (31UL * st.wMonth + st.wDay) + st.wHour) + st.wMinute)) + st.wSecond);
        dwBias = dwRet;
    } else {
        dwRet = (CurMSec/1000) + dwBias;
    }

    if (dwRet < dwLastTime) {
        EdbgOutputDebugString("! Time went backwards (or wrapped): cur: %u, last %u\n",
                              dwRet,dwLastTime);
    }
    dwLastTime = dwRet;
    return (dwRet);
}


#ifdef IMGSHAREETH

//
//	These functions are only needed if vmini is in.
//	i.e. if IMGSHAREETH is set.
//


////////////////////////////////////////////////////////////////////////////////
//	OEMEthSetFilter()
//
//	Description:
//		
//		This function is used by VMINI to inform the underlying ethernet
//		library on the filtering mode it requires.
//
//	Arguments:
//
//		pdwRequestedFilter	:: The requested filter.
//							   Identical constants have been added in 
//							   that mimics NDIS_PACKET_TYPE_XXX constants.
//
//	Return Value:
//
//		TRUE	:: if we can set the filter.
//		FALSE	:: otherwise..
//
//
//	Note:
//		
//		As a minimum to get vmini to work, we need to support
//		PACKET_TYPE_DIRECTED 
//		PACKET_TYPE_BROADCAST
//
//	
BOOL
OEMEthCurrentPacketFilter(PDWORD pdwRequestedFilter)
{

	if (pfnCurrentPacketFilter)
	{
		EdbgOutputDebugString(
			"OEMEthCurrentPacketFilter set to [0x%x]\r\n",
			*pdwRequestedFilter);	

		//
		//	Note that we can't do it immediately here, since we are called 
		//	by user mode code.
		//	So what we do is to set the flag here for the kernel mode code
		//	to pick up.
		//

		dwFilter   = *pdwRequestedFilter;
		bNewFilter = TRUE;
		return TRUE;
	}
	else
	{
		//
		//	Oh well, eth driver does not yet support filter setting
		//	So if it is PACKET_TYPE_DIRECTED, PACKET_TYPE_MULTICAST, 
		//	PACKET_TYPE_BROADCAST, we just lie that we are ok with it.
		//	Since EDBG will run in this mode anyway..
		//

		DWORD	dwInherentlySupported = 
					PACKET_TYPE_MULTICAST	| 
					PACKET_TYPE_DIRECTED	| 
					PACKET_TYPE_BROADCAST;

		if (*pdwRequestedFilter == dwInherentlySupported)
			return TRUE;
		else
			return FALSE;
	}

}	//	OEMEthCurrentPacketFilter()



////////////////////////////////////////////////////////////////////////////////
//	OEMEthMulticastList()
//
//	Description:
//
//		This function is used by VMINI to inform the underlying ethernet 
//		library on multicast addresses that winsock app is interested in.
//		
//	Arguments:
//
//		pucMulticastAddressList	:: Pointer to an array of multicast addresses.
//		dwNoOfAddresses			:: Number of addresses passed in to us.
//
//	Return Value:
//		
//		TRUE	::  if we can set the underlying edbg ethernet libary to start
//						filtering on these multicast addresses.
//
//		FALSE	::  otherwise.
//
BOOL
OEMEthMulticastList(PUCHAR	pucMulticastAddressList, DWORD	dwNoOfAddresses)
{
	//
	//	This platform does not support multicast yet..
	//

	DWORD	i;
	BOOL	bReturnValue;

	EdbgOutputDebugString(
		"OEMEthMulticastList():: No of Entries [%d]\r\n",
			dwNoOfAddresses);	

	for (i = 0 ; i < dwNoOfAddresses ; i++)
	{
		EdbgOutputDebugString(
			"[%d] : %x - %x - %x - %x - %x - %x\r\n",
			i,
			pucMulticastAddressList[6*i+0],
			pucMulticastAddressList[6*i+1],
			pucMulticastAddressList[6*i+2],
			pucMulticastAddressList[6*i+3],
			pucMulticastAddressList[6*i+4],
			pucMulticastAddressList[6*i+5]);
	}

	if (pfnMulticastList)
		bReturnValue = pfnMulticastList(pucMulticastAddressList, dwNoOfAddresses);
	else
		bReturnValue = FALSE;

	EdbgOutputDebugString(
		"OEMEthMulticastList returning [%d]\r\n",
		bReturnValue);


	return bReturnValue;
	

}	//	OEMEthMulticastList()

#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?