xllp_pccardsocket.c

来自「该BSP是基于PXA270+WINCE的BSP」· C语言 代码 · 共 967 行 · 第 1/2 页

C
967
字号
					//is interrupt-ready and can function normally now.
					for(t = 0; t < XLLP_PCCARD_MAX_READY_WAIT_TIME;  t += XLLP_PCCARD_READY_POLL_INTERVAL)
					{
//						blRDYStatus = ((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_HIGH << 8) &
//                                                             (XLLP_BCR_PCMCIA_SCR_S0_nIRQ));

	blRDYStatus = ((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_H << 8) & (XLLP_BCR_PCMCIA_SCR_S0_nIRQ));
						if(!blRDYStatus)
						{
                            XllpOstDelayMilliSeconds(pstrSocketHandle->pstrOstRegsHandle,
                                                     XLLP_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
				{
					//Tri-state the socket here.
					ReturnValue = XLLP_STATUS_PCCARD_FAILURE;
				}

			break;
/*
			case XLLP_PCCARD_SOCKET1:
				//Check if a card is inserted in the socket
				blCDStatus = ((pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR) & 
	   		                                     	 (XLLP_BCR_PCMCIA_SCR_S1_nCD));

				//If the CD status bit is *not* set in the PC Card Status register,
				//it implies that a card is properly inserted. Reset the socket 
				//in that case.
				if(!blCDStatus)
				{
					//Assert reset
					(pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR) |= 
			                              (XLLP_BCR_PCMCIA_SCR_S1_RESET);
					//Clear reset
					(pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR) &= 
			                             ~(XLLP_BCR_PCMCIA_SCR_S1_RESET);
                    XllpOstDelayMilliSeconds(pstrSocketHandle->pstrOstRegsHandle,20);


					//Wait for the READY signal to be set.This will indicate that the socket 
					//is interrupt-ready and can function normally now.
					for(t = 0; t < XLLP_PCCARD_MAX_READY_WAIT_TIME;  t += XLLP_PCCARD_READY_POLL_INTERVAL)
					{
						blRDYStatus = ((pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR) &
                                                             (XLLP_BCR_PCMCIA_SCR_S1_nIRQ));

						if(!blRDYStatus)
						{
                            XllpOstDelayMilliSeconds(pstrSocketHandle->pstrOstRegsHandle,
                                                     XLLP_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
				{
					//Tri-state the socket here
					ReturnValue = XLLP_STATUS_PCCARD_FAILURE;
				}

			break;
*/
			default:
				//TBD. Should not be here at all!!
				ReturnValue = XLLP_STATUS_PCCARD_FAILURE;

			break;
		} //end switch

	} //end if

	return ReturnValue;

} //end XllpPCCardResetSocket()



/******************************************************************************

  Function Name: XllpPCCardPowerOn

  Description: 

  Global Registers Modified: 

  Input Arguments:

  Output Arguments:

  Return Value: 


*******************************************************************************/
XLLP_STATUS_T XllpPCCardPowerOn(XLLP_PCCARDSOCKET_T *pstrSocketHandle,
                                XLLP_VUINT16_T      ushSocketNumber,
                                XLLP_UINT32_T       uiCardVoltage)
{
    XLLP_STATUS_T ReturnValue = XLLP_STATUS_SUCCESS;



	//
    //Check the validity of the input arguments to the function
	//
    if((ushSocketNumber > XLLP_MAINSTONE_MAX_PCCARD_SOCKETS) ||
       (pstrSocketHandle == XLLP_NULL_PTR))
    {
        ReturnValue = XLLP_STATUS_PCCARD_FAILURE;  
    } 

    if(ReturnValue != XLLP_STATUS_PCCARD_FAILURE)
    {
        switch(ushSocketNumber)
        {
            case XLLP_PCCARD_SOCKET0:

				if(uiCardVoltage == XLLP_PCCARD_5_00VOLTS)
				{
					//
					//5V card detected; set bit[2] of the status register
					//
					pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L |= (XLLP_BIT_2);
					pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L &= ~(XLLP_BIT_3);
				}
				else if(uiCardVoltage == XLLP_PCCARD_3_30VOLTS)
				{
					//
					//3.3V card detected; set bit[3] of the status register
					//
					pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L |= (XLLP_BIT_3);
					pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L &= ~(XLLP_BIT_2);
				}
				else
				{
					//
					//Unsupported PC Card voltage
					//
                    ReturnValue = XLLP_STATUS_PCCARD_FAILURE;
				}
	                pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L &= ~(XLLP_BCR_PCMCIA_SCR_S0_RESET);

                break;
/*
            case XLLP_PCCARD_SOCKET1:

				if(uiCardVoltage == XLLP_PCCARD_5_00VOLTS)
				{
					//5V card detected; set bit[2] of the status register
					pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR |= (XLLP_BIT_2);
					pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR &= ~(XLLP_BIT_3);
				}
				else if(uiCardVoltage == XLLP_PCCARD_3_30VOLTS)
				{
					//3.3V card detected; set bit[3] of the status register
					pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR |= (XLLP_BIT_3);
					pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR &= ~(XLLP_BIT_2);
				}
				else
				{
					//
					//Unsupported PC Card voltage
					//
                    ReturnValue = XLLP_STATUS_PCCARD_FAILURE;
				}
                (pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR) &= ~(XLLP_BCR_PCMCIA_SCR_S1_RESET);
                break;

*/
            default:
                //TBD. Should not be here at all!!
                ReturnValue = XLLP_STATUS_PCCARD_FAILURE;

            break;
        } //end switch
    }

    return ReturnValue;

} //end XllpPCCardEnableSocket()



/******************************************************************************

  Function Name: XllpPCCardPowerOff

  Description: 

  Global Registers Modified: 

  Input Arguments:

  Output Arguments:

  Return Value: 


*******************************************************************************/
XLLP_STATUS_T XllpPCCardPowerOff(XLLP_PCCARDSOCKET_T *pstrSocketHandle,
                                 XLLP_VUINT16_T      ushSocketNumber)
{
    XLLP_STATUS_T ReturnValue = XLLP_STATUS_SUCCESS;



	//
    //Check the validity of the input arguments to the function
	//
    if((ushSocketNumber > XLLP_MAINSTONE_MAX_PCCARD_SOCKETS) ||
       (pstrSocketHandle == XLLP_NULL_PTR))
    {
        ReturnValue = XLLP_STATUS_PCCARD_FAILURE;  
    } 

    if(ReturnValue != XLLP_STATUS_PCCARD_FAILURE)
    {
        switch(ushSocketNumber)
        {
            case XLLP_PCCARD_SOCKET0:

				//
                //Power off the socket
				//
				pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L |= (XLLP_BIT_2);
				pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L |= (XLLP_BIT_3);

                break;

            case XLLP_PCCARD_SOCKET1:

				//
                //Power off the socket
				//
				pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR_L |= (XLLP_BIT_2);
				pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR_L |= (XLLP_BIT_3);

                break;

            default:

                //TBD. Should not be here at all!!
                ReturnValue = XLLP_STATUS_PCCARD_FAILURE;

            break;

        } //end switch
    } //end if

    return ReturnValue;

} //end XllpPCCardResetSocket()



/******************************************************************************

  Function Name: XllpPCCardGetVoltageSetting

  Description: 

  Global Registers Modified: 

  Input Arguments:

  Output Arguments:

  Return Value: 


*******************************************************************************/
XLLP_STATUS_T XllpPCCardGetVoltageSetting(XLLP_PCCARDSOCKET_T *pstrSocketHandle,
                                          XLLP_VUINT16_T ushSocketNumber,
                                          XLLP_UINT32_T *puiCardVoltage)
{
    XLLP_STATUS_T ReturnValue = XLLP_STATUS_SUCCESS;



	//
    //Check the validity of the input arguments to the function
	//
    if((ushSocketNumber > XLLP_MAINSTONE_MAX_PCCARD_SOCKETS) ||
       (pstrSocketHandle == XLLP_NULL_PTR))
    {
        ReturnValue = XLLP_STATUS_PCCARD_FAILURE;  
    } 

    if(ReturnValue != XLLP_STATUS_PCCARD_FAILURE)
    {
        switch(ushSocketNumber)
        {
            case XLLP_PCCARD_SOCKET0:

				if((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L) & (XLLP_BCR_PCMCIA_SCR_S0_nCD))
				{
					ReturnValue = XLLP_STATUS_PCCARD_FAILURE;
				}
				else
				{
					//
					//Determine the voltage requirements of the PC Card, else
					//default voltage to 3.3V
					//
					if(((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L) & (XLLP_BIT_6)) &&
		               ((pstrSocketHandle->pstrBcrHandle->PCMCIAS0SCR_L) & (XLLP_BIT_7)))		               
			        {
						//
			            //5 volt card detected in the socket
						//
			            *puiCardVoltage = XLLP_PCCARD_5_00VOLTS;
			        }
			        else
			        {
						//
			            //3.3 volt card detected in the socket
						//
			            *puiCardVoltage = XLLP_PCCARD_3_30VOLTS;
			        }
				}

				break;

            case XLLP_PCCARD_SOCKET1:

				if((pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR_L) & (XLLP_BCR_PCMCIA_SCR_S0_nCD))
				{
					ReturnValue = XLLP_STATUS_PCCARD_FAILURE;
				}
				else
				{
					//
					//Determine the voltage requirements of the PC Card, else 
					//default voltage to 3.3V
					//
					if(((pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR_L) & (XLLP_BIT_6)) &&
		               ((pstrSocketHandle->pstrBcrHandle->PCMCIAS1SCR_L) & (XLLP_BIT_7)))
			        {
						//
			            //5 volt card detected in the socket
						//
			            *puiCardVoltage = XLLP_PCCARD_5_00VOLTS;
			        }
			        else
			        {
						//
			            //3.3 volt card detected in the socket
						//
			            *puiCardVoltage = XLLP_PCCARD_3_30VOLTS;
			        }
				}

				break;

            default:

                //TBD. Should not be here at all!!
                ReturnValue = XLLP_STATUS_PCCARD_FAILURE;

            break;

		} //end switch
	}

	return ReturnValue;

} //end XllpPCCardGetVoltageSetting()



/******************************************************************************

  Function Name: XllpPCCardSetExpMemTiming

  Description: 

  Global Registers Modified: 

  Input Arguments:

  Output Arguments:

  Return Value: 


*******************************************************************************/
XLLP_STATUS_T XllpPCCardSetExpMemTiming(XLLP_PCCARDSOCKET_T *pstrSocketHandle)
{

    XLLP_STATUS_T ReturnValue = XLLP_STATUS_SUCCESS;

	//
    //Check the validity of the input arguments to the function
	//
    if(pstrSocketHandle == XLLP_NULL_PTR)
    {
        ReturnValue = XLLP_STATUS_PCCARD_FAILURE;  
    }

	if(ReturnValue != XLLP_STATUS_PCCARD_FAILURE)
	{
		pstrSocketHandle->pstrMemCtrlRegsHandle->MCATT0 = pstrSocketHandle->pstrCardTimingHandle->MCATT0;
		pstrSocketHandle->pstrMemCtrlRegsHandle->MCATT1 = pstrSocketHandle->pstrCardTimingHandle->MCATT1;

		pstrSocketHandle->pstrMemCtrlRegsHandle->MCMEM0 = pstrSocketHandle->pstrCardTimingHandle->MCMEM0;
		pstrSocketHandle->pstrMemCtrlRegsHandle->MCMEM1 = pstrSocketHandle->pstrCardTimingHandle->MCMEM1;

		pstrSocketHandle->pstrMemCtrlRegsHandle->MCIO0 = pstrSocketHandle->pstrCardTimingHandle->MCIO0;
		pstrSocketHandle->pstrMemCtrlRegsHandle->MCIO1 = pstrSocketHandle->pstrCardTimingHandle->MCIO1;
	}

	return ReturnValue;

} //end XllpPCCardSetExpMemTiming()



/******************************************************************************

  Function Name: XllpPCCardGetExpMemTiming

  Description: 

  Global Registers Modified: 

  Input Arguments:

  Output Arguments:

  Return Value: 


*******************************************************************************/
XLLP_STATUS_T XllpPCCardGetExpMemTiming(XLLP_PCCARDSOCKET_T *pstrSocketHandle,
                                        XLLP_CARDTIMING_T *pstrCardTimingHandle)
{
    XLLP_STATUS_T ReturnValue = XLLP_STATUS_SUCCESS;

	//
    //Check the validity of the input arguments to the function
	//
    if((pstrSocketHandle == XLLP_NULL_PTR) ||
       (pstrCardTimingHandle == XLLP_NULL_PTR))
    {
        ReturnValue = XLLP_STATUS_PCCARD_FAILURE;  
    }

	if(ReturnValue != XLLP_STATUS_PCCARD_FAILURE)
	{
		pstrCardTimingHandle->MCATT0 = pstrSocketHandle->pstrMemCtrlRegsHandle->MCATT0;
		pstrCardTimingHandle->MCATT1 = pstrSocketHandle->pstrMemCtrlRegsHandle->MCATT1;

		pstrCardTimingHandle->MCMEM0 = pstrSocketHandle->pstrMemCtrlRegsHandle->MCMEM0;
		pstrCardTimingHandle->MCMEM1 = pstrSocketHandle->pstrMemCtrlRegsHandle->MCMEM1;

		pstrCardTimingHandle->MCIO0 = pstrSocketHandle->pstrMemCtrlRegsHandle->MCIO0;
		pstrCardTimingHandle->MCIO1 = pstrSocketHandle->pstrMemCtrlRegsHandle->MCIO1;
	}

	return ReturnValue;

} //end XllpPCCardGetExpMemTiming()






⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?