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 + -
显示快捷键?