📄 pcmciabridge.cpp
字号:
return pNewSocket;
}
return NULL;
}
CPcmciaSocket* CPcmciaBusBridge::ObjectBySocket( HANDLE hSocket )
{
CPcmciaSocket* pObject = NULL;
DEBUGMSG( 1, ( TEXT( "CPcmciaBusBridge::ObjectBySocket m_dwArraySize=0x%x\r\n" ), m_dwArraySize) );
Lock();
for( DWORD dwIndex = 0; dwIndex < m_dwArraySize; dwIndex++ )
{
if( ( pObject = m_rgObjectArray[dwIndex] ) != NULL )
{
if( pObject->GetSocketHandle() == hSocket )
{
pObject->AddRef();
break;
}
}
pObject = NULL;
}
Unlock();
return pObject;
}
void CPcmciaBusBridge::InsertPcmciaCardSocket( CPcmciaSocket* pSocket )
{
DEBUGMSG( ZONE_PDD, (TEXT("PCCARD: +CPcmciaBusBridge::InsertPcmciaCardSocket\n")));
if( pSocket )
{
//Lock();
if( m_pCardSocket != pSocket )
RemovePcmciaCardSocket( );
if( m_pCardSocket == NULL )
{
CPcmciaSocket* pReturn = InsertObjectAtEmpty( NULL, pSocket );
if( pReturn )
{
SS_SOCKET_STATE sSockState;
m_pCardSocket = pSocket;
m_pCardSocket->CardGetSocket( &sSockState );
sSockState.dwEventChanged |= SOCK_EVENT_CD;
sSockState.dwEventStatus |= SOCK_EVENT_CD;
CallBackToCardService( m_pCardSocket->GetSocketHandle(),
&sSockState );
}
else
{
// This should never happens.But we do our best to recover.
DEBUGCHK( FALSE );
delete pSocket;
}
}
else
DEBUGCHK( FALSE );
//Unlock();
}
else
{
DEBUGCHK( FALSE );
}
DEBUGMSG( ZONE_PDD, (TEXT("PCCARD: -CPcmciaBusBridge::InsertPcmciaCardSocket\n")));
}
void CPcmciaBusBridge::RemovePcmciaCardSocket( )
{
DEBUGMSG( ZONE_PDD, (TEXT("PCCARD: +CPcmciaBusBridge::RemovePcmciaCardSocket\n")));
Lock();
if( m_pCardSocket )
{
SS_SOCKET_STATE sSockState;
m_pCardSocket->CardGetSocket( &sSockState );
sSockState.dwEventChanged |= SOCK_EVENT_CD;
sSockState.dwEventStatus &= ~SOCK_EVENT_CD;
CallBackToCardService( m_pCardSocket->GetSocketHandle(),
&sSockState );
CPcmciaSocket* pSocket = RemoveObjectBy( m_pCardSocket );
DEBUGCHK( pSocket != NULL );
m_pCardSocket = NULL;
}
Unlock();
DEBUGMSG( ZONE_PDD, (TEXT("PCCARD: -CPcmciaBusBridge::RemovePcmciaCardSocket\n")));
}
void CPcmciaBusBridge::PowerManager( BOOL bPowerDown )
{
if( bPowerDown )
{
g_vPcmciaReg->PER = 0; // Disable all the interrupts
SetPccPower(0, TRUE); // Set GPIO pins to 0 volt
g_vPcmciaReg->PGCR = PCMCIA_PGCR_LOWPWRMODE; // Set to Lower Power mode
//DeinitGpio();
}
else
{
//InitGpio();
// Do software reset - then clear bit after it's done
PCMCIA_RESET_SOCKET(1);
UINT32 i=100;
while(i-- <1);
//Sleep(1000);
PCMCIA_RESET_SOCKET(0);
g_vPcmciaReg->PER = 0; // Disable all the interrupts
SetPccPower(0, TRUE); // Set GPIO pins to 0 volt
g_vPcmciaReg->PGCR = PCMCIA_PGCR_LOWPWRMODE; // Set to Lower Power mode
if( m_pCardSocket )
{
m_fCardInjectEvent = TRUE;
SetEvent( m_hISTEvent );
}
}
}
void CPcmciaBusBridge::PowerCycleEvent( )
{
Lock();
m_fPowerCycleEvent = TRUE;
SetEvent( m_hISTEvent );
Unlock();
}
void CPcmciaBusBridge::CardInjectEvent( )
{
Lock();
m_fCardInjectEvent = TRUE;
SetEvent( m_hISTEvent );
Unlock();
}
DWORD CPcmciaBusBridge::ThreadRun() // THIS is CardBusBridge IST.
{
UINT32 dwStatus, dwStatusChange;
dwStatus = GET_CARD_STATUS();
if (IS_CARD_INSERTED(dwStatus)) {
DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun() Card is already inserted trigger the IST event\r\n" ) );
m_fCardInjectEvent = TRUE;
SetEvent( m_hISTEvent );
}
// run until signalled to terminate
while( !m_bTerminated )
{
DEBUGCHK(m_hISTEvent!=NULL);
BOOL bInterrupt;
bInterrupt = (WaitForSingleObject(m_hISTEvent, m_dwPollTimeout)!=WAIT_TIMEOUT);
if( m_fPollingMode ) // we are pooling, fake an interrupt event
bInterrupt = TRUE;
//DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun() m_fPollingMode=%d\r\n" , m_fPollingMode) );
if (!bInterrupt) { // we have reached a timeout in non-pooling mode or something bad has occured.
//DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun() Timeout Continue\r\n" ) );
continue;
}
Lock();
UINT32 fNotifyEvents = 0;
while (TRUE) {
Sleep(20);
// See what changed and acknowledge any status change interrupts
fNotifyEvents = 0;
dwStatusChange = GET_CARD_STATUS_CHANGE();
dwStatus = GET_CARD_STATUS();
//DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun() dwStatusChange=0x%X dwStatus=0x%X\r\n" , dwStatusChange, dwStatus ));
// if nothing has changed, continue until next event
if( !m_fPowerCycleEvent &&
!m_fCardInjectEvent &&
(dwStatusChange&0x7F) == 0x0 )
{
break;
}
if( IS_CARDDETEC_CHANGE(dwStatusChange) )
{
DEBUGMSG( ZONE_PDD,( L"PCCARD: ThreadRun() CardStatusChange\r\n" ) );
fNotifyEvents |= EVENT_MASK_CARD_DETECT;
}
if( m_fCardInjectEvent )
{
DEBUGMSG( ZONE_PDD,( L"PCCARD: ThreadRun() CardInjectEvent\r\n" ) );
fNotifyEvents |= EVENT_MASK_CARD_DETECT;
m_fCardInjectEvent = FALSE;
}
if( m_fPowerCycleEvent )
{
DEBUGMSG( ZONE_PDD,( L"PCCARD: ThreadRun() PowerCycleEvent\r\n" ) );
fNotifyEvents |= EVENT_MASK_POWER_CYCLE;
m_fPowerCycleEvent = FALSE;
}
if( fNotifyEvents & EVENT_MASK_CARD_DETECT )
{
// we're only processing Card Detection Signal.
// If this happens, Something has been changed.
// Send out Card revmoval before doing any more process.
RemovePcmciaCardSocket();
ProcessCDD( dwStatus );
}
else
{
// Other Event left for type specific socket
DEBUGMSG( ZONE_PDD, ( L"PCCARD: ThreadRun() OtherEvents\r\n" ) );
if( m_pCardSocket )
m_pCardSocket->SocketEventHandle( dwStatusChange, fNotifyEvents );
}
dwStatusChange = 0;
}
Unlock();
if( !m_fPollingMode )
{
DEBUGMSG( ZONE_FUNCTION,
( L"CardBus: PCCardBus Call InterruptDone\r\n" ) );
InterruptDone( m_dwCSCSysIntr );
}
} // while(!m_bTerminated)
return 0;
}
void CPcmciaBusBridge::ProcessCDD( DWORD dwPStateReg )
{
if( IS_CARD_INSERTED(dwPStateReg) )
{
if(!m_pCardSocket)
InsertPcmciaCardSocket( CreatePCMCIASocket( ) );
}
else
{
// Complete removal
if( m_pCardSocket )
RemovePcmciaCardSocket( );
}
}
void CPcmciaBusBridge::CallBackToCardService( HANDLE hSocket,
PSS_SOCKET_STATE pSocketState )
{
if( m_pCallBackToCardService )
{
__try
{
m_pCallBackToCardService( hSocket,
m_uSocketNum,
pSocketState );
} __except( EXCEPTION_EXECUTE_HANDLER )
{
DEBUGCHK( FALSE );
}
}
else
{
DEBUGCHK( FALSE );
}
}
BOOL CPcmciaBusBridge::GetSocketNumberFromCardService( BOOL bGet )
{
STATUS status = CERR_BAD_ARGS;
if( m_pRequestSocketNumber && m_pDeleteSocket )
{
__try
{
status = ( bGet ?
m_pRequestSocketNumber( &m_uSocketNum,
sizeof( MX27SocketServiceStatic ),
&MX27SocketServiceStatic,
GetSocketName() ) :
m_pDeleteSocket( m_uSocketNum ) );
} __except( EXCEPTION_EXECUTE_HANDLER )
{
DEBUGCHK( FALSE );
status = CERR_BAD_ARGS;
}
}
DEBUGCHK( status == CERR_SUCCESS );
return ( status == CERR_SUCCESS );
}
//
// Print Pcmcia Register value
//
void PcPrintPcmciaReg(void)
{
UINT8 i = 0;
DEBUGMSG(ZONE_PDD,(TEXT("PCMCIA Register:g_vPcmciaReg:0x%X\n"),g_vPcmciaReg));
DEBUGMSG(ZONE_PDD,(TEXT("\tPIPR [0x%X] :0x%X\n"),&(g_vPcmciaReg->PIPR),g_vPcmciaReg->PIPR));
DEBUGMSG(ZONE_PDD,(TEXT("\tPSCR [0x%X] :0x%X\n"),&(g_vPcmciaReg->PSCR),g_vPcmciaReg->PSCR));
DEBUGMSG(ZONE_PDD,(TEXT("\tPER [0x%X] :0x%X\n"),&(g_vPcmciaReg->PER),g_vPcmciaReg->PER));
DEBUGMSG(ZONE_PDD,(TEXT("\tPGSR [0x%X] :0x%X\n"),&(g_vPcmciaReg->PGSR),g_vPcmciaReg->PGSR));
DEBUGMSG(ZONE_PDD,(TEXT("\tPGCR [0x%X] :0x%X\n"),&(g_vPcmciaReg->PGCR),g_vPcmciaReg->PGCR));
for(i=0;i<PCMCIA_NUM_WINDOWS;i++) {
DEBUGMSG(ZONE_PDD,(TEXT("\tPBR[%d] :0x%X = 0x%X\n"),i,&(g_vPcmciaReg->PBR[i]),g_vPcmciaReg->PBR[i]));
DEBUGMSG(ZONE_PDD,(TEXT("\tPOR[%d] :0x%X= 0x%X\n"),i,&(g_vPcmciaReg->POR[i]),g_vPcmciaReg->POR[i]));
DEBUGMSG(ZONE_PDD,(TEXT("\tPOFR[%d] :0x%X= 0x%X\n"),i,&(g_vPcmciaReg->POFR[i]),g_vPcmciaReg->POFR[i]));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -