xspccardsocket.c
来自「优龙YLP270开发板 光盘自带的BIOS和实验例程源码 强烈推荐」· C语言 代码 · 共 756 行 · 第 1/3 页
C
756 行
XS_PCCARD_READY_POLL_INTERVAL);
}
else
{
break;
}
} //end for loop
}
//If no card is inserted or if a card is not properly inserted, then tri-
//state the socket.
else
{
// Power down the socket.
XsPcCardDisableSocket(pstrSocketHandle, ushSocketNumber);
// Return the error.
ReturnValue = XS_PCCARD_FAILURE;
}
break;
default:
//TBD. Should not be here at all!!
ReturnValue = XS_PCCARD_FAILURE;
break;
} //end switch
//Wait for the READY signal to be asserted again, which indicates that the
//socket is ready for normal operation
if(ReturnValue != XS_PCCARD_FAILURE)
{
//If the READY signal is not asserted within the specified time interval,
//then the PC Card has timed out!
if(t >= XS_PCCARD_MAX_READY_WAIT_TIME)
{
//(??)Insert message here. Also, does any other action need to occur here?
ReturnValue = XS_PCCARD_FAILURE;
}
}
} //end if
return ReturnValue;
} //end XsPcCardResetSocket()
/******************************************************************************
Function Name: XsPcCardEnableSocket
Description:
Global Registers Modified:
Input Arguments:
Output Arguments:
Return Value:
*******************************************************************************/
XS_STATUS_T XsPcCardEnableSocket(XS_PCCARD_SOCKET_T *pstrSocketHandle,
XLLP_VUINT16_T ushSocketNumber)
{
XS_STATUS_T ReturnValue = XS_PCCARD_SUCCESS;
XLLP_UINT32_T power; //voltage setting
//Check the validity of the input arguments to the function
if((ushSocketNumber > XS_MAINSTONE_MAX_PCCARD_SOCKETS) ||
(pstrSocketHandle == XS_NULL_PTR))
{
ReturnValue = XS_PCCARD_FAILURE;
}
else
{
switch(ushSocketNumber)
{
case XS_PCCARD_SOCKET0:
// Check if card inserted.
if (pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR &
XLLP_BCR_PCMCIA_SCR_S0_nCD)
{
ReturnValue = XS_PCCARD_FAILURE;
}
else
{
if ((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR &
XLLP_BCR_PCMCIA_SCR_S0_nVS1) &&
(pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR &
XLLP_BCR_PCMCIA_SCR_S0_nVS2))
{
// 5 volt card inserted.
power = XLLP_BCR_PCMCIA_SCR_S0_5V;
}
else
{
// 3.3 volt card inserted.
power = XLLP_BCR_PCMCIA_SCR_S0_3_3V;
}
// Start by powering off the card with reset deasserted.
pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR &=
~(XLLP_BCR_PCMCIA_SCR_S0_PWR | XLLP_BCR_PCMCIA_SCR_S0_RESET);
// Wait 50 ms.
XllpOstDelayMilliSeconds(pstrSocketHandle->pstrOstRegsHandle, 50);
// Power up the card with the appropriate voltage settings.
pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR |= power;
// Wait 50 ms.
XllpOstDelayMilliSeconds(pstrSocketHandle->pstrOstRegsHandle, 50);
// Assert card reset.
pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR |=
XLLP_BCR_PCMCIA_SCR_S0_RESET;
// Wait 50 ms.
XllpOstDelayMilliSeconds(pstrSocketHandle->pstrOstRegsHandle, 50);
// Deassert card reset.
pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR &=
~XLLP_BCR_PCMCIA_SCR_S0_RESET;
}
break;
case XS_PCCARD_SOCKET1:
// Check if card inserted.
if (pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR &
XLLP_BCR_PCMCIA_SCR_S1_nCD)
{
ReturnValue = XS_PCCARD_FAILURE;
}
else
{
if ((pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR &
XLLP_BCR_PCMCIA_SCR_S1_nVS1) &&
(pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR &
XLLP_BCR_PCMCIA_SCR_S1_nVS2))
{
// 5 volt card inserted.
power = XLLP_BCR_PCMCIA_SCR_S1_5V;
}
else
{
// 3.3 volt card inserted.
power = XLLP_BCR_PCMCIA_SCR_S1_3_3V;
}
// Start by powering off the card with reset deasserted.
pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR &=
~(XLLP_BCR_PCMCIA_SCR_S1_PWR | XLLP_BCR_PCMCIA_SCR_S1_RESET);
// Wait 50 ms.
XllpOstDelayMilliSeconds(pstrSocketHandle->pstrOstRegsHandle, 50);
// Power up the card with the appropriate voltage settings.
pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR |= power;
// Wait 50 ms.
XllpOstDelayMilliSeconds(pstrSocketHandle->pstrOstRegsHandle, 50);
// Assert card reset.
pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR |=
XLLP_BCR_PCMCIA_SCR_S1_RESET;
// Wait 50 ms.
XllpOstDelayMilliSeconds(pstrSocketHandle->pstrOstRegsHandle, 50);
// Deassert card reset.
pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR &=
~XLLP_BCR_PCMCIA_SCR_S1_RESET;
}
break;
default:
//TBD. Should not be here at all!!
ReturnValue = XS_PCCARD_FAILURE;
break;
} //end switch
}
return ReturnValue;
} //end XsPcCardEnableSocket()
/******************************************************************************
Function Name: XsPcCardDisableSocket
Description:
Global Registers Modified:
Input Arguments:
Output Arguments:
Return Value:
*******************************************************************************/
XS_STATUS_T XsPcCardDisableSocket(XS_PCCARD_SOCKET_T *pstrSocketHandle,
XLLP_VUINT16_T ushSocketNumber)
{
XS_STATUS_T ReturnValue = XS_PCCARD_SUCCESS;
//Check the validity of the input arguments to the function
if((ushSocketNumber > XS_MAINSTONE_MAX_PCCARD_SOCKETS) ||
(pstrSocketHandle == XS_NULL_PTR))
{
ReturnValue = XS_PCCARD_FAILURE;
}
else
{
switch(ushSocketNumber)
{
case XS_PCCARD_SOCKET0:
// Power off the card with reset deasserted.
pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR &=
~(XLLP_BCR_PCMCIA_SCR_S0_PWR | XLLP_BCR_PCMCIA_SCR_S0_RESET);
break;
case XS_PCCARD_SOCKET1:
// Power off the card with reset deasserted.
pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR &=
~(XLLP_BCR_PCMCIA_SCR_S1_PWR | XLLP_BCR_PCMCIA_SCR_S1_RESET);
break;
default:
//TBD. Should not be here at all!!
ReturnValue = XS_PCCARD_FAILURE;
break;
} //end switch
} //end if
return ReturnValue;
} //end XsPcCardResetSocket()
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?