📄 pdsocket.cpp
字号:
&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 )
{
}
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;
// Test if a PCMCIA card is already inserted in one of the sockets
switch(m_SlotNumber)
{
case 1:
statusReg = m_pBLRegs->pcmcia1_srcr;
bLastCardDetectStatus = !((statusReg & PCMCIA_S1_nCD_MASK) >> 5);
if (bLastCardDetectStatus)
{
bLastIRQReadyStatus = ((statusReg & PCMCIA_S1_nIRQ_MASK) >> 10);
bLastBvd1Status = !((statusReg & PCMCIA_S1_nSTSCHG_BVD1_MASK) >> 8);
bLastBvd2Status = !((statusReg & PCMCIA_S1_nSPKR_BVD2_MASK) >> 9);
}
break;
case 0:
default:
statusReg = m_pBLRegs->pcmcia0_srcr;
bLastCardDetectStatus = !((statusReg & PCMCIA_S0_nCD_MASK) >> 5);
if (bLastCardDetectStatus)
{
bLastIRQReadyStatus = ((statusReg & PCMCIA_S0_nIRQ_MASK) >> 10);
bLastBvd1Status = !((statusReg & PCMCIA_S0_nSTSCHG_BVD1_MASK) >> 8);
bLastBvd2Status = !((statusReg & PCMCIA_S0_nSPKR_BVD2_MASK) >> 9);
}
break;
}
if (bLastCardDetectStatus)
{
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;
}
Lock();
//
// Determine the slot status.
//
BOOL bCardDetectStatus;
BOOL bIRQReadyStatus;
BOOL bBvd1Status;
BOOL bBvd2Status;
switch(m_SlotNumber)
{
case 1:
statusReg = m_pBLRegs->pcmcia1_srcr;
bCardDetectStatus = !((statusReg & PCMCIA_S1_nCD_MASK) >> 5);
bBvd1Status = !((statusReg & PCMCIA_S1_nSTSCHG_BVD1_MASK) >> 8);
bBvd2Status = !((statusReg & PCMCIA_S1_nSPKR_BVD2_MASK) >> 9);
bIRQReadyStatus = ((statusReg & PCMCIA_S1_nIRQ_MASK) >> 10);
break;
case 0:
default:
statusReg = m_pBLRegs->pcmcia0_srcr;
bCardDetectStatus = !((statusReg & PCMCIA_S0_nCD_MASK) >> 5);
bBvd1Status = !((statusReg & PCMCIA_S0_nSTSCHG_BVD1_MASK) >> 8);
bBvd2Status = !((statusReg & PCMCIA_S0_nSPKR_BVD2_MASK) >> 9);
bIRQReadyStatus = ((statusReg & PCMCIA_S0_nIRQ_MASK) >> 10);
break;
}
// if nothing has changed, continue to the next slot
if( !m_rgfPowerCycleEvent && !m_rgForceEject &&
bCardDetectStatus == bLastCardDetectStatus &&
bBvd1Status == bLastBvd1Status &&
bBvd2Status == bLastBvd2Status &&
bIRQReadyStatus == bLastIRQReadyStatus)
{
Unlock();
continue;
}
bLastCardDetectStatus = bCardDetectStatus;
bLastBvd1Status = bBvd1Status;
bLastBvd2Status = bBvd2Status;
bLastIRQReadyStatus = bIRQReadyStatus;
//
// Figure out the socket state
//
if(bCardDetectStatus)
{
dwNotifyEvents |= SOCK_EVENT_CD;
if (bIRQReadyStatus)
{
dwNotifyEvents |= SOCK_EVENT_READY;
}
if(bBvd1Status)
{
dwNotifyEvents |= SOCK_EVENT_BVD1;
}
if(bBvd2Status)
{
dwNotifyEvents |= SOCK_EVENT_BVD2;
}
}
else
{
dwNotifyEvents &= ~(SOCK_EVENT_CD);
}
Unlock();
if (m_rgForceEject) {
m_rgForceEject = FALSE;
RemovePcmciaCardSocket();
bIsCardInserted = false;
}
if( bIsCardInserted && !bCardDetectStatus )
{
RemovePcmciaCardSocket();
bIsCardInserted = false;
}
else if ( !bIsCardInserted && bCardDetectStatus )
{
RemovePcmciaCardSocket();
InsertPcmciaCardSocket(CreatePCMCIASocket(this, m_SlotNumber));
bIsCardInserted = true;
}
else
{
// Other Event left for type specific socket
DWORD dwNotifyEventsChanged = dwLastNotifyEvents ^ dwNotifyEvents;
dwLastNotifyEvents = dwNotifyEvents;
if (m_prgCardSocket)
{
m_prgCardSocket->SocketEventHandle( dwNotifyEventsChanged, dwNotifyEvents );
}
}
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 )
{
return(FALSE);
}
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( MAINSTONEIISocketServiceStatic ),
&MAINSTONEIISocketServiceStatic,
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 + -