📄 pdsocket.cpp
字号:
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;
ULONG ulGPIOF;
// 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;
}
*/
ulGPIOF=*GPIO_PFDR;
// bLastCardDetectStatus= ( ulGPIOF & (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ) ? false: true;
bLastCardDetectStatus= ( ulGPIOF & (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ) == (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ? false: true;
if( bLastCardDetectStatus )
{
bLastBvd1Status = ulGPIOF & GPIOF_PCMCIA_BVD1 ;
bLastBvd2Status = ulGPIOF & GPIOF_PCMCIA_BVD2 ;
bLastIRQReadyStatus = ulGPIOF & GPIOF_PCMCIA_IRQ;
}
// bLastCardDetectStatus= false;
// bLastBvd1Status = false;
// bLastBvd2Status = false;
// bLastIRQReadyStatus = false;
if (bLastCardDetectStatus)
{
InsertPcmciaCardSocket(CreatePCMCIASocket(this, m_SlotNumber));
bIsCardInserted = true;
}
DEBUGMSG( ZONE_INT,( L"EP93XX: PCCardBus interrupt handler %d\r\n",m_fPollingMode ) );
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;
}
DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus Get interrupt\r\n" ) );
Sleep(10 );
if (!bInterrupt) // we have reached a timeout in non-pooling mode or something bad has occured.
{
DEBUGMSG( ZONE_INT,( L"PCC EP93XX interrupt ERROR\r\n" ) );
continue;
}
Lock();
//
// Determine the slot status.
//
BOOL bCardDetectStatus;
BOOL bIRQReadyStatus;
BOOL bBvd1Status;
BOOL bBvd2Status;
ulGPIOF=*GPIO_PFDR;
// *GPIO_FINTTYPE2 = ~ulGPIOF & ( GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2 | GPIOF_PCMCIA_BVD1 | GPIOF_PCMCIA_BVD2);
//bCardDetectStatus = ( ulGPIOF & (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ) ? false: true;
bCardDetectStatus= ( ulGPIOF & (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ) == (GPIOF_PCMCIA_CD1 | GPIOF_PCMCIA_CD2) ? false: true;
if( bCardDetectStatus )
{
bBvd1Status = ulGPIOF & GPIOF_PCMCIA_BVD1 ;
bBvd2Status = ulGPIOF & GPIOF_PCMCIA_BVD2 ;
bIRQReadyStatus = ulGPIOF & GPIOF_PCMCIA_IRQ;
}
/*
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;
}
*/
DEBUGMSG( ZONE_INT,( L"PCCardBus Detect %d BVD1 %d BVD2 %d IRQ %d\r\n"
,bCardDetectStatus
,bBvd1Status
,bBvd2Status
,bIRQReadyStatus
));
DEBUGMSG( ZONE_INT,( L"PCCardBus LAST Detect %d BVD1 %d BVD2 %d IRQ %d\r\n"
,bLastCardDetectStatus
,bLastBvd1Status
,bLastBvd2Status
,bLastIRQReadyStatus
));
// if nothing has changed, continue to the next slot
if( !m_rgfPowerCycleEvent && !m_rgForceEject &&
bCardDetectStatus == bLastCardDetectStatus &&
bBvd1Status == bLastBvd1Status &&
bBvd2Status == bLastBvd2Status &&
bIRQReadyStatus == bLastIRQReadyStatus)
{
DEBUGMSG( ZONE_INT,( L"PCC EP93XX InterruptDone\r\n" ) );
InterruptDone( m_dwCSCSysIntr );
Unlock();
continue;
}
/*
if( bCardDetectStatus )
*GPIO_FINTTYPE2 |= (GPIOF_PCMCIA_CD1|GPIOF_PCMCIA_CD2); //Card is present, so set CD to rising edge triger.
else
*GPIO_FINTTYPE2 &= ~(GPIOF_PCMCIA_CD1|GPIOF_PCMCIA_CD2);
*/
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) {
DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus int 00000000000\r\n" ) );
m_rgForceEject = FALSE;
RemovePcmciaCardSocket();
bIsCardInserted = false;
}
if( bIsCardInserted && !bCardDetectStatus )
{
DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus int 111111111\r\n" ) );
RemovePcmciaCardSocket();
bIsCardInserted = false;
}
else if ( !bIsCardInserted && bCardDetectStatus )
{
DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus int 222222222\r\n" ) );
RemovePcmciaCardSocket();
InsertPcmciaCardSocket(CreatePCMCIASocket(this, m_SlotNumber));
bIsCardInserted = true;
}
else
{
DEBUGMSG( ZONE_INT,( L"CardBus: PCCardBus int 33333333333\r\n" ) );
// 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_INT,( 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 + -