blob: d96043f74e0cb05394adf0a6b5fe1313ae2f5d1f [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*****************************************************************************
37 *
38 * Filename:
39 * ---------
40 * msdc2.c
41 *
42 * Project:
43 * --------
44 * Maui_Software
45 *
46 * Description:
47 * ------------
48 * driver functons for MSDC controller
49 *
50 *
51 * Author:
52 * -------
53 * -------
54 *
55 *============================================================================
56 * HISTORY
57 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
58 *------------------------------------------------------------------------------
59 * removed!
60 * removed!
61 * removed!
62 * removed!
63 * removed!
64 * removed!
65 * removed!
66 * removed!
67 * removed!
68 * removed!
69 * removed!
70 *
71 * removed!
72 * removed!
73 * removed!
74 *
75 * removed!
76 * removed!
77 * removed!
78 *
79 * removed!
80 * removed!
81 * removed!
82 *
83 * removed!
84 * removed!
85 * removed!
86 *
87 * removed!
88 * removed!
89 * removed!
90 *
91 * removed!
92 * removed!
93 * removed!
94 *
95 * removed!
96 * removed!
97 * removed!
98 *
99 * removed!
100 * removed!
101 * removed!
102 *
103 * removed!
104 * removed!
105 * removed!
106 *
107 * removed!
108 * removed!
109 * removed!
110 *
111 * removed!
112 * removed!
113 * removed!
114 *
115 * removed!
116 * removed!
117 * removed!
118 *
119 * removed!
120 * removed!
121 * removed!
122 *------------------------------------------------------------------------------
123 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
124 *============================================================================
125 ****************************************************************************/
126#ifndef DRV_MSDC_OFF
127#include "kal_public_api.h" //MSBB change #include "kal_release.h"
128#include "kal_public_defs.h" //MSBB change #include "stack_common.h"
129#include "kal_public_defs.h" //MSBB change #include "stack_msgs.h"
130#include "kal_public_api.h" //MSBB change #include "app_ltlcom.h" /* Task message communiction */
131#include "syscomp_config.h"
132#include "task_config.h"
133#include "stacklib.h"
134#include "intrCtrl.h"
135#include "reg_base.h"
136#include "drvpdn.h"
137#include "eint.h"
138#include "drv_comm.h"
139#include "msdc_reg_adap.h"
140#include "fat_fs.h"
141#include "dma_hw.h"
142#include "dma_sw.h"
143#include "drv_hisr.h"
144#include "msdc_def.h"
145#include "sd_def.h"
146#if defined(__MSDC2_SD_MMC__)&&defined(__MSDC_SD_SDIO__)
147#include "sdio_sw.h"
148#endif
149#if defined(__MSDC_MS__)
150#include "ms_def.h"
151#elif defined(__MSDC_MSPRO__)
152#include "mspro_def.h"
153#endif
154#include "upll_ctrl.h"
155//#include "gpio_hw.h"
156//#include "gpio_sw.h"
157//#include "sim_hw.h"
158#ifdef __MULTI_BOOT__
159#include "syscomp_config.h"
160#include "multiboot_config.h"
161#endif /*__MULTI_BOOT__*/
162//#include "sim_hw.h"
163
164#if defined(__MSDC2_SD_MMC__) || defined(__MSDC2_SD_SDIO__)
165
166
167#ifdef __CLKG_DEFINE__
168#ifdef DRVPDN_CON0
169#error "__CLKG_DEFINE__ & DRVPDN_CON0 are all defined"
170#else
171#define DRVPDN_CON0 CG_CON0
172#endif
173
174#ifdef DRVPDN_CON1_SIM
175#error "__CLKG_DEFINE__ & DRVPDN_CON1_SIM are all defined"
176#else
177#define DRVPDN_CON1_SIM CG_CON1_SIM
178#endif
179
180#ifdef DRVPDN_CON0_MSDC2
181#error "__CLKG_DEFINE__ & DRVPDN_CON0_MSDC2 are all defined"
182#else
183#define DRVPDN_CON0_MSDC2 CG_CON0_MSDC2
184#endif
185
186#ifdef DRVPDN_CON0_CLR
187#error "__CLKG_DEFINE__ & DRVPDN_CON0_CLR are all defined"
188#else
189#define DRVPDN_CON0_CLR CG_CLR0
190#endif
191
192#ifdef DRVPDN_CON0_SET
193#error "__CLKG_DEFINE__ & DRVPDN_CON0_SET are all defined"
194#else
195#define DRVPDN_CON0_SET CG_SET0
196#endif
197#endif
198
199
200
201
202#pragma arm section zidata = "NONCACHEDZI", rwdata = "NONCACHEDRW"
203kal_uint32 MSDC_Sector2[128] = {0};
204MSDC_HANDLE *msdc2_handle = &MSDC_Blk[SD_MSDC2];
205
206#ifdef MSDC_CACHED_SUPPORT
207kal_uint32 msdc_uncachedBuf2[MSDC_UNCACHED_BUF_SIZE/4];
208#endif
209#pragma arm section zidata, rwdata
210
211// function predeclaration
212void MSDC_DMAInit2(void);
213void MSDC_INT_Init2(void);
214void MSDC_DMA_Callback2(void);
215extern void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada);
216extern boot_mode_type stack_query_boot_mode(void);
217extern kal_bool INT_USBBoot(void);
218extern kal_uint32 MSDC_GetCustom(void);
219/*************************************************************************
220* FUNCTION
221* MSDC_SetClock
222*
223* DESCRIPTION
224*
225* PARAMETERS
226* clock: the desired operating clock rate in the unit of kHz
227*
228* RETURNS
229*
230* GLOBALS AFFECTED
231*
232*************************************************************************/
233void MSDC_SetClock2(kal_uint32 clock)
234{
235 kal_uint32 cfg;
236
237 if(clock == 0)
238 return;
239 MSDC_LSD_ClearBits32(SDC_CFG2,SDC_CFG_SIEN);
240 cfg = ((msdc2_handle->msdc_clock+clock-1)/clock);
241 if(cfg <=2 )
242 {
243 cfg = 0;
244 msdc2_handle->op_clock = msdc2_handle->msdc_clock/2;
245 }
246 else
247 {
248 cfg = (cfg >> 2) + (cfg&3 != 0);
249 msdc2_handle->op_clock = msdc2_handle->msdc_clock/(4*cfg);
250 }
251 BitFieldWrite32((kal_uint32*)MSDC_CFG2,(kal_uint32)cfg,MSDC_CFG_SCLKF);
252 MSDC_LSD_SetBits32(SDC_CFG2,SDC_CFG_SIEN);
253
254}
255/*************************************************************************
256* FUNCTION
257* MSDC_Check_Card_Present2
258*
259* DESCRIPTION
260* c
261*
262* PARAMETERS
263* ON: turn on power saving or not
264*
265* RETURNS
266*
267* GLOBALS AFFECTED
268*
269*
270*************************************************************************/
271kal_bool MSDC_Check_Card_Present2(void)
272{
273#if !defined(__MSDC_NOT_SUPPORT_HOT_PLUG__)
274 return msdc2_handle->mIsPresent;
275#else
276 return KAL_TRUE;
277#endif
278}
279/*************************************************************************
280* FUNCTION
281* MSDC_PDNControl
282*
283* DESCRIPTION
284* Enable power saving or not.
285*
286* PARAMETERS
287* ON: turn on power saving or not
288*
289* RETURNS
290*
291* GLOBALS AFFECTED
292*
293*
294*************************************************************************/
295void MSDC_PDNControl2(kal_bool ON)
296{
297 msdc2_handle->mIsPWDown = ON;
298 if(ON)
299 { // OFF
300 MSDC_CLR_INT2();
301 MSDC_CLR_INT2();
302 #if defined(MSDC_USE_USB_CLK) && defined(__MSDC2_SD_MMC__)
303 if(gSD_blk[SD_MSDC2].flags & SD_FLAG_USE_USB_CLK)
304 UPLL_Disable(UPLL_OWNER_MSDC2);
305 #endif
306 DRVPDN_Enable(DRVPDN_CON0,DRVPDN_CON0_MSDC2,PDN_MSDC2);
307 }
308 else
309 { // ON
310 DRVPDN_Disable(DRVPDN_CON0,DRVPDN_CON0_MSDC2,PDN_MSDC2);
311 #if defined(MSDC_USE_USB_CLK) && defined(__MSDC2_SD_MMC__)
312 if(gSD_blk[SD_MSDC2].flags & SD_FLAG_USE_USB_CLK)
313 UPLL_Enable(UPLL_OWNER_MSDC2);
314 #endif
315 }
316}
317/*************************************************************************
318* FUNCTION
319* MSDC_TimeOutHandler2
320*
321* DESCRIPTION
322* Callback function of gpt timer, and launched while MSDC busy for a while
323
324*
325* PARAMETERS
326*
327*
328* RETURNS
329*
330* GLOBALS AFFECTED
331*
332*
333*************************************************************************/
334void MSDC_TimeOutHandler2(void *parameter)
335{
336 tst_sys_trace("MSDC_TimeOutHandler2");
337 msdc2_handle->is_timeout = KAL_TRUE;
338 #if defined(__MSDC_MS__)||defined(__MSDC_MSPRO__)
339 kal_set_eg_events(msdc2_handle->MSDC_Events,
340 (EVENT_MSIFIRQ|EVENT_DMAIRQ|EVENT_MSRDYIRQ),
341 KAL_OR);
342 #else
343 kal_set_eg_events(msdc2_handle->MSDC_Events,
344 (EVENT_SDCMDIRQ|EVENT_SDDATIRQ|EVENT_SDMCIRQ|EVENT_SDR1BIRQ|EVENT_DMAIRQ),
345 KAL_OR);
346 #endif
347}
348
349
350/*************************************************************************
351* FUNCTION
352* MSDC_GetCardStatus
353*
354* DESCRIPTION
355* Check currently card is present or not.
356*
357* PARAMETERS
358*
359*
360* RETURNS
361*
362* GLOBALS AFFECTED
363* msdc_eint_state
364*
365*
366*************************************************************************/
367int MSDC_GetCardStatus2(void * DriveData, int AckType)
368{
369 MSDC_HANDLE *msdc = (MSDC_HANDLE *)DriveData;;
370
371 // a debounce mechanism
372 if(kal_query_systemInit() == KAL_FALSE)
373 {
374 kal_sleep_task(100);
375 }
376 ENTER_CRITICAL();
377 msdc->send_ilm = KAL_TRUE;
378 EXIT_CRITICAL();
379
380
381 if(!msdc->mIsPresent)
382 MSDC_PDNControl2(KAL_TRUE);
383 return 0;
384}
385
386
387/*************************************************************************
388* FUNCTION
389* MSDC_Config_INS_WP
390*
391* DESCRIPTION
392* Configure the pull up or pull down status for INS and WP pin
393*
394* PARAMETERS
395* 1. ins: MSDC_IOCTRL_PULL_DOWN, MSDC_IOCTRL_PULL_UP
396* 2. wp: MSDC_IOCTRL_PULL_DOWN, MSDC_IOCTRL_PULL_UP
397*
398* RETURNS
399*
400* GLOBALS AFFECTED
401*
402* NOTE
403* 1. MT6219 can not be configured to PULL up or down. They are all pulled up by IO.
404* 2. MT6218B and MT6217, WP is configured with data lines.
405*************************************************************************/
406void MSDC_Config_INS_WP2(msdc_ioctrl_enum ins, msdc_ioctrl_enum wp)
407{
408 kal_uint32 msdc_cfg,iocon;
409
410 msdc2_handle->ins_level = ins;
411 //#if defined(MT6218B) || defined(MT6217)
412 // INS use PRCFG3, WP use PRCFG0
413 MSDC_SetData32(MSDC_CFG2, MSDC_CFG_PRCFG0, (wp << 22));
414 MSDC_SetData32(MSDC_IOCON2, MSDC_IOCON_PRCFG3, (ins << 8));
415}
416/*************************************************************************
417* FUNCTION
418* MSDC_Initialize
419*
420* DESCRIPTION
421* Initialize the MS/SD host controller, called only once at drv_init
422*
423* PARAMETERS*
424*
425* RETURNS
426* 1: initailized failed
427* 0: successful
428*
429* GLOBALS AFFECTED
430* gMSDC_Handle
431*
432*************************************************************************/
433void MSDC_Initialize2(void)
434{
435
436 // turn on the power of controler
437 DRVPDN_Disable(DRVPDN_CON0,DRVPDN_CON0_MSDC2,PDN_MSDC2);
438#if defined(__MSDC_MS__)
439 MSDC_LSD_ClearBits32(MSDC_CFG2, MSDC_CFG_MSDC);
440 msdc2_handle->mMSDC_type = MS_CARD;
441#elif defined(__MSDC_MSPRO__)
442 MSDC_LSD_ClearBits32(MSDC_CFG2, MSDC_CFG_MSDC);
443 msdc2_handle->mMSDC_type = MSPRO_CARD;
444 FS_MspDrvAll = FS_MspDrv;
445#elif (defined(__MSDC2_SD_MMC__) || defined(__MSDC2_SD_SDIO__))
446 MSDC_LSD_SetBits32(MSDC_CFG2, MSDC_CFG_MSDC) ;
447 msdc2_handle->mMSDC_type = SD_CARD;
448#endif
449 msdc2_handle->msdc_clock = MSDC_CLOCK;
450
451 if(msdc2_handle->gpt_handle == 0)
452 MSDC_GPTI_GetHandle(&msdc2_handle->gpt_handle);
453 #if !defined(__MSDC_TFLASH_DAT3_1BIT_HOT_PLUG__)
454 MSDC_Config_INS_WP2(MSDC_IOCTRL_PULL_UP,MSDC_IOCTRL_PULL_UP);
455 #else
456 MSDC_Config_INS_WP2(MSDC_IOCTRL_PULL_DOWN,MSDC_IOCTRL_PULL_UP);
457 // first time if card is present, no card insertion interrupt generated
458 msdc2_handle->mIsPresent = KAL_TRUE;
459 #endif
460 // turn on the power of memory card
461 MSDC_LSD_SetBits32(MSDC_CFG2,MSDC_CFG_VDDPD);
462 MSDC_SET_FIFO2(1);
463
464 if(MSDC_GetCustom() & MSDC2_HOT_PLUG)
465 {
466 // enable card detection
467 MSDC_WriteReg32(MSDC_PS2, MSDC_PS_CDEN|MSDC_PS_PIEN0|MSDC_PS_POEN0);
468 if(MSDC_Reg(MSDC_PS2) & MSDC_PS_PIN0)
469 {
470 if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
471 msdc2_handle->mIsPresent = KAL_FALSE;
472 else
473 msdc2_handle->mIsPresent = KAL_TRUE;
474 }
475 else
476 {
477 if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
478 msdc2_handle->mIsPresent = KAL_TRUE;
479 else
480 msdc2_handle->mIsPresent = KAL_FALSE;
481 }
482 MSDC_LSD_SetBits32(MSDC_CFG2, MSDC_CFG_PINEN);
483 }
484 else
485 {
486 msdc2_handle->mIsPresent = KAL_TRUE;
487 }
488
489 #ifdef MSDC_INT
490 MSDC_INT_Init2();
491 #endif // end of MSDC_INT
492 #ifdef MSDC_DMA
493 MSDC_DMAInit2();
494 #endif
495 #ifdef __MULTI_BOOT__
496 if(stack_query_boot_mode() != NORMAL_BOOT)
497 msdc2_handle->send_ilm = KAL_FALSE;
498 else
499 msdc2_handle->send_ilm = KAL_TRUE;
500 #else
501 msdc2_handle->send_ilm = KAL_FALSE;
502 #endif
503
504 DRVPDN_Enable(DRVPDN_CON0,DRVPDN_CON0_MSDC2,PDN_MSDC2);
505}
506
507void MSDC_SetIOCONRegDLT2(void)
508{
509 kal_uint32 factor;
510
511 /*set DLT field according to SCLKF seeting*/
512 factor = msdc2_handle->msdc_clock/msdc2_handle->op_clock;
513 BitFieldWrite32((kal_uint32*)MSDC_IOCON2,(kal_uint32)(factor/2),MSDC_IOCON_DLT);
514}
515
516/*************************************************************************
517* FUNCTION
518* MSDC_GetMediaChanged
519*
520* DESCRIPTION
521* Check if the media is changed, and clear the status after function call
522*
523* PARAMETERS
524*
525* RETURNS
526*
527* GLOBALS AFFECTED
528*
529*
530*************************************************************************/
531/*! combined to MSDC_GetMediaChanged(), and removed in HAL [20101203 Samuel]
532kal_bool MSDC_GetMediaChanged2(void* id)
533{
534 kal_bool ret;
535
536 ENTER_CRITICAL();
537 msdc2_handle = (MSDC_HANDLE *)id;
538 ret = (msdc2_handle->mIsChanged )?(KAL_TRUE):(KAL_FALSE);
539 msdc2_handle->mIsChanged = KAL_FALSE;
540 EXIT_CRITICAL();
541
542 return ret;
543}
544*/
545
546#ifdef MSDC_DMA
547extern kal_uint8 DMA_GetChannel(DMA_Master DMA_CODE);
548/*************************************************************************
549* FUNCTION
550* MSDC_DMAInit
551*
552* DESCRIPTION
553* Initialize MSDC's DMA
554*
555* PARAMETERS
556*
557* RETURNS
558*
559* GLOBALS AFFECTED
560*
561*
562*************************************************************************/
563void MSDC_DMAInit2(void)
564{
565 msdc2_handle->msdc_dmaport = DMA_GetChannel(DMA_MSDC2);
566 msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_TRUE;
567 msdc2_handle->msdc_menu.TMOD.cycle = 0x4;
568 msdc2_handle->msdc_menu.master = DMA_MSDC2;
569 msdc2_handle->msdc_menu.addr = NULL;
570 msdc2_handle->msdc_input.type = DMA_HWRX;
571 msdc2_handle->msdc_input.size = DMA_LONG;
572 msdc2_handle->msdc_input.count = 0;
573 msdc2_handle->msdc_input.menu = &msdc2_handle->msdc_menu;
574}
575
576/*************************************************************************
577* FUNCTION
578* MSDC_DMATransfer
579*
580* DESCRIPTION
581* MSDC using DAM for data transfer
582*
583* PARAMETERS
584* adrs: data buffer
585* count: bytes to be transfered
586* isTx: ture for move data from MSDC to data buffer and vise versa
587*
588* RETURNS
589*
590* GLOBALS AFFECTED
591*
592*
593*************************************************************************/
594void MSDC_DMATransferFirst2(kal_uint32 adrs,kal_uint32 count, kal_bool isTx)
595{
596 kal_uint32 total_count;
597 kal_bool is_aligned, is_poll;
598
599 DMA_Stop(msdc2_handle->msdc_dmaport);
600
601#ifdef MSDC_CACHED_SUPPORT
602 if (KAL_TRUE == msdc2_handle->isCachedBuf){
603 msdc2_handle->msdc_menu.addr = (kal_uint32)msdc_uncachedBuf2;
604 msdc2_handle->cachedBufCopyPtr = adrs;
605 }
606 else
607#endif
608 msdc2_handle->msdc_menu.addr = adrs;
609
610
611 if(isTx)
612 {
613 msdc2_handle->timeout_period = (50 + (count>>5));
614 msdc2_handle->msdc_input.type = DMA_HWTX;
615 if(count <= MSDC_WRITE_THD_POLL)
616 {
617 msdc2_handle->msdc_input.callback = NULL;
618 is_poll = KAL_TRUE;
619 }
620 else
621 {
622 msdc2_handle->msdc_input.callback = MSDC_DMA_Callback2;
623 is_poll = KAL_FALSE;
624 }
625 }
626 else
627 {
628 msdc2_handle->timeout_period = (50 + (count>>7));
629 msdc2_handle->msdc_input.type = DMA_HWRX;
630 if(count <= MSDC_READ_THD_POLL)
631 {
632 msdc2_handle->msdc_input.callback = NULL;
633 is_poll = KAL_TRUE;
634 }
635 else
636 {
637 msdc2_handle->msdc_input.callback = MSDC_DMA_Callback2;
638 is_poll = KAL_FALSE;
639 }
640 }
641
642 if(kal_query_systemInit() == KAL_TRUE
643#ifdef __TST_WRITE_TO_FILE_ONLY__ /*error recording: considering error recording additionally*/
644 || (KAL_TRUE == INT_QueryExceptionStatus())
645#endif
646 )
647 {
648 msdc2_handle->msdc_input.callback = NULL;
649 is_poll = KAL_TRUE;
650 }
651
652#ifndef MSDC_CACHED_SUPPORT
653 if(adrs%4 == 0)
654 {
655 is_aligned = KAL_TRUE;
656 total_count = count;
657 }
658 else
659 {
660 is_aligned = KAL_FALSE;
661 total_count = count<<2;
662 }
663#else
664 if(adrs%4 == 0 || KAL_TRUE == msdc2_handle->isCachedBuf)
665 {
666 is_aligned = KAL_TRUE;
667 total_count = count;
668 }
669 else
670 {
671 is_aligned = KAL_FALSE;
672 total_count = count<<2;
673 }
674#endif
675 msdc2_handle->total_count = total_count;
676 msdc2_handle->is_poll = is_poll;
677 msdc2_handle->is_aligned = is_aligned;
678 {
679 if(is_aligned)
680 {
681 #if defined(USE_DMA_BURST)
682 MSDC_SET_FIFO2(4);
683 #else
684 msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_FALSE;
685 #endif
686#ifdef MSDC_CACHED_SUPPORT
687 if(KAL_TRUE == msdc2_handle->isCachedBuf)
688 msdc2_handle->msdc_input.count = (total_count > MSDC_UNCACHED_TRASNFER_SIZE)?(MSDC_UNCACHED_TRASNFER_SIZE):(total_count);
689 else
690#endif
691 msdc2_handle->msdc_input.count = (total_count > 65024)?(65024):(total_count);
692#ifdef MSDC_CACHED_SUPPORT
693 if(KAL_TRUE == msdc2_handle->isCachedBuf){
694 /*have do memory copy stuff here*/
695 if(DMA_HWTX == msdc2_handle->msdc_input.type){
696 /*copy from upper application buffer*/
697 kal_mem_cpy(msdc_uncachedBuf2, (void *)msdc2_handle->cachedBufCopyPtr, 4 * msdc2_handle->msdc_input.count);
698 msdc2_handle->cachedBufCopyPtr += msdc2_handle->msdc_input.count * 4;
699 }
700 }
701#endif
702 msdc2_handle->msdc_input.size = DMA_LONG;
703 DMA_Config_B2W(msdc2_handle->msdc_dmaport,&msdc2_handle->msdc_input,KAL_TRUE,KAL_FALSE);
704 msdc2_handle->msdc_menu.addr += msdc2_handle->msdc_input.count*4;
705 }
706 else
707 {
708#ifdef MSDC_CACHED_SUPPORT
709 if(KAL_TRUE == msdc2_handle->isCachedBuf)
710 ASSERT(0);
711#endif
712 #if defined(USE_DMA_BURST)
713 MSDC_SET_FIFO2(1);
714 #else
715
716 msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_TRUE;
717 #endif
718 msdc2_handle->msdc_input.count = (total_count > 65024)?(65024):(total_count);
719 msdc2_handle->msdc_input.size = DMA_BYTE;
720 DMA_Config_B2W(msdc2_handle->msdc_dmaport,&msdc2_handle->msdc_input,KAL_TRUE,KAL_TRUE);
721 msdc2_handle->msdc_menu.addr += msdc2_handle->msdc_input.count;
722 }
723
724 }
725}
726kal_uint32 MSDC_DMATransferFinal2(void)
727{
728 kal_uint32 total_count = msdc2_handle->total_count, t1;
729 kal_bool is_poll = msdc2_handle->is_poll;
730 kal_bool is_aligned = msdc2_handle->is_aligned;
731
732 t1 = drv_get_current_time();
733 if(msdc2_handle->timeout_period > MSDC_TIMEOUT_PERIOD_DAT)
734 msdc2_handle->timeout_period = MSDC_TIMEOUT_PERIOD_DAT;
735 MSDC_START_TIMER2(msdc2_handle->timeout_period);
736 if(is_poll)
737 {
738 while(IS_MSDC_DMA_RUN(msdc2_handle->msdc_dmaport) && MSDC_Check_Card_Present2() && !msdc2_handle->is_timeout)
739 {
740 if(drv_get_duration_ms(t1) > MSDC_TIMEOUT_PERIOD_DAT*11)
741 msdc2_handle->is_timeout = KAL_TRUE;
742 }
743 }
744 else
745 {
746 kal_uint32 flags;
747 kal_retrieve_eg_events(msdc2_handle->MSDC_Events,(EVENT_DMAIRQ),KAL_OR_CONSUME,&flags,KAL_SUSPEND);
748 }
749 MSDC_STOP_TIMER2();
750 if(IS_MSDC_DMA_RUN(msdc2_handle->msdc_dmaport) && msdc2_handle->is_timeout)
751 return MSDC_GPT_TIMEOUT_ERR;
752
753 total_count -= msdc2_handle->msdc_input.count;
754 if(total_count == 0){
755#ifdef MSDC_CACHED_SUPPORT
756 if(KAL_TRUE == msdc2_handle->isCachedBuf){
757 if(DMA_HWRX == msdc2_handle->msdc_input.type){
758 /*copy to upper application's buffer*/
759 kal_mem_cpy((void *)msdc2_handle->cachedBufCopyPtr, msdc_uncachedBuf2, 4 * msdc2_handle->msdc_input.count);
760 }
761 }
762#endif
763 return MSDC_NOERROR;
764 }
765
766#ifdef MSDC_CACHED_SUPPORT
767 if(KAL_TRUE == msdc2_handle->isCachedBuf){
768 /*have do memory copy stuff here*/
769 if(DMA_HWTX == msdc2_handle->msdc_input.type){
770 /*copy from upper application buffer*/
771 kal_mem_cpy(msdc_uncachedBuf2, (void *)msdc2_handle->cachedBufCopyPtr, 4 * msdc2_handle->msdc_input.count);
772 }
773 else{
774 /*copy to upper application's buffer*/
775 kal_mem_cpy((void *)msdc2_handle->cachedBufCopyPtr, msdc_uncachedBuf2, 4 * msdc2_handle->msdc_input.count);
776 }
777 msdc2_handle->cachedBufCopyPtr += msdc2_handle->msdc_input.count * 4;
778 }
779#endif
780 while(1)
781 {
782 if(is_aligned)
783 {
784 #if defined(USE_DMA_BURST)
785 MSDC_SET_FIFO(4);
786 #else
787 msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_FALSE;
788 #endif
789#ifdef MSDC_CACHED_SUPPORT
790 if(KAL_TRUE == msdc2_handle->isCachedBuf)
791 msdc2_handle->msdc_input.count = (total_count > MSDC_UNCACHED_TRASNFER_SIZE)?(MSDC_UNCACHED_TRASNFER_SIZE):(total_count);
792 else
793#endif
794 msdc2_handle->msdc_input.count = (total_count > 65024)?(65024):(total_count);
795 msdc2_handle->msdc_input.size = DMA_LONG;
796 DMA_Config_B2W(msdc2_handle->msdc_dmaport,&msdc2_handle->msdc_input,KAL_TRUE,KAL_FALSE);
797#ifdef MSDC_CACHED_SUPPORT
798 /*we don't need to increase the addr when encounter cached buffer, since we only have a fix size uncached buffer to use*/
799 if(KAL_FALSE == msdc2_handle->isCachedBuf)
800#endif
801 {
802 msdc2_handle->msdc_menu.addr += msdc2_handle->msdc_input.count*4;
803 }
804 msdc2_handle->timeout_period = 1 + (msdc2_handle->msdc_input.count>>7);
805 }
806 else
807 {
808#ifdef MSDC_CACHED_SUPPORT
809 if(KAL_TRUE == msdc2_handle->isCachedBuf)
810 ASSERT(0);
811#endif
812 #if defined(USE_DMA_BURST)
813 MSDC_SET_FIFO(1);
814 #else
815 msdc2_handle->msdc_menu.TMOD.burst_mode = KAL_TRUE;
816 #endif
817 msdc2_handle->msdc_input.count = (total_count > 65024)?(65024):(total_count);
818 msdc2_handle->msdc_input.size = DMA_BYTE;
819 DMA_Config_B2W(msdc2_handle->msdc_dmaport,&msdc2_handle->msdc_input,KAL_TRUE,KAL_TRUE);
820 msdc2_handle->msdc_menu.addr += msdc2_handle->msdc_input.count;
821 msdc2_handle->timeout_period = 1 + (msdc2_handle->msdc_input.count>>9);
822 }
823
824 // wait until running bit clr
825 if(msdc2_handle->msdc_input.type == DMA_HWTX)
826 msdc2_handle->timeout_period <<= 2 ;
827 if(msdc2_handle->mMSDC_type == MMC_CARD)
828 msdc2_handle->timeout_period <<= 1;
829
830 t1 = drv_get_current_time();
831 MSDC_START_TIMER2(msdc2_handle->timeout_period);
832 if(is_poll)
833 {
834 while(IS_MSDC_DMA_RUN(msdc2_handle->msdc_dmaport) && MSDC_Check_Card_Present2() && !msdc2_handle->is_timeout)
835 {
836 if(drv_get_duration_ms(t1) > msdc2_handle->timeout_period*11)
837 msdc2_handle->is_timeout = KAL_TRUE;
838 }
839 }
840 else
841 {
842 kal_uint32 flags;
843 kal_retrieve_eg_events(msdc2_handle->MSDC_Events,(EVENT_DMAIRQ),KAL_OR_CONSUME,&flags,KAL_SUSPEND);
844 }
845 MSDC_STOP_TIMER2();
846 if(IS_MSDC_DMA_RUN(msdc2_handle->msdc_dmaport) && msdc2_handle->is_timeout)
847 return MSDC_GPT_TIMEOUT_ERR;
848 total_count -= msdc2_handle->msdc_input.count;
849 if(total_count == 0)
850 break;
851#ifdef MSDC_CACHED_SUPPORT
852 if(KAL_TRUE == msdc2_handle->isCachedBuf){
853 /*have do memory copy stuff here*/
854 if(DMA_HWTX == msdc2_handle->msdc_input.type){
855 /*copy from upper application buffer*/
856 kal_mem_cpy(msdc_uncachedBuf2, (void *)msdc2_handle->cachedBufCopyPtr, 4 * msdc2_handle->msdc_input.count);
857 }
858 else{
859 /*copy to upper application's buffer*/
860 kal_mem_cpy((void *)msdc2_handle->cachedBufCopyPtr, msdc_uncachedBuf2, 4 * msdc2_handle->msdc_input.count);
861 }
862 msdc2_handle->cachedBufCopyPtr += msdc2_handle->msdc_input.count * 4;
863 }
864#endif
865 }
866
867#ifdef MSDC_CACHED_SUPPORT
868 if(KAL_TRUE == msdc2_handle->isCachedBuf){
869 if(DMA_HWRX == msdc2_handle->msdc_input.type){
870 /*copy to upper application's buffer*/
871 kal_mem_cpy((void *)msdc2_handle->cachedBufCopyPtr, msdc_uncachedBuf2, 4 * msdc2_handle->msdc_input.count);
872 }
873 }
874#endif
875 return MSDC_NOERROR;
876}
877
878
879#endif // DMA
880
881#ifdef MSDC_INT
882/*************************************************************************
883* FUNCTION
884* MSDC_INT_Init
885*
886* DESCRIPTION
887* Initialize MSDC's interrupt
888*
889* PARAMETERS
890*
891* RETURNS
892*
893* GLOBALS AFFECTED
894*
895*
896*************************************************************************/
897void MSDC_INT_Init2(void)
898{
899
900 msdc2_handle->MSDC_Events = kal_create_event_group("MSDC2");
901 DRV_Register_HISR(DRV_MSDC2_HISR_ID, MSDC_HISR_Entry2);
902 IRQ_Register_LISR(IRQ_MSDC2_CODE, MSDC_LISR2,"MSDC_LISR2");
903 IRQSensitivity(IRQ_MSDC2_CODE,LEVEL_SENSITIVE);
904 IRQUnmask(IRQ_MSDC2_CODE);
905
906 // enable MSDC interrupt
907 MSDC_CLR_INT();
908 #if !defined(MSDC_USE_INT)
909 MSDC_DISABLE_INT2();// (active)turn off other interrupt event except pin interrupt
910 #else
911 MSDC_ENABLE_INT2();// (deactive)
912 #endif
913
914}
915void MSDC_LISR2(void)
916{
917 IRQMask(IRQ_MSDC2_CODE);
918 drv_active_hisr(DRV_MSDC2_HISR_ID);
919}
920/*************************************************************************
921* FUNCTION
922* MSDC_HISR_Entry
923*
924* DESCRIPTION
925* Set corresponding enevt and wake up waiting task.
926*
927* PARAMETERS
928*
929* RETURNS
930*
931* GLOBALS AFFECTED
932*
933*
934*************************************************************************/
935void MSDC_HISR_Entry2(void)
936{
937 kal_uint16 msdc_int = 0;
938
939#if defined(__MSDC_MS__)||defined(__MSDC_MSPRO__)
940 kal_uint16 msc_sta;
941
942 FS_MspDrvAll = FS_MspDrv;
943 TurnOnMSDC2();
944 msc_sta = MSDC_Reg(MSC_STA2);
945 if(msc_sta & MSC_STA_SIF)
946 kal_set_eg_events(msdc2_handle->MSDC_Events,EVENT_MSIFIRQ,KAL_OR);
947 else
948 kal_set_eg_events(msdc2_handle->MSDC_Events,EVENT_MSRDYIRQ,KAL_OR);
949
950 msdc_int = MSDC_Reg(MSDC_INTR);
951 if(msdc_int & MSDC_INT_PINIRQ)
952 {
953 msdc2_handle->mIsInitialized = KAL_FALSE;
954 msdc2_handle->mIsChanged = KAL_TRUE;
955 kal_set_eg_events(msdc2_handle->MSDC_Events,
956 (EVENT_MSIFIRQ|EVENT_DMAIRQ|EVENT_MSRDYIRQ),
957 KAL_OR);
958 if(MSDC_Reg(MSDC_PS2) & MSDC_PS_PIN0)
959 {
960 if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
961 msdc2_handle->mIsPresent = KAL_FALSE;
962 else
963 msdc2_handle->mIsPresent = KAL_TRUE;
964 }
965 else
966 {
967 if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
968 msdc2_handle->mIsPresent = KAL_TRUE;
969 else
970 msdc2_handle->mIsPresent = KAL_FALSE;
971 }
972 if(msdc2_handle->mIsPresent == KAL_FALSE)
973 {
974 MSDC_CLR_FIFO2();
975 MSDC_CLR_INT2();
976 MSDC_CLR_INT2();
977 DMA_Stop(msdc2_handle->msdc_dmaport);
978 }
979 #if !defined(FMT_NOT_PRESENT)
980 MSDC_SendCardInd(MOD_FMT, SD_MSDC2);
981 #endif
982 }
983#else // sd/mmc start here
984 TurnOnMSDC2();
985 msdc_int = MSDC_Reg(MSDC_INTR2);
986 #if defined(__MSDC2_SD_MMC__)&&defined(__MSDC_SD_SDIO__)
987 /*SDIO*/
988 if(msdc_int & MSDC_INT_SDIOIRQ)
989 {
990 SDIO_HISR_Entry();
991 }
992 #endif
993
994 if(msdc_int & MSDC_INT_PINIRQ)
995 {
996 msdc2_handle->mIsInitialized = KAL_FALSE;
997 msdc2_handle->mIsChanged = KAL_TRUE;
998 if(MSDC_Reg(MSDC_PS2) & MSDC_PS_PIN0)
999 {
1000 if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
1001 msdc2_handle->mIsPresent = KAL_FALSE;
1002 else
1003 msdc2_handle->mIsPresent = KAL_TRUE;
1004 }
1005 else
1006 {
1007 if(msdc2_handle->ins_level == MSDC_IOCTRL_PULL_UP)
1008 msdc2_handle->mIsPresent = KAL_TRUE;
1009 else
1010 msdc2_handle->mIsPresent = KAL_FALSE;
1011 }
1012 if(msdc2_handle->mIsPresent == KAL_FALSE)
1013 {
1014 MSDC_CLR_FIFO2();
1015 MSDC_CLR_INT2();
1016 MSDC_CLR_INT2();
1017 DMA_Stop(msdc2_handle->msdc_dmaport);
1018 }
1019 #if !defined(FMT_NOT_PRESENT)
1020 MSDC_SendCardInd(MOD_FMT, SD_MSDC2);
1021 #endif
1022 }
1023 #endif // MSDC_MS
1024 IRQUnmask(IRQ_MSDC2_CODE);
1025}
1026/*************************************************************************
1027* FUNCTION
1028* MSDC_DMA_Callback
1029*
1030* DESCRIPTION
1031* Call back while DMA has done the data transfer.
1032*
1033* PARAMETERS
1034*
1035* RETURNS
1036*
1037* GLOBALS AFFECTED
1038*
1039*
1040*************************************************************************/
1041void MSDC_DMA_Callback2(void)
1042{
1043 kal_set_eg_events(msdc2_handle->MSDC_Events,EVENT_DMAIRQ,KAL_OR);
1044}
1045
1046#endif //end of MSDC_INT
1047#endif // end of (defined(__MSDC_MS__) || defined(__MSDC_SD_MMC__)) && defined(__MSDC2_SD_MMC__)
1048
1049#endif //DRV_MSDC_OFF