📄 pcmsock.cpp
字号:
( TEXT( "-CPcmciaCardSocket::GetSocket(): dwEventMask: %x dwEventChanged: %x dwEventStatus: %x\r\n" ),
pState->dwEventMask,
pState->dwEventChanged,
pState->dwEventStatus ) );
}
Unlock();
return CERR_SUCCESS;
}
void CPcmciaCardSocket::PowerMgrCallback( BOOL bPowerOff )
{
SS_SOCKET_STATE sSocketState = m_SockState;
sSocketState.dwEventChanged = SOCK_EVENT_SUSPEND_RESUME;
sSocketState.dwEventStatus = (bPowerOff ?
SOCK_EVENT_CD :
(SOCK_EVENT_CD |
SOCK_EVENT_SUSPEND_RESUME ) );
m_pBridge->CallBackToCardService(m_pBridge->GetSocketNumber(),
GetSocketHandle(),
&sSocketState );
}
void CPcmciaCardSocket::PowerMgr( BOOL bPowerDown )
{
}
BOOL CPcmciaCardSocket::Resuming() // This routine can not call sleep because it could endup yeild to other thread.
{
return(FALSE);
}
//
// PDCardSetSocket
//
// @func STATUS | PDCardSetSocket | Set the socket state of the specified socket.
// @rdesc Returns one of the CERR_* return codes in cardserv.h.
//
// @comm This function sets the specified socket's state and adjusts the socket
// controller appropriately.
// PDCardGetSocketState will usually be called first and adjustments will
// be made to the PDCARD_SOCKET_STATE structure before PDCardSetSocketState
// is called. This avoids duplicated socket state on different layers and
// it avoids unintentionally setting socket parameters.
//
// @xref <f PDCardGetSocketState>
//
STATUS CPcmciaCardSocket::CardSetSocket(PSS_SOCKET_STATE pState)
{
STATUS retValue = CERR_SUCCESS;
if(m_pBridge && pState)
{
Lock();
m_SockState.dwEventMask = pState->dwEventMask;
m_SockState.dwEventChanged &= ~pState->dwEventChanged;
//
// Check the power settings for the socket.
//
if( ( pState->dwEventStatus & SOCK_EVENT_EJECT ) != 0 ||
( pState->dwEventStatus & SOCK_EVENT_INSERT ) != 0 )
{
// Ask for ejection of the card.
DEBUGMSG( ZONE_PDD,
( TEXT( "PDCardSetSocket PCMSocket. Gernerate Artificial Eject\r\n" ) ) );
// We have to force
m_pBridge->ForceEjectEvent(m_pBridge->GetSlotNumber());
}
else
if ((pState->fVcc != m_SockState.fVcc) ||
(pState->uVpp1 != m_SockState.uVpp1)||
(pState->uVpp2 != m_SockState.uVpp2))
{
// We don't support changing Vpp.
if (pState->uVpp1 != pState->uVpp2 ||
m_SockState.uVpp1 != pState->uVpp1 ||
m_SockState.uVpp2 != pState->uVpp2)
{
Unlock();
return(CERR_BAD_VPP);
}
if ((pState->fVcc & SOCK_VCC_LEVEL_MASK ) >= NUM_POWER_ENTRIES ||
!(m_rgPowerEntries[pState->fVcc & SOCK_VCC_LEVEL_MASK].fSupply & PWR_SUPPLY_VCC))
{
Unlock();
return (CERR_BAD_VCC);
}
else
{
retValue = CardPowerHandler(m_rgPowerEntries[pState->fVcc & SOCK_VCC_LEVEL_MASK].uPowerLevel);
if (retValue == CERR_SUCCESS)
{
m_SockState.fVcc = pState->fVcc;
m_SockState.uVpp1 = pState->uVpp1;
m_SockState.uVpp2 = pState->uVpp2;
}
}
}
Unlock();
}
return (STATUS)retValue;
}
STATUS CPcmciaCardSocket::CardPowerHandler(UINT8 nVcc)
{
// Note: Gumstix CF does not support setting card voltage
/*
switch(nVcc)
{
case 0: // Off
if(m_pBridge->GetSlotNumber() == 0)
{
RETAILMSG(TRUE, (TEXT("INFO: Setting PCCARD slot 0 voltage to 0v (off).\r\n")));
}
else
{
RETAILMSG(TRUE, (TEXT("INFO: Setting PCCARD slot 1 voltage to 0v (off).\r\n")));
}
break;
case 33: // 3.3v
if (m_pBridge->GetSlotNumber() == 0)
{
RETAILMSG(TRUE, (TEXT("INFO: Setting PCCARD slot 0 voltage to 3.3v).\r\n")));
}
else
{
RETAILMSG(TRUE, (TEXT("INFO: Setting PCCARD slot 1 voltage to 3.3v).\r\n")));
}
break;
case 50: // 5.0v
if (m_pBridge->GetSlotNumber() == 0)
{
RETAILMSG(TRUE, (TEXT("INFO: Setting PCCARD slot 0 voltage to 5.0v).\r\n")));
}
else
{
RETAILMSG(TRUE, (TEXT("INFO: Setting PCCARD slot 1 voltage to 5.0v).\r\n")));
}
break;
default:
break;
}
*/
return(CERR_SUCCESS);
}
void CPcmciaCardSocket::PowerCycleEvent()
{
m_pBridge->PowerCycleEvent(m_pBridge->GetSlotNumber());
}
//
// ResetSocket - do a PCCARD reset
// return CERR_SUCCESS on success, CERR_UNSUPPORTED_SERVICE if size is anomolous
//
STATUS CPcmciaCardSocket::CardResetSocket()
{
STATUS retValue = CERR_SUCCESS;
BOOL bCardDetectStatus = FALSE;
UINT16 nSlotNumber = 0;
Lock();
if( m_pBridge )
{
nSlotNumber = m_pBridge->GetSlotNumber();
m_pGPIORegs->GPCR0 = GPIO_8_CFRESET;
Sleep(50);
m_pGPIORegs->GPSR0 = GPIO_8_CFRESET; // reset
Sleep(50);
m_pGPIORegs->GPCR0 = GPIO_8_CFRESET;
Sleep(100);
switch(nSlotNumber)
{
case 1:
bCardDetectStatus = (0x01 == *m_pS1baseAttr) ? TRUE : FALSE;
break;
case 0:
bCardDetectStatus = (m_pGPIORegs->GPLR0 & GPIO_11_S0_nCARD_DETECT) ? FALSE : TRUE;
break;
default:
retValue = CERR_BAD_SOCKET;
break;
}
if ((retValue == CERR_SUCCESS) && (bCardDetectStatus == TRUE))
{
m_SockState.fVcc = 1; //3.3
m_SockState.uVpp1 = 0;
m_SockState.uVpp2 = 0;
// Notify the MDD of a power-on status change.
SocketEventHandle(SOCK_EVENT_PWRCYCLE, SOCK_EVENT_PWRCYCLE);
}
}
Unlock();
return (retValue);
}
CPcmciaCardSocket* CreatePCMCIASocket(CPcmciaBusBridge* pBridge,
UINT16 m_SlotNumber )
{
CPcmciaCardSocket* pNewSocket = new CPcmciaCardSocket(pBridge, m_SlotNumber);
if( pNewSocket != NULL )
{
if( pNewSocket->CardInitWindow( pNewSocket ) )
{
return pNewSocket;
}
else
{
delete pNewSocket;
}
}
return NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -