[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/storage/mc/src/msdc.c b/mcu/driver/storage/mc/src/msdc.c
new file mode 100644
index 0000000..28328cf
--- /dev/null
+++ b/mcu/driver/storage/mc/src/msdc.c
@@ -0,0 +1,3956 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * msdc.c
+ *
+ * Project:
+ * --------
+ * Maui_Software
+ *
+ * Description:
+ * ------------
+ * driver functons for MSDC controller
+ *
+ *
+ * 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!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * 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 "drv_features.h"
+#ifndef DRV_MSDC_OFF
+#include "kal_public_api.h" //MSBB change #include "kal_release.h"
+#include "md_drv_sap.h"
+#include "drv_msgid.h"
+#include "kal_general_types.h"
+#include "kal_public_defs.h"
+#include "kal_public_api.h"
+#include "kal_debug.h"
+#include "hisr_config.h"
+#include "config_hw.h"
+#include "init.h"
+
+#include "kal_trace.h"
+#include "dcl.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_common.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_msgs.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_config.h"
+#include "kal_public_api.h"
+#include "kal_public_api.h" //MSBB change #include "app_ltlcom.h" /* Task message communiction */
+#include "intrCtrl.h"
+#include "reg_base.h"
+#include "drvpdn.h"
+#include "drv_features.h"
+#include "drv_comm.h"
+#include "msdc_reg_adap.h"
+#include "drv_hisr.h"
+#include "sleepdrv_interface.h"
+#include "eint.h"
+
+#if !defined(__UBL__) || defined(__CARD_DOWNLOAD__) || defined(__EMMC_BOOTING__)
+#include "msdc_api.h"
+#include "msdc_def.h"
+#include "sd_def.h"
+#include "../../../devdrv/iomux/inc/drv_iomux.h"
+
+//! EMB
+#include "FTL.h"
+
+#if defined(__MSDC_SD_MMC__)&&defined(__MSDC_SD_SDIO__)
+#include "sdio_sw.h"
+#endif
+#if defined(__MSDC_MS__)
+#include "ms_def.h"
+#elif defined(__MSDC_MSPRO__)
+#include "mspro_def.h"
+#endif
+#include "upll_ctrl.h"
+//#include "gpio_sw.h"
+#include "drv_trc.h"
+#if defined(__AUDIO_DSP_LOWPOWER__)
+#include "audlp_exp.h"
+#endif
+
+#ifdef DRV_LSD
+#include "msdc_lsd.h"
+#endif
+
+#ifdef __CLKG_DEFINE__
+#ifdef DRVPDN_CON1
+#error "__CLKG_DEFINE__ & DRVPDN_CON1 are all defined"
+#else
+#define DRVPDN_CON1 CG_CON1
+#endif
+
+#ifdef DRVPDN_CON1_SIM
+#error "__CLKG_DEFINE__ & DRVPDN_CON1_SIM are all defined"
+#else
+#define DRVPDN_CON1_SIM CG_CON1_SIM
+#endif
+
+#ifndef MSDC_TEST_MSDC2_FROM_MSDC1_CODE
+
+#ifdef DRVPDN_CON1_MSDC
+#error "__CLKG_DEFINE__ & DRVPDN_CON1_MSDC are all defined"
+#else
+#define DRVPDN_CON1_MSDC CG_CON1_MSDC
+#endif
+
+#ifdef DRVPDN_CON1_CLR
+#error "__CLKG_DEFINE__ & DRVPDN_CON1_CLR are all defined"
+#else
+#define DRVPDN_CON1_CLR CG_CLR1
+#endif
+
+#ifdef DRVPDN_CON1_SET
+#error "__CLKG_DEFINE__ & DRVPDN_CON1_SET are all defined"
+#else
+#define DRVPDN_CON1_SET CG_SET1
+#endif
+
+#else /*when MSDC_TEST_MSDC2_FROM_MSDC1_CODE is defined, we direct CON1 related macro to CON0 related*/
+
+#ifdef DRVPDN_CON1_MSDC
+#error "__CLKG_DEFINE__ & DRVPDN_CON1_MSDC are all defined"
+#else
+#define DRVPDN_CON1_MSDC CG_CON0_MSDC2
+#endif
+
+#ifdef DRVPDN_CON1_CLR
+#error "__CLKG_DEFINE__ & DRVPDN_CON1_CLR are all defined"
+#else
+#define DRVPDN_CON1_CLR CG_CLR0
+#endif
+
+#ifdef DRVPDN_CON1_SET
+#error "__CLKG_DEFINE__ & DRVPDN_CON1_SET are all defined"
+#else
+#define DRVPDN_CON1_SET CG_SET0
+#endif
+#endif//MSDC_TEST_MSDC2_FROM_MSDC1_CODE
+
+#endif
+
+
+
+
+/*
+#if !(defined __MSDC_NOT_SUPPORT_HOT_PLUG__)
+#if defined(MT6218B_FN) || defined(MT6219_EV) ||defined(MT6217)||defined(MT6227)||defined(MT6226)||defined(MT6226M)\
+ || defined(MT6225)
+#define USE_INT26_CARD_DETECTION
+#endif
+#endif
+*/
+
+
+#if defined (WISDOM35B_DEMO_BB)
+extern const char gpio_SD_det_pin;
+#endif
+
+// global variable
+MSDC_HANDLE MSDC_Blk[SD_NUM];
+
+#if (defined(__MSDC_MS__) || defined(__MSDC_SD_MMC__)|| defined(__MSDC_MSPRO__)) || defined(__MSDC_SD_SDIO__)
+MSDC_HANDLE *gMSDC_Handle = &(MSDC_Blk[0]);
+
+#if defined(__UBL__) && defined(__EMMC_BOOTING__)
+__attribute__ ((zero_init, section ("EXT_UN_INIT_ZI")))kal_uint32 MSDC_Sector[128];
+__attribute__ ((zero_init, section ("EXT_UN_INIT_ZI")))kal_uint32 MSDC_eCSD[128];
+#ifdef MSDC_CACHED_SUPPORT
+__attribute__ ((zero_init, section ("EXT_UN_INIT_ZI")))kal_uint32 msdc_uncachedBuf[MSDC_UNCACHED_BUF_SIZE / 4];
+#endif
+#else
+__attribute__ ((zero_init, section ("NONCACHEDZI")))kal_uint32 MSDC_Sector[128];
+__attribute__ ((zero_init, section ("NONCACHEDZI")))kal_uint32 MSDC_eCSD[128];
+#ifdef MSDC_CACHED_SUPPORT
+__attribute__ ((zero_init, section ("NONCACHEDZI")))kal_uint32 msdc_uncachedBuf[MSDC_UNCACHED_BUF_SIZE / 4];
+#endif
+#endif
+//Light 120907
+#define MSDC_DMA_BURSTLEN_LIMIT 0xFFFFFFFF//4294966784 //32bit
+//#define MSDC_DMA_BURSTLEN_LIMIT 65024
+kal_bool MSDC_useDMA4ByteBurst = KAL_FALSE;
+
+/* Debug log */
+kal_uint32 MSDC_DebugLevel;
+
+/* IO configurations */
+static struct msdc_cust msdc_cap = {
+ 0, /* host clock source */
+ 1, /* command latch edge */
+ 1, /* read data latch edge */
+ 1, /* write data latch edge */
+
+ {6, 6, 0, 0, 1, 0, 1},
+ {4, 4, 0, 0, 1, 0, 1},
+ {4, 4, 0, 0, 1, 0, 1},
+
+ 8, /* data pins */
+ 0, /* data address offset */
+
+ /* hardware capability flags */
+ 0,
+};
+
+#ifdef __TST_WRITE_TO_FILE__
+/*error recording: add this additional global variable to use when in error recording*/
+MSDC_HANDLE MSDC_ErrorRecordingBlk;
+#endif
+
+#if defined(DRV_MSDC_SHARE_BY_SWITCH)
+sd_select_enum current_card; // active card
+#if !defined(__CUST_NEW__)
+extern kal_char MSDC_GetLDO_GPIO(void);
+extern kal_char MSDC_GetSwitch_GPIO(void);
+extern kal_char MSDC_GetEXTLDO_GPIO(void);
+extern kal_char MSDC_GetSwitchDirection(void);
+kal_char gpio_simplug_ldo_switch;
+kal_char gpio_ext_sd_ldo_switch;
+kal_char gpio_sim_msdc_switch;
+#endif
+#endif
+
+#if !defined(DRV_LSD) && defined(__DRV_DBG_MEMORY_TRACE_SUPPORT__) && !defined(__UBL__)
+msdc_debugMessage msdc_msgArray[MSDC_DBG_ARRAY_SIZE];
+kal_uint32 msdc_msdIndex;
+#endif
+
+#define MSDC_EINT_NUM MSDC_EINT_NO
+
+
+// system control blocks
+
+// function predeclaration
+void MSDC_DMAInit(void);
+void MSDC_INT_Init(void);
+void MSDC_DMA_Callback(void);
+void MSDC_EINT_Handler(void);
+void MSDC_turnOnVMC(kal_bool turnOnLdo);
+#ifdef R1B_INTERRUPT_MODE
+static void MSDC_R1B_Init();
+#endif
+
+
+extern void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
+extern kal_bool INT_USBBoot(void);
+extern kal_int8 MSDC_GetDLTFromOPCLK(kal_uint32 opClk, kal_uint8 *setRED);
+extern void SD_Sleep4Wait(kal_int32 sleep_tick);
+extern void msdc_tune_init(void);
+
+#ifdef __CARD_DOWNLOAD__
+extern kal_bool MSDC_QueryIsPowerControllable(void);
+extern void MSDC_SetPower(kal_bool enable);
+#endif
+
+#if !defined(_MSDC_INTERNAL_CD_INT_PIN_)
+
+#if defined(__MSDC_NOT_SUPPORT_HOT_PLUG__)
+#error "__MSDC_NOT_SUPPORT_HOT_PLUG__ shouldn't be defined."
+#endif
+extern const unsigned char MSDC_EINT_NO;
+static kal_uint32 MSDC_debounceTime;
+static kal_bool cardDetectionEINTPolarity;
+#endif
+
+#if defined(__UBL__) || defined(__FUE__)
+kal_bool MSDC_START_TIMER(kal_uint16 x)
+{
+ gMSDC_Handle->is_timeout = KAL_FALSE;
+}
+#else// defined(__UBL__) || defined(__FUE__)
+
+kal_bool MSDC_START_TIMER(kal_uint16 x)
+{
+ //DCL_HANDLE gpt_handle;
+ DCL_STATUS status;
+ SGPT_CTRL_START_T start;
+
+#if defined(MSDC_DEBUG_INFO)
+ strcpy(gMSDC_Handle->msdc_fname, __FILE__);
+ gMSDC_Handle->msdc_lines = __LINE__;
+#endif
+
+ gMSDC_Handle->is_timeout = KAL_FALSE;
+ start.u2Tick = x;
+ start.pfCallback = MSDC_TimeOutHandler;
+ start.vPara = NULL;
+ //gpt_handle= module |MSDC_GPT_CB_MAGIC_NUM;
+ status = DclSGPT_Control(MSDC_Blk[0].gpt_handle, SGPT_CMD_START, (DCL_CTRL_DATA_T*)&start);
+ //dbg_print("start timer++++++++%d+++++\r\n",drv_get_current_time());
+ if (STATUS_OK == status)
+ return KAL_TRUE;
+ else
+ return KAL_FALSE;
+}
+#endif// defined(__UBL__) || defined(__FUE__)
+
+#if defined(__UBL__) || defined(__FUE__)
+kal_bool MSDC_STOP_TIMER()
+{
+ return KAL_TRUE;
+}
+#else// defined(__UBL__) || defined(__FUE__)
+kal_bool MSDC_STOP_TIMER()
+{
+
+
+ //MSDC_GPTI_StopItem(gMSDC_Handle->gpt_handle);
+ DclSGPT_Control(MSDC_Blk[0].gpt_handle, SGPT_CMD_STOP, 0);
+ if (gMSDC_Handle->is_timeout ||!gMSDC_Handle->mIsPresent)
+ {
+ kal_set_eg_events(gMSDC_Handle->MSDC_Events, 0, KAL_AND);
+ }
+ //dbg_print("stop timer +++++++%d++++++++\r\n",drv_get_current_time());
+ return KAL_TRUE;
+}
+#endif// defined(__UBL__) || defined(__FUE__)
+
+#if !defined(__FUE__) && !defined(__UBL__)
+void MSDC_GPTI_BusyWait(kal_uint16 len)
+{
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+}
+
+kal_uint8 MSDC_GPTI_GetHandle(DCL_HANDLE *handle)
+{
+ //DCL_HANDLE gpt_handle;
+ *handle = DclSGPT_Open(DCL_GPT_CB, 0);
+
+ //*handle = 0xFF & gpt_handle;
+
+ return KAL_TRUE;
+}
+
+#endif//!defined(__FUE__) && !defined(__UBL__)
+
+/*************************************************************************
+* FUNCTION
+* MSDC_SetClock
+*
+* DESCRIPTION
+*
+* PARAMETERS
+* clock: the desired operating clock rate in the unit of kHz
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+kal_uint32 MSDC_SetClock(kal_uint32 bus_clock,kal_bool ddr_mode)
+{
+ kal_uint32 msdc_clock,op_clock=0;
+ kal_uint32 div,mode;
+ if (!gMSDC_Handle->msdc_clock)
+ {
+ /*didn't set source clock*/
+ MSDC_ERR("[MSDC][%s %d]set clock before set source clock\r\n",__FUNCTION__,__LINE__);
+ return MSDC_ERROR;
+ }
+
+ msdc_clock=gMSDC_Handle->msdc_clock;
+
+ if (!(bus_clock))
+ {
+ MSDC_RESET();
+ MSDC_ENABLE_CARD_CLOCK(KAL_TRUE);
+ MSDC_ERR("[MSDC][%s %d]can't set bus clock to %d\r\n",__FUNCTION__,__LINE__,bus_clock);
+ return MSDC_ERROR;
+ }
+
+ /* Check the MAX bus clock which could be supportted by driver */
+ if (bus_clock > gMSDC_Handle->op_clock_max)
+ bus_clock = gMSDC_Handle->op_clock_max;
+
+ /*need disable irq*/
+
+ MSDC_ENABLE_CARD_CLOCK(KAL_FALSE);
+
+ if (ddr_mode){
+ mode=USE_DDR_MODE;
+ if (bus_clock>=(msdc_clock >> 2)){
+ div=0;
+ op_clock=msdc_clock >> 2;
+ }
+ else
+ {
+ bus_clock=bus_clock << 1;
+ div=(msdc_clock+((bus_clock << 2)-1))/(bus_clock << 2);
+ op_clock=(msdc_clock>>2)/div;
+ op_clock=op_clock>>1;
+ }
+ }
+ else
+ {
+ if (bus_clock >=msdc_clock)
+ {
+ //dbg_print("entry bus_clock==msdc_clock\r\n");
+ mode =USE_MSDC_SRC_CK;
+ div=0;
+ op_clock=msdc_clock;
+ }
+ else
+ {
+ mode =USE_CLOCK_DIV;
+ if (bus_clock >= (msdc_clock >> 1))
+ {
+
+ div=0;
+ op_clock=msdc_clock>>1;
+ //dbg_print("entry bus_clock >= (msdc_clock>>1),op_clock=%d\r\n",op_clock);
+ } else {
+
+ div=(msdc_clock+((bus_clock << 2)-1))/(bus_clock << 2);
+ op_clock=(msdc_clock >> 2)/div;
+ //dbg_print("entry bus_clock <(msdc_clock>>1),bus_clock=%d ,op_clock=%d,msdc_clock=%d\r\n",bus_clock,op_clock,msdc_clock);
+ }
+ }
+ }
+
+ gMSDC_Handle->op_clock=op_clock;
+ gMSDC_Handle->msdc_clock=msdc_clock;
+ //dbg_print("op_clock=%d ,msdc_clock=%d,div=%x\r\n",op_clock,msdc_clock,div);
+ BitFieldWrite32((kal_uint32 *)MSDC_CFG, mode, MSDC_CFG_CKMOD);
+ BitFieldWrite32((kal_uint32 *)MSDC_CFG,div,MSDC_CFG_CKDIV);
+ if (MSDC_TIMEOUT_WAIT((MSDC_Reg32(MSDC_CFG)&MSDC_CFG_CKSTB),500))
+ {
+ MSDC_ERR("[MSDC][%s %d]wait clock stable 500ms,then timeout \r\n",__FUNCTION__,__LINE__);
+ return MSDC_ERROR;
+ }
+ //dbg_print("MSDC_CFG=%x\r\n",MSDC_Reg32(MSDC_CFG));
+
+ /*open irq*/
+ MSDC_CRIT("[MSDC][%s %d] SET_CLK(%dkHz): SCLK(%dkHz) MODE(%d) DDR(%d) DIV(%d)\r\n",
+ __FUNCTION__,__LINE__, bus_clock / 1000, op_clock / 1000, mode, ddr_mode, div);
+
+ MSDC_ENABLE_CARD_CLOCK(KAL_TRUE);
+ return MSDC_OK;
+
+}
+
+kal_uint32 uffs(kal_uint32 x)
+{
+ kal_uint32 r=1;
+ if (!x)
+ {
+ return 0 ;
+ }
+ if (!(x&0xffff))
+ {
+ x>>=16;
+ r+=16;
+ }
+ if (!(x&0xff))
+ {
+ x>>=8;
+ r+=8;
+ }
+ if (!(x&0xf))
+ {
+ x>>=4;
+ r+=4;
+ }
+ if (!(x&0x3))
+ {
+ x>>=2;
+ r+=2;
+ }
+ if (!(x&0x1))
+ {
+ x>>=1;
+ r+=1;
+ }
+ return r;
+}
+
+
+void msdc_sleep(kal_uint32 ticks)
+{
+ if ((kal_query_systemInit() == KAL_TRUE)
+ #ifdef __TST_WRITE_TO_FILE__ /*error recording: considering error recording additionally*/
+ || (KAL_TRUE == INT_QueryExceptionStatus())
+ #endif
+ #ifndef __MTK_TARGET__
+ || KAL_TRUE == FTL_isPollingMode()
+ #endif
+ )
+ {
+ MSDC_GPTI_BusyWait(ticks*5);
+ }
+ else
+ {
+ kal_sleep_task(ticks);
+ }
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_SetClockSource
+*
+* DESCRIPTION
+*
+* PARAMETERS
+* type: the desired operating clock source
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+#if (CHIP_VER == 0)
+void MSDC_SetClockSource(T_MSDC_CLK_TYPE type)
+{
+ kal_uint32 orig_val;
+ // 3'b000: 26MHz
+ // 3'b001: 40MHz
+ // 3'b010: 50MHz
+ // 3'b011: 60MHz
+ // 3'b100: 69MHz
+ // 3'b101: 80MHz
+ // 3'b110: 96MHz
+ // 3'b111: 100MHz
+ #define MSDC_SOURCE_SEL_ADDR (0xBF814004)
+ orig_val=MSDC_Reg32(MSDC_SOURCE_SEL_ADDR);
+ orig_val=orig_val&(~0x7);
+ switch (type)
+ {
+ case SRC_26M:
+ MSDC_WriteReg32(MSDC_SOURCE_SEL_ADDR,orig_val|SRC_26M);
+ gMSDC_Handle->msdc_clock=26000000;
+ gMSDC_Handle->op_clock_max = 13000000;
+ break;
+
+ case SRC_40M:
+ MSDC_WriteReg32(MSDC_SOURCE_SEL_ADDR,orig_val|SRC_40M);
+ gMSDC_Handle->msdc_clock=40000000;
+ gMSDC_Handle->op_clock_max = 20000000;
+ break;
+ case SRC_50M:
+ MSDC_WriteReg32(MSDC_SOURCE_SEL_ADDR,orig_val|SRC_50M);
+ gMSDC_Handle->msdc_clock=50000000;
+ gMSDC_Handle->msdc_clock=35000000;
+ gMSDC_Handle->op_clock_max = 17000000;
+ break;
+ case SRC_60M:
+ MSDC_WriteReg32(MSDC_SOURCE_SEL_ADDR,orig_val|SRC_60M);
+ gMSDC_Handle->msdc_clock=60000000;
+ gMSDC_Handle->op_clock_max = 30000000;
+ break;
+ case SRC_69M:
+ MSDC_WriteReg32(MSDC_SOURCE_SEL_ADDR,orig_val|SRC_69M);
+ gMSDC_Handle->msdc_clock=69000000;
+ gMSDC_Handle->op_clock_max = 35000000;
+ break;
+ case SRC_80M:
+ MSDC_WriteReg32(MSDC_SOURCE_SEL_ADDR,orig_val|SRC_80M);
+ gMSDC_Handle->msdc_clock=80000000;
+ gMSDC_Handle->op_clock_max = 40000000;
+ break;
+ case SRC_96M:
+ MSDC_WriteReg32(MSDC_SOURCE_SEL_ADDR,orig_val|SRC_96M);
+ gMSDC_Handle->msdc_clock=96000000;
+ gMSDC_Handle->op_clock_max = 48000000;
+ break;
+ case SRC_100M:
+ MSDC_WriteReg32(MSDC_SOURCE_SEL_ADDR,orig_val|SRC_100M);
+ gMSDC_Handle->msdc_clock=100000000;
+ gMSDC_Handle->op_clock_max = 50000000;
+ break;
+ default:
+ MSDC_WriteReg32(MSDC_SOURCE_SEL_ADDR,orig_val|SRC_26M);
+ gMSDC_Handle->msdc_clock=26000000;
+ MSDC_ERR("[MSDC][%s %d]unknow source CLK %d\r\n",__FUNCTION__,__LINE__,type);
+ break;
+ }
+}
+#elif (CHIP_VER == 1)
+
+#define MSDC_OP_SCLK (200000000)
+#define MSDC_MAX_SCLK (200000000)
+void MSDC_SetClockSource(T_MSDC_CLK_TYPE type)
+{
+ gMSDC_Handle->msdc_clock = MSDC_OP_SCLK;
+ gMSDC_Handle->op_clock_max = MSDC_MAX_SCLK;
+}
+
+#endif
+/*************************************************************************
+* FUNCTION
+* MSDC_Check_Card_Present
+*
+* DESCRIPTION
+* c
+*
+* PARAMETERS
+* ON: turn on power saving or not
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+kal_bool MSDC_Check_Card_Present(void)
+{
+#if !defined(__MSDC_NOT_SUPPORT_HOT_PLUG__)
+ return gMSDC_Handle->mIsPresent;
+#else
+ return KAL_TRUE;
+#endif
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_PDNControl
+*
+* DESCRIPTION
+* Enable power saving or not.
+*
+* PARAMETERS
+* ON: turn on power saving or not
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+#define MSDC_PDN_EN
+void MSDC_PDNControl(kal_bool ON)
+{
+ if (ON) {
+ #if !defined(ATEST_DRV_ENABLE)
+
+ #if defined(MSDC_PDN_EN)
+ PDN_SET(PDN_MSDC0);
+ #endif
+
+ SleepDrv_SleepEnable(gMSDC_Handle->msdc_sm_hdl);
+ #endif
+ }
+ else {
+ #if !defined(ATEST_DRV_ENABLE)
+
+ #if defined(MSDC_PDN_EN)
+ PDN_CLR(PDN_MSDC0);
+ #endif
+
+ SleepDrv_SleepDisable(gMSDC_Handle->msdc_sm_hdl);
+ #endif
+ }
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_TimeOutHandler
+*
+* DESCRIPTION
+* Callback function of gpt timer, and launched while MSDC busy for a while
+
+*
+* PARAMETERS
+*
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_TimeOutHandler(void *parameter)
+{
+ gMSDC_Handle->is_timeout=KAL_TRUE;
+ kal_set_eg_events(gMSDC_Handle->MSDC_Events,
+ EVENT_DMA_DONE|EVENT_XFER_DONE|EVENT_CMD_DONE,KAL_OR);
+ MSDC_ERR("[MSDC][%s %d] Enter timeout handler \r\n",__FUNCTION__,__LINE__);
+}
+
+/*************************************************************************
+* FUNCTION
+* MSDC_GetCardStatus
+*
+* DESCRIPTION
+* Check currently card is present or not.
+*
+* PARAMETERS
+*
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+* msdc_eint_state
+*
+*
+*************************************************************************/
+int MSDC_GetCardStatus(void * DriveData, int AckType)
+{
+ return 0;
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_SendCardInd
+*
+* DESCRIPTION
+* Send card indication to the specified module.
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_SendCardInd(module_type dest_id, sd_select_enum sel, kal_uint32 msg_id)
+{
+
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_GetMediaChanged
+*
+* DESCRIPTION
+* Check if the media is changed, and clear the status after function call
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+kal_bool MSDC_GetMediaChanged(sd_select_enum sel)
+{
+ kal_bool ret;
+
+ ENTER_CRITICAL();
+ ret = (MSDC_Blk[sel].mIsChanged ) ? (KAL_TRUE) : (KAL_FALSE);
+ MSDC_Blk[sel].mIsChanged = KAL_FALSE;
+ EXIT_CRITICAL();
+
+ return ret;
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_InvertN
+*
+* DESCRIPTION
+* Invert the order of bytes eg,
+* src: 0x01 0x02, len: 2 => dest: 0x02 0x01
+*
+* PARAMETERS
+* 1. dest: used for store inverted result
+* 2. src: source for inverting
+* 3. len: bytes for inverting
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+* NOTE
+* 1. make sure dest has the same size with src.
+*************************************************************************/
+void MSDC_InvertN(kal_uint8 *dest, kal_uint8 *src, kal_uint8 len)
+{
+ int i;
+
+ for (i = 0; i < len; i++)
+ *(dest + len - 1 - i) = *(src + i);
+
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_Config_INS_WP
+*
+* DESCRIPTION
+* Configure the pull up or pull down status for INS and WP pin
+*
+* PARAMETERS
+* 1. ins: MSDC_IOCTRL_PULL_DOWN, MSDC_IOCTRL_PULL_UP
+* 2. wp: MSDC_IOCTRL_PULL_DOWN, MSDC_IOCTRL_PULL_UP
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+* NOTE
+* 1. MT6219 can not be configured to PULL up or down. They are all pulled up by IO.
+* 2. MT6218B and MT6217, WP is configured with data lines.
+*************************************************************************/
+void MSDC_Config_INS_WP(msdc_ioctrl_enum ins, msdc_ioctrl_enum wp)
+{
+
+}
+
+void MSDC_InitializeSwitchGpio()
+{
+
+ #if defined(__SIM_PLUS__) || defined(DRV_MSDC_DUAL_TCARD_BY_SWITCH)
+ DCL_HANDLE handle;
+#if !defined(__CUST_NEW__)
+ GPIO_LDO_SWITCH = MSDC_GetLDO_GPIO();
+ GPIO_EXT_SD_LDO_SWITCH = MSDC_GetEXTLDO_GPIO();
+ GPIO_SIM_MSDC_SWITCH = MSDC_GetSwitch_GPIO();
+#endif
+ //GPIO_ModeSetup(GPIO_SIM_MSDC_SWITCH, 0); // gpio mode (replaced by DCL)
+ handle = DclGPIO_Open(DCL_GPIO, GPIO_SIM_MSDC_SWITCH);
+ DclGPIO_Control(handle, GPIO_CMD_SET_MODE_0, 0);
+ DclGPIO_Close(handle);
+ //GPIO_InitIO(OUTPUT, GPIO_SIM_MSDC_SWITCH); // replaced by DCL
+ handle = DclGPIO_Open(DCL_GPIO, GPIO_SIM_MSDC_SWITCH);
+ DclGPIO_Control(handle, GPIO_CMD_SET_DIR_OUT, 0);
+ DclGPIO_Close(handle);
+ /*bewlow comes after JRD SIM+ issue on 2007_03_08, use custom setting instead of fix value*/
+ //GPIO_WriteIO(MSDC_GetSwitchDirection(), GPIO_SIM_MSDC_SWITCH); // replaced by DCL
+ handle = DclGPIO_Open(DCL_GPIO, GPIO_SIM_MSDC_SWITCH);
+
+ if (0 == MSDC_GetSwitchDirection())
+ DclGPIO_Control(handle, GPIO_CMD_WRITE_LOW, 0);
+ else if (1 == MSDC_GetSwitchDirection())
+ DclGPIO_Control(handle, GPIO_CMD_WRITE_HIGH, 0);
+ else
+ {
+ DclGPIO_Close(handle);
+ ASSERT(0);
+ }
+
+ DclGPIO_Close(handle);
+ /*end of changes of JRD SIM+ issue on 2007_03_08*/
+#endif
+
+}
+
+#if !defined(_MSDC_INTERNAL_CD_INT_PIN_)
+#if defined(__MSDC_TFLASH_DAT3_1BIT_HOT_PLUG__)
+kal_bool EINT_DefaultPolarity = KAL_FALSE;
+#else
+kal_bool EINT_DefaultPolarity = KAL_FALSE;
+#endif
+#endif
+
+void MSDC_ConfigPin(kal_uint32 pullmode)
+{
+ /*
+ * Note that the CLK signal is a output signal,
+ * and it should be kept to the default value.
+ * that is, PULL DOWN
+ */
+ switch (pullmode)
+ {
+ case MSDC_PIN_PULL_UP:
+
+ /* For CMD pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU_DUAL_IO, 1);
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD_DUAL_IO, 0);
+ /* For DATA pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU_DUAL_IO, 1);
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD_DUAL_IO, 0);
+ break;
+
+ case MSDC_PIN_PULL_DOWN:
+
+ /* For CMD pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU_DUAL_IO, 0);
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD_DUAL_IO, 1);
+ /* For DATA pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU_DUAL_IO, 0);
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD_DUAL_IO, 1);
+
+ break;
+ case MSDC_PIN_PULL_NONE:
+ default:
+
+ /* For CMD pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU_DUAL_IO, 0);
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD_DUAL_IO, 0);
+ /* For DATA pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU_DUAL_IO, 0);
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD_DUAL_IO, 0);
+
+ break;
+ }
+}
+
+/*************************************************************************
+* FUNCTION
+* MSDC_SetHostPower
+*
+* DESCRIPTION
+* enable or disable the power of host
+*
+* PARAMETERS*
+* on: KAL_TURE enable the power, KAL_FALSE disable the power
+*
+* RETURNS
+*
+* KAL_FALSE: fail to set the power
+* KAL_TURE: success to set the power
+*
+* GLOBALS AFFECTED
+* gMSDC_Handle
+*
+*************************************************************************/
+kal_bool MSDC_SetHostPower(kal_bool on)
+{
+ kal_bool ret = KAL_TRUE;
+
+ return ret;
+}
+
+#if (CHIP_VER == 0)
+/*************************************************************************
+* FUNCTION
+* MSDC_SetVddPower
+*
+* DESCRIPTION
+* enable or disable the power of host
+*
+* PARAMETERS*
+* on: KAL_TURE enable the power, KAL_FALSE disable the power
+* volt: the voltage of vdd 3300 mean 3.3v
+* RETURNS
+*
+* KAL_FALSE: fail to set the power
+* KAL_TURE: success to set the power
+*
+* GLOBALS AFFECTED
+* gMSDC_Handle
+*
+*************************************************************************/
+kal_bool MSDC_SetVddPower(kal_bool on,kal_uint32 volt)
+{
+ kal_bool ret =KAL_TRUE;
+ if (on)
+ {
+ if (volt == 3300)
+ {
+ MSDC_ConfigPin(MSDC_PIN_PULL_UP);
+ }
+ else
+ {
+ ret = KAL_FALSE;
+ }
+ }
+ else
+ {
+ MSDC_ConfigPin(MSDC_PIN_PULL_DOWN);
+ }
+ return ret;
+}
+
+/*************************************************************************
+* FUNCTION
+* MSDC_SetSignalPower
+*
+* DESCRIPTION
+* enable or disable the power of host
+*
+* PARAMETERS*
+* on: KAL_TURE enable the power, KAL_FALSE disable the power
+* volt: the voltage of signal , 3300 mean 3.3v ,1800 mean 1.8v
+* RETURNS
+*
+* KAL_FALSE: fail to set the power
+* KAL_TURE: success to set the power
+*
+* GLOBALS AFFECTED
+* gMSDC_Handle
+*
+*************************************************************************/
+/*
+ CARD_PWR 1 LEVEL_PWR33 0 1.8v
+ CARD_PWR 1 LEVEL_PWR33 1 3.3v
+ CARD_PWR0 0v
+*/
+#define MSDC_CARD_PWR 26
+#define MSDC_LEVEL_PWR33 27
+kal_bool MSDC_SetSignalPower(kal_bool on,kal_uint32 volt)
+{
+ DCL_HANDLE handle;
+ kal_bool ret =KAL_TRUE;
+ if (on)
+ {
+ handle = DclGPIO_Open(DCL_GPIO, MSDC_CARD_PWR);
+ DclGPIO_Control(handle, GPIO_CMD_SET_OWNERSHIP_TO_MD, 0);
+ DclGPIO_Control(handle, GPIO_CMD_SET_DIR_OUT, 0);
+ DclGPIO_Control(handle, GPIO_CMD_WRITE_HIGH, 0);
+ //DclGPIO_Control(handle, GPIO_CMD_SET_MODE_0, 0);
+
+ DclGPIO_Close(handle);
+ if (volt == 3300)
+ {
+ handle = DclGPIO_Open(DCL_GPIO, MSDC_LEVEL_PWR33);
+ DclGPIO_Control(handle, GPIO_CMD_SET_OWNERSHIP_TO_MD, 0);
+ DclGPIO_Control(handle, GPIO_CMD_SET_DIR_OUT, 0);
+ DclGPIO_Control(handle, GPIO_CMD_WRITE_HIGH, 0);
+ //DclGPIO_Control(handle, GPIO_CMD_SET_MODE_0, 0);
+
+ DclGPIO_Close(handle);
+ MSDC_CRIT("[MSDC][%s %d]set signal power to 3.3v\r\n",__FUNCTION__,__LINE__);
+ gMSDC_Handle->signal_volt=3300;
+ }
+ else if (volt ==1800)
+ {
+ handle = DclGPIO_Open(DCL_GPIO,MSDC_LEVEL_PWR33);
+ DclGPIO_Control(handle, GPIO_CMD_SET_OWNERSHIP_TO_MD, 0);
+ DclGPIO_Control(handle, GPIO_CMD_SET_DIR_OUT, 0);
+ DclGPIO_Control(handle, GPIO_CMD_WRITE_LOW, 0);
+ //DclGPIO_Control(handle, GPIO_CMD_SET_MODE_0, 0);
+
+ DclGPIO_Close(handle);
+ MSDC_CRIT("[MSDC][%s %d]set signal power to 1.8v\r\n",__FUNCTION__,__LINE__);
+ gMSDC_Handle->signal_volt=1800;
+ }
+ else
+ {
+ MSDC_ERR("[MSDC][%s %d]unknow signal power %d v\r\n",__FUNCTION__,__LINE__,volt);
+ ret = KAL_FALSE;
+ }
+ }
+ else
+ {
+ /*set signal volt to 0v*/
+ handle = DclGPIO_Open(DCL_GPIO, MSDC_CARD_PWR);
+ DclGPIO_Control(handle, GPIO_CMD_SET_OWNERSHIP_TO_MD, 0);
+ DclGPIO_Control(handle, GPIO_CMD_SET_DIR_OUT, 0);
+ DclGPIO_Control(handle, GPIO_CMD_WRITE_LOW, 0);
+ //DclGPIO_Control(handle, GPIO_CMD_SET_MODE_0, 0);
+
+ DclGPIO_Close(handle);
+ MSDC_CRIT("[MSDC][%s %d]set signal power to 0v\r\n",__FUNCTION__,__LINE__);
+ gMSDC_Handle->signal_volt=0;
+ }
+
+ return ret;
+}
+
+#elif (CHIP_VER == 1)
+
+#define LDO_VMC 0
+#define LDO_VMCH 1
+#define LDO_VIO18_PMU 2
+
+static kal_uint32 g_msdc0_io = PMU_VOLT_03_300000_V;
+static kal_uint32 g_msdc0_card = PMU_VOLT_03_300000_V;
+
+static kal_uint32 hwPowerOn(kal_uint32 powerID, PMU_VOLTAGE_ENUM powerVolt)
+{
+ PMU_CTRL_LDO_BUCK_SET_EN pmu_en;
+ PMU_CTRL_LDO_BUCK_SET_VOLTAGE pmu_volsel;
+ DCL_HANDLE handle;
+
+ /* Open PMU handle */
+ handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
+
+ switch(powerID) {
+ case LDO_VMC:
+ /* Set enable control */
+ pmu_en.mod = VMC;
+ pmu_en.enable = 1;
+
+ /* Set voltage */
+ pmu_volsel.mod = VMC;
+ pmu_volsel.voltage = powerVolt;
+
+ DclPMU_Control(handle, LDO_BUCK_SET_VOLTAGE, (DCL_CTRL_DATA_T *)&pmu_volsel);
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&pmu_en);
+
+ break;
+
+ case LDO_VMCH:
+ /* Set enable control */
+ pmu_en.mod = VMCH;
+ pmu_en.enable = 1;
+
+ /* Set voltage */
+ pmu_volsel.mod = VMCH;
+ pmu_volsel.voltage = powerVolt;
+
+ DclPMU_Control(handle, LDO_BUCK_SET_VOLTAGE, (DCL_CTRL_DATA_T *)&pmu_volsel);
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&pmu_en);
+
+ break;
+
+ default:
+ break;
+ }
+
+ /* Close PMU handle */
+ DclPMU_Close(handle);
+
+ return 1;
+}
+
+static kal_uint32 hwPowerDown(kal_uint32 powerID)
+{
+ PMU_CTRL_LDO_BUCK_SET_EN pmu_en;
+ DCL_HANDLE handle;
+
+ /* Open PMU handle */
+ handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
+
+ switch(powerID) {
+ case LDO_VMC:
+ /* Set enable control */
+ pmu_en.mod = VMC;
+ pmu_en.enable = 0;
+
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&pmu_en);
+ break;
+
+ case LDO_VMCH:
+ /* Set enable control */
+ pmu_en.mod = VMCH;
+ pmu_en.enable = 0;
+
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&pmu_en);
+
+ break;
+
+ default:
+ break;
+ }
+
+ /* Close PMU handle */
+ DclPMU_Close(handle);
+
+ return 1;
+}
+
+static kal_uint32 msdc_ldo_power(kal_uint32 on, kal_uint8 powerId,
+ PMU_VOLTAGE_ENUM powerVolt, kal_uint32 *status)
+{
+ if (on) { // want to power on
+ if (*status == 0) { // can power on
+ MSDC_CRIT("msdc LDO<%s> power on<%d>\r\n",
+ powerId ? "VMCH" : "VMC", powerVolt);
+
+ hwPowerOn(powerId, powerVolt);
+
+ *status = powerVolt;
+ } else if (*status == powerVolt) {
+ MSDC_CRIT("msdc LDO<%s><%d> power on again!\r\n",
+ powerId ? "VMCH" : "VMC", powerVolt);
+ } else { // for sd3.0 later
+ MSDC_CRIT("msdc LDO<%s> change<%d> to <%d>\r\n",
+ powerId ? "VMCH" : "VMC", *status, powerVolt);
+
+ hwPowerDown(powerId);
+ hwPowerOn(powerId, powerVolt);
+
+ *status = powerVolt;
+ }
+ } else { // want to power off
+ if (*status != 0) { // has been powerred on
+ MSDC_CRIT("msdc LDO<%s> power off\r\n", powerId ? "VMCH" : "VMC");
+
+ hwPowerDown(powerId);
+
+ *status = 0;
+ } else {
+ MSDC_CRIT("LDO<%s> not power on\r\n", powerId ? "VMCH" : "VMC");
+ }
+ }
+
+ return 0;
+}
+
+void msdc_set_smt(kal_bool clk, kal_bool cmd, kal_bool dat)
+{
+ clk &= 0xF;
+ cmd &= 0xF;
+ dat &= 0xF;
+
+ /* For CLK pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKSMT, clk);
+ /* For CMD pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDSMT, cmd);
+ /* For DATA pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATSMT, dat);
+}
+
+void msdc_set_slew_rate(int clk,int cmd, int dat)
+{
+ clk &= 0x1;
+ cmd &= 0x1;
+ dat &= 0x1;
+
+ /* For CLK pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKSR, clk);
+ /* For CMD pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDSR, cmd);
+ /* For DATA pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATSR, dat);
+}
+
+void msdc_set_rdsel(kal_bool clk, kal_bool cmd, kal_bool dat)
+{
+ clk &= 0xF;
+ cmd &= 0xF;
+ dat &= 0xF;
+
+ /* For CLK pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKRDSEL, clk);
+ /* For CMD pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDRDSEL, cmd);
+ /* For DATA pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATRDSEL, dat);
+}
+
+void msdc_set_tdsel(kal_bool clk, kal_bool cmd, kal_bool dat)
+{
+ clk &= 0xF;
+ cmd &= 0xF;
+ dat &= 0xF;
+
+ /* For CLK pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKTDSEL, clk);
+ /* For CMD pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDTDSEL, cmd);
+ /* For DATA pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATTDSEL, dat);
+}
+
+void msdc_set_driving(struct msdc_cust *hw, kal_bool sd_18)
+{
+ if (sd_18) {
+ /* For CLK pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRV, hw->io_clk.io_drv_18);
+ /* For CMD pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRV, hw->io_cmd.io_drv_18);
+ /* For DATA pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRV, hw->io_dat.io_drv_18);
+ } else {
+ /* For CLK pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRV, hw->io_clk.io_drv_33);
+ /* For CMD pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRV, hw->io_cmd.io_drv_33);
+ /* For DATA pin */
+ MSDC_SET_FIELD(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRV, hw->io_dat.io_drv_33);
+ }
+
+}
+
+int msdc_io_init()
+{
+ struct msdc_cust *pmsdc_cust = NULL;
+
+ pmsdc_cust = &msdc_cap;
+
+ if (!pmsdc_cust) {
+ MSDC_ERR("<%s> : Invalid host ID!\r\n", __FUNCTION__);
+ goto exit;
+ }
+
+ /* RDSEL Init */
+ msdc_set_rdsel(pmsdc_cust->io_clk.rdsel, pmsdc_cust->io_cmd.rdsel,
+ pmsdc_cust->io_dat.rdsel);
+
+ /* TDSEL Init */
+ msdc_set_tdsel(pmsdc_cust->io_clk.tdsel, pmsdc_cust->io_cmd.tdsel,
+ pmsdc_cust->io_dat.tdsel);
+
+ /* SMTen Init */
+ msdc_set_smt(pmsdc_cust->io_clk.smten, pmsdc_cust->io_cmd.smten,
+ pmsdc_cust->io_dat.smten);
+
+ /* Slew Rate Init */
+ msdc_set_slew_rate(pmsdc_cust->io_clk.slew, pmsdc_cust->io_cmd.slew,
+ pmsdc_cust->io_dat.slew);
+
+ /* IO driving Init */
+ msdc_set_driving(pmsdc_cust, 0);
+
+exit:
+
+ return 1;
+}
+
+void msdc_pin_init()
+{
+ /* Pin config for MSDC0 */
+#if defined(_MSDC_INTERNAL_CD_INT_PIN_)
+ /* Set to MSDC function(INS and WP) */
+ IOMUX_set_module_func(0, sel_msdc0p_0);
+#else
+ /* Set GPIO/EINT function, both for INS and WP */
+ IOMUX_set_module_func(4, sel_msdc0p_0);
+
+ #ifdef ATEST_DRV_MSDC
+ GPIO_init();
+ EINT_Setting_Init();
+ #endif
+
+#endif
+
+ IOMUX_set_module_func(0, sel_msdc0p_1);
+ IOMUX_set_module_func(0, sel_msdc0p_2);
+
+ return;
+}
+
+kal_bool MSDC_SetVddPower(kal_bool on, kal_uint32 volt)
+{
+ kal_bool ret =KAL_TRUE;
+
+ if (on)
+ MSDC_ConfigPin(MSDC_PIN_PULL_UP);
+
+ if (volt == 3300)
+ {
+ msdc_ldo_power(on, LDO_VMCH, PMU_VOLT_03_300000_V, &g_msdc0_card);
+ }
+ else
+ {
+ MSDC_ERR("[MSDC][%s %d]unknow signal power %d v\r\n",
+ __FUNCTION__, __LINE__, volt);
+
+ ret = KAL_FALSE;
+ }
+
+ if (!on)
+ MSDC_ConfigPin(MSDC_PIN_PULL_UP);
+
+ return ret;
+}
+
+kal_bool MSDC_SetSignalPower(kal_bool on,kal_uint32 volt)
+{
+ kal_bool ret =KAL_TRUE;
+ if (volt == 3300)
+ {
+ msdc_ldo_power(on, LDO_VMC, PMU_VOLT_03_300000_V, &g_msdc0_io);
+ msdc_set_driving(&msdc_cap, 0);
+ }
+ else if (volt ==1800)
+ {
+ msdc_ldo_power(on, LDO_VMC, PMU_VOLT_01_800000_V, &g_msdc0_io);
+ msdc_set_driving(&msdc_cap, 1);
+ }
+ else
+ {
+ MSDC_ERR("[MSDC][%s %d]unknow signal power %d v\r\n",
+ __FUNCTION__, __LINE__, volt);
+
+ ret = KAL_FALSE;
+ }
+
+ return ret;
+}
+#endif
+
+/*************************************************************************
+* FUNCTION
+* MSDC_SetAllPower
+*
+* DESCRIPTION
+* enable or disable the power of host\Vdd\signal
+*
+* PARAMETERS*
+*
+* RETURNS
+*
+* KAL_FALSE: fail to set the power
+* KAL_TURE: success to set the power
+*
+* GLOBALS AFFECTED
+* gMSDC_Handle
+*
+*************************************************************************/
+kal_bool MSDC_SetAllPower(kal_bool on)
+{
+ kal_bool ret=KAL_TRUE;
+
+ if (on)
+ {
+ MSDC_SetHostPower(on);
+ MSDC_SetVddPower(on,gMSDC_Handle->vdd_volt);
+ MSDC_SetSignalPower(on,gMSDC_Handle->signal_volt);
+ }
+ else
+ {
+ MSDC_SetSignalPower(on,gMSDC_Handle->signal_volt);
+ MSDC_SetVddPower(on,gMSDC_Handle->vdd_volt);
+ MSDC_SetHostPower(on);
+
+ }
+ return ret;
+
+}
+
+void power_cycle(kal_uint32 interval_ticks)
+{
+ MSDC_SetVddPower(0,gMSDC_Handle->vdd_volt);
+ msdc_sleep(interval_ticks);
+ MSDC_SetVddPower(1,gMSDC_Handle->vdd_volt);
+}
+
+/*************************************************************************
+* FUNCTION
+* MSDC_SetBusWidth
+*
+* DESCRIPTION
+* set the bus width to 1 ,4 8
+*
+* PARAMETERS*
+* bus_width : set to 1 ,4 ,8
+* RETURNS
+*
+* GLOBALS AFFECTED
+* gMSDC_Handle
+*
+*************************************************************************/
+void MSDC_SetBusWidth(SD_BITWIDTH bus_width)
+{
+ kal_uint32 val;
+ val=MSDC_Reg32(SDC_CFG)&(~SDC_CFG_BUSWIDTH);
+ switch(bus_width)
+ {
+ default:
+ case BIT_1W:
+ val |=(MSDC_BUS_1BITS << 16);
+ gMSDC_Handle->bus_width=1;
+ break;
+ case BIT_4W:
+ val |=(MSDC_BUS_4BITS <<16);
+ gMSDC_Handle->bus_width=4;
+ break;
+ case BIT_8W:
+ val |=(MSDC_BUS_8BITS<<16);
+ gMSDC_Handle->bus_width=8;
+ break;
+ }
+ MSDC_WriteReg32(SDC_CFG,val);
+
+ MSDC_CRIT("[MSDC][%s %d]Set to %d-bit bus width\r\n", __FUNCTION__,
+ __LINE__, gMSDC_Handle->bus_width);
+}
+
+void MSDC_FatalErrorHandle()
+{
+ /*reset msdc*/
+ MSDC_RESET();
+ /*stop dma*/
+ MSDC_STOP_DMA();
+ /*clear fifo*/
+ MSDC_CLR_FIFO_EX();
+ /*clear ints*/
+ MSDC_CLR_INT();
+ /**/
+}
+
+ kal_uint32 MSDC_PollInts(kal_uint32 int_mask,kal_uint32 timeout_ms)
+{
+ kal_uint32 intsts;
+ if (!MSDC_TIMEOUT_WAIT((MSDC_Reg32(MSDC_INT)&int_mask),timeout_ms))
+ {
+ intsts=MSDC_Reg32(MSDC_INT);
+ MSDC_WriteReg32(MSDC_INT,intsts&int_mask);
+ return intsts&int_mask;
+ }
+
+ MSDC_ERR("[MSDC][%s %d]poll INT %d, SW timeout\r\n",__FUNCTION__,__LINE__,timeout_ms);
+ return 0;
+}
+/*************************************************************************
+* FUNCTION
+
+* MSDC_Initialize
+*
+* DESCRIPTION
+* Initialize the MS/SD host controller, called only once at drv_init
+*
+* PARAMETERS*
+*
+* RETURNS
+* 1: initailized failed
+* 0: successful
+*
+* GLOBALS AFFECTED
+* gMSDC_Handle
+*
+*************************************************************************/
+extern kal_semid dualMsdcArb;
+
+void MSDC_Probe (void)
+{
+ if (gMSDC_Handle->mIsProbeMSDC)
+ return;
+
+ /* PDN disable first */
+ MSDC_PDNControl(KAL_FALSE);
+
+ #if (CHIP_VER == 1)
+ msdc_io_init();
+ #endif
+
+ /*check card present or not*/
+#if defined(MSDC_HOTPLUG_EN)
+#if defined(_MSDC_INTERNAL_CD_INT_PIN_)
+ if (MSDC_Reg32(MSDC_PS)&MSDC_PS_CDSTS)
+ gMSDC_Handle->mIsPresent=KAL_FALSE;
+ else
+ gMSDC_Handle->mIsPresent=KAL_TRUE;
+#else /* _MSDC_INTERNAL_CD_INT_PIN_ */
+ {
+ DCL_HANDLE handle;
+
+ GPIO_CTRL_READ_T data;
+
+ /* when use EINT for card detect,get the status */
+ handle = DclGPIO_Open(DCL_GPIO, MSDC_INS_GPIO);
+ DclGPIO_Control(handle, GPIO_CMD_READ, (DCL_CTRL_DATA_T *)&data);
+
+ if (data.u1IOData)
+ gMSDC_Handle->mIsPresent = KAL_FALSE;
+ else
+ gMSDC_Handle->mIsPresent = KAL_TRUE;
+
+ DclGPIO_Close(handle);
+ }
+#endif
+#else /* MSDC_HOTPLUG_EN */
+ gMSDC_Handle->mIsPresent = KAL_TRUE;
+#endif
+ MSDC_CRIT("[MSDC][%s %d]Card is %s\r\n",__FUNCTION__,__LINE__,
+ gMSDC_Handle->mIsPresent ? "Present" : "Not Present");
+
+ /* If card is not exist, step over the INIT flow */
+ if (gMSDC_Handle->mIsPresent)
+ gMSDC_Handle->mIsProbeMSDC = KAL_TRUE;
+ else {
+ gMSDC_Handle->mIsProbeMSDC = KAL_FALSE;
+ goto exit;
+ }
+
+ /*set MSDC as the controller of SD*/
+ MSDC_SET_FIELD(MSDC_CFG, MSDC_CFG_MODE, 1);
+
+ /*reset MSDC ,clear FIFO*/
+ MSDC_RESET();
+ MSDC_CLR_FIFO_EX();
+ MSDC_DEBUG("[MSDC][%s %d]reset MSDC,clear FIFO\r\n",__FUNCTION__,__LINE__);
+
+ /*write crc timeout detection*/
+ MSDC_SetData32(MSDC_PATCH_BIT0,1<<30,(1<<30));
+ /*Configure To Default Data Timeout */
+ MSDC_SetData32(SDC_CFG,SDC_CFG_DTOC,(DEFAULT_DTOC<<24));
+ /*set bus width to 1 */
+ MSDC_SetBusWidth(BIT_1W);
+
+ /* Tuning parameters INIT */
+ msdc_tune_init();
+
+exit:
+ MSDC_PDNControl(KAL_TRUE);
+
+ /* Shut card power */
+ MSDC_SetVddPower(KAL_FALSE, gMSDC_Handle->vdd_volt);
+
+ /* Defaultly turn VMC to 1.8V to save power */
+ MSDC_SetSignalPower(KAL_TRUE, gMSDC_Handle->signal_volt);
+}
+
+void MSDC_Initialize(void)
+{
+ /* INIT MSDC debug flag */
+ MSDC_SetDebugLevel(K_NOTICE);
+
+ MSDC_CRIT("[MSDC][%s %d]Start init MSDC...\r\n",__FUNCTION__,__LINE__);
+
+ /*check MSDC is initalized or not */
+ if (gMSDC_Handle->mIsInitMSDC)
+ return;
+
+ gMSDC_Handle->mIsProbeMSDC = 0;
+
+ /*init gSD*/
+ kal_mem_set(gSD,0,sizeof(T_SDC_HANDLE));
+
+ /* Set voltage of single and card power */
+ gMSDC_Handle->signal_volt = 1800;
+ gMSDC_Handle->vdd_volt = 3300;
+
+ #if !defined(ATEST_DRV_ENABLE)
+ /* Get Sleep handler */
+ gMSDC_Handle->msdc_sm_hdl = SleepDrv_GetHandle(SMP);
+ MSDC_CRIT("[MSDC][%s %d]MSDC Slp Handler: %d\r\n",
+ __FUNCTION__, __LINE__, gMSDC_Handle->msdc_sm_hdl);
+ #endif
+
+ /*set clock source */
+ MSDC_SetClockSource(SRC_80M);
+
+ #if (CHIP_VER == 1)
+ /* Pin MUX setting and IO settings */
+ msdc_pin_init();
+ #endif
+
+ /*get gpt handle*/
+ if (gMSDC_Handle->gpt_handle==0)
+ MSDC_GPTI_GetHandle(&gMSDC_Handle->gpt_handle);
+
+ /*clear and disable all interrupt*/
+ MSDC_ClearBits32(MSDC_INTEN,MSDC_Reg32(MSDC_INTEN));
+ MSDC_WriteReg32(MSDC_INT,MSDC_Reg32(MSDC_INT));
+
+ /* INIT the MSDC related registers */
+ MSDC_Probe();
+
+ /*init INT handle*/
+ MSDC_INT_Init();
+
+ /*set the function support by host*/
+ gMSDC_Handle->host_support.function1=FUN1_SDR12_DS|FUN1_SDR25_HS|FUN1_SDR50|FUN1_SDR104|FUN1_DDR50;
+ gMSDC_Handle->host_support.function2=FUN2_DEFAULT;
+ gMSDC_Handle->host_support.function3=FUN3_TYPE_B;
+ gMSDC_Handle->host_support.function4=FUN4_200MA|FUN4_400MA|FUN4_600MA|FUN4_800MA;
+
+ gMSDC_Handle->mIsInitMSDC = KAL_TRUE;
+
+ MSDC_DEBUG("[MSDC][%s %d]finish init MSDC\r\n",__FUNCTION__,__LINE__);
+}
+
+/*************************************************************************
+* FUNCTION
+* MSDC_DeInit
+*
+* DESCRIPTION
+* De-initialize the MS/SD host controller, called only once at drv_init
+*
+* PARAMETERS*
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+void MSDC_DeInit(void)
+{
+ /* Shutdown Card power Only */
+ MSDC_SetVddPower(KAL_FALSE, gMSDC_Handle->vdd_volt);
+
+ gMSDC_Handle->mIsProbeMSDC = KAL_FALSE;
+ gMSDC_Handle->mIsInitialized = KAL_FALSE;
+
+ return;
+}
+
+
+#ifdef __TST_WRITE_TO_FILE__
+/*error recording: add this function to do MSDC reset when error recording*/
+void MSDC_ErrorRecordingReset()
+{
+
+
+}
+#endif
+
+#ifndef DRV_LSD
+/*************************************************************************
+* FUNCTION
+* BitFieldWrite32
+*
+* DESCRIPTION
+* Write src to dest at mask position
+*
+* PARAMETERS
+* dest: destination to be update
+* src: value to be written
+* mask: bit mask
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+// Note: mask must be a continuous area during 32bits. eg,
+// dest : 00A30000 , src : BF, mask : 0000BF00.
+// after BitFieldCpy, dest : 00A3BF00, copy src to dest at mask position.
+void BitFieldWrite32(kal_uint32 * dest, kal_uint32 src, kal_uint32 mask)
+{
+ kal_uint8 bit_pos;
+ kal_uint32 tmp;
+
+ bit_pos = 0;
+ tmp = MSDC_Reg32(dest);
+
+ // get bit positoin
+ while (!((mask >> bit_pos++) & 1));
+
+ //use mask clear the corresponding area
+ tmp &= ~mask;
+ //shift src to the corresponding positiion
+ src <<= (bit_pos - 1);
+ //copy src into destination
+ tmp |= src;
+ MSDC_WriteReg32(dest, tmp);
+}
+#endif
+
+#ifdef MSDC_USED_STUFF
+/*************************************************************************
+* FUNCTION
+* BitFieldRead32
+*
+* DESCRIPTION
+* read src to dest at mask position
+*
+* PARAMETERS
+* dest: destination to store
+* src: value to be written
+* mask: bit mask
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+
+// Note: mask must ve continuous area during 32 bits.eg,
+// src : 00A3BF00, mask : 00FF0000
+// after BitFieldRead, dest : A3
+void BitFieldRead32(kal_uint32 * dest, kal_uint32 src, kal_uint32 mask)
+{
+ kal_uint8 bit_pos = 0;
+
+ while (!((mask >> bit_pos++) & 1));
+
+ src &= mask;
+ *(kal_uint32 *)dest = src >> (bit_pos - 1);
+}
+#endif//MSDC_USED_STUFF
+
+// get the bit field value of start_bit with width bits
+// note 1) start_bit start from bit 0
+// 2) prepare dest with initialized with zeros
+// 3) width must less than 32 if using the retrun value as a result
+// eg,
+// src:00110110, start_bit:2,width:3 => dest:101
+void GetBitFieldN(kal_uint8* dest, kal_uint8* src, kal_uint16 start_bit, kal_uint16 width)
+{
+ int i;
+ kal_uint16 bytes, bits;
+
+ //kal_mem_set(dest,0,width/8+1);
+ kal_mem_set(dest, 0, (width / 8) + (0 == (width % 8) ? 0 : 1));
+
+ for ( i = 0; i < width; i++)
+ {
+ bytes = (start_bit + i) / 8;
+ bits = (start_bit + i) % 8;
+ *(dest + i / 8) |= (kal_uint8)(((*(src + bytes) >> bits) & 1) << (i % 8));
+ }
+
+ /*in MT6238, address of kal_uint32 is checked strictly, and we don't need the return value of this function*/
+ /*change it's return type to void*/
+ return ;
+}
+
+#if defined(DRV_MSDC_LATCH_MT6276_SERIES)
+void MSDC_SetLatchTuning(void)
+{
+
+}
+#else
+void MSDC_SetIOCONRegDLT(void)
+{
+
+}
+#endif//#if defined(DRV_MSDC_LATCH_MT6276_SERIES)
+
+void msdc_dump_reg(void)
+{
+ int idx;
+
+ MSDC_CRIT("****** [00]MSDC_CFG : %x\r\n", MSDC_Reg32(MSDC_CFG));
+ MSDC_CRIT("****** [04]MSDC_IOCON : %x\r\n", MSDC_Reg32(MSDC_IOCON));
+ MSDC_CRIT("****** [08]MSDC_PS : %x\r\n", MSDC_Reg32(MSDC_PS));
+ MSDC_CRIT("****** [0C]MSDC_INT : %x\r\n", MSDC_Reg32(MSDC_INT));
+ MSDC_CRIT("****** [10]MSDC_INTEN : %x\r\n", MSDC_Reg32(MSDC_INTEN));
+ MSDC_CRIT("****** [14]MSDC_FIFOCS : %x\r\n", MSDC_Reg32(MSDC_FIFOCS));
+ MSDC_CRIT("****** [18]MSDC_TXDATA : %x\r\n", MSDC_Reg32(MSDC_TXDATA));
+ MSDC_CRIT("****** [1C]MSDC_RXDATA : --------\r\n");
+ MSDC_CRIT("****** [30]SDC_CFG : %x\r\n", MSDC_Reg32(SDC_CFG));
+ MSDC_CRIT("****** [34]SDC_CMD : %x\r\n", MSDC_Reg32(SDC_CMD));
+ MSDC_CRIT("****** [38]SDC_ARG : %x\r\n", MSDC_Reg32(SDC_ARG));
+ MSDC_CRIT("****** [3C]SDC_STS : %x\r\n", MSDC_Reg32(SDC_STS));
+ MSDC_CRIT("****** [40]SDC_RESP0 : %x\r\n", MSDC_Reg32(SDC_RESP0));
+ MSDC_CRIT("****** [44]SDC_RESP1 : %x\r\n", MSDC_Reg32(SDC_RESP1));
+ MSDC_CRIT("****** [48]SDC_RESP2 : %x\r\n", MSDC_Reg32(SDC_RESP2));
+ MSDC_CRIT("****** [4C]SDC_RESP3 : %x\r\n", MSDC_Reg32(SDC_RESP3));
+ MSDC_CRIT("****** [50]SDC_BLK_NUM : %x\r\n", MSDC_Reg32(SDC_BLK_NUM));
+ MSDC_CRIT("****** [58]SDC_CSTS : %x\r\n", MSDC_Reg32(SDC_CSTS));
+ MSDC_CRIT("****** [5C]SDC_CSTS_EN : %x\r\n", MSDC_Reg32(SDC_CSTS_EN));
+ MSDC_CRIT("****** [60]SDC_DATCRC_STS : %x\r\n", MSDC_Reg32(SDC_DCRC_STS));
+ MSDC_CRIT("****** [70]EMMC_CFG0 : %x\r\n", MSDC_Reg32(EMMC_CFG0));
+ MSDC_CRIT("****** [74]EMMC_CFG1 : %x\r\n", MSDC_Reg32(EMMC_CFG1));
+ MSDC_CRIT("****** [78]EMMC_STS : %x\r\n", MSDC_Reg32(EMMC_STS));
+ MSDC_CRIT("****** [7C]EMMC_IOCON : %x\r\n", MSDC_Reg32(EMMC_IOCON));
+ MSDC_CRIT("****** [80]SD_ACMD_RESP : %x\r\n", MSDC_Reg32(SDC_ACMD_RESP));
+ MSDC_CRIT("****** [84]SD_ACMD19_TRG : %x\r\n", MSDC_Reg32(SDC_ACMD19_TRG));
+ MSDC_CRIT("****** [88]SD_ACMD19_STS : %x\r\n", MSDC_Reg32(SDC_ACMD19_STS));
+ MSDC_CRIT("****** [90]DMA_SA : %x\r\n", MSDC_Reg32(MSDC_DMA_SA));
+ MSDC_CRIT("****** [94]DMA_CA : %x\r\n", MSDC_Reg32(MSDC_DMA_CA));
+ MSDC_CRIT("****** [98]DMA_CTRL : %x\r\n", MSDC_Reg32(MSDC_DMA_CTL));
+ MSDC_CRIT("****** [9C]DMA_CFG : %x\r\n", MSDC_Reg32(MSDC_DMA_CFG));
+ MSDC_CRIT("****** [A8]DMA_LENGTH : %x\r\n", MSDC_Reg32(MSDC_DMA_LENGTH));
+ MSDC_CRIT("****** [B0]PATCH_BIT0 : %x\r\n", MSDC_Reg32(MSDC_PATCH_BIT0));
+ MSDC_CRIT("****** [B4]PATCH_BIT1 : %x\r\n", MSDC_Reg32(MSDC_PATCH_BIT1));
+ MSDC_CRIT("****** [E0]SD30_PAD_CTL0 : %x\r\n", MSDC_Reg32(MSDC_PAD_CTL0));
+ MSDC_CRIT("****** [E4]SD30_PAD_CTL1 : %x\r\n", MSDC_Reg32(MSDC_PAD_CTL1));
+ MSDC_CRIT("****** [E8]SD30_PAD_CTL2 : %x\r\n", MSDC_Reg32(MSDC_PAD_CTL2));
+ MSDC_CRIT("****** [EC]PAD_TUNE : %x\r\n", MSDC_Reg32(MSDC_PAD_TUNE));
+ MSDC_CRIT("****** [F0]DAT_RD_DLY0 : %x\r\n", MSDC_Reg32(MSDC_DAT_RDDLY0));
+ MSDC_CRIT("****** [F4]DAT_RD_DLY1 : %x\r\n", MSDC_Reg32(MSDC_DAT_RDDLY1));
+ MSDC_CRIT("****** [100]MAIN_VERSION : %x\r\n", MSDC_Reg32(MSDC_VERSION));
+ MSDC_CRIT("****** [104]ECO_VERSION : %x\r\n", MSDC_Reg32(MSDC_ECO_VER));
+
+ for (idx = 0; idx < 26; idx++) {
+ MSDC_WriteReg32(MSDC_DBG_SEL, idx);
+ MSDC_CRIT("=*=*=* MSDC_DBG_SEL:%d => MSDC_DBG_OUT:%x\r\n",
+ idx, MSDC_Reg32(MSDC_DBG_OUT));
+ }
+
+ MSDC_CRIT("====== MSDC Register and Debug Register Dump End ======\r\n");
+}
+
+#ifdef _MSDC_DMA_
+/*************************************************************************
+* FUNCTION
+* MSDC_DMAInit
+*
+* DESCRIPTION
+* Initialize MSDC's DMA
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_DMAInit(void)
+{
+
+}
+void MSDC_StartDMA(void)
+{
+ kal_uint32 ints=MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO |
+ MSDC_INTEN_DATCRCERR |MSDC_INTEN_DXFER_DONE |
+ MSDC_INTEN_BD_CS_ERR | MSDC_INTEN_GPD_CS_ERR;
+ //kal_uint32 ints=MSDC_DAT_INTS;
+ kal_uint32 abnormal_ints;
+ abnormal_ints=MSDC_Reg32(MSDC_INT)&ints;
+ if(0 != abnormal_ints)
+ {
+ /*error, have irq before we enable it*/
+ MSDC_ERR("[MSDC][%s %d]abnormal irq %x\r\n",__FUNCTION__,__LINE__,abnormal_ints);
+ MSDC_WriteReg32(MSDC_INT,abnormal_ints);
+ }
+ MSDC_SetBits32(MSDC_INTEN, ints);
+ MSDC_SET_FIELD(MSDC_DMA_CTL, MSDC_DMA_CTL_START, 1);
+ gMSDC_Handle->is_timeout=KAL_FALSE;
+ MSDC_START_TIMER(MSDC_DMA_DAT_TMO);
+}
+SDC_CMD_STATUS MSDC_ConfigDMA(kal_uint32 * buffer,kal_uint32 num,msdc_gpd_t * gpd_ptr,kal_bool isLastBuf)
+{
+ kal_uint32 dma_ctl_arg;
+ #define BURST_8Byte 3
+ #define BURST_16Byte 4
+ #define BURST_32Byte 5
+ #define BURST_64Byte 6
+ /*if (gpd_ptr==NULL)
+ {
+ gMSDC_Handle->error=ERR_ARGUMENT;
+ #ifdef MSDC_DEBUG_PRINT
+ dbg_print("[MSDC][ERROR][%s %d]gpd_ptr point to zero\r\n",__FUNCTION__,__LINE__);
+ #endif
+ return ERR_ARGUMENT;
+ }*/
+ //set to DMA mode
+ //BitFieldWrite32((kal_uint32 *)MSDC_CFG, 0, MSDC_CFG_PIO);
+ MSDC_ClearBits32(MSDC_CFG,MSDC_CFG_PIO);
+ gMSDC_Handle->dma_xfer=1;
+ if ((buffer==NULL) && (gpd_ptr != NULL))
+ {
+ /*use link list based DMA */
+
+ #ifdef MSDC_DMA_CHKSUM_EN
+ /*Enable descriptor 's checksum*/
+ MSDC_SET_FIELD(MSDC_DMA_CFG, MSDC_DMA_CFG_DECSEN, 1);
+ #else
+ /*Disable descriptor 's checksum*/
+ MSDC_SET_FIELD(MSDC_DMA_CFG, MSDC_DMA_CFG_DECSEN, 0);
+ #endif
+
+ /*descriptor mode and burst size=64Bytes*/
+ dma_ctl_arg=(BURST_64Byte<<12)|MSDC_DMA_CTL_MODE;
+ MSDC_WriteReg32(MSDC_DMA_CTL,dma_ctl_arg);
+ /*write DMA start address to GPD's physical address*/
+ MSDC_WriteReg32(MSDC_DMA_SA,gpd_ptr);
+ }
+ else if((buffer != NULL)&& (gpd_ptr == NULL))
+ {
+
+ /*use basic DMA*/
+ /*burst size\last buffer*/
+ dma_ctl_arg = (isLastBuf==KAL_TRUE)? ((BURST_64Byte<<12)|MSDC_DMA_CTL_LASTBUF) : (BURST_64Byte<<12);
+ MSDC_WriteReg32(MSDC_DMA_CTL,dma_ctl_arg);
+ /*set xfer size*/
+ MSDC_WriteReg32(MSDC_DMA_LENGTH,num);
+ /*set address*/
+ MSDC_WriteReg32(MSDC_DMA_SA,buffer);
+ }
+ else
+ {
+ //wrong argument
+ }
+ return NO_ERROR;
+}
+SDC_CMD_STATUS MSDC_WaitDMADone()
+{
+ kal_uint32 status;
+ kal_uint32 ints= MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO |
+ MSDC_INTEN_DATCRCERR |MSDC_INTEN_DXFER_DONE |
+ MSDC_INTEN_BD_CS_ERR | MSDC_INTEN_GPD_CS_ERR;
+
+ /*wait DMA done*/
+ kal_retrieve_eg_events(gMSDC_Handle->MSDC_Events,EVENT_XFER_DONE|EVENT_DMA_DONE,KAL_OR_CONSUME,&status,KAL_SUSPEND);
+ MSDC_STOP_TIMER();
+ MSDC_DEBUG("[MSDC][%s]msdc_int=%x\r\n",__FUNCTION__,gMSDC_Handle->msdc_int);
+ if (gMSDC_Handle->is_timeout)
+ {
+ MSDC_ERR("[MSDC][%s %d]wait DMA done GPT timeout\r\n",__FUNCTION__,__LINE__);
+ msdc_dump_reg();
+ gMSDC_Handle->error=MSDC_GPT_TIMEOUT_ERR;
+ }
+ /*Disable interrupt*/
+ MSDC_ClearBits32(MSDC_INTEN,ints);
+ /*stop dma*/
+ MSDC_STOP_DMA();
+ return gMSDC_Handle->error;
+}
+kal_uint32 MSDC_CheckCardBusy(kal_bool send_stop,kal_uint32 timeout_ms)
+{
+ kal_uint32 start_time,status;
+ kal_uint32 err,count=0;
+ start_time = drv_get_current_time();
+
+ do{
+ err=SD_GetStatus(gSD->mRCA, &status);
+ if(err)
+ {
+ break;
+ }
+ count++;
+ if(count%5000==0)
+ {
+ if(send_stop)
+ {
+ SD_StopTrans();
+ }
+ }
+ }while((!(status&R1_READY_FOR_DATA_8)||(R1_CURRENT_STATE(status)==7))&&(drv_get_duration_ms(start_time) <=timeout_ms));
+ if (!(drv_get_duration_ms(start_time) <=timeout_ms))
+ {
+ MSDC_ERR("[MSDC][%s %d]card busy timeout\r\n",__FUNCTION__,__LINE__);
+ gMSDC_Handle->error=err=ERR_CARD_BUSY_TIMEOUT;
+ }
+ return err;
+}
+/************************************************************************
+* FUNCTION
+* MSDC_DMATransferFinal_In_Callback
+*
+* DESCRIPTION
+* Initialize MSDC's DMA
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+#if defined(MSDC_START_DMA_IN_CALLBACK)
+
+void MSDC_DMATransferFinal_In_Callback(void)
+{
+
+}
+
+kal_uint32 MSDC_DMATransferFinal(void)
+{
+
+}
+#endif
+/*************************************************************************
+* FUNCTION
+* MSDC_DMATransfer
+*
+* DESCRIPTION
+* MSDC using DAM for data transfer
+*
+* PARAMETERS
+* adrs: data buffer
+* count: bytes to be transfered
+* isTx: ture for move data from MSDC to data buffer and vise versa
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+extern kal_bool FTL_isPollingMode();
+void MSDC_DMATransferFirst( kal_bool isWrite,kal_bool isLinkListBuf)
+{
+ kal_uint32 * adrs;
+
+ kal_set_eg_events(gMSDC_Handle->MSDC_Events,0,KAL_AND);
+ if (isLinkListBuf)
+ {
+ /*configure DMA*/
+ MSDC_ConfigDMA(NULL,gMSDC_Handle->total_count,(msdc_gpd_t *)gMSDC_Handle->buf_addr,1);
+ }
+ else
+ {
+ adrs=gMSDC_Handle->buf_addr;
+ #ifdef MSDC_CACHED_SUPPORT
+ if (gMSDC_Handle->isRomSpace)
+ {
+ gMSDC_Handle->trans_count=(gMSDC_Handle->total_count > MSDC_UNCACHED_TRANSFER_SIZE) ? (MSDC_UNCACHED_TRANSFER_SIZE) : gMSDC_Handle->total_count;
+ /*copy from upper application buffer*/
+ if (isWrite)
+ {
+ kal_mem_cpy((void *)msdc_uncachedBuf,(void*)gMSDC_Handle->buf_addr,gMSDC_Handle->trans_count);
+ }
+ adrs=(kal_uint32 *)msdc_uncachedBuf;
+ }
+ else if (gMSDC_Handle->isCachedBuf)
+ {
+ //clear cache
+ gMSDC_Handle->trans_count=(gMSDC_Handle->total_count > MSDC_DMA_BURSTLEN_LIMIT) ? (MSDC_DMA_BURSTLEN_LIMIT) : gMSDC_Handle->total_count;
+ clean_and_invalidate_dcache(CPU_CACHE_LINE_ALIGN_ADDR((kal_uint32)gMSDC_Handle->buf_addr),CPU_CACHE_LINE_ALIGN_LEN((kal_uint32)gMSDC_Handle->buf_addr,gMSDC_Handle->trans_count));
+ Data_Mem_Barrier();
+ }
+ else
+ #endif
+ {
+ gMSDC_Handle->trans_count=(gMSDC_Handle->total_count > MSDC_DMA_BURSTLEN_LIMIT) ? (MSDC_DMA_BURSTLEN_LIMIT) : gMSDC_Handle->total_count;
+ }
+ /*configure DMA*/
+ MSDC_ConfigDMA(adrs,gMSDC_Handle->trans_count,NULL,(gMSDC_Handle->total_count==gMSDC_Handle->trans_count));
+ }
+
+}
+#if !defined(MSDC_START_DMA_IN_CALLBACK)
+kal_uint32 MSDC_DMATransferFinal(kal_bool isWrite,kal_bool isLinkListBuf)
+{
+ kal_uint32 status;
+ while(1)
+ {
+ /*start DMA*/
+ MSDC_StartDMA();
+ /*wait DMA finish*/
+ status=MSDC_WaitDMADone();
+ if (status!=NO_ERROR)
+ {
+ MSDC_ERR("[MSDC][%s %d]INTS<%x>\r\n",__FUNCTION__,__LINE__,gMSDC_Handle->msdc_int);
+ goto done;
+ }
+ if (isLinkListBuf)
+ {
+ MSDC_DEBUG("[MSDC]link list DMA finish\r\n");
+ break;
+ }
+ else
+ {
+ /*copy RX data when use cached buffer*/
+ #ifdef MSDC_CACHED_SUPPORT
+ if (gMSDC_Handle->isCachedBuf)
+ {
+ /*if (!isWrite)
+ {
+ kal_mem_cpy((void *)gMSDC_Handle->buf_addr,(void *)msdc_uncachedBuf,gMSDC_Handle->trans_count);
+ }*/
+ //invalidate_dcache((gMSDC_Handle->buf_addr&~CPU_CACHE_LINE_SIZE_MASK),(gMSDC_Handle->trans_count+CPU_CACHE_LINE_SIZE_MASK)&~CPU_CACHE_LINE_SIZE_MASK);
+ }
+ #endif
+ /*check need do further transfer or not */
+ gMSDC_Handle->total_count-=gMSDC_Handle->trans_count;
+ if (gMSDC_Handle->total_count==0)
+ {
+ gMSDC_Handle->error=NO_ERROR;
+ goto done;
+ }
+ gMSDC_Handle->buf_addr+=gMSDC_Handle->trans_count;
+ MSDC_DMATransferFirst( isWrite,isLinkListBuf);
+ }
+ }
+done:
+
+ return status;
+}
+#endif //!defined(MSDC_START_DMA_IN_CALLBACK)
+
+#endif // DMA
+
+void* GetMsdcHandle(kal_uint8 id)
+{
+ return (void*)&MSDC_Blk[id];
+}
+
+#ifdef R1B_INTERRUPT_MODE
+static void MSDC_R1B_Init()
+{
+
+}
+#endif
+
+// ===========================================================
+// MSDC common lock
+// ===========================================================
+
+#if !defined(__FUE__) && !defined(__UBL__)
+
+void init_MSDC_lock(PMSDC_LOCK_TAG lock, const kal_char *str)
+{
+ if (lock->mtd_mutex == NULL)
+ {
+ strcpy((char *)lock->name, str);
+ lock->mtd_mutex = kal_create_mutex((kal_char *)lock->name);
+ lock->lock_count = 0;
+ lock->owner_id = NULL;
+ }
+}
+
+static kal_uint8 msdc_lock_user = 0;
+
+void get_MSDC_lock(PMSDC_LOCK_TAG lock)
+{
+ if (msdc_lock_user > 0)
+ ;//ASSERT(0); // init debugging purpose
+ else
+ msdc_lock_user ++;
+
+ if ( kal_query_systemInit() || INT_QueryExceptionStatus() )
+ return;
+
+ if (kal_if_hisr() == KAL_TRUE || kal_if_lisr() == KAL_TRUE)
+ {
+ kal_uint32 retaddr0 = 0;
+ GET_RETURN_ADDRESS(retaddr0);
+ EXT_ASSERT(0, retaddr0, 0, 0);
+ }
+
+ if ( kal_get_current_task() == lock->owner_id )
+ {
+ force_ASSERT(0 != lock->lock_count, lock->lock_count, (kal_uint32)lock->owner_id, (kal_uint32)lock->mtd_mutex);
+ lock->lock_count++;
+ }
+ else
+ {
+ if (lock->mtd_mutex == NULL)
+ {
+ init_MSDC_lock(lock, (const kal_char *)lock->name);
+ }
+
+ kal_take_mutex(lock->mtd_mutex);
+ // lock->owner_id = kal_get_task_self_id();
+ lock->owner_id = kal_get_current_task();
+ lock->lock_count++;
+ }
+}
+
+void free_MSDC_lock(PMSDC_LOCK_TAG lock)
+{
+ if (msdc_lock_user != 1)
+ ;//ASSERT(0); // init debugging purpose
+ else
+ msdc_lock_user --;
+
+ if ( kal_query_systemInit() || INT_QueryExceptionStatus() )
+ return;
+
+ if ( kal_get_current_task() == lock->owner_id )
+ {
+ force_ASSERT(lock->lock_count > 0, lock->lock_count, (kal_uint32)lock->owner_id, (kal_uint32)lock->mtd_mutex);
+ lock->lock_count--;
+
+ if (0 == lock->lock_count)
+ {
+ lock->owner_id = NULL;
+
+ if (lock->mtd_mutex != NULL)
+ kal_give_mutex(lock->mtd_mutex);
+ }
+ }
+ else
+ {
+ force_ASSERT(0, (kal_uint32)lock->owner_id, (kal_uint32)kal_get_current_task(), (kal_uint32)lock->mtd_mutex);
+ }
+}
+
+#else /* __FUE__, __UBL__ */
+
+//#define init_MSDC_lock(x)
+
+//#define get_MSDC_lock(x)
+
+//#define free_MSDC_lock(x)
+
+#endif /* !defined(__FUE__) && !defined(__UBL__) */
+
+#ifdef _MSDC_INT_
+
+#ifdef USE_INT26_CARD_DETECTION
+void MSDC_CardDetect_LISR(void)
+{
+
+}
+#endif //USE_INT26_CARD_DETECTION
+
+
+#ifdef DRV_LSD
+kal_uint32 MSDC_CARD_INSERT_COUNTER, MSDC_CARD_REMOVE_COUNTER;
+kal_uint32 notifiedFMT;//this variable is to sync the state, since we only allow FMT get disk infor to be the first operation that access SD
+
+
+void MSDC_LSD_HISR(void)
+{
+
+
+}
+
+void MSDC_unsealMountOperation(void)
+{
+ /*notifiedFMT may be modified by FMT and MMI tasks, but it is no need to protect this, any task that preempt FMT just get mount fail*/
+ if (1 == notifiedFMT) /*FMT may call this function no matter card exits or not*/
+ {
+ notifiedFMT = 2;
+ }
+
+}
+#endif
+
+#if !defined(_MSDC_INTERNAL_CD_INT_PIN_)
+void MSDC_CD_Entry()
+{
+ /* Reverse the polarity */
+ cardDetectionEINTPolarity = !cardDetectionEINTPolarity;
+ EINT_Set_Polarity(MSDC_EINT_NUM, cardDetectionEINTPolarity);
+
+ gMSDC_Handle->mIsChanged=KAL_TRUE;
+
+ /*memory card insertion\removal */
+ if (!cardDetectionEINTPolarity)
+ {
+ gMSDC_Handle->mIsPresent=KAL_FALSE;
+ gMSDC_Handle->mIsInitialized=KAL_FALSE;
+ #ifdef MSDC_MUST_RECORD_PLUGOUT
+ if (KAL_FALSE == gMSDC_Handle->mIsPresent)
+ gMSDC_Handle->MSDC_everPlugOut = KAL_TRUE;
+ #endif//MSDC_MUST_RECORD_PLUGOUT
+
+ MSDC_CRIT("[MSDC]Card Remove(EINT)\r\n");
+ MSDC_DeInit();
+ }
+ else
+ {
+ gMSDC_Handle->mIsPresent=KAL_TRUE;
+ gMSDC_Handle->mIsInitialized=KAL_FALSE;
+
+ MSDC_CRIT("[MSDC]Card Insert(EINT)\r\n");
+ MSDC_Probe();
+ }
+}
+#endif
+
+/*************************************************************************
+* FUNCTION
+* MSDC_INT_Init
+*
+* DESCRIPTION
+* Initialize MSDC's interrupt
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_INT_Init(void)
+{
+ /*create events group*/
+ gMSDC_Handle->MSDC_Events=kal_create_event_group("MSDC Event");
+ /*register HISR*/
+ DRV_Register_HISR(DRV_MSDC_HISR_ID,MSDC_HISR_Entry);
+ /*register LISR*/
+ IRQ_Register_LISR(MD_IRQID_MSDC0,MSDC_LISR,"MSDC ISR");
+ IRQSensitivity(MD_IRQID_MSDC0,LEVEL_SENSITIVE);
+ IRQUnmask(MD_IRQID_MSDC0);
+ /*clear IRQ */
+ MSDC_WriteReg32(MSDC_INT,MSDC_Reg32(MSDC_INT));
+
+ /*register IRQ for card detect*/
+ /*enable card detect interrupt*/
+#if defined(_MSDC_INTERNAL_CD_INT_PIN_)
+ /*enable card detect*/
+ MSDC_SET_FIELD(MSDC_PS, MSDC_PS_CDEN, 1);
+ MSDC_SET_FIELD(MSDC_INTEN, MSDC_INTEN_CDSC, 1);
+#else
+
+ /* Polarity setting, default triggered by low level */
+ cardDetectionEINTPolarity = EINT_DefaultPolarity;
+
+ /* SW debounce time is 300ms */
+ MSDC_debounceTime=30;
+
+ EINT_Mask(MSDC_EINT_NUM); //need check the MSDC_EINT_NO ,unused current time
+
+ /* Level trigger */
+ EINT_Set_Sensitivity(MSDC_EINT_NUM, KAL_FALSE);
+
+ EINT_Registration(MSDC_EINT_NUM,KAL_TRUE,cardDetectionEINTPolarity,MSDC_CD_Entry,KAL_TRUE);
+ EINT_SW_Debounce_Modify(MSDC_EINT_NUM,MSDC_debounceTime);
+ EINT_UnMask(MSDC_EINT_NUM);
+
+#endif
+}
+void MSDC_LISR(void)
+{
+ /*Mask IRQ*/
+ IRQMask(MD_IRQID_MSDC0);
+ /*save IRQ information*/
+ gMSDC_Handle->msdc_int=MSDC_Reg32(MSDC_INT);
+ /*call hisr*/
+ drv_active_hisr(DRV_MSDC_HISR_ID);
+
+}
+
+void MSDC_DatIrqHandle(kal_uint32 intsts)
+{
+ if (intsts & MSDC_INT_XFER_COMPL){
+ gMSDC_Handle->error=NO_ERROR;
+ kal_set_eg_events(gMSDC_Handle->MSDC_Events,EVENT_XFER_DONE,KAL_OR);
+ }
+ else if (intsts & MSDC_INT_DXFER_DONE)
+ {
+
+ gMSDC_Handle->error=NO_ERROR;
+ kal_set_eg_events(gMSDC_Handle->MSDC_Events,EVENT_DMA_DONE,KAL_OR);
+ }
+ else
+ {
+
+ /*mean some error */
+ if (intsts & MSDC_INT_DATCRCERR)
+ {
+ gMSDC_Handle->error=ERR_DAT_CRCERR;
+ MSDC_ERR("[MSDC][%s %d]CMD%d DMA DAT CRCERR!\r\n",__FUNCTION__,
+ __LINE__, gMSDC_Handle->cmd & 0x3F);
+ }
+ else if (intsts & MSDC_INT_DATTMO)
+ {
+ gMSDC_Handle->error=ERR_DAT_TIMEOUT;
+ MSDC_ERR("[MSDC][%s %d]CMD%d DMA DAT TMO!\r\n",__FUNCTION__,
+ __LINE__, gMSDC_Handle->cmd & 0x3F);
+ } else if (intsts & MSDC_INT_BD_CS_ERR) {
+
+ gMSDC_Handle->error = ERR_DAT_TIMEOUT;
+ MSDC_ERR("[MSDC][%s %d]CMD%d DMA BD checksum ERR!\r\n",__FUNCTION__,
+ __LINE__, gMSDC_Handle->cmd & 0x3F);
+ } else if (intsts & MSDC_INT_GPD_CS_ERR) {
+
+ gMSDC_Handle->error = ERR_DAT_TIMEOUT;
+ MSDC_ERR("[MSDC][%s %d]CMD%d DMA GPD checksum ERR!\r\n",__FUNCTION__,
+ __LINE__, gMSDC_Handle->cmd & 0x3F);
+ }
+
+ /*for poll mode exit*/
+ gMSDC_Handle->abort=1;
+
+ if (gMSDC_Handle->dma_xfer)
+ {
+ kal_set_eg_events(gMSDC_Handle->MSDC_Events,EVENT_XFER_DONE,KAL_OR);
+ }
+ }
+}
+void MSDC_CmdIrqHandle(kal_uint32 intsts)
+{
+ if ((intsts&MSDC_INT_CMDRDY)||(intsts&MSDC_INT_ACMDRDY)||(intsts&MSDC_INT_ACMD19_DONE))
+ {
+ gMSDC_Handle->error=NO_ERROR;
+ }
+ else if ((intsts&MSDC_INT_RSPCRCERR)||(intsts&MSDC_INT_ACMDCRCERR))
+ {
+ gMSDC_Handle->error=ERR_CMD_RSPCRCERR;
+ }
+ else if ((intsts&MSDC_INT_ACMDTMO)||(intsts&MSDC_INT_CMDTMO))
+ {
+ gMSDC_Handle->error=ERR_CMD_TIMEOUT;
+ }
+ kal_set_eg_events(gMSDC_Handle->MSDC_Events,EVENT_CMD_DONE,KAL_OR);
+}
+
+void MSDC_CardDetectHandle(kal_uint32 intsts)
+{
+#if defined(_MSDC_INTERNAL_CD_INT_PIN_)
+
+
+ gMSDC_Handle->mIsChanged=KAL_TRUE;
+
+ /*memory card insertion\removal */
+ if (MSDC_Reg32(MSDC_PS)&MSDC_PS_CDSTS)
+ {
+ /*Card detection pin is logic high*/
+ gMSDC_Handle->mIsPresent=KAL_FALSE;
+ gMSDC_Handle->mIsInitialized=KAL_FALSE;
+ #ifdef MSDC_MUST_RECORD_PLUGOUT
+ if (KAL_FALSE == gMSDC_Handle->mIsPresent)
+ gMSDC_Handle->MSDC_everPlugOut = KAL_TRUE;
+ #endif//MSDC_MUST_RECORD_PLUGOUT
+
+ MSDC_CRIT("[MSDC]Card Remove\r\n");
+ MSDC_DeInit();
+
+ }
+ else
+ {
+ /*Card detection pin is logic low*/
+ gMSDC_Handle->mIsPresent=KAL_TRUE;
+ gMSDC_Handle->mIsInitialized=KAL_FALSE;
+
+ MSDC_CRIT("[MSDC]Card Insert\r\n");
+ MSDC_Probe();
+ }
+
+#endif
+}
+
+/*************************************************************************
+* FUNCTION
+* MSDC_HISR_Entry
+*
+* DESCRIPTION
+* Set corresponding enevt and wake up waiting task.
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_HISR_Entry(void)
+{
+ kal_uint32 cmdsts =MSDC_INT_CMDRDY|MSDC_INT_CMDTMO|MSDC_INT_RSPCRCERR;
+ kal_uint32 acmdsts =MSDC_INT_ACMDRDY|MSDC_INT_ACMDTMO|MSDC_INT_ACMDCRCERR|MSDC_INT_ACMD19_DONE;
+ kal_uint32 datsts =MSDC_INT_XFER_COMPL | MSDC_INT_DXFER_DONE |
+ MSDC_INT_DATCRCERR | MSDC_INT_DATTMO |
+ MSDC_INT_BD_CS_ERR | MSDC_INT_GPD_CS_ERR;
+
+ kal_uint32 intsts_pure;
+ kal_uint32 inten, intsts;
+
+ /*Mask IRQ*/
+ IRQMask(MD_IRQID_MSDC0);
+ /*save IRQ information*/
+ gMSDC_Handle->msdc_int=MSDC_Reg32(MSDC_INT);
+
+ intsts_pure=gMSDC_Handle->msdc_int;
+ inten=MSDC_Reg32(MSDC_INTEN);
+
+ intsts=intsts_pure&inten;
+ /*clear all interrupt*/
+ MSDC_WriteReg32(MSDC_INT,intsts);
+ /*data transfer interrupt*/
+ if (intsts&datsts)
+ {
+ MSDC_DatIrqHandle(intsts);
+ }
+ /*command interrupt*/
+ if (intsts&(cmdsts|acmdsts))
+ {
+ MSDC_CmdIrqHandle(intsts);
+ }
+ /*card detect interrupt*/
+ if(intsts & MSDC_INT_CDSC)
+ {
+ MSDC_CardDetectHandle(intsts);
+ }
+ /*mmc interrupt*/
+
+ /*unmask irq*/
+ IRQUnmask(MD_IRQID_MSDC0);
+}
+
+/*************************************************************************
+* FUNCTION
+* MSDC_DMA_Callback
+*
+* DESCRIPTION
+* Call back while DMA has done the data transfer.
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_DMA_Callback(void)
+{
+
+}
+
+#ifdef DRV_MSDC_SHARE_BY_SWITCH
+void MSDC_changeSwContext(sd_select_enum sel)
+{
+ gMSDC_Handle = &MSDC_Blk[sel];
+ gSD = &gSD_blk[sel];
+}
+
+/*
+ this function do not consider race condition issue, caller should make sure this function is called without risk
+ currently, this function is called in sdio_drv.c and sd_drv.c
+*/
+void MSDC_backupHwSetting()
+{
+ /*backup MSDC_CFG, MSDC_IOCON, SDC_CFG*/
+ gMSDC_Handle->setting_MSDC_CFG = MSDC_Reg32(MSDC_CFG);
+ gMSDC_Handle->setting_MSDC_IOCON = MSDC_Reg32(MSDC_IOCON);
+ gMSDC_Handle->setting_SDC_CFG = MSDC_Reg32(SDC_CFG);
+}
+
+void MSDC_retreiveHwSetting()
+{
+ MSDC_WriteReg32(MSDC_CFG, gMSDC_Handle->setting_MSDC_CFG);
+ MSDC_WriteReg32(MSDC_IOCON, gMSDC_Handle->setting_MSDC_IOCON);
+ MSDC_WriteReg32(SDC_CFG, gMSDC_Handle->setting_SDC_CFG);
+}
+#endif
+
+#if defined(__SIM_PLUS__) || defined(DRV_MSDC_DUAL_TCARD_BY_SWITCH)
+void MSDC_Switch_Card(sd_select_enum sel)
+{
+
+}
+#endif
+
+#endif //end of MSDC_INT
+
+
+void MSDC_turnOnVMC(kal_bool turnOnLdo)
+{
+
+}
+
+#if defined(MSDC_TRACE_LEVEL3)
+void MSDC_add_dbg_msg( msdc_dbg_Event event, kal_uint32 data1, kal_uint32 data2)
+{
+
+}
+#endif
+
+#ifdef DRV_MSDC_SD_SDIO_SHARE_BY_SWITCH
+void MSDC_Switch_SDIO(sd_select_enum sel)
+{
+
+
+}
+#endif
+
+#ifdef DRV_MSDC_SD_SDIO_SHARE_BY_SWITCH
+
+/*following should be the value defined in custom files*/
+#define MSDC_SWITCH_2_SD 1
+#define MSDC_SWITCH_2_SDIO 0
+#define MSDC_SWITCH_GPIO 20
+typedef enum
+{
+ MSDC_SWITCH_DIRECTION_SD,
+ MSDC_SWITCH_DIRECTION_SDIO
+} MSDC_SWITCH_DIRECTION;
+
+
+void MSDC_Switch_init()
+{
+
+}
+
+/*
+ direction:
+ 0 : cmmb
+ 1 : sd card
+*/
+
+void MSDC_Switch(sd_select_enum direction)
+{
+
+}
+#endif
+
+
+#else
+#ifdef DRV_LSD
+void MSDC_LSD_HISR(void)
+{
+}
+#endif
+#endif // end of (defined(__MSDC_MS__) || defined(__MSDC_SD_MMC__))
+#endif//!defined(__UBL__) || defined(__CARD_DOWNLOAD__) || defined(__EMMC_BOOTING__)
+
+#else //DRV_MSDC_OFF
+#include "kal_public_api.h" //MSBB change #include "kal_release.h"
+#include "msdc_def.h"
+
+/*
+#include "kal_public_api.h" //MSBB change #include "kal_release.h"
+//RHR REMOVE
+#include "syscomp_config.h"
+#include "task_config.h"
+#include "stacklib.h"
+#include "eint.h"
+#include "fat_fs.h"
+*/
+//RHR
+#include "kal_public_defs.h" //MSBB change #include "stack_common.h"
+#include "kal_public_defs.h" //MSBB change #include "stack_msgs.h"
+#include "kal_public_api.h" //MSBB change #include "app_ltlcom.h"
+#include "intrCtrl.h"
+#include "reg_base.h"
+#include "drvpdn.h"
+//#include "gpt_sw.h"
+#include "drv_comm.h"
+#include "drv_hisr.h"
+#include "msdc_def.h"
+#include "dcl.h"
+
+/* Debug log */
+kal_uint32 MSDC_DebugLevel;
+
+#define LDO_VMC 0
+#define LDO_VMCH 1
+#define LDO_VIO18_PMU 2
+
+static kal_uint32 g_msdc0_io = PMU_VOLT_03_300000_V;
+static kal_uint32 g_msdc0_card = PMU_VOLT_03_300000_V;
+
+static kal_uint32 hwPowerOn(kal_uint32 powerID, PMU_VOLTAGE_ENUM powerVolt)
+{
+ PMU_CTRL_LDO_BUCK_SET_EN pmu_en;
+ PMU_CTRL_LDO_BUCK_SET_VOLTAGE pmu_volsel;
+ DCL_HANDLE handle;
+
+ /* Open PMU handle */
+ handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
+
+ switch(powerID) {
+ case LDO_VMC:
+ /* Set enable control */
+ pmu_en.mod = VMC;
+ pmu_en.enable = 1;
+
+ /* Set voltage */
+ pmu_volsel.mod = VMC;
+ pmu_volsel.voltage = powerVolt;
+
+ DclPMU_Control(handle, LDO_BUCK_SET_VOLTAGE, (DCL_CTRL_DATA_T *)&pmu_volsel);
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&pmu_en);
+
+ break;
+
+ case LDO_VMCH:
+ /* Set enable control */
+ pmu_en.mod = VMCH;
+ pmu_en.enable = 1;
+
+ /* Set voltage */
+ pmu_volsel.mod = VMCH;
+ pmu_volsel.voltage = powerVolt;
+
+ DclPMU_Control(handle, LDO_BUCK_SET_VOLTAGE, (DCL_CTRL_DATA_T *)&pmu_volsel);
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&pmu_en);
+
+ break;
+
+ default:
+ break;
+ }
+
+ /* Close PMU handle */
+ DclPMU_Close(handle);
+
+ return 1;
+}
+
+static kal_uint32 hwPowerDown(kal_uint32 powerID)
+{
+ PMU_CTRL_LDO_BUCK_SET_EN pmu_en;
+ DCL_HANDLE handle;
+
+ /* Open PMU handle */
+ handle = DclPMU_Open(DCL_PMU, FLAGS_NONE);
+
+ switch(powerID) {
+ case LDO_VMC:
+ /* Set enable control */
+ pmu_en.mod = VMC;
+ pmu_en.enable = 0;
+
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&pmu_en);
+ break;
+
+ case LDO_VMCH:
+ /* Set enable control */
+ pmu_en.mod = VMCH;
+ pmu_en.enable = 0;
+
+ DclPMU_Control(handle, LDO_BUCK_SET_EN, (DCL_CTRL_DATA_T *)&pmu_en);
+
+ break;
+
+ default:
+ break;
+ }
+
+ /* Close PMU handle */
+ DclPMU_Close(handle);
+
+ return 1;
+}
+
+static kal_uint32 msdc_ldo_power(kal_uint32 on, kal_uint8 powerId,
+ PMU_VOLTAGE_ENUM powerVolt, kal_uint32 *status)
+{
+ if (on) { // want to power on
+ if (*status == 0) { // can power on
+ hwPowerOn(powerId, powerVolt);
+
+ *status = powerVolt;
+ } else if (*status == powerVolt) {
+ } else { // for sd3.0 later
+
+ hwPowerDown(powerId);
+ hwPowerOn(powerId, powerVolt);
+
+ *status = powerVolt;
+ }
+ } else { // want to power off
+ if (*status != 0) { // has been powerred on
+
+ hwPowerDown(powerId);
+
+ *status = 0;
+ } else {
+ }
+ }
+
+ return 0;
+}
+
+kal_bool MSDC_SetVddPower(kal_bool on, kal_uint32 volt)
+{
+ kal_bool ret =KAL_TRUE;
+
+ if (volt == 3300)
+ {
+ msdc_ldo_power(on, LDO_VMCH, PMU_VOLT_03_300000_V, &g_msdc0_card);
+ }
+ else
+ {
+ ret = KAL_FALSE;
+ }
+
+ return ret;
+}
+
+kal_bool MSDC_SetSignalPower(kal_bool on,kal_uint32 volt)
+{
+ kal_bool ret =KAL_TRUE;
+ if (volt == 3300)
+ {
+ msdc_ldo_power(on, LDO_VMC, PMU_VOLT_03_300000_V, &g_msdc0_io);
+ }
+ else if (volt ==1800)
+ {
+ msdc_ldo_power(on, LDO_VMC, PMU_VOLT_01_800000_V, &g_msdc0_io);
+ }
+ else
+ {
+ ret = KAL_FALSE;
+ }
+
+ return ret;
+}
+
+/*here are dummy API*/
+void MSDC_Initialize(void)
+{
+ /* INIT MSDC debug flag */
+ MSDC_SetDebugLevel(K_WARNIN);
+
+ /* Shut card power and signal power */
+ MSDC_SetVddPower(KAL_FALSE, 3300);
+ MSDC_SetSignalPower(KAL_FALSE, 3300);
+}
+
+void MSDC_PDNControl(kal_bool ON) {}
+int MSDC_GetCardStatus(void * DriveData, int AckType) {return 0;}
+//kal_bool MSDC_GetMediaChanged(void * id) {}
+kal_bool MSDC_GetMediaChanged(sd_select_enum id) {return 0;}
+MSDC_HANDLE MSDC_Blk[SD_NUM];
+MSDC_HANDLE *gMSDC_Handle = &(MSDC_Blk[0]);
+//kal_bool MSDC_everPlugOut;
+
+#endif //DRV_MSDC_OFF