📄 pdsocket.cpp
字号:
{
m_fPollingMode = TRUE; // RegQueryValueEx failed, default to TRUE
}
else
{
m_fPollingMode = dwData ? TRUE : FALSE;
}
// Get client (function) IRQ.
dwSize = sizeof( DWORD );
if( !RegQueryValueEx( CLIENT_IRQ_VALUE_NAME,
&dwType,
( PUCHAR ) & dwData,
&dwSize ) )
{
DEBUGMSG( ZONE_PDD,
( TEXT( "PCMCIA:GetRegistyConfig RegQueryValueEx(%s) failed\r\n" ),
CLIENT_IRQ_VALUE_NAME ) );
goto grc_fail;
}
m_dwClientIrq = dwData;
// TODO - get CD IRQ and SYSINTR - no polling.
// Get card status change (CSC) IRQ and SYSINTR values.
// NOTE: the CSC and CD IRQ values are part of the same IRQ multi-string in the registry.
dwSize = sizeof( DWORD );
if( !RegQueryValueEx( IRQ_VALUE_NAME,
&dwType,
( PUCHAR ) & dwData,
&dwSize ) )
{
m_dwCSCIrq = 0;
m_fPollingMode = FALSE;
}
else
{
m_dwCSCIrq = dwData;
}
dwSize = sizeof( DWORD );
if( !RegQueryValueEx( SYSINTR_VALUE_NAME,
&dwType,
( PUCHAR ) & dwData,
&dwSize ) )
{
m_dwCSCSysIntr = 0;
m_dwCSCIrq = 0;
m_fPollingMode = FALSE;
}
else
{
m_dwCSCSysIntr = dwData;
}
// Get the polling timeout value.
dwSize = sizeof( DWORD );
if( !RegQueryValueEx( POLL_TIMEOUT_NAME,
&dwType,
( PUCHAR ) & dwData,
&dwSize ) )
{
// RegQueryValueEx failed; if pooling, set the timeout to 0.5 sec, otherwise set to INFINITE
m_dwPollTimeout = m_fPollingMode ? 500 : INFINITE;
}
else
{
m_dwPollTimeout = dwData;
}
// Get thread priority from registry and set it.
m_uPriority = DEFAULT_PRIORITY;
dwSize = sizeof( DWORD );
if( RegQueryValueEx( CSC_THREAD_PRIORITY_NAME,
&dwType,
( PUCHAR ) & dwData,
&dwSize ) )
{
m_uPriority = ( UINT )dwData;
}
dwRet = ERROR_SUCCESS;
grc_fail : return dwRet;
} // GetRegistryConfig
BOOL CPcmciaBusBridge::InitCardBusBridge( void )
{
// Get PCCARD controller registry information.
if((GetRegistryConfig()) != ERROR_SUCCESS)
{
DEBUGMSG( ZONE_PDD,
( TEXT( "PDCardInitServices GetRegistryConfig failed.\r\n" )));
return(FALSE);
}
// Map PCCARD controller device buffers.
if( !MapDeviceRegisters() )
{
DEBUGMSG( ZONE_PDD,
( TEXT( "PDCardInitServices MapDeviceRegisters failed %d\r\n" )));
return(FALSE);
}
// Initialize the PCMCIA bridge hardware.
if( !InitializeBridgeHW() )
{
DEBUGMSG( ZONE_PDD,
( TEXT( "PDCardInitServices InitializeBridgeHW failed %d\r\n" )));
return(FALSE);
}
// Initialize slot interrupts.
InstallIsr();
return(TRUE);
}
BOOL CPcmciaBusBridge::Init()
{
if(!loadPcCardEntry())
{
return(FALSE);
}
if(!InitCardBusBridge())
{
return(FALSE);
}
if (!GetSocketNumberFromCS( TRUE ))
{
return(FALSE);
}
// Set Tread Priority.
CeSetPriority( m_uPriority );
m_bTerminated = FALSE;
ThreadStart();
return(TRUE);
}
BOOL CPcmciaBusBridge::GetRegPowerOption( PDWORD pOption )
{
if( pOption )
{
return GetRegValue( POWER_OPTION_NAME,
( PBYTE ) pOption,
sizeof( DWORD ) );
}
return TRUE;
}
void CPcmciaBusBridge::PowerMgr( BOOL bPowerDown )
{
if( m_prgCardSocket )
{
if( !bPowerDown )
{
//Resume
InitializeBridgeHW();
}
m_prgCardSocket->PowerMgr( bPowerDown );
}
}
BOOL CPcmciaBusBridge::NeedPowerResuming()
{
m_bResumeFlag = TRUE;
SetInterruptEvent( m_dwCSCSysIntr );
return TRUE;
}
void CPcmciaBusBridge::PowerCycleEvent(UINT16 nSlotNumber)
{
Lock();
m_rgfPowerCycleEvent = TRUE;
SetEvent( m_hISTEvent );
Unlock();
}
void CPcmciaBusBridge::ForceEjectEvent(UINT16 nSlotNumber)
{
Lock();
m_rgForceEject = TRUE;
SetEvent( m_hISTEvent );
Unlock();
}
DWORD CPcmciaBusBridge::ThreadRun() // This is card status change IST
{
UINT16 statusReg = 0;
BOOL bLastCardDetectStatus = FALSE;
BOOL bLastIRQReadyStatus = FALSE;
BOOL bLastBvd1Status = FALSE;
BOOL bLastBvd2Status = FALSE;
DWORD dwLastNotifyEvents = FALSE;
DWORD dwNotifyEvents = 0;
BOOL bIsCardInserted = FALSE;
//
// Plato Device has a PCMCIA(CF) device always inserted into the socket
//
InsertPcmciaCardSocket(CreatePCMCIASocket(this, m_SlotNumber));
bIsCardInserted = true;
while( !m_bTerminated )
{
BOOL bInterrupt;
ASSERT(m_hISTEvent != NULL);
bInterrupt = (WaitForSingleObject(m_hISTEvent, m_dwPollTimeout) != WAIT_TIMEOUT);
if( m_fPollingMode ) // Fake the interrupt if we're polling.
{
bInterrupt = true;
}
if (!bInterrupt) // we have reached a timeout in non-pooling mode or something bad has occured.
{
continue;
}
if( !m_fPollingMode )
{
DEBUGMSG( ZONE_FUNCTION,
( L"CardBus: PCCardBus Call InterruptDone\r\n" ) );
InterruptDone( m_dwCSCSysIntr );
}
} // while(!m_bTerminated)
return(0);
}
BOOL CPcmciaBusBridge::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;
}
void CPcmciaBusBridge::CallBackToCardService( UINT16 nSocketNumber,
HANDLE hSocket,
PSS_SOCKET_STATE pSocketState )
{
if( m_pCallBackToCardService )
{
__try
{
m_pCallBackToCardService( hSocket,
nSocketNumber,
pSocketState );
} __except( EXCEPTION_EXECUTE_HANDLER )
{
DEBUGCHK( FALSE );
}
}
else
{
DEBUGCHK( FALSE );
}
}
BOOL CPcmciaBusBridge::GetSocketNumberFromCS(BOOL bGet)
{
STATUS status = CERR_BAD_ARGS;
if (m_pRequestSocketNumber && m_pDeleteSocket)
{
__try
{
status = (bGet ?
m_pRequestSocketNumber(&m_SocketNumber,
sizeof( PlatoSocketServiceStatic ),
&PlatoSocketServiceStatic,
GetSocketName()) :
m_pDeleteSocket(m_SocketNumber));
} __except(EXCEPTION_EXECUTE_HANDLER)
{
DEBUGCHK(FALSE);
status = CERR_BAD_ARGS;
}
}
DEBUGCHK(status == CERR_SUCCESS);
return (status == CERR_SUCCESS);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -