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

📄 sd.c

📁 一个复杂控制SD卡的例子,可以参考应用到手机上.
💻 C
📖 第 1 页 / 共 5 页
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *   sd.c
 *
 * Project:
 * --------
 *   Maui_Software
 *
 * Description:
 * ------------
 *   driver functons for SD/MMC 
 *   
 *
 * Author:
 * -------
 * -------
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================ 
 ****************************************************************************/
#include "kal_release.h"
#include "app_buff_alloc.h"
#include "gpt_sw.h"
#include "drv_comm.h"
#include "msdc_def.h"
#include "sd_def.h"
#include "intrCtrl.h"
#include "reg_base.h"
#include "upll_ctrl.h"
#include "gpio_sw.h"
#include "init.h"

#ifdef DRV_LSD
#include "msdc_lsd.h"
#endif

#if defined(__MSDC_SD_MMC__)
//global variables
T_SDC_HANDLE	gSD_blk[SD_NUM];
T_SDC_HANDLE	*gSD = gSD_blk;

extern void GPTI_BusyWait(kal_uint16 len);
extern kal_uint8 MSDC_GetIOCtrlParam(void);
extern kal_bool INT_USBBoot(void);

#if !defined(__SDC_SPI_INTERFACE__)
/*************************************************************************
* FUNCTION
*  SD_Acmd42
*
* DESCRIPTION
*	connect/disconnect the 50K Ohm pull-up resistor on CD/DAT3
*
* PARAMETERS
*
* RETURNS
*	SDC_CMD_STATUS
*
* GLOBALS AFFECTED
*	gSD
*
* NOTE
*	
*
*************************************************************************/

// Get CID(CMD2)
SDC_CMD_STATUS SD_Acmd42(kal_bool connect)
{
	SDC_CMD_STATUS status;

	// send APP_CMD
	if((status = SD_Cmd55(gSD->mRCA))!=NO_ERROR)
		return status;
	// send cmd6
	if((status = SD_Send_Cmd(SDC_CMD_ACMD42,connect))!=NO_ERROR)
		return status;
	//read R1
	if((status = SD_CheckStatus())!=NO_ERROR)
		return status;	

	gSD->mCD_DAT3 = KAL_FALSE;	// pull-up resistor is disconnected for data trnasfer
	return NO_ERROR;
}

/*************************************************************************
* FUNCTION
*  SD_SetMMC40_4bit_high_speed
*
* DESCRIPTION
*	Check inserted card is SD or MMC
*
* PARAMETERS
*	
*
* RETURNS
*  SD_CARD or MMC_CARD
*
* GLOBALS AFFECTED
*	gMSDC_Handle
*
*************************************************************************/
SDC_CMD_STATUS SD_SetMMC40_bus_high_speed(void)
{
		kal_uint32 clock, hs;
	#ifdef DRV_MSDC_MT6225_SERIES
		/*use larger driving current. In mt6225 and mt6227D, IOCON is 32 bit register and DLT cannot be 0*/
		MSDC_WriteReg16(MSDC_IOCON,0x36);
		MSDC_SetIOCONRegDLT();
	#else
		MSDC_WriteReg16(MSDC_IOCON,0x1B);
	#endif

		if(SD_SetBlength(512)!=NO_ERROR)			
			goto err;
		
		// read the EXT_CSD
		if(SD_SendEXTCSD_MMC40(MSDC_Sector) != NO_ERROR)
			goto err;;

		/*calculate size*/
		if(MMC42_CARD == gMSDC_Handle->mMSDC_type){
			gSD->mCSD.capacity = (kal_uint64)gSD->mCSD.ext_csd->sec_count * 512;
		}
		
		// set high speed
		if(gSD->mCSD.ext_csd->card_type & HS_52M)
		{
			// should be 52000
			//clock = 52000;
                        clock = gMSDC_Handle->msdc_clock / 2;
			hs = 1;
			//MSDC_WriteReg32(MSDC_IOCON,0x010002FF);
			MSDC_CLR_BIT32(MSDC_CFG,MSDC_CFG_CRED);;
			
		}
		else if(gSD->mCSD.ext_csd->card_type & HS_26M)
		{
			// should be 26000
			clock = 26000;
			hs = 1;
		}
		else
		{
			clock = 13000;
			hs = 0;
		}
		if(hs)
		{
			// select proper power class
			if(SD_Switch_MMC40(SET_BYTE,EXT_CSD_POW_CLASS_INDEX,
				(gSD->mCSD.ext_csd->pwr_52_360&0xf) ,0) != NO_ERROR)
				goto err;
			
			// enable high speed (26M or 52M)
			if(SD_Switch_MMC40(SET_BYTE,EXT_CSD_HIGH_SPPED_INDEX,
				EXT_CSD_ENABLE_HIGH_SPEED,0) != NO_ERROR)
				goto err;

			// latch data at falling edge to cover the card driving capability
			// MSDC_SET_BIT32(MSDC_CFG,MSDC_CFG_RED);			
		}
		
	#ifndef DRV_LSD
		gMSDC_Handle->msdc_clock = MSDC_CLOCK;
		MSDC_SetClock(clock);
	#else
		LSD_HostSetClock(LSD_SPEED_52M);
	#endif
	
	#ifdef DRV_MSDC_MT6225_SERIES
		/*change DLT and set cmd latch at rising edge*/
		MSDC_WriteReg16(MSDC_IOCON,0x8036);
		MSDC_SetIOCONRegDLT();
	#endif
		// select bus width
		#if defined(MMC40_USE_4BIT_BUS)
		// enable 4-bit bus width
		if(SD_Switch_MMC40(SET_BYTE,EXT_CSD_BUS_WIDTH_INDEX,BIT_4_MMC40,0) != NO_ERROR)
			goto err;
		MSDC_SET_BIT32(SDC_CFG,SDC_CFG_MDLEN);
		gSD->bus_width = 4;		
		#elif defined(MMC40_USE_8BIT_BUS)
		// enable 8-bit bus width
		if(SD_Switch_MMC40(SET_BYTE,EXT_CSD_BUS_WIDTH_INDEX,BIT_8_MMC40,0) != NO_ERROR)
			goto err;
		MSDC_SET_BIT32(SDC_CFG,SDC_CFG_MDLEN8);
		gSD->bus_width = 8;		
		#endif
					
		if(SD_SendEXTCSD_MMC40(MSDC_Sector) != NO_ERROR)
			goto err;;
				
		return NO_ERROR;
err:
		return ERR_MMC_BUS_HS_ERROR;
}
/*************************************************************************
* FUNCTION
*  SD_CheckSDorMMC
*
* DESCRIPTION
*	Check inserted card is SD or MMC
*
* PARAMETERS
*	
*
* RETURNS
*  SD_CARD or MMC_CARD
*
* GLOBALS AFFECTED
*	gMSDC_Handle
*
*************************************************************************/
T_MSDC_CARD SD_CheckSDorMMC()
{
	SDC_CMD_STATUS status; 

#if defined(SD_MMC_HIGH_DENSITY_SUPPORT)
	SD_Cmd8();
#endif
	if((status = SD_Acmd41_SD())==NO_ERROR)
		return gMSDC_Handle->mMSDC_type;	// SD_CARD
	else if((status = SD_Cmd1_MMC())==NO_ERROR)
		return gMSDC_Handle->mMSDC_type;	// MMC_CARD

	return UNKNOWN_CARD;
}
/*************************************************************************
* FUNCTION
*  SD_SetDefault
*
* DESCRIPTION
*	set default values to gSD
*
* PARAMETERS
*	
*
* RETURNS
*
* GLOBALS AFFECTED
*	gSD
*
*************************************************************************/
void SD_SetDefault(void)
{
	kal_mem_set(gSD,0,sizeof(T_SDC_HANDLE));
	gSD->mBKLength = 512;
	gSD->mRCA = 0;
	gSD->mInactive = KAL_FALSE;
	gSD->mState = IDLE_STA;
	gSD->bus_width = 1;
	gSD->mCD_DAT3 = KAL_TRUE;
}

void SD_Use24M_Clock(void)
{
#ifndef DRV_LSD
	if(gMSDC_Handle->mMSDC_type == SD_CARD || gMSDC_Handle->mMSDC_type == SD20_LCS_CARD
		|| gMSDC_Handle->mMSDC_type == SD20_HCS_CARD)
	{
		UPLL_Enable(UPLL_OWNER_MSDC);
		MSDC_SET_BIT32(MSDC_CFG, MSDC_CFG_CLKSRC);
		gMSDC_Handle->msdc_clock = MSDC_CLOCK_USB;
		MSDC_SetClock(MSDC_SD_OP_CLOCK);
		gSD->flags |= SD_FLAG_USE_USB_CLK;	
	}
#else
	LSD_HostSetClock(LSD_SPEED_52M);

⌨️ 快捷键说明

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