2 #include "asm/arch/sci_types.h"
3 #include "sdio_card_pal.h"
4 #include "sdhost_drv.h"
5 #include "asm/arch/isr_drvapi.h"
6 #include "asm/arch/mmu_drvapi.h"
7 //#include "asm/arch/chng_freq.h"
8 #include "asm/arch/sc_reg.h"
10 //#include "asm/arch/deep_sleep.h"
11 //#include "asm/arch/deepsleep_drvapi.h"
13 //#define DUAL_TCARD_SUPPORT
15 #define CARD_SDIO_EVENT
21 //#define UCOS_BSD_EVENT
23 //#define DUAL_TCARD_SUPPORT
25 /*-----------------------------------------*/
27 /*-----------------------------------------*/
28 #define SDIO_CARD_PAL_ASSERT SCI_ASSERT
29 #if defined CONFIG_SC8825 && defined CONFIG_UBOOT_DEBUG
30 #define SDIO_CARD_PRINT(x) printf x
32 #define SDIO_CARD_PRINT(x) SCI_TRACE_LOW x
34 /*-----------------------------------------*/
36 /*-----------------------------------------*/
37 #if defined(OS_SELF_SIMULATOR)
38 #define SDIO_CARD_PAL_IRQ_DECLARE OS_CPU_SR cpu_sr
39 #define SDIO_CARD_PAL_DISABLE_IRQ OS_ENTER_CRITICAL
40 #define SDIO_CARD_PAL_ENABLE_IRQ OS_EXIT_CRITICAL
42 #define SDIO_CARD_PAL_IRQ_DECLARE
43 #define SDIO_CARD_PAL_DISABLE_IRQ //SCI_DisableIRQ
44 #define SDIO_CARD_PAL_ENABLE_IRQ //SCI_RestoreIRQ
46 /*-----------------------------------------*/
48 extern void Dcache_InvalRegion(unsigned int addr, unsigned int length);
49 extern void Dcache_CleanRegion(unsigned int addr, unsigned int length);
50 extern ISR_EXE_T _SDHOST_IrqHandle (uint32 isrnum);
54 SDIO_CARD_PAL_CMD_E cmd;
57 CMD_RSP_TYPE_E Response;
63 // response Name cmd int filter ,rsp ,cmd error filter
64 #define CARD_SDIO_NO_RSP NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_NO_RSP ,NULL
65 #define CARD_SDIO_R1 NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_RSP_R1 ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
66 #define CARD_SDIO_R2 NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_RSP_R2 ,ERR_RSP| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
67 #define CARD_SDIO_R3 NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_RSP_R3 ,ERR_RSP| ERR_CMD_END| ERR_CMD_TIMEOUT
68 #define CARD_SDIO_R4 NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_RSP_R4 ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
69 #define CARD_SDIO_R5 NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_RSP_R5 ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
70 #define CARD_SDIO_R6 NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_RSP_R6 ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
71 #define CARD_SDIO_R7 NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_RSP_R7 ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
72 #define CARD_SDIO_R1B NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_RSP_R1B ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
73 //#define CARD_SDIO_R5B NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_RSP_R5B ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
76 LOCAL const CMD_CTL_FLG s_SDCmdDetail[]=
78 // cmdindex,rsp,transmode
79 //#define CMDname cmdindex ,data int filter + (cmd int filter+)rsp(+cmd error filter) + ,data error filter ,transmode
80 { CARD_CMD0_GO_IDLE_STATE , 0 , NULL | CARD_SDIO_NO_RSP | NULL , NULL },
81 { CARD_CMD1_SEND_OP_COND /*MMC*/ , 1 , NULL | CARD_SDIO_R3 | NULL , NULL },
82 { CARD_CMD2_ALL_SEND_CID , 2 , NULL | CARD_SDIO_R2 | NULL , NULL },
83 { CARD_CMD3_SEND_RELATIVE_ADDR /*SD*/ , 3 , NULL | CARD_SDIO_R6 | NULL , NULL },
84 { CARD_CMD3_SET_RELATIVE_ADDR /*MMC*/ , 3 , NULL | CARD_SDIO_R1 | NULL , NULL },
85 { CARD_CMD4_SET_DSR , 4 , NULL | CARD_SDIO_NO_RSP | NULL , NULL },
86 { CARD_CMD6_SWITCH_FUNC , 6 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_END | ERR_DATA_CRC | ERR_DATA_TIMEOUT , TRANS_MODE_READ | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
87 { CARD_CMD7_SELECT_DESELECT_CARD , 7 , NULL | CARD_SDIO_R1B | NULL , NULL },
88 { CARD_CMD8_SEND_IF_COND /*SD*/ , 8 , NULL | CARD_SDIO_R7 | NULL , NULL },
89 { CARD_CMD9_SEND_CSD , 9 , NULL | CARD_SDIO_R2 | NULL , NULL },
90 { CARD_CMD10_SEND_CID , 10 , NULL | CARD_SDIO_R2 | NULL , NULL },
91 { CARD_CMD11_READ_DAT_UNTIL_STOP /*MMC*/ , 11 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_END | ERR_DATA_CRC | ERR_DATA_TIMEOUT , TRANS_MODE_MULTI_BLOCK | TRANS_MODE_READ | TRANS_MODE_BLOCK_COUNT_EN | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
92 { CARD_CMD11_READ_DAT_UNTIL_STOP_AUT12 /*MMC*/, 11, SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_END | ERR_DATA_CRC | ERR_DATA_TIMEOUT | ERR_CMD12 , TRANS_MODE_MULTI_BLOCK | TRANS_MODE_READ | TRANS_MODE_CMD12_EN | TRANS_MODE_BLOCK_COUNT_EN | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
93 { CARD_CMD12_STOP_TRANSMISSION , 12 , SIG_TRANS_CMP | CARD_SDIO_R1B | NULL , NULL }, //It is auto performed by Host
94 { CARD_CMD13_SEND_STATUS , 13 , NULL | CARD_SDIO_R1 | NULL , NULL },
95 { CARD_CMD15_GO_INACTIVE_STATE , 15 , NULL | CARD_SDIO_NO_RSP | NULL , NULL },
96 { CARD_CMD16_SET_BLOCKLEN , 16 , NULL | CARD_SDIO_R1 | NULL , NULL },
97 { CARD_CMD17_READ_SINGLE_BLOCK , 17 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_END | ERR_DATA_CRC | ERR_DATA_TIMEOUT , TRANS_MODE_READ | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
98 { CARD_CMD18_READ_MULTIPLE_BLOCK , 18 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_END | ERR_DATA_CRC | ERR_DATA_TIMEOUT , TRANS_MODE_MULTI_BLOCK | TRANS_MODE_READ | TRANS_MODE_BLOCK_COUNT_EN | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
99 { CARD_CMD18_READ_MULTIPLE_BLOCK_AUT12 , 18 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_END | ERR_DATA_CRC | ERR_DATA_TIMEOUT | ERR_CMD12 , TRANS_MODE_MULTI_BLOCK | TRANS_MODE_READ | TRANS_MODE_CMD12_EN | TRANS_MODE_BLOCK_COUNT_EN | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
100 { CARD_CMD20_WRITE_DAT_UNTIL_STOP /*MMC*/ , 20 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC | ERR_DATA_TIMEOUT , TRANS_MODE_MULTI_BLOCK | TRANS_MODE_BLOCK_COUNT_EN | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
101 { CARD_CMD20_WRITE_DAT_UNTIL_STOP_AUT12 /*MMC*/, 20, SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC | ERR_DATA_TIMEOUT | ERR_CMD12 , TRANS_MODE_MULTI_BLOCK | TRANS_MODE_CMD12_EN | TRANS_MODE_BLOCK_COUNT_EN | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
102 { CARD_CMD23_SET_BLOCK_COUNT /*MMC*/ , 23 , NULL | CARD_SDIO_R1 | NULL , NULL },
103 { CARD_CMD24_WRITE_BLOCK , 24 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC | ERR_DATA_TIMEOUT , TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
104 { CARD_CMD25_WRITE_MULTIPLE_BLOCK , 25 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC | ERR_DATA_TIMEOUT , TRANS_MODE_MULTI_BLOCK | TRANS_MODE_BLOCK_COUNT_EN | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
105 { CARD_CMD25_WRITE_MULTIPLE_BLOCK_AUT12 , 25 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC | ERR_DATA_TIMEOUT | ERR_CMD12 , TRANS_MODE_MULTI_BLOCK | TRANS_MODE_CMD12_EN | TRANS_MODE_BLOCK_COUNT_EN | TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
107 { CARD_CMD26_PROGRAM_CID /*MMC*/ , 26 , NULL | CARD_SDIO_R1 | NULL , NULL },
108 { CARD_CMD27_PROGRAM_CSD , 27 , NULL | CARD_SDIO_R1 | NULL , NULL },
109 { CARD_CMD28_SET_WRITE_PROT , 28 , SIG_TRANS_CMP | CARD_SDIO_R1B | NULL , NULL },
110 { CARD_CMD29_CLR_WRITE_PROT , 29 , SIG_TRANS_CMP | CARD_SDIO_R1B | NULL , NULL },
111 { CARD_CMD30_SEND_WRITE_PROT , 30 , NULL | CARD_SDIO_R1 | NULL , NULL }, // ??
113 { CARD_CMD32_ERASE_WR_BLK_START /*SD*/ , 32 , NULL | CARD_SDIO_R1 | NULL , NULL },
114 { CARD_CMD33_ERASE_WR_BLK_END /*SD*/ , 33 , NULL | CARD_SDIO_R1 | NULL , NULL },
116 { CARD_CMD35_ERASE_GROUP_START /*MMC*/ , 35 , NULL | CARD_SDIO_R1 | NULL , NULL },
117 { CARD_CMD36_ERASE_GROUP_END /*MMC*/ , 36 , NULL | CARD_SDIO_R1 | NULL , NULL },
119 { CARD_CMD38_ERASE , 38 , SIG_TRANS_CMP | CARD_SDIO_R1B | NULL , NULL },
121 { CARD_CMD39_FAST_IO /*MMC*/ , 39 , NULL | CARD_SDIO_R4 | NULL , NULL },
122 { CARD_CMD40_GO_IRQ_STATE /*MMC*/ , 40 , NULL | CARD_SDIO_R5 | NULL , NULL },
124 { CARD_CMD42_LOCK_UNLOCK_SD /*SD*/ , 42 , NULL | CARD_SDIO_R1 | NULL , NULL }, // ??
125 { CARD_CMD42_LOCK_UNLOCK_MMC /*MMC*/ , 42 , NULL | CARD_SDIO_R1B | NULL , NULL }, // ??
126 { CARD_CMD55_APP_CMD , 55 , NULL | CARD_SDIO_R1 | NULL , NULL },
127 { CARD_CMD56_GEN_CMD_SD /*SD*/ , 56 , NULL | CARD_SDIO_R1 | NULL , NULL }, //??
128 { CARD_CMD56_GEN_CMD_MMC /*MMC*/ , 56 , NULL | CARD_SDIO_R1B | NULL , NULL }, //??
131 { CARD_ACMD6_SET_BUS_WIDTH /*SD*/ , 6 , NULL | CARD_SDIO_R1 | NULL , NULL },
132 { CARD_ACMD13_SD_STATUS /*SD*/ , 13 , NULL | CARD_SDIO_R1 | NULL , NULL },
133 { CARD_ACMD22_SEND_NUM_WR_BLCOKS /*SD*/ , 22 , NULL | CARD_SDIO_R1 | NULL , NULL },
134 { CARD_ACMD23_SET_WR_BLK_ERASE_COUNT /*SD*/, 23, NULL | CARD_SDIO_R1 | NULL , NULL },
135 { CARD_ACMD41_SD_SEND_OP_COND /*SD*/ , 41 , NULL | CARD_SDIO_R3 | NULL , NULL },
136 { CARD_ACMD42_SET_CLR_CARD_DETECT /*SD*/ , 42 , NULL | CARD_SDIO_R1 | NULL , NULL },
137 { CARD_ACMD51_SEND_SCR /*SD*/ , 51 , NULL | CARD_SDIO_R1 | NULL , NULL }, // ??
139 { CARD_CMDMAX , 0 , NULL | CARD_SDIO_NO_RSP | NULL , NULL }
144 static const CMD_CTL_FLG s_cmdDetail[] =
146 // cmdindex,rsp,transmode
147 //#define CMDname cmdindex ,data int filter + (cmd int filter+)rsp(+cmd error filter) + ,data error filter ,transmode
148 { CARD_CMD0_GO_IDLE_STATE ,0 ,NULL | CARD_SDIO_NO_RSP |NULL ,NULL },
149 //{ CARD_CMD0_GO_IDLE_STATE ,0 ,SIG_TRANS_CMP | CARD_SDIO_NO_RSP |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT ,TRANS_MODE_MULTI_BLOCK|TRANS_MODE_READ | TRANS_MODE_BLOCK_COUNT_EN| TRANS_MODE_DMA_EN| CMD_HAVE_DATA},
150 { CARD_CMD1_SEND_OP_COND /*MMC*/ ,1 ,NULL | CARD_SDIO_R3 |NULL ,NULL },
151 { CARD_CMD2_ALL_SEND_CID ,2 ,NULL | CARD_SDIO_R2 |NULL ,NULL },
152 { CARD_CMD3_SEND_RELATIVE_ADDR /*SD*/ ,3 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
153 { CARD_CMD3_SET_RELATIVE_ADDR /*MMC*/ ,3 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
154 { CARD_CMD4_SET_DSR ,4 ,NULL | CARD_SDIO_NO_RSP |NULL ,NULL },
155 { CARD_CMD6_SWITCH_FUNC ,6 ,SIG_TRANS_CMP | CARD_SDIO_R1 |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT , TRANS_MODE_READ| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
156 { CARD_CMD7_SELECT_DESELECT_CARD ,7 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
157 //{ CARD_CMD8_SEND_IF_COND /*SD*/ ,8 ,NULL | CARD_SDIO_R7 |NULL ,NULL },
158 { CARD_CMD8_SEND_IF_COND /*SD*/ ,8 ,SIG_TRANS_CMP | CARD_SDIO_R1 |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT , TRANS_MODE_READ| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
159 { CARD_CMD9_SEND_CSD ,9 ,NULL | CARD_SDIO_R2 |NULL ,NULL },
160 { CARD_CMD10_SEND_CID ,10 ,NULL | CARD_SDIO_R2 |NULL ,NULL },
161 { CARD_CMD11_READ_DAT_UNTIL_STOP /*MMC*/ ,11 ,SIG_TRANS_CMP | CARD_SDIO_R1 |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT ,TRANS_MODE_MULTI_BLOCK|TRANS_MODE_READ | TRANS_MODE_BLOCK_COUNT_EN| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
162 { CARD_CMD11_READ_DAT_UNTIL_STOP_AUT12 /*MMC*/,11,SIG_TRANS_CMP | CARD_SDIO_R1 |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT |ERR_CMD12 ,TRANS_MODE_MULTI_BLOCK|TRANS_MODE_READ| TRANS_MODE_CMD12_EN| TRANS_MODE_BLOCK_COUNT_EN| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
163 { CARD_CMD12_STOP_TRANSMISSION ,12 ,SIG_TRANS_CMP | CARD_SDIO_R1B |NULL ,NULL }, //It is auto performed by Host
164 { CARD_CMD13_SEND_STATUS ,13 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
165 { CARD_CMD15_GO_INACTIVE_STATE ,15 ,NULL | CARD_SDIO_NO_RSP |NULL ,NULL },
166 { CARD_CMD16_SET_BLOCKLEN ,16 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
167 { CARD_CMD17_READ_SINGLE_BLOCK ,17 ,SIG_TRANS_CMP | CARD_SDIO_R1 |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT , TRANS_MODE_READ| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
168 { CARD_CMD18_READ_MULTIPLE_BLOCK ,18 ,SIG_TRANS_CMP | CARD_SDIO_R1 |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT ,TRANS_MODE_MULTI_BLOCK|TRANS_MODE_READ | TRANS_MODE_BLOCK_COUNT_EN| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
169 { CARD_CMD18_READ_MULTIPLE_BLOCK_AUT12 ,18 ,SIG_TRANS_CMP | CARD_SDIO_R1 |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT |ERR_CMD12 ,TRANS_MODE_MULTI_BLOCK|TRANS_MODE_READ| TRANS_MODE_CMD12_EN | TRANS_MODE_BLOCK_COUNT_EN| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
170 { CARD_CMD20_WRITE_DAT_UNTIL_STOP /*MMC*/ ,20 ,SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC| ERR_DATA_TIMEOUT ,TRANS_MODE_MULTI_BLOCK | TRANS_MODE_BLOCK_COUNT_EN| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
171 { CARD_CMD20_WRITE_DAT_UNTIL_STOP_AUT12 /*MMC*/,20,SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC| ERR_DATA_TIMEOUT |ERR_CMD12 ,TRANS_MODE_MULTI_BLOCK | TRANS_MODE_CMD12_EN | TRANS_MODE_BLOCK_COUNT_EN| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
172 { CARD_CMD23_SET_BLOCK_COUNT /*MMC*/ ,23 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
173 { CARD_CMD24_WRITE_BLOCK ,24 ,SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC| ERR_DATA_TIMEOUT , TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
174 { CARD_CMD25_WRITE_MULTIPLE_BLOCK ,25 ,SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC| ERR_DATA_TIMEOUT ,TRANS_MODE_MULTI_BLOCK | TRANS_MODE_BLOCK_COUNT_EN| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
175 { CARD_CMD25_WRITE_MULTIPLE_BLOCK_AUT12 ,25 ,SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC| ERR_DATA_TIMEOUT |ERR_CMD12 ,TRANS_MODE_MULTI_BLOCK | TRANS_MODE_CMD12_EN | TRANS_MODE_BLOCK_COUNT_EN| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
177 { CARD_CMD26_PROGRAM_CID /*MMC*/ ,26 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
178 { CARD_CMD27_PROGRAM_CSD ,27 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
179 { CARD_CMD28_SET_WRITE_PROT ,28 ,SIG_TRANS_CMP | CARD_SDIO_R1B |NULL ,NULL },
180 { CARD_CMD29_CLR_WRITE_PROT ,29 ,SIG_TRANS_CMP | CARD_SDIO_R1B |NULL ,NULL },
181 { CARD_CMD30_SEND_WRITE_PROT ,30 ,NULL | CARD_SDIO_R1 |NULL ,NULL }, // ??
183 { CARD_CMD32_ERASE_WR_BLK_START /*SD*/ ,32 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
184 { CARD_CMD33_ERASE_WR_BLK_END /*SD*/ ,33 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
186 { CARD_CMD35_ERASE_GROUP_START /*MMC*/ ,35 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
187 { CARD_CMD36_ERASE_GROUP_END /*MMC*/ ,36 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
189 { CARD_CMD38_ERASE ,38 ,SIG_TRANS_CMP | CARD_SDIO_R1B |NULL ,NULL },
191 { CARD_CMD39_FAST_IO /*MMC*/ ,39 ,NULL | CARD_SDIO_R4 |NULL ,NULL },
192 { CARD_CMD40_GO_IRQ_STATE /*MMC*/ ,40 ,NULL | CARD_SDIO_R5 |NULL ,NULL },
194 { CARD_CMD42_LOCK_UNLOCK_SD /*SD*/ ,42 ,NULL | CARD_SDIO_R1 |NULL ,NULL }, // ??
195 { CARD_CMD42_LOCK_UNLOCK_MMC /*MMC*/ ,42 ,NULL | CARD_SDIO_R1B |NULL ,NULL }, // ??
196 { CARD_CMD55_APP_CMD ,55 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
197 { CARD_CMD56_GEN_CMD_SD /*SD*/ ,56 ,NULL | CARD_SDIO_R1 |NULL ,NULL }, //??
198 { CARD_CMD56_GEN_CMD_MMC /*MMC*/ ,56 ,NULL | CARD_SDIO_R1B |NULL ,NULL }, //??
201 { CARD_ACMD6_SET_BUS_WIDTH /*SD*/ ,6 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
202 { CARD_ACMD13_SD_STATUS /*SD*/ ,13 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
203 { CARD_ACMD22_SEND_NUM_WR_BLCOKS /*SD*/ ,22 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
204 { CARD_ACMD23_SET_WR_BLK_ERASE_COUNT /*SD*/,23,NULL | CARD_SDIO_R1 |NULL ,NULL },
205 { CARD_ACMD41_SD_SEND_OP_COND /*SD*/ ,41 ,NULL | CARD_SDIO_R3 |NULL ,NULL },
206 { CARD_ACMD42_SET_CLR_CARD_DETECT /*SD*/ ,42 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
207 { CARD_ACMD51_SEND_SCR /*SD*/ ,51 ,NULL | CARD_SDIO_R1 |NULL ,NULL }, // ??
209 { CARD_ACMD6_SET_EXT_CSD /*SD*/ ,6 ,NULL | CARD_SDIO_R1B |NULL ,NULL },
211 #if defined(SPRD_SUPPORT_MCEX)
212 { CARD_CMD34_READ_SEC_CMD ,34 ,SIG_TRANS_CMP | CARD_SDIO_R1 |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT , TRANS_MODE_READ| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
213 { CARD_CMD35_WRITE_SEC_CMD ,35 ,SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC| ERR_DATA_TIMEOUT , TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
214 { CARD_CMD36_SEND_PSI ,36 ,SIG_TRANS_CMP | CARD_SDIO_R1 |ERR_DATA_END| ERR_DATA_CRC| ERR_DATA_TIMEOUT , TRANS_MODE_READ| TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
215 { CARD_CMD37_CTL_TRM ,37 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
218 { CARD_CMDMAX ,0 ,NULL | CARD_SDIO_NO_RSP |NULL ,NULL }
222 #define SDIO_CARD_PAL_MAGICNUM 0x5344494F
224 typedef struct SDIO_CARD_PAL_Struct
227 uint32 MagicNum; // "SDIO"
229 SDHOST_HANDLE sdio_port;
231 #if defined (UCOS_BSD_EVENT)
232 OS_FLAG_GRP *sdio_event;
233 #elif defined (CARD_SDIO_EVENT)
234 SCI_EVENT_GROUP_PTR sdio_event;
237 SDIO_CARD_PAL_SLOT_E sdio_No;
238 SDIO_CARD_PAL_TYPE_E sdio_type;
239 } SDIO_CARD_PAL_Struct_T;
241 #if defined (UCOS_BSD_EVENT)
242 #elif defined (CARD_SDIO_EVENT)
243 LOCAL SDIO_CARD_PAL_Struct_T s_sdioCardPalHd[SDHOST_SLOT_MAX_NUM] = {{FALSE,0,0,0,0},{FALSE,0,0,0,0},{FALSE,0,0,0,0},{FALSE,0,0,0,0},{FALSE,0,0,0,0},{FALSE,0,0,0,0},{FALSE,0,0,0,0},,{FALSE,0,0,0,0}};
245 LOCAL SDIO_CARD_PAL_Struct_T s_sdioCardPalHd[SDHOST_SLOT_MAX_NUM] = {{FALSE,0,0},{FALSE,0,0},{FALSE,0,0},{FALSE,0,0}};
248 #ifdef DUAL_TCARD_SUPPORT
249 LOCAL SDIO_CARD_PAL_SLOT_E s_activeslot = SDIO_CARD_PAL_SLOT_MAX;
252 #if defined (UCOS_BSD_EVENT)
254 #elif defined (CARD_SDIO_EVENT)
257 LOCAL volatile uint32 s_CardEvent = 0;
259 LOCAL volatile uint32 s_CardErrCode = 0;
261 //-----------------------------------------------------------------------------------
262 // Clear all event happened before ,and prepare next transmission
263 //-----------------------------------------------------------------------------------
264 LOCAL void _InitCardEvent (SDIO_CARD_PAL_HANDLE handle)
267 #if defined (UCOS_BSD_EVENT)
270 OSFlagPost (handle->sdio_event, 0xFFFFFFFF, OS_FLAG_CLR, &err);
272 #elif defined (CARD_SDIO_EVENT)
273 SCI_SetEvent (handle->sdio_event,0,SCI_AND);
279 //-----------------------------------------------------------------------------------
280 // After the transmission begin , wait event during the transmission
281 //-----------------------------------------------------------------------------------
282 LOCAL uint32 _WaitCardEvent (SDIO_CARD_PAL_HANDLE handle,uint32 EventId)
284 #if defined (UCOS_BSD_EVENT)
286 OSFlagPend (handle->sdio_event, EventId, OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME, 1000, &err);
288 if (OS_TIMEOUT == err)
290 s_CardErrCode |= BIT_31;
293 #elif defined (CARD_SDIO_EVENT)
298 eRet = SCI_GetEvent (handle->sdio_event,EventId,SCI_AND_CLEAR,&actualFlag,3000);
299 if (SCI_SUCCESS != eRet)
301 s_CardErrCode |= BIT_31;
302 SDIO_CARD_PRINT(("SCM Wait event error!!! eRet = 0x%x",eRet));
307 // CARD_PRINT(("SD20 Wait event before %x",EventId));
308 if(EventId == (s_CardEvent&EventId))
317 // CARD_PRINT(("SD20 Wait event end %x",s_CardEvent));
321 //-----------------------------------------------------------------------------------
322 // After the transmission begin , this funtion used to give event
323 //-----------------------------------------------------------------------------------
324 LOCAL void _SetCardEvent (SDIO_CARD_PAL_HANDLE handle,uint32 EventId)
326 #if defined (UCOS_BSD_EVENT)
328 OSFlagPost (handle->sdio_event, EventId, OS_FLAG_SET, &err);
329 #elif defined (CARD_SDIO_EVENT)
330 SCI_SetEvent (handle->sdio_event,EventId,SCI_OR);
332 s_CardEvent |= EventId;
336 //-----------------------------------------------------------------------------------
337 // during the transmission ,all the event is given out by the interrupt,this function is called by the interrupt service to give the event to application
338 //-----------------------------------------------------------------------------------
341 LOCAL uint32 s_irqCardProc_msg;
342 LOCAL uint32 s_sdio_dma_addr[4] = {NULL};
344 LOCAL void _irqCardProc (uint32 msg, uint32 errCode, SDHOST_SLOT_NO slotNum)
346 SDIO_CARD_PAL_HANDLE handle;
347 handle = &s_sdioCardPalHd[slotNum];
349 if (0 != (SIG_CARD_IN&msg)) // card interrupt happened , may be some operation error happened
351 _SetCardEvent (handle,SIG_CARD_IN);
354 if (0 != (SIG_CARD_INSERT&msg)) // card is inserted in slot
356 _SetCardEvent (handle,SIG_CARD_INSERT);
358 else if (0 != (SIG_CARD_REMOVE&msg)) // card is plug out from slot
360 _SetCardEvent (handle,SIG_CARD_REMOVE);
362 else if (0 != (SIG_ERR&msg)) // some error happened during the transmission
364 s_CardErrCode |= errCode; // get the error detail
365 _SetCardEvent (handle,SIG_ALL);
369 if (0 != (SIG_TRANS_CMP&msg)) // transmission complete
371 /* clear transfer complete timeout bit! */
372 s_CardErrCode &= ~ERR_DATA_TIMEOUT;
373 _SetCardEvent (handle,SIG_TRANS_CMP);
375 else if (0 != (SIG_DMA_INT&msg)) // during the transmission ,the dma buffer is out of used ,we must set new dma buffer to continue the transmission
377 volatile uint32 nextAdd;
379 s_irqCardProc_msg = msg;
381 nextAdd = SDHOST_GetDmaAddr (handle->sdio_port);
382 SDHOST_SetDmaAddr (handle->sdio_port, nextAdd);
384 s_sdio_dma_addr[3] = SDHOST_GetDmaAddr (handle->sdio_port);
386 SDHOST_NML_IntStatus_En (handle->sdio_port, SIG_DMA_INT);
387 SDHOST_NML_IntSig_En (handle->sdio_port, SIG_DMA_INT);
390 if (0 != (SIG_CMD_CMP&msg)) // during the transmission ,the command has be confirmed by card
392 s_CardErrCode &= ~ERR_CMD_TIMEOUT;
393 _SetCardEvent (handle,SIG_CMD_CMP);
397 #ifdef DUAL_TCARD_SUPPORT
398 LOCAL void _SlotSelect(SDIO_CARD_PAL_SLOT_E slotNo)
400 SDIO_CARD_PAL_SLOT_E i;
401 SDIO_CARD_PAL_HANDLE handle;
403 SDIO_CARD_PAL_ASSERT(SDHOST_SLOT_MAX_NUM > slotNo); /*assert verified*/
405 SDHOST_Slot_select((SDHOST_SLOT_NO)slotNo);
407 for(i = 0; i < SDHOST_SLOT_MAX_NUM; i ++)
409 handle = &s_sdioCardPalHd[i];
410 if(PNULL == handle->sdio_port)
416 SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);
420 SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_OFF);
427 PUBLIC SDIO_CARD_PAL_HANDLE SDIO_Card_Pal_Open (SDIO_CARD_PAL_SLOT_E slotNo)
429 SDIO_CARD_PAL_IRQ_DECLARE;
431 SDIO_CARD_PAL_ASSERT (SDHOST_SLOT_MAX_NUM > slotNo); /*assert verified*/
433 SDIO_CARD_PAL_DISABLE_IRQ;
435 if (TRUE == s_sdioCardPalHd[slotNo].flag)
437 SDIO_CARD_PAL_ENABLE_IRQ;
438 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
441 s_sdioCardPalHd[slotNo].flag = TRUE;
442 SDIO_CARD_PAL_ENABLE_IRQ;
444 s_sdioCardPalHd[slotNo].MagicNum = SDIO_CARD_PAL_MAGICNUM;
445 #if defined (UCOS_BSD_EVENT)
448 s_sdioCardPalHd[slotNo].sdio_event = PNULL;
449 s_sdioCardPalHd[slotNo].sdio_event = OSFlagCreate (0, &err);
451 if (PNULL == s_sdioCardPalHd[slotNo].sdio_event)
453 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
456 #elif defined (CARD_SDIO_EVENT)
457 s_sdioCardPalHd[slotNo].sdio_event = PNULL;
458 s_sdioCardPalHd[slotNo].sdio_event = SCI_CreateEvent ("SDIO_EVENT");
460 if (PNULL == s_sdioCardPalHd[slotNo].sdio_event)
462 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
469 s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE) SDHOST_Register ( (SDHOST_SLOT_NO) slotNo,_irqCardProc);
471 if (0 == s_sdioCardPalHd[slotNo].sdio_port)
473 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
476 s_sdioCardPalHd[slotNo].sdio_No = slotNo;
477 #ifdef DUAL_TCARD_SUPPORT
478 s_activeslot = slotNo;
482 return &s_sdioCardPalHd[slotNo];
486 PUBLIC BOOLEAN SDIO_Card_Pal_Pwr (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_PWR_E onOrOff)
489 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
490 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
491 && (TRUE == handle->flag)
494 #ifdef DUAL_TCARD_SUPPORT
495 switch(handle->sdio_No)
497 case SDIO_CARD_PAL_SLOT_0:
498 case SDIO_CARD_PAL_SLOT_1:
500 if(s_activeslot != handle->sdio_No)
502 s_activeslot = handle->sdio_No;
503 _SlotSelect(handle->sdio_No);
510 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
518 case SDIO_CARD_PAL_ON:
520 SDHOST_RST(handle->sdio_port, RST_MODULE);
521 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_1BIT_WIDTH);
522 SDHOST_Cfg_SpeedMode (handle->sdio_port, SDIO_LOWSPEED/*EMMC_SDR12*/);
523 #if defined(CONFIG_FPGA)
525 SDHOST_Cfg_Voltage (handle->sdio_port,VOL_3_0);
527 SDHOST_SD_POWER (handle->sdio_port,POWR_ON);
529 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,400000);
530 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_ON);
532 SDHOST_internalClk_OnOff (handle->sdio_port,CLK_ON);
536 case SDIO_CARD_PAL_OFF:
538 SDHOST_SD_POWER (handle->sdio_port,POWR_OFF);
539 SDHOST_RST (handle->sdio_port,RST_ALL);
540 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
541 SDHOST_internalClk_OnOff (handle->sdio_port,CLK_OFF);
543 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
549 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
557 PUBLIC BOOLEAN SDIO_Card_Pal_SetClk (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_CLKTYPE_E clkType)
559 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
560 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
561 && (TRUE == handle->flag)
564 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
568 case SDIO_CARD_PAL_400KHz:
570 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,400000);
573 #if defined (CONFIG_SC8825) || defined(CONFIG_SC7710G2) || defined (CONFIG_SC8830) || (defined CONFIG_SC9630)
574 case SDIO_CARD_PAL_1MHz:
575 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,1000000);
577 case SDIO_CARD_PAL_2MHz:
578 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,2000000);
580 case SDIO_CARD_PAL_4MHz:
581 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,4000000);
583 case SDIO_CARD_PAL_8MHz:
584 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,8000000);
586 case SDIO_CARD_PAL_12MHz:
587 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,12000000);
590 case SDIO_CARD_PAL_20MHz:
592 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,20000000);
596 case SDIO_CARD_PAL_25MHz:
598 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,25000000);
602 case SDIO_CARD_PAL_50MHz:
604 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,50000000);
610 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
616 SDHOST_internalClk_OnOff (handle->sdio_port,CLK_ON);
618 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_ON);
624 PUBLIC BOOLEAN SDIO_Card_Pal_SetBusWidth (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_BUFWIDTH_E widthType)
626 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
627 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
628 && (TRUE == handle->flag)
633 case SDIO_CARD_PAL_1_BIT:
635 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_1BIT_WIDTH);
639 case SDIO_CARD_PAL_4_BIT:
641 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_4BIT_WIDTH);
645 case SDIO_CARD_PAL_8_BIT:
647 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_8BIT_WIDTH);
653 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
662 PUBLIC BOOLEAN SDIO_Card_Pal_SetSpeedMode (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_SPEEDMODE_E speedMode)
664 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
665 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
666 && (TRUE == handle->flag)
668 #if defined (CONFIG_SC8825) || defined(CONFIG_SC7710G2) || defined(CONFIG_SC8830) || (defined CONFIG_SC9630)
671 case EMMC_SPEED_SDR12:
672 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR12);
674 case EMMC_SPEED_SDR25:
675 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR25);
677 case EMMC_SPEED_SDR50:
678 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR50);
680 case EMMC_SPEED_SDR104:
681 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR104);
683 case EMMC_SPEED_DDR50:
684 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_DDR50);
694 case SDIO_CARD_PAL_LOW_SPEED:
696 SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_LOWSPEED);
700 case SDIO_CARD_PAL_HIGH_SPEED:
702 SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_HIGHSPEED);
708 SDIO_CARD_PAL_ASSERT(0); /*assert verified*/
715 // if ahb_clk < 96M, then not enter highspeed mode.
716 /*if(CHIP_GetAhbClk() < 96000000)
726 //-----------------------------------------------------------------------------------
727 // Send command to card
728 //-----------------------------------------------------------------------------------
730 LOCAL CARD_DATA_PARAM_T s_dataParam;
733 PUBLIC void SDIO_Card_Pal_SetType(SDIO_CARD_PAL_HANDLE handle, SDIO_CARD_PAL_TYPE_E sdio_type)
735 handle->sdio_type = sdio_type;
738 PUBLIC SDIO_CARD_PAL_ERROR_E SDIO_Card_Pal_SendCmd (
739 /*IN*/SDIO_CARD_PAL_HANDLE handle,
740 /*IN*/SDIO_CARD_PAL_CMD_E cmd,
741 /*IN*/uint32 argument,
742 /*IN*/CARD_DATA_PARAM_T *dataParam,
748 const CMD_CTL_FLG* curCmdInfo = NULL;
749 #if defined CONFIG_SC8830 || (defined CONFIG_SC9630)
750 if (handle->sdio_type == SDIO_CARD_PAL_TYPE_SD)
751 curCmdInfo = &s_SDCmdDetail[cmd];
754 curCmdInfo = &s_cmdDetail[cmd];
756 SDIO_CARD_PRINT(("%s : cmd:%x, cmdIndex:%x, argument:%x\r\n", __FUNCTION__, cmd, curCmdInfo->cmdIndex, argument));
758 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
759 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
760 && (TRUE == handle->flag)
762 SDIO_CARD_PAL_ASSERT (cmd == curCmdInfo->cmd); /*assert verified*/
765 SCI_SDIO_EnableDeepSleep (DISABLE_AHB_SLEEP);
766 CHNG_FREQ_Event_Clr (FREQ_CHNG_EVENT_SDIO,SYS_MODE_NORMAL);
769 SDHOST_NML_IntSig_Dis (handle->sdio_port, SIG_ALL);
770 SDHOST_NML_IntStatus_Dis (handle->sdio_port, SIG_ALL); // ???
771 SDHOST_NML_IntStatus_Clr (handle->sdio_port, SIG_ALL);
774 SDHOST_SetDataTimeOutValue (handle->sdio_port,0xE);
777 SDHOST_SetErrCodeFilter (handle->sdio_port, curCmdInfo->errFilter);
779 tmpIntFilter = curCmdInfo->intFilter;
781 if (NULL != curCmdInfo->errFilter)
783 tmpIntFilter |= SIG_ERR;
786 if (NULL != dataParam)
788 tmpIntFilter |= SIG_DMA_INT;
791 SDHOST_NML_IntStatus_En (handle->sdio_port, tmpIntFilter);
792 SDHOST_NML_IntSig_En (handle->sdio_port, tmpIntFilter);
793 #if !(defined(CONFIG_SC8830) || defined(CONFIG_SC9630) )
795 *(volatile uint32 *)(INT_IRQ_EN) |= (0x1<<TB_SDIO1_INT);
798 _InitCardEvent (handle);
800 if (NULL != dataParam)
802 uint32 bufferSize = 0;
804 s_dataParam = *dataParam;
806 bufferSize = dataParam->blkLen * (dataParam->blkNum);
807 //if(dataParam->direction == SDIO_DMA_OUT)
809 Dcache_CleanRegion((unsigned int)(dataParam->databuf), bufferSize);
810 Dcache_InvalRegion((unsigned int)(dataParam->databuf), bufferSize);
812 //MMU_DmaCacheSync( (uint32) (dataParam->databuf), bufferSize, DMABUFFER_BIDIRECTIONAL);
814 SDHOST_SetDmaAddr (handle->sdio_port, (uint32) (dataParam->databuf));
815 SDHOST_SetDataParam (handle->sdio_port, dataParam->blkLen, dataParam->blkNum, SDIO_DMA_512K);
817 s_sdio_dma_addr[0] = SDHOST_GetDmaAddr (handle->sdio_port);
821 SDHOST_SetCmdArg (handle->sdio_port,argument);
822 SDHOST_SetCmd (handle->sdio_port,curCmdInfo->cmdIndex,curCmdInfo->transmode,CMD_TYPE_NORMAL, curCmdInfo->Response);
824 while (0 != _WaitCardEvent(handle,curCmdInfo->intFilter))
826 _SDHOST_IrqHandle(handle->sdio_No);
828 if (CARD_CMD38_ERASE == cmd)
834 s_CardErrCode = ERR_DATA_TIMEOUT;
840 SDHOST_RST (handle->sdio_port,RST_CMD_DAT_LINE);
843 SCI_SDIO_EnableDeepSleep (ENABLE_AHB_SLEEP);
844 CHNG_FREQ_Event_Set (FREQ_CHNG_EVENT_SDIO,SYS_MODE_NORMAL);
847 if (0 != s_CardErrCode)
849 if ( (CARD_CMD38_ERASE == cmd) && (ERR_DATA_TIMEOUT == s_CardErrCode))
851 SDIO_CARD_PRINT ( ("SDIO_Card may be erase R1b is too long"));
852 tmOut = SCI_GetTickCount();
854 while (0 == (BIT_20 & SDHOST_GetPinState (handle->sdio_port)))
856 SDHOST_Delayus (1000);
858 if ( (tmOut+20000) < SCI_GetTickCount())
861 if (NULL != dataParam)
863 s_sdio_dma_addr[2] = SDHOST_GetDmaAddr (handle->sdio_port);
866 SDHOST_RST (handle->sdio_port,RST_CMD_DAT_LINE);
867 return s_CardErrCode;
870 s_CardErrCode &= ~ERR_DATA_TIMEOUT;
874 SDIO_CARD_PRINT ( ("SDIO_Card error = 0x%x",s_CardErrCode));
875 return s_CardErrCode;
879 /* if (NULL != dataParam)
881 if(dataParam->direction == SDIO_DMA_IN)
882 Dcache_InvalRegion((unsigned int)(dataParam->databuf), dataParam->blkLen * dataParam->blkNum);
885 SDHOST_GetRspFromBuf (handle->sdio_port, curCmdInfo->Response, rspBuf);
887 SDIO_CARD_PRINT(("resp[0-4]:%02X, %02X, %02X, %02X\r\n", rspBuf[0], rspBuf[1], rspBuf[2], rspBuf[3]));
889 return SDIO_CARD_PAL_ERR_NONE;
892 PUBLIC BOOLEAN SDIO_Card_Pal_Close (SDIO_CARD_PAL_HANDLE handle)
894 SDIO_CARD_PAL_IRQ_DECLARE;
896 // ´ËÄ£¿éÖ»Ìṩ¸øCard_sdio.cÕâ¸öÐÒéʹÓã¬ÐÒé´úÂë±¾ÉíÒѾ±£Ö¤¸ÃhandleµÄÓÐЧÐÔ£¬Òò´ËÔÚÕâÀï²»×öÌرðÑϵļì²é
897 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
898 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
899 && (TRUE == handle->flag)
902 SDIO_CARD_PAL_DISABLE_IRQ;
903 handle->flag = FALSE;
904 SDIO_CARD_PAL_ENABLE_IRQ;
906 SDHOST_UnRegister (handle->sdio_port);
908 #if defined (UCOS_BSD_EVENT)
911 OSFlagDel (handle->sdio_event, OS_DEL_ALWAYS, &err);
912 handle->sdio_event = PNULL;
914 #elif defined (CARD_SDIO_EVENT)
915 SCI_DeleteEvent (handle->sdio_event);
916 handle->sdio_event = PNULL;
923 #if !(defined(CONFIG_SC8830) || defined(CONFIG_SC9630) )
924 #ifdef CONFIG_EMMC_BOOT
925 uint32 SCI_GetTickCount(void)
927 volatile uint32 tmp_tick1;
928 volatile uint32 tmp_tick2;
930 tmp_tick1 = SYSTEM_CURRENT_CLOCK;
931 tmp_tick2 = SYSTEM_CURRENT_CLOCK;
933 while (tmp_tick1 != tmp_tick2)
935 tmp_tick1 = tmp_tick2;
936 tmp_tick2 = SYSTEM_CURRENT_CLOCK;
944 void SDIO_Card_Pal_DisSdClk(SDIO_CARD_PAL_HANDLE handle)
946 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);