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

📄 pdsocket.cpp

📁 WinCE5.0BSP for Renesas SH7770
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{
    if( NeedReinitAfterPowerDown() )
    {
        // For Bridge that is shut down during suspend/resume
        if( bPowerDown )
        {
            EnableClientInterrupt( 0, FALSE );
            EnableClientInterrupt( 1, FALSE );
            // Shut down socket any way.
            ApplyPower( 0, 0, 0 );
            ApplyPower( 1, 0, 0 );
            ApplyEnable(0,FALSE);
            ApplyEnable(1,FALSE);
        }
        else
        {
            // Force Remover
            m_rgPcmciaInterruptEvents[0] = PCMCIA_INTERRUPT_FORCE_EJECT;
            m_rgPcmciaInterruptEvents[1] = PCMCIA_INTERRUPT_FORCE_EJECT;
            ::SetInterruptEvent( m_dwCSCSysIntr );
        }
    }
    else
    {
        for( int nSlot = 0; nSlot < NUM_SLOTS; nSlot++ )
        {
            if( m_rgpCardSocket[nSlot] )
            {
                SS_SOCKET_STATE sState;
                if( bPowerDown )
                {
                    if( m_rgpCardSocket[nSlot]->CardGetSocket( &sState ) ==
                        CERR_SUCCESS &&
                        ( sState.dwInteruptStatus & ( SOCK_INT_STATUS_CHG_WAKE |
                                                    SOCK_INT_FUNC_IRQ_WAKE ) ) ==
                        0 )
                    {
                        // I am going to shut down power.            
                        EnableClientInterrupt( nSlot, FALSE );
                        ApplyPower( nSlot, 0, 0 );
                        ApplyEnable(nSlot,FALSE);
                    }
                    else
                        m_rgpCardSocket[nSlot]->PowerMgr( bPowerDown );
                }
                else
                {
                    //Resume
                    if( m_rgpCardSocket[nSlot]->CardGetSocket( &sState ) ==
                        CERR_SUCCESS &&
                        ( sState.dwInteruptStatus & ( SOCK_INT_STATUS_CHG_WAKE |
                                                    SOCK_INT_FUNC_IRQ_WAKE ) ) ==
                        0 )
                    {
                        // In case to free the bus.
                        ApplyEnable(nSlot,FALSE);
                        ApplyPower(nSlot,GetVSPinOut(nSlot) , 0 ) ;
                        m_rgPcmciaInterruptEvents[nSlot] = PCMCIA_INTERRUPT_FORCE_EJECT;
                        ::SetInterruptEvent( m_dwCSCSysIntr );
                    }
                    else
                        m_rgpCardSocket[nSlot]->PowerMgr( bPowerDown );
                }
            }
        }
    }
}

void CPCCardBusBridge::CallBackToCardService( int nSlot, HANDLE hSocket,
                                              PSS_SOCKET_STATE pSocketState )
{
    if( m_pCallBackToCardService )
    {
        __try
        {
            m_pCallBackToCardService( hSocket, m_rguSocketNum[nSlot], pSocketState );
        } __except( EXCEPTION_EXECUTE_HANDLER )
        {
            DEBUGCHK( FALSE );
        }
    }
    else
    {
        DEBUGCHK( FALSE );
    }
}

BOOL CPCCardBusBridge::GetSocketNumberFromCS( int nSlot, BOOL bGet )
{
    STATUS status = CERR_BAD_ARGS;
    if( m_pRequestSocketNumber && m_pDeleteSocket )
    {
        __try
        {
            status = ( bGet ?
                       m_pRequestSocketNumber( &m_rguSocketNum[nSlot],
                                               sizeof( MRSHPCSocketServicStatic ),
                                               &MRSHPCSocketServicStatic,
                                               GetSocketName() ) :
                       m_pDeleteSocket( m_rguSocketNum[nSlot] ) );
        } __except( EXCEPTION_EXECUTE_HANDLER )
        {
            DEBUGCHK( FALSE );
            status = CERR_BAD_ARGS;
        }
    }
    DEBUGCHK( status == CERR_SUCCESS );
    return ( status == CERR_SUCCESS );
}

BOOL CPCCardBusBridge::SetupWakeupSource( BOOL bSet )
{
    if( bSet )
    {
        KernelIoControl( IOCTL_HAL_ENABLE_WAKE,
                         &m_dwCSCSysIntr,
                         sizeof( m_dwCSCSysIntr ),
                         NULL,
                         0,
                         NULL );
    }
    else
    {
        KernelIoControl( IOCTL_HAL_DISABLE_WAKE,
                         &m_dwCSCSysIntr,
                         sizeof( m_dwCSCSysIntr ),
                         NULL,
                         0,
                         NULL );
    }
    return TRUE;
}

#define CSC_THREAD_PRIORITY TEXT("CSCThreadPriority")
#define REGISTRY_POWER_OPTION TEXT("PowerOption")
#define CSC_SYSINTR_VALUE_NAME TEXT("CSCSysIntr")
#define SOCKET0_FUNCTION_SYSINTR_VALUE_NAME TEXT("Socket0FunctionSysInt")
#define SOCKET1_FUNCTION_SYSINTR_VALUE_NAME TEXT("Socket1FunctionSysInt")

BOOL CPCCardBusBridge::loadRequiredRegEntry()
{
    if( !IsKeyOpened() )
    {
        return FALSE;
    }

    if( !LoadWindowsSettings() )
    {
        DEBUGMSG( ZONE_SOCKET |
                  ZONE_ERROR,
                  ( TEXT( "CPCCardBusBridge::LoadWindowsSettings: Cannot get windows info from the registry\r\n" ) ) );
        return FALSE;
    }

    DWORD dwType;
    DWORD dwLength;

    // Get the Card Status Change interrupt SYSINTR value
    dwLength = sizeof( m_dwCSCSysIntr );
    if( !RegQueryValueEx( CSC_SYSINTR_VALUE_NAME,
                          &dwType,
                          ( LPBYTE ) &m_dwCSCSysIntr,
                          &dwLength ) )
    {
        DEBUGMSG( ZONE_SOCKET | ZONE_ERROR,
                    ( TEXT( "CPCCardBusBridge::loadRequiredRegEntry: Can not Get %s (type is 0x%x) from Registry\r\n" ),
                      CSC_SYSINTR_VALUE_NAME,
                      dwType ) );
        return FALSE;
    }

    // Get the Slot 0 Card Function interrupt SYSINTR value
    dwLength = sizeof( m_rgdwFunctionSysIntr[0] );
    if( !RegQueryValueEx( SOCKET0_FUNCTION_SYSINTR_VALUE_NAME,
                          &dwType,
                          ( LPBYTE ) &m_rgdwFunctionSysIntr[0],
                          &dwLength ) )
    {
        DEBUGMSG( ZONE_SOCKET | ZONE_ERROR,
                  ( TEXT( "CPCCardBusBridge::loadRequiredRegEntry: Can not Get %s (type is 0x%x) from Registry\r\n" ),
                    SOCKET0_FUNCTION_SYSINTR_VALUE_NAME,
                    dwType ) );
        return FALSE;
    }

    // Get the Slot 1 Card Function interrupt SYSINTR value
    dwLength = sizeof( m_rgdwFunctionSysIntr[1] );
    if( !RegQueryValueEx( SOCKET1_FUNCTION_SYSINTR_VALUE_NAME,
                          &dwType,
                          ( LPBYTE ) &m_rgdwFunctionSysIntr[1],
                          &dwLength ) )
    {
        DEBUGMSG( ZONE_SOCKET |
                  ZONE_ERROR,
                  ( TEXT( "CPCCardBusBridge::loadRequiredRegEntry: Can not Get %s (type is 0x%x) from Registry\r\n" ),
                  SOCKET1_FUNCTION_SYSINTR_VALUE_NAME,
                  dwType ) );
        return FALSE;
    }

    // Get the CSC thread priority
    DWORD dwTempVal;
    m_uPriority = DEFAULT_PRIORITY;
    dwLength = sizeof( dwTempVal );
    if( RegQueryValueEx( CSC_THREAD_PRIORITY,
                         &dwType,
                         ( LPBYTE ) &dwTempVal,
                         &dwLength ) )
    {
        m_uPriority = ( UINT ) dwTempVal;
    }

    // Get the power options
    dwLength = sizeof( m_dwPowerOption );
    if( !RegQueryValueEx( REGISTRY_POWER_OPTION,
                          &dwType,
                          ( LPBYTE ) &m_dwPowerOption,
                          &dwLength ) )
    {
        m_dwPowerOption = 0;
    }

    return TRUE;
}

BOOL CPCCardBusBridge::MapHardware()
{
	int nSlot;

	m_pDriverGlobals = (PDRIVER_GLOBALS)VirtualAlloc(0, DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE, MEM_RESERVE, PAGE_NOACCESS);
	if (NULL == m_pDriverGlobals) 
	{
		ASSERT(FALSE);
		return FALSE;
	}
	if (!VirtualCopy(m_pDriverGlobals, (PVOID)DRIVER_GLOBALS_PHYSICAL_MEMORY_START, 
		DRIVER_GLOBALS_PHYSICAL_MEMORY_SIZE,PAGE_READWRITE|PAGE_NOCACHE)) 
	{
		ASSERT(FALSE);
		return FALSE;
	}

    m_pPerFPGABase = (PVBYTE)VirtualAlloc (0,SF_REG_SIZE, MEM_RESERVE, PAGE_NOACCESS);
    if (NULL == m_pPerFPGABase) 
    {
		ASSERT(FALSE);
		return FALSE;
    }
    if (!VirtualCopy((unsigned char *)m_pPerFPGABase, (PVOID)SYSTEM_FPGA_BASE, SF_REG_SIZE,
        PAGE_READWRITE|PAGE_NOCACHE))
    {
		ASSERT(FALSE);
		return FALSE;
    }

	for(nSlot = 0; nSlot < NUM_SLOTS; nSlot++){

		PVBYTE pPcmciaBase = (PVBYTE)VirtualAlloc (0,PCMCIA_REG_SIZE, MEM_RESERVE, PAGE_NOACCESS);
		if (NULL == pPcmciaBase) 
		{
			ASSERT(FALSE);
			return FALSE;
		}
		if (!VirtualCopy((unsigned char *)pPcmciaBase, (PVOID)v_PcmciaInit[nSlot].reg_base, PCMCIA_REG_SIZE, PAGE_READWRITE|PAGE_NOCACHE))
		{
			ASSERT(FALSE);
			return FALSE;
		}

	    m_rgPcmciaRegisters[nSlot].pMOD   = (PVSHORT)(pPcmciaBase + MR_SHPC_MOD_OFFSET); 
	    m_rgPcmciaRegisters[nSlot].pOPT   = (PVSHORT)(pPcmciaBase + MR_SHPC_OPT_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pCST   = (PVSHORT)(pPcmciaBase + MR_SHPC_CST_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pINTR  = (PVSHORT)(pPcmciaBase + MR_SHPC_INTR_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pINTC  = (PVSHORT)(pPcmciaBase + MR_SHPC_INTC_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pCPWC  = (PVSHORT)(pPcmciaBase + MR_SHPC_CPWC_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pMW0C1 = (PVSHORT)(pPcmciaBase + MR_SHPC_MW0C1_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pMW1C1 = (PVSHORT)(pPcmciaBase + MR_SHPC_MW1C1_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pIOWC1 = (PVSHORT)(pPcmciaBase + MR_SHPC_IOWC1_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pMW0C2 = (PVSHORT)(pPcmciaBase + MR_SHPC_MW0C2_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pMW1C2 = (PVSHORT)(pPcmciaBase + MR_SHPC_MW1C2_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pIOWC2 = (PVSHORT)(pPcmciaBase + MR_SHPC_IOWC2_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pCCN   = (PVSHORT)(pPcmciaBase + MR_SHPC_CCN_OFFSET);
	    m_rgPcmciaRegisters[nSlot].pCIN   = (PVSHORT)(pPcmciaBase + MR_SHPC_CIN_OFFSET);

	    //Initialize the FPGA registers to use before initializing the PCMCIA controller 
	    
	    //Now, ready to initialize the PCMCIA controller
	    
	    /*First, set the Mode Reg.*/
	    WRITE_REGISTER_USHORT(m_rgPcmciaRegisters[nSlot].pMOD,(MR_SHPC_MOD_SH4_WAIT | MR_SHPC_MOD_CKIO_66));

	    // Initialize VPP and VCC by setting 0
	    WRITE_REGISTER_USHORT(m_rgPcmciaRegisters[nSlot].pCPWC, 
	        (READ_REGISTER_USHORT(m_rgPcmciaRegisters[nSlot].pCPWC) & ~(MR_SHPC_CPWC_VPP_MASK | MR_SHPC_CPWC_VCC_MASK)));

		if(nSlot == 0){
			m_pDriverGlobals->pcm.slot0Enable = 0;
		}
		else{
			m_pDriverGlobals->pcm.slot1Enable = 0;
		}

	    //Before starting the system, clear all pending interrupts
	    
	    READ_REGISTER_USHORT(m_rgPcmciaRegisters[nSlot].pINTR);  //Once reading INTR register, it is automatically cleared
	    
	    //starting the reset sequence 

		// The reset line must be active 10 us
		
		Sleep(10);

⌨️ 快捷键说明

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