📄 pdsocket.cpp
字号:
{
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 + -