📄 sd.c
字号:
/*****************************************************************************
* 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 + -