⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bspsdhc.c

📁 IMX开发板BSP驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------------------
//
//  Copyright (C) 2004, Motorola Inc. All Rights Reserved
//
//------------------------------------------------------------------------------
/*---------------------------------------------------------------------------
* Copyright (C) 2004, 2005, 2006, Freescale Semiconductor, Inc. All Rights Reserved.
* THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
* AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT 
*--------------------------------------------------------------------------*/

//------------------------------------------------------------------------------
//
//  File:  bspsdhc.c
//
//  Implementation of SDHC Driver Platform Device Driver
//
//  This file implements platform specific functions for SDHC.
//------------------------------------------------------------------------------
#include <windows.h>
#include <nkintr.h>
#include <ceddk.h>
#include <Sdcard.h>
#include "bsp.h"
#include "bspsdhc.h"
#include "pmic_regulator.h"

//-----------------------------------------------------------------------------
// External Variables
//-----------------------------------------------------------------------------
// External Functions
//-----------------------------------------------------------------------------
extern PMIC_STATUS PmicVoltageRegulatorOn (PMIC_REGULATOR_VREG regulator);
extern PMIC_STATUS PmicVoltageRegulatorSetVoltageLevel (PMIC_REGULATOR_VREG regulator, 
                                                        PMIC_REGULATOR_VREG_VOLTAGE voltage);
//-----------------------------------------------------------------------------
// Defines

//------------------------------------------------------------------------------
// Types

//------------------------------------------------------------------------------
// Global Variables

//------------------------------------------------------------------------------
// Local Variables
/*******************************************************************************
 EXPORTED FUNCTIONS
*******************************************************************************/
//------------------------------------------------------------------------------
//
// Function: BSPSdhcLoadPlatformRegistrySettings
//
// This function is to get any platform-specific registry setting
//
// Parameters: 
//			hKeyDevice
//				[in] Registry key opened opened by CSP layer 
//
// Returns:
//      Return TRUE if successful
//			   FALSE if unsuccessful  
//------------------------------------------------------------------------------
BOOL BSPSdhcLoadPlatformRegistrySettings( HKEY hKeyDevice )
{
    return TRUE;
}

//------------------------------------------------------------------------------
//
// Function: BSPSdhcSetClockGatingMode
//
// This function enable or disable CRM clock for SDHC.
//
// Parameters:
//      startClocks
//          [in] boolean variable to enable or disable CRM clock
//		Controller Index 
//			[in] SDHC controller index (1 or 2) 
//
// Returns:
//      Return TRUE.
//
//------------------------------------------------------------------------------
BOOL BSPSdhcSetClockGatingMode(BOOL startClocks, DWORD ControllerIndex)
{
    BOOL rc;

    if (startClocks)
    {
    	if(ControllerIndex == 1) 
        	rc = DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_SDHC1, 
        	    DDK_CLOCK_GATE_MODE_ENABLED_ALL);
		if(ControllerIndex == 2)
			rc = DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_SDHC2, 
			    DDK_CLOCK_GATE_MODE_ENABLED_ALL);
    }
    else
    {
    	if(ControllerIndex == 1) 
        	rc = DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_SDHC1, 
        	    DDK_CLOCK_GATE_MODE_DISABLED);
		if(ControllerIndex == 2)
			rc = DDKClockSetGatingMode(DDK_CLOCK_GATE_INDEX_SDHC2, 
			    DDK_CLOCK_GATE_MODE_DISABLED);
    }
    return rc;
}
//------------------------------------------------------------------------------
//
// Function: BSPGetSDHCCLK
//
// This function returns the BSP-specific clock
// source selection value for SDHC.
//
// Parameters:
//      None
//
// Returns:
//      The clock source for SDHC.
//
//------------------------------------------------------------------------------
UINT32 BSPGetSDHCCLK(void)
{
    UINT32 freq;

    // SDHC uses the PERCLK for generating the bit clock.
    DDKClockGetFreq(DDK_CLOCK_SIGNAL_PER, &freq);
    return freq;
}
//------------------------------------------------------------------------------
//
// Function: BSPSlotVoltageOn
//
// This function turns on the voltage to the specified slot
//
// Parameters:
//      dwIndex [in]    requested slot number
//
// Returns:
//------------------------------------------------------------------------------
void BSPSlotVoltageOn(DWORD dwIndex)
{
    if (dwIndex == 1)
    {
        PmicVoltageRegulatorOn(VMMC1);
    }
    else
    {
        PmicVoltageRegulatorOn(VMMC2);
    }
}
//------------------------------------------------------------------------------
//
// Function: BSPSetVoltageSlot
//
// This function sets voltage slot
//
// Parameters:
//      dwIndex [in]    requested slot number
//      mask [in]		requested voltage window mask 
//
// Returns:
//------------------------------------------------------------------------------
void BSPSetVoltageSlot(DWORD dwIndex, UINT32 mask)
{
    PMIC_REGULATOR_VREG_VOLTAGE voltage;
    DWORD regulator;

    if (dwIndex == 1)
    {
        regulator = VMMC1;
    }
    else
    {
        regulator = VMMC2;
    }

    switch (mask)
    {
    case 0:
        //shut down the regulator
        PmicVoltageRegulatorOff(regulator);
        break;

    case SD_VDD_WINDOW_1_6_TO_1_7:
        voltage.vmmc = VMMC_1; //1.6V
        break;

    case SD_VDD_WINDOW_1_7_TO_1_8:
        voltage.vmmc = VMMC_2; //1.8V
        break;

    case SD_VDD_WINDOW_1_8_TO_1_9:
        voltage.vmmc = VMMC_2; //1.8V
        break;

    case SD_VDD_WINDOW_1_9_TO_2_0:
        voltage.vmmc = VMMC_3; //2.0V
        break;

    case SD_VDD_WINDOW_2_0_TO_2_1:
        voltage.vmmc = VMMC_3; //2.0V
        break;

    case SD_VDD_WINDOW_2_1_TO_2_2:
        voltage.vmmc = VMMC_4; //2.6V
        break;

    case SD_VDD_WINDOW_2_2_TO_2_3:
        voltage.vmmc = VMMC_4; //2.6V
        break;

    case SD_VDD_WINDOW_2_3_TO_2_4:
        voltage.vmmc = VMMC_4; //2.6V
        break;

    case SD_VDD_WINDOW_2_4_TO_2_5:
        voltage.vmmc = VMMC_4; //2.6V
        break;

    case SD_VDD_WINDOW_2_5_TO_2_6:
        voltage.vmmc = VMMC_4; //2.6V
        break;

    case SD_VDD_WINDOW_2_6_TO_2_7:
        voltage.vmmc = VMMC_5; //2.7V
        break;

    case SD_VDD_WINDOW_2_7_TO_2_8:
        voltage.vmmc = VMMC_6; //2.8V
        break;

    case SD_VDD_WINDOW_2_8_TO_2_9:
        voltage.vmmc = VMMC_7; //2.9V
        break;

    case SD_VDD_WINDOW_2_9_TO_3_0:
        voltage.vmmc = VMMC_8; //3.0V
        break;

    case SD_VDD_WINDOW_3_0_TO_3_1:
        voltage.vmmc = VMMC_8; //3.0V
        break;

    case SD_VDD_WINDOW_3_1_TO_3_2:
        voltage.vmmc = VMMC_8; //3.0V
        break;

    case SD_VDD_WINDOW_3_2_TO_3_3:
        voltage.vmmc = VMMC_8; //3.0V
        break;

    case SD_VDD_WINDOW_3_3_TO_3_4:
        voltage.vmmc = VMMC_8; //3.0V
        break;

    case SD_VDD_WINDOW_3_4_TO_3_5:
        voltage.vmmc = VMMC_8; //3.0V
        break;

    case SD_VDD_WINDOW_3_5_TO_3_6:
        voltage.vmmc = VMMC_8; //3.0V
        break;
        
    default:
       voltage.vmmc = VMMC_8; //3.0V
       break; 
    }
        
    if (mask != 0)
    {
        //set the level in PMIC
        PmicVoltageRegulatorSetVoltageLevel(regulator, voltage);
    }
}

//TODO: (currently not used)
//------------------------------------------------------------------------------
//
// Function: BSPGetVoltageSlot
//
// This function gets voltage window mask and optimal voltage
//
// Parameters:
//      mask [out]		supported voltage window mask 
//		voltage [out] 	optimum voltage mask
//
// Returns:
//      The clock source for SDHC.
//
//------------------------------------------------------------------------------
//void BSPGetVoltageSlot(UINT32 *mask, UINT32 *voltage, UINT32 *PowerUpDelay)
//{
//     *mask = SD_VDD_WINDOW_3_2_TO_3_3 | SD_VDD_WINDOW_3_3_TO_3_4 ; 
//	 *voltage = SD_VDD_WINDOW_3_2_TO_3_3 ;
//	 *PowerUpDelay = SDHC_MAX_POWER_SUPPLY_RAMP_UP ; 
//}

//------------------------------------------------------------------------------
//
// Function: BSPSdhcInit
//
// BSP specific initialization
//
// Parameters:
//      ControllerIndex [in]		SDHC controller index 
//
// Returns:
//      TRUE if success 
//
//------------------------------------------------------------------------------
BOOL BSPSdhcInit(DWORD ControllerIndex) 
{
	return TRUE  ; 
}
//------------------------------------------------------------------------------
//
// Function: BspSdhcIsCardPresent
//
// function to check card existence
//
// Parameters:
//      ControllerIndex [in]		controller index
//
// Returns:
//      TRUE if success 
//
//------------------------------------------------------------------------------
BOOL BspSdhcIsCardPresent(DWORD ControllerIndex)
{
	UINT32 card_exist = 0 ; 
	
	if(ControllerIndex == 1)
	{
        //Read from hardware whether card exist
		if(DDKGpioReadDataPin(DDK_GPIO_PORT1, 1, &card_exist) == FALSE)
			card_exist = 0 ; //GPIO read failed
	}
	else
	{
        //Read from hardware whether card exist
		if(DDKGpioReadDataPin(DDK_GPIO_PORT1, 2, &card_exist) == FALSE)
			card_exist = 0 ; //GPIO read failed
	}

	return (card_exist ? TRUE : FALSE); 
}
//------------------------------------------------------------------------------
//
// Function: BspSdhcCardDetectDeinitialize
//
// function to clean up preiously configured iomux, gpio 
//
// Parameters:
//      ControllerIndex [in]		controller index 
//
// Returns: None
//
//------------------------------------------------------------------------------
void BspSdhcCardDetectDeinitialize(DWORD ControllerIndex)
{
	if(ControllerIndex == 1)
	{
        //disable the GPIO pins
        DDKGpioClearIntrPin(DDK_GPIO_PORT1, 1);
        DDKGpioUnbindIrq(DDK_GPIO_PORT1, 1);
	}
    else
	{
        //disable the GPIO pins
		DDKGpioClearIntrPin(DDK_GPIO_PORT1, 2);
        DDKGpioUnbindIrq(DDK_GPIO_PORT1, 2);
	}
}

//-----------------------------------------------------------------------------
//
// Function: BspSdhcSetIOMux
//
// This function configures IOMUX for successful operation of the SDHC.
//
// Parameters:
//      ControllerIndex [in]    SDHC controller index.
//
// Returns: None
//-----------------------------------------------------------------------------
void BspSdhcSetIOMux(DWORD ControllerIndex)
{
    if (ControllerIndex == 1)
    {
        // Configure IOMUX to request SDHC1 bus signals
        DDKIomuxSetPinMux(DDK_IOMUX_PIN_SD1_CMD,   DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
        DDKIomuxSetPinMux(DDK_IOMUX_PIN_SD1_CLK,   DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
        DDKIomuxSetPinMux(DDK_IOMUX_PIN_SD1_DATA0, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
        DDKIomuxSetPinMux(DDK_IOMUX_PIN_SD1_DATA1, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
        DDKIomuxSetPinMux(DDK_IOMUX_PIN_SD1_DATA2, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);
        DDKIomuxSetPinMux(DDK_IOMUX_PIN_SD1_DATA3, DDK_IOMUX_OUT_FUNC, DDK_IOMUX_IN_FUNC);

        DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SD1_CMD, DDK_IOMUX_PAD_SLEW_FAST, 
                             DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, 
                             DDK_IOMUX_PAD_TRIG_SCHMITT, 
                             DDK_IOMUX_PAD_PULL_UP_22K);
  
        DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SD1_CLK, DDK_IOMUX_PAD_SLEW_FAST, 
                             DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, 
                             DDK_IOMUX_PAD_TRIG_SCHMITT, 
                             DDK_IOMUX_PAD_PULL_UP_22K);
  
        DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SD1_DATA0, DDK_IOMUX_PAD_SLEW_FAST, 
                             DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, 
                             DDK_IOMUX_PAD_TRIG_SCHMITT, 
                             DDK_IOMUX_PAD_PULL_UP_22K);
  
        DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SD1_DATA1, DDK_IOMUX_PAD_SLEW_FAST, 
                             DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, 
                             DDK_IOMUX_PAD_TRIG_SCHMITT, 
                             DDK_IOMUX_PAD_PULL_UP_22K);
  
        DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SD1_DATA2, DDK_IOMUX_PAD_SLEW_FAST, 
                             DDK_IOMUX_PAD_DRIVE_MAX, DDK_IOMUX_PAD_MODE_CMOS, 
                             DDK_IOMUX_PAD_TRIG_SCHMITT, 
                             DDK_IOMUX_PAD_PULL_UP_22K);
  
        DDKIomuxSetPadConfig(DDK_IOMUX_PAD_SD1_DATA3, DDK_IOMUX_PAD_SLEW_FAST, 

⌨️ 快捷键说明

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