[Feature]Upload Modem source code
Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/driver/storage/mc/src/msdc2.c b/mcu/driver/storage/mc/src/msdc2.c
new file mode 100644
index 0000000..d96043f
--- /dev/null
+++ b/mcu/driver/storage/mc/src/msdc2.c
@@ -0,0 +1,1049 @@
+/*****************************************************************************
+* 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:
+ * ---------
+ * msdc2.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!
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *============================================================================
+ ****************************************************************************/
+#ifndef DRV_MSDC_OFF
+#include "kal_public_api.h" //MSBB change #include "kal_release.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_api.h" //MSBB change #include "app_ltlcom.h" /* Task message communiction */
+#include "syscomp_config.h"
+#include "task_config.h"
+#include "stacklib.h"
+#include "intrCtrl.h"
+#include "reg_base.h"
+#include "drvpdn.h"
+#include "eint.h"
+#include "drv_comm.h"
+#include "msdc_reg_adap.h"
+#include "fat_fs.h"
+#include "dma_hw.h"
+#include "dma_sw.h"
+#include "drv_hisr.h"
+#include "msdc_def.h"
+#include "sd_def.h"
+#if defined(__MSDC2_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_hw.h"
+//#include "gpio_sw.h"
+//#include "sim_hw.h"
+#ifdef __MULTI_BOOT__
+#include "syscomp_config.h"
+#include "multiboot_config.h"
+#endif /*__MULTI_BOOT__*/
+//#include "sim_hw.h"
+
+#if defined(__MSDC2_SD_MMC__) || defined(__MSDC2_SD_SDIO__)
+
+
+#ifdef __CLKG_DEFINE__
+#ifdef DRVPDN_CON0
+#error "__CLKG_DEFINE__ & DRVPDN_CON0 are all defined"
+#else
+#define DRVPDN_CON0 CG_CON0
+#endif
+
+#ifdef DRVPDN_CON1_SIM
+#error "__CLKG_DEFINE__ & DRVPDN_CON1_SIM are all defined"
+#else
+#define DRVPDN_CON1_SIM CG_CON1_SIM
+#endif
+
+#ifdef DRVPDN_CON0_MSDC2
+#error "__CLKG_DEFINE__ & DRVPDN_CON0_MSDC2 are all defined"
+#else
+#define DRVPDN_CON0_MSDC2 CG_CON0_MSDC2
+#endif
+
+#ifdef DRVPDN_CON0_CLR
+#error "__CLKG_DEFINE__ & DRVPDN_CON0_CLR are all defined"
+#else
+#define DRVPDN_CON0_CLR CG_CLR0
+#endif
+
+#ifdef DRVPDN_CON0_SET
+#error "__CLKG_DEFINE__ & DRVPDN_CON0_SET are all defined"
+#else
+#define DRVPDN_CON0_SET CG_SET0
+#endif
+#endif
+
+
+
+
+#pragma arm section zidata = "NONCACHEDZI", rwdata = "NONCACHEDRW"
+kal_uint32 MSDC_Sector2[128] = {0};
+MSDC_HANDLE *msdc2_handle = &MSDC_Blk[SD_MSDC2];
+
+#ifdef MSDC_CACHED_SUPPORT
+kal_uint32 msdc_uncachedBuf2[MSDC_UNCACHED_BUF_SIZE/4];
+#endif
+#pragma arm section zidata, rwdata
+
+// function predeclaration
+void MSDC_DMAInit2(void);
+void MSDC_INT_Init2(void);
+void MSDC_DMA_Callback2(void);
+extern void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
+extern boot_mode_type stack_query_boot_mode(void);
+extern kal_bool INT_USBBoot(void);
+extern kal_uint32 MSDC_GetCustom(void);
+/*************************************************************************
+* FUNCTION
+* MSDC_SetClock
+*
+* DESCRIPTION
+*
+* PARAMETERS
+* clock: the desired operating clock rate in the unit of kHz
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*************************************************************************/
+void MSDC_SetClock2(kal_uint32 clock)
+{
+ kal_uint32 cfg;
+
+ if(clock == 0)
+ return;
+ MSDC_LSD_ClearBits32(SDC_CFG2,SDC_CFG_SIEN);
+ cfg = ((msdc2_handle->msdc_clock+clock-1)/clock);
+ if(cfg <=2 )
+ {
+ cfg = 0;
+ msdc2_handle->op_clock = msdc2_handle->msdc_clock/2;
+ }
+ else
+ {
+ cfg = (cfg >> 2) + (cfg&3 != 0);
+ msdc2_handle->op_clock = msdc2_handle->msdc_clock/(4*cfg);
+ }
+ BitFieldWrite32((kal_uint32*)MSDC_CFG2,(kal_uint32)cfg,MSDC_CFG_SCLKF);
+ MSDC_LSD_SetBits32(SDC_CFG2,SDC_CFG_SIEN);
+
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_Check_Card_Present2
+*
+* DESCRIPTION
+* c
+*
+* PARAMETERS
+* ON: turn on power saving or not
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+kal_bool MSDC_Check_Card_Present2(void)
+{
+#if !defined(__MSDC_NOT_SUPPORT_HOT_PLUG__)
+ return msdc2_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
+*
+*
+*************************************************************************/
+void MSDC_PDNControl2(kal_bool ON)
+{
+ msdc2_handle->mIsPWDown = ON;
+ if(ON)
+ { // OFF
+ MSDC_CLR_INT2();
+ MSDC_CLR_INT2();
+ #if defined(MSDC_USE_USB_CLK) && defined(__MSDC2_SD_MMC__)
+ if(gSD_blk[SD_MSDC2].flags & SD_FLAG_USE_USB_CLK)
+ UPLL_Disable(UPLL_OWNER_MSDC2);
+ #endif
+ DRVPDN_Enable(DRVPDN_CON0,DRVPDN_CON0_MSDC2,PDN_MSDC2);
+ }
+ else
+ { // ON
+ DRVPDN_Disable(DRVPDN_CON0,DRVPDN_CON0_MSDC2,PDN_MSDC2);
+ #if defined(MSDC_USE_USB_CLK) && defined(__MSDC2_SD_MMC__)
+ if(gSD_blk[SD_MSDC2].flags & SD_FLAG_USE_USB_CLK)
+ UPLL_Enable(UPLL_OWNER_MSDC2);
+ #endif
+ }
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_TimeOutHandler2
+*
+* DESCRIPTION
+* Callback function of gpt timer, and launched while MSDC busy for a while
+
+*
+* PARAMETERS
+*
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_TimeOutHandler2(void *parameter)
+{
+ tst_sys_trace("MSDC_TimeOutHandler2");
+ msdc2_handle->is_timeout = KAL_TRUE;
+ #if defined(__MSDC_MS__)||defined(__MSDC_MSPRO__)
+ kal_set_eg_events(msdc2_handle->MSDC_Events,
+ (EVENT_MSIFIRQ|EVENT_DMAIRQ|EVENT_MSRDYIRQ),
+ KAL_OR);
+ #else
+ kal_set_eg_events(msdc2_handle->MSDC_Events,
+ (EVENT_SDCMDIRQ|EVENT_SDDATIRQ|EVENT_SDMCIRQ|EVENT_SDR1BIRQ|EVENT_DMAIRQ),
+ KAL_OR);
+ #endif
+}
+
+
+/*************************************************************************
+* FUNCTION
+* MSDC_GetCardStatus
+*
+* DESCRIPTION
+* Check currently card is present or not.
+*
+* PARAMETERS
+*
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+* msdc_eint_state
+*
+*
+*************************************************************************/
+int MSDC_GetCardStatus2(void * DriveData, int AckType)
+{
+ MSDC_HANDLE *msdc = (MSDC_HANDLE *)DriveData;;
+
+ // a debounce mechanism
+ if(kal_query_systemInit() == KAL_FALSE)
+ {
+ kal_sleep_task(100);
+ }
+ ENTER_CRITICAL();
+ msdc->send_ilm = KAL_TRUE;
+ EXIT_CRITICAL();
+
+
+ if(!msdc->mIsPresent)
+ MSDC_PDNControl2(KAL_TRUE);
+ return 0;
+}
+
+
+/*************************************************************************
+* 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_WP2(msdc_ioctrl_enum ins, msdc_ioctrl_enum wp)
+{
+ kal_uint32 msdc_cfg,iocon;
+
+ msdc2_handle->ins_level = ins;
+ //#if defined(MT6218B) || defined(MT6217)
+ // INS use PRCFG3, WP use PRCFG0
+ MSDC_SetData32(MSDC_CFG2, MSDC_CFG_PRCFG0, (wp << 22));
+ MSDC_SetData32(MSDC_IOCON2, MSDC_IOCON_PRCFG3, (ins << 8));
+}
+/*************************************************************************
+* 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
+*
+*************************************************************************/
+void MSDC_Initialize2(void)
+{
+
+ // turn on the power of controler
+ DRVPDN_Disable(DRVPDN_CON0,DRVPDN_CON0_MSDC2,PDN_MSDC2);
+#if defined(__MSDC_MS__)
+ MSDC_LSD_ClearBits32(MSDC_CFG2, MSDC_CFG_MSDC);
+ msdc2_handle->mMSDC_type = MS_CARD;
+#elif defined(__MSDC_MSPRO__)
+ MSDC_LSD_ClearBits32(MSDC_CFG2, MSDC_CFG_MSDC);
+ msdc2_handle->mMSDC_type = MSPRO_CARD;
+ FS_MspDrvAll = FS_MspDrv;
+#elif (defined(__MSDC2_SD_MMC__) || defined(__MSDC2_SD_SDIO__))
+ MSDC_LSD_SetBits32(MSDC_CFG2, MSDC_CFG_MSDC) ;
+ msdc2_handle->mMSDC_type = SD_CARD;
+#endif
+ msdc2_handle->msdc_clock = MSDC_CLOCK;
+
+ if(msdc2_handle->gpt_handle == 0)
+ MSDC_GPTI_GetHandle(&msdc2_handle->gpt_handle);
+ #if !defined(__MSDC_TFLASH_DAT3_1BIT_HOT_PLUG__)
+ MSDC_Config_INS_WP2(MSDC_IOCTRL_PULL_UP,MSDC_IOCTRL_PULL_UP);
+ #else
+ MSDC_Config_INS_WP2(MSDC_IOCTRL_PULL_DOWN,MSDC_IOCTRL_PULL_UP);
+ // first time if card is present, no card insertion interrupt generated
+ msdc2_handle->mIsPresent = KAL_TRUE;
+ #endif
+ // turn on the power of memory card
+ MSDC_LSD_SetBits32(MSDC_CFG2,MSDC_CFG_VDDPD);
+ MSDC_SET_FIFO2(1);
+
+ if(MSDC_GetCustom() & MSDC2_HOT_PLUG)
+ {
+ // enable card detection
+ MSDC_WriteReg32(MSDC_PS2, MSDC_PS_CDEN|MSDC_PS_PIEN0|MSDC_PS_POEN0);
+ if(MSDC_Reg(MSDC_PS2) & MSDC_PS_PIN0)
+ {
+ if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
+ msdc2_handle->mIsPresent = KAL_FALSE;
+ else
+ msdc2_handle->mIsPresent = KAL_TRUE;
+ }
+ else
+ {
+ if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
+ msdc2_handle->mIsPresent = KAL_TRUE;
+ else
+ msdc2_handle->mIsPresent = KAL_FALSE;
+ }
+ MSDC_LSD_SetBits32(MSDC_CFG2, MSDC_CFG_PINEN);
+ }
+ else
+ {
+ msdc2_handle->mIsPresent = KAL_TRUE;
+ }
+
+ #ifdef MSDC_INT
+ MSDC_INT_Init2();
+ #endif // end of MSDC_INT
+ #ifdef MSDC_DMA
+ MSDC_DMAInit2();
+ #endif
+ #ifdef __MULTI_BOOT__
+ if(stack_query_boot_mode() != NORMAL_BOOT)
+ msdc2_handle->send_ilm = KAL_FALSE;
+ else
+ msdc2_handle->send_ilm = KAL_TRUE;
+ #else
+ msdc2_handle->send_ilm = KAL_FALSE;
+ #endif
+
+ DRVPDN_Enable(DRVPDN_CON0,DRVPDN_CON0_MSDC2,PDN_MSDC2);
+}
+
+void MSDC_SetIOCONRegDLT2(void)
+{
+ kal_uint32 factor;
+
+ /*set DLT field according to SCLKF seeting*/
+ factor = msdc2_handle->msdc_clock/msdc2_handle->op_clock;
+ BitFieldWrite32((kal_uint32*)MSDC_IOCON2,(kal_uint32)(factor/2),MSDC_IOCON_DLT);
+}
+
+/*************************************************************************
+* FUNCTION
+* MSDC_GetMediaChanged
+*
+* DESCRIPTION
+* Check if the media is changed, and clear the status after function call
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+/*! combined to MSDC_GetMediaChanged(), and removed in HAL [20101203 Samuel]
+kal_bool MSDC_GetMediaChanged2(void* id)
+{
+ kal_bool ret;
+
+ ENTER_CRITICAL();
+ msdc2_handle = (MSDC_HANDLE *)id;
+ ret = (msdc2_handle->mIsChanged )?(KAL_TRUE):(KAL_FALSE);
+ msdc2_handle->mIsChanged = KAL_FALSE;
+ EXIT_CRITICAL();
+
+ return ret;
+}
+*/
+
+#ifdef MSDC_DMA
+extern kal_uint8 DMA_GetChannel(DMA_Master DMA_CODE);
+/*************************************************************************
+* FUNCTION
+* MSDC_DMAInit
+*
+* DESCRIPTION
+* Initialize MSDC's DMA
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_DMAInit2(void)
+{
+ msdc2_handle->msdc_dmaport = DMA_GetChannel(DMA_MSDC2);
+ msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_TRUE;
+ msdc2_handle->msdc_menu.TMOD.cycle = 0x4;
+ msdc2_handle->msdc_menu.master = DMA_MSDC2;
+ msdc2_handle->msdc_menu.addr = NULL;
+ msdc2_handle->msdc_input.type = DMA_HWRX;
+ msdc2_handle->msdc_input.size = DMA_LONG;
+ msdc2_handle->msdc_input.count = 0;
+ msdc2_handle->msdc_input.menu = &msdc2_handle->msdc_menu;
+}
+
+/*************************************************************************
+* 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
+*
+*
+*************************************************************************/
+void MSDC_DMATransferFirst2(kal_uint32 adrs,kal_uint32 count, kal_bool isTx)
+{
+ kal_uint32 total_count;
+ kal_bool is_aligned, is_poll;
+
+ DMA_Stop(msdc2_handle->msdc_dmaport);
+
+#ifdef MSDC_CACHED_SUPPORT
+ if (KAL_TRUE == msdc2_handle->isCachedBuf){
+ msdc2_handle->msdc_menu.addr = (kal_uint32)msdc_uncachedBuf2;
+ msdc2_handle->cachedBufCopyPtr = adrs;
+ }
+ else
+#endif
+ msdc2_handle->msdc_menu.addr = adrs;
+
+
+ if(isTx)
+ {
+ msdc2_handle->timeout_period = (50 + (count>>5));
+ msdc2_handle->msdc_input.type = DMA_HWTX;
+ if(count <= MSDC_WRITE_THD_POLL)
+ {
+ msdc2_handle->msdc_input.callback = NULL;
+ is_poll = KAL_TRUE;
+ }
+ else
+ {
+ msdc2_handle->msdc_input.callback = MSDC_DMA_Callback2;
+ is_poll = KAL_FALSE;
+ }
+ }
+ else
+ {
+ msdc2_handle->timeout_period = (50 + (count>>7));
+ msdc2_handle->msdc_input.type = DMA_HWRX;
+ if(count <= MSDC_READ_THD_POLL)
+ {
+ msdc2_handle->msdc_input.callback = NULL;
+ is_poll = KAL_TRUE;
+ }
+ else
+ {
+ msdc2_handle->msdc_input.callback = MSDC_DMA_Callback2;
+ is_poll = KAL_FALSE;
+ }
+ }
+
+ if(kal_query_systemInit() == KAL_TRUE
+#ifdef __TST_WRITE_TO_FILE_ONLY__ /*error recording: considering error recording additionally*/
+ || (KAL_TRUE == INT_QueryExceptionStatus())
+#endif
+ )
+ {
+ msdc2_handle->msdc_input.callback = NULL;
+ is_poll = KAL_TRUE;
+ }
+
+#ifndef MSDC_CACHED_SUPPORT
+ if(adrs%4 == 0)
+ {
+ is_aligned = KAL_TRUE;
+ total_count = count;
+ }
+ else
+ {
+ is_aligned = KAL_FALSE;
+ total_count = count<<2;
+ }
+#else
+ if(adrs%4 == 0 || KAL_TRUE == msdc2_handle->isCachedBuf)
+ {
+ is_aligned = KAL_TRUE;
+ total_count = count;
+ }
+ else
+ {
+ is_aligned = KAL_FALSE;
+ total_count = count<<2;
+ }
+#endif
+ msdc2_handle->total_count = total_count;
+ msdc2_handle->is_poll = is_poll;
+ msdc2_handle->is_aligned = is_aligned;
+ {
+ if(is_aligned)
+ {
+ #if defined(USE_DMA_BURST)
+ MSDC_SET_FIFO2(4);
+ #else
+ msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_FALSE;
+ #endif
+#ifdef MSDC_CACHED_SUPPORT
+ if(KAL_TRUE == msdc2_handle->isCachedBuf)
+ msdc2_handle->msdc_input.count = (total_count > MSDC_UNCACHED_TRASNFER_SIZE)?(MSDC_UNCACHED_TRASNFER_SIZE):(total_count);
+ else
+#endif
+ msdc2_handle->msdc_input.count = (total_count > 65024)?(65024):(total_count);
+#ifdef MSDC_CACHED_SUPPORT
+ if(KAL_TRUE == msdc2_handle->isCachedBuf){
+ /*have do memory copy stuff here*/
+ if(DMA_HWTX == msdc2_handle->msdc_input.type){
+ /*copy from upper application buffer*/
+ kal_mem_cpy(msdc_uncachedBuf2, (void *)msdc2_handle->cachedBufCopyPtr, 4 * msdc2_handle->msdc_input.count);
+ msdc2_handle->cachedBufCopyPtr += msdc2_handle->msdc_input.count * 4;
+ }
+ }
+#endif
+ msdc2_handle->msdc_input.size = DMA_LONG;
+ DMA_Config_B2W(msdc2_handle->msdc_dmaport,&msdc2_handle->msdc_input,KAL_TRUE,KAL_FALSE);
+ msdc2_handle->msdc_menu.addr += msdc2_handle->msdc_input.count*4;
+ }
+ else
+ {
+#ifdef MSDC_CACHED_SUPPORT
+ if(KAL_TRUE == msdc2_handle->isCachedBuf)
+ ASSERT(0);
+#endif
+ #if defined(USE_DMA_BURST)
+ MSDC_SET_FIFO2(1);
+ #else
+
+ msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_TRUE;
+ #endif
+ msdc2_handle->msdc_input.count = (total_count > 65024)?(65024):(total_count);
+ msdc2_handle->msdc_input.size = DMA_BYTE;
+ DMA_Config_B2W(msdc2_handle->msdc_dmaport,&msdc2_handle->msdc_input,KAL_TRUE,KAL_TRUE);
+ msdc2_handle->msdc_menu.addr += msdc2_handle->msdc_input.count;
+ }
+
+ }
+}
+kal_uint32 MSDC_DMATransferFinal2(void)
+{
+ kal_uint32 total_count = msdc2_handle->total_count, t1;
+ kal_bool is_poll = msdc2_handle->is_poll;
+ kal_bool is_aligned = msdc2_handle->is_aligned;
+
+ t1 = drv_get_current_time();
+ if(msdc2_handle->timeout_period > MSDC_TIMEOUT_PERIOD_DAT)
+ msdc2_handle->timeout_period = MSDC_TIMEOUT_PERIOD_DAT;
+ MSDC_START_TIMER2(msdc2_handle->timeout_period);
+ if(is_poll)
+ {
+ while(IS_MSDC_DMA_RUN(msdc2_handle->msdc_dmaport) && MSDC_Check_Card_Present2() && !msdc2_handle->is_timeout)
+ {
+ if(drv_get_duration_ms(t1) > MSDC_TIMEOUT_PERIOD_DAT*11)
+ msdc2_handle->is_timeout = KAL_TRUE;
+ }
+ }
+ else
+ {
+ kal_uint32 flags;
+ kal_retrieve_eg_events(msdc2_handle->MSDC_Events,(EVENT_DMAIRQ),KAL_OR_CONSUME,&flags,KAL_SUSPEND);
+ }
+ MSDC_STOP_TIMER2();
+ if(IS_MSDC_DMA_RUN(msdc2_handle->msdc_dmaport) && msdc2_handle->is_timeout)
+ return MSDC_GPT_TIMEOUT_ERR;
+
+ total_count -= msdc2_handle->msdc_input.count;
+ if(total_count == 0){
+#ifdef MSDC_CACHED_SUPPORT
+ if(KAL_TRUE == msdc2_handle->isCachedBuf){
+ if(DMA_HWRX == msdc2_handle->msdc_input.type){
+ /*copy to upper application's buffer*/
+ kal_mem_cpy((void *)msdc2_handle->cachedBufCopyPtr, msdc_uncachedBuf2, 4 * msdc2_handle->msdc_input.count);
+ }
+ }
+#endif
+ return MSDC_NOERROR;
+ }
+
+#ifdef MSDC_CACHED_SUPPORT
+ if(KAL_TRUE == msdc2_handle->isCachedBuf){
+ /*have do memory copy stuff here*/
+ if(DMA_HWTX == msdc2_handle->msdc_input.type){
+ /*copy from upper application buffer*/
+ kal_mem_cpy(msdc_uncachedBuf2, (void *)msdc2_handle->cachedBufCopyPtr, 4 * msdc2_handle->msdc_input.count);
+ }
+ else{
+ /*copy to upper application's buffer*/
+ kal_mem_cpy((void *)msdc2_handle->cachedBufCopyPtr, msdc_uncachedBuf2, 4 * msdc2_handle->msdc_input.count);
+ }
+ msdc2_handle->cachedBufCopyPtr += msdc2_handle->msdc_input.count * 4;
+ }
+#endif
+ while(1)
+ {
+ if(is_aligned)
+ {
+ #if defined(USE_DMA_BURST)
+ MSDC_SET_FIFO(4);
+ #else
+ msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_FALSE;
+ #endif
+#ifdef MSDC_CACHED_SUPPORT
+ if(KAL_TRUE == msdc2_handle->isCachedBuf)
+ msdc2_handle->msdc_input.count = (total_count > MSDC_UNCACHED_TRASNFER_SIZE)?(MSDC_UNCACHED_TRASNFER_SIZE):(total_count);
+ else
+#endif
+ msdc2_handle->msdc_input.count = (total_count > 65024)?(65024):(total_count);
+ msdc2_handle->msdc_input.size = DMA_LONG;
+ DMA_Config_B2W(msdc2_handle->msdc_dmaport,&msdc2_handle->msdc_input,KAL_TRUE,KAL_FALSE);
+#ifdef MSDC_CACHED_SUPPORT
+ /*we don't need to increase the addr when encounter cached buffer, since we only have a fix size uncached buffer to use*/
+ if(KAL_FALSE == msdc2_handle->isCachedBuf)
+#endif
+ {
+ msdc2_handle->msdc_menu.addr += msdc2_handle->msdc_input.count*4;
+ }
+ msdc2_handle->timeout_period = 1 + (msdc2_handle->msdc_input.count>>7);
+ }
+ else
+ {
+#ifdef MSDC_CACHED_SUPPORT
+ if(KAL_TRUE == msdc2_handle->isCachedBuf)
+ ASSERT(0);
+#endif
+ #if defined(USE_DMA_BURST)
+ MSDC_SET_FIFO(1);
+ #else
+ msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_TRUE;
+ #endif
+ msdc2_handle->msdc_input.count = (total_count > 65024)?(65024):(total_count);
+ msdc2_handle->msdc_input.size = DMA_BYTE;
+ DMA_Config_B2W(msdc2_handle->msdc_dmaport,&msdc2_handle->msdc_input,KAL_TRUE,KAL_TRUE);
+ msdc2_handle->msdc_menu.addr += msdc2_handle->msdc_input.count;
+ msdc2_handle->timeout_period = 1 + (msdc2_handle->msdc_input.count>>9);
+ }
+
+ // wait until running bit clr
+ if(msdc2_handle->msdc_input.type == DMA_HWTX)
+ msdc2_handle->timeout_period <<= 2 ;
+ if(msdc2_handle->mMSDC_type == MMC_CARD)
+ msdc2_handle->timeout_period <<= 1;
+
+ t1 = drv_get_current_time();
+ MSDC_START_TIMER2(msdc2_handle->timeout_period);
+ if(is_poll)
+ {
+ while(IS_MSDC_DMA_RUN(msdc2_handle->msdc_dmaport) && MSDC_Check_Card_Present2() && !msdc2_handle->is_timeout)
+ {
+ if(drv_get_duration_ms(t1) > msdc2_handle->timeout_period*11)
+ msdc2_handle->is_timeout = KAL_TRUE;
+ }
+ }
+ else
+ {
+ kal_uint32 flags;
+ kal_retrieve_eg_events(msdc2_handle->MSDC_Events,(EVENT_DMAIRQ),KAL_OR_CONSUME,&flags,KAL_SUSPEND);
+ }
+ MSDC_STOP_TIMER2();
+ if(IS_MSDC_DMA_RUN(msdc2_handle->msdc_dmaport) && msdc2_handle->is_timeout)
+ return MSDC_GPT_TIMEOUT_ERR;
+ total_count -= msdc2_handle->msdc_input.count;
+ if(total_count == 0)
+ break;
+#ifdef MSDC_CACHED_SUPPORT
+ if(KAL_TRUE == msdc2_handle->isCachedBuf){
+ /*have do memory copy stuff here*/
+ if(DMA_HWTX == msdc2_handle->msdc_input.type){
+ /*copy from upper application buffer*/
+ kal_mem_cpy(msdc_uncachedBuf2, (void *)msdc2_handle->cachedBufCopyPtr, 4 * msdc2_handle->msdc_input.count);
+ }
+ else{
+ /*copy to upper application's buffer*/
+ kal_mem_cpy((void *)msdc2_handle->cachedBufCopyPtr, msdc_uncachedBuf2, 4 * msdc2_handle->msdc_input.count);
+ }
+ msdc2_handle->cachedBufCopyPtr += msdc2_handle->msdc_input.count * 4;
+ }
+#endif
+ }
+
+#ifdef MSDC_CACHED_SUPPORT
+ if(KAL_TRUE == msdc2_handle->isCachedBuf){
+ if(DMA_HWRX == msdc2_handle->msdc_input.type){
+ /*copy to upper application's buffer*/
+ kal_mem_cpy((void *)msdc2_handle->cachedBufCopyPtr, msdc_uncachedBuf2, 4 * msdc2_handle->msdc_input.count);
+ }
+ }
+#endif
+ return MSDC_NOERROR;
+}
+
+
+#endif // DMA
+
+#ifdef MSDC_INT
+/*************************************************************************
+* FUNCTION
+* MSDC_INT_Init
+*
+* DESCRIPTION
+* Initialize MSDC's interrupt
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_INT_Init2(void)
+{
+
+ msdc2_handle->MSDC_Events = kal_create_event_group("MSDC2");
+ DRV_Register_HISR(DRV_MSDC2_HISR_ID, MSDC_HISR_Entry2);
+ IRQ_Register_LISR(IRQ_MSDC2_CODE, MSDC_LISR2,"MSDC_LISR2");
+ IRQSensitivity(IRQ_MSDC2_CODE,LEVEL_SENSITIVE);
+ IRQUnmask(IRQ_MSDC2_CODE);
+
+ // enable MSDC interrupt
+ MSDC_CLR_INT();
+ #if !defined(MSDC_USE_INT)
+ MSDC_DISABLE_INT2();// (active)turn off other interrupt event except pin interrupt
+ #else
+ MSDC_ENABLE_INT2();// (deactive)
+ #endif
+
+}
+void MSDC_LISR2(void)
+{
+ IRQMask(IRQ_MSDC2_CODE);
+ drv_active_hisr(DRV_MSDC2_HISR_ID);
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_HISR_Entry
+*
+* DESCRIPTION
+* Set corresponding enevt and wake up waiting task.
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_HISR_Entry2(void)
+{
+ kal_uint16 msdc_int = 0;
+
+#if defined(__MSDC_MS__)||defined(__MSDC_MSPRO__)
+ kal_uint16 msc_sta;
+
+ FS_MspDrvAll = FS_MspDrv;
+ TurnOnMSDC2();
+ msc_sta = MSDC_Reg(MSC_STA2);
+ if(msc_sta & MSC_STA_SIF)
+ kal_set_eg_events(msdc2_handle->MSDC_Events,EVENT_MSIFIRQ,KAL_OR);
+ else
+ kal_set_eg_events(msdc2_handle->MSDC_Events,EVENT_MSRDYIRQ,KAL_OR);
+
+ msdc_int = MSDC_Reg(MSDC_INTR);
+ if(msdc_int & MSDC_INT_PINIRQ)
+ {
+ msdc2_handle->mIsInitialized = KAL_FALSE;
+ msdc2_handle->mIsChanged = KAL_TRUE;
+ kal_set_eg_events(msdc2_handle->MSDC_Events,
+ (EVENT_MSIFIRQ|EVENT_DMAIRQ|EVENT_MSRDYIRQ),
+ KAL_OR);
+ if(MSDC_Reg(MSDC_PS2) & MSDC_PS_PIN0)
+ {
+ if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
+ msdc2_handle->mIsPresent = KAL_FALSE;
+ else
+ msdc2_handle->mIsPresent = KAL_TRUE;
+ }
+ else
+ {
+ if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
+ msdc2_handle->mIsPresent = KAL_TRUE;
+ else
+ msdc2_handle->mIsPresent = KAL_FALSE;
+ }
+ if(msdc2_handle->mIsPresent == KAL_FALSE)
+ {
+ MSDC_CLR_FIFO2();
+ MSDC_CLR_INT2();
+ MSDC_CLR_INT2();
+ DMA_Stop(msdc2_handle->msdc_dmaport);
+ }
+ #if !defined(FMT_NOT_PRESENT)
+ MSDC_SendCardInd(MOD_FMT, SD_MSDC2);
+ #endif
+ }
+#else // sd/mmc start here
+ TurnOnMSDC2();
+ msdc_int = MSDC_Reg(MSDC_INTR2);
+ #if defined(__MSDC2_SD_MMC__)&&defined(__MSDC_SD_SDIO__)
+ /*SDIO*/
+ if(msdc_int & MSDC_INT_SDIOIRQ)
+ {
+ SDIO_HISR_Entry();
+ }
+ #endif
+
+ if(msdc_int & MSDC_INT_PINIRQ)
+ {
+ msdc2_handle->mIsInitialized = KAL_FALSE;
+ msdc2_handle->mIsChanged = KAL_TRUE;
+ if(MSDC_Reg(MSDC_PS2) & MSDC_PS_PIN0)
+ {
+ if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
+ msdc2_handle->mIsPresent = KAL_FALSE;
+ else
+ msdc2_handle->mIsPresent = KAL_TRUE;
+ }
+ else
+ {
+ if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
+ msdc2_handle->mIsPresent = KAL_TRUE;
+ else
+ msdc2_handle->mIsPresent = KAL_FALSE;
+ }
+ if(msdc2_handle->mIsPresent == KAL_FALSE)
+ {
+ MSDC_CLR_FIFO2();
+ MSDC_CLR_INT2();
+ MSDC_CLR_INT2();
+ DMA_Stop(msdc2_handle->msdc_dmaport);
+ }
+ #if !defined(FMT_NOT_PRESENT)
+ MSDC_SendCardInd(MOD_FMT, SD_MSDC2);
+ #endif
+ }
+ #endif // MSDC_MS
+ IRQUnmask(IRQ_MSDC2_CODE);
+}
+/*************************************************************************
+* FUNCTION
+* MSDC_DMA_Callback
+*
+* DESCRIPTION
+* Call back while DMA has done the data transfer.
+*
+* PARAMETERS
+*
+* RETURNS
+*
+* GLOBALS AFFECTED
+*
+*
+*************************************************************************/
+void MSDC_DMA_Callback2(void)
+{
+ kal_set_eg_events(msdc2_handle->MSDC_Events,EVENT_DMAIRQ,KAL_OR);
+}
+
+#endif //end of MSDC_INT
+#endif // end of (defined(__MSDC_MS__) || defined(__MSDC_SD_MMC__)) && defined(__MSDC2_SD_MMC__)
+
+#endif //DRV_MSDC_OFF