2 #include "asm/arch/sci_types.h"
3 #include "sdio_card_pal.h"
4 #include "sdhost_drv.h"
5 #include "asm/arch/mmu_drvapi.h"
6 //#include "asm/arch/chng_freq.h"
7 #include "asm/arch/sc_reg.h"
9 //#include "asm/arch/deep_sleep.h"
10 //#include "asm/arch/deepsleep_drvapi.h"
12 //#define DUAL_TCARD_SUPPORT
14 #define CARD_SDIO_EVENT
20 //#define UCOS_BSD_EVENT
22 //#define DUAL_TCARD_SUPPORT
24 /*-----------------------------------------*/
26 /*-----------------------------------------*/
27 #define SDIO_CARD_PAL_ASSERT SCI_ASSERT
28 #if defined CONFIG_SC8825 && defined CONFIG_UBOOT_DEBUG
29 #define SDIO_CARD_PRINT(x) printf x
31 #define SDIO_CARD_PRINT(x) SCI_TRACE_LOW x
33 /*-----------------------------------------*/
35 /*-----------------------------------------*/
36 #if defined(OS_SELF_SIMULATOR)
37 #define SDIO_CARD_PAL_IRQ_DECLARE OS_CPU_SR cpu_sr
38 #define SDIO_CARD_PAL_DISABLE_IRQ OS_ENTER_CRITICAL
39 #define SDIO_CARD_PAL_ENABLE_IRQ OS_EXIT_CRITICAL
41 #define SDIO_CARD_PAL_IRQ_DECLARE
42 #define SDIO_CARD_PAL_DISABLE_IRQ //SCI_DisableIRQ
43 #define SDIO_CARD_PAL_ENABLE_IRQ //SCI_RestoreIRQ
45 /*-----------------------------------------*/
50 SDIO_CARD_PAL_CMD_E cmd;
53 CMD_RSP_TYPE_E Response;
59 // response Name cmd int filter ,rsp ,cmd error filter
60 #define CARD_SDIO_NO_RSP NULL/*|SIG_CARD_IN|SIG_CARD_INSERT|SIG_CARD_REMOVE*/|SIG_CMD_CMP ,CMD_NO_RSP ,NULL
61 #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
62 #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
63 #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
64 #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
65 #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
66 #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
67 #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
68 #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
69 //#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
72 LOCAL const CMD_CTL_FLG s_SDCmdDetail[]=
74 // cmdindex,rsp,transmode
75 //#define CMDname cmdindex ,data int filter + (cmd int filter+)rsp(+cmd error filter) + ,data error filter ,transmode
76 { CARD_CMD0_GO_IDLE_STATE , 0 , NULL | CARD_SDIO_NO_RSP | NULL , NULL },
77 { CARD_CMD1_SEND_OP_COND /*MMC*/ , 1 , NULL | CARD_SDIO_R3 | NULL , NULL },
78 { CARD_CMD2_ALL_SEND_CID , 2 , NULL | CARD_SDIO_R2 | NULL , NULL },
79 { CARD_CMD3_SEND_RELATIVE_ADDR /*SD*/ , 3 , NULL | CARD_SDIO_R6 | NULL , NULL },
80 { CARD_CMD3_SET_RELATIVE_ADDR /*MMC*/ , 3 , NULL | CARD_SDIO_R1 | NULL , NULL },
81 { CARD_CMD4_SET_DSR , 4 , NULL | CARD_SDIO_NO_RSP | NULL , NULL },
82 { 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 },
83 { CARD_CMD7_SELECT_DESELECT_CARD , 7 , NULL | CARD_SDIO_R1B | NULL , NULL },
84 { CARD_CMD8_SEND_IF_COND /*SD*/ , 8 , NULL | CARD_SDIO_R7 | NULL , NULL },
85 { CARD_CMD9_SEND_CSD , 9 , NULL | CARD_SDIO_R2 | NULL , NULL },
86 { CARD_CMD10_SEND_CID , 10 , NULL | CARD_SDIO_R2 | NULL , NULL },
87 { 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 },
88 { 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 },
89 { CARD_CMD12_STOP_TRANSMISSION , 12 , SIG_TRANS_CMP | CARD_SDIO_R1B | NULL , NULL }, //It is auto performed by Host
90 { CARD_CMD13_SEND_STATUS , 13 , NULL | CARD_SDIO_R1 | NULL , NULL },
91 { CARD_CMD15_GO_INACTIVE_STATE , 15 , NULL | CARD_SDIO_NO_RSP | NULL , NULL },
92 { CARD_CMD16_SET_BLOCKLEN , 16 , NULL | CARD_SDIO_R1 | NULL , NULL },
93 { 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 },
94 { 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 },
95 { 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 },
96 { 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 },
97 { 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 },
98 { CARD_CMD23_SET_BLOCK_COUNT /*MMC*/ , 23 , NULL | CARD_SDIO_R1 | NULL , NULL },
99 { CARD_CMD24_WRITE_BLOCK , 24 , SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC | ERR_DATA_TIMEOUT , TRANS_MODE_DMA_EN | CMD_HAVE_DATA },
100 { 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 },
101 { 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 },
103 { CARD_CMD26_PROGRAM_CID /*MMC*/ , 26 , NULL | CARD_SDIO_R1 | NULL , NULL },
104 { CARD_CMD27_PROGRAM_CSD , 27 , NULL | CARD_SDIO_R1 | NULL , NULL },
105 { CARD_CMD28_SET_WRITE_PROT , 28 , SIG_TRANS_CMP | CARD_SDIO_R1B | NULL , NULL },
106 { CARD_CMD29_CLR_WRITE_PROT , 29 , SIG_TRANS_CMP | CARD_SDIO_R1B | NULL , NULL },
107 { CARD_CMD30_SEND_WRITE_PROT , 30 , NULL | CARD_SDIO_R1 | NULL , NULL }, // ??
109 { CARD_CMD32_ERASE_WR_BLK_START /*SD*/ , 32 , NULL | CARD_SDIO_R1 | NULL , NULL },
110 { CARD_CMD33_ERASE_WR_BLK_END /*SD*/ , 33 , NULL | CARD_SDIO_R1 | NULL , NULL },
112 { CARD_CMD35_ERASE_GROUP_START /*MMC*/ , 35 , NULL | CARD_SDIO_R1 | NULL , NULL },
113 { CARD_CMD36_ERASE_GROUP_END /*MMC*/ , 36 , NULL | CARD_SDIO_R1 | NULL , NULL },
115 { CARD_CMD38_ERASE , 38 , SIG_TRANS_CMP | CARD_SDIO_R1B | NULL , NULL },
117 { CARD_CMD39_FAST_IO /*MMC*/ , 39 , NULL | CARD_SDIO_R4 | NULL , NULL },
118 { CARD_CMD40_GO_IRQ_STATE /*MMC*/ , 40 , NULL | CARD_SDIO_R5 | NULL , NULL },
120 { CARD_CMD42_LOCK_UNLOCK_SD /*SD*/ , 42 , NULL | CARD_SDIO_R1 | NULL , NULL }, // ??
121 { CARD_CMD42_LOCK_UNLOCK_MMC /*MMC*/ , 42 , NULL | CARD_SDIO_R1B | NULL , NULL }, // ??
122 { CARD_CMD55_APP_CMD , 55 , NULL | CARD_SDIO_R1 | NULL , NULL },
123 { CARD_CMD56_GEN_CMD_SD /*SD*/ , 56 , NULL | CARD_SDIO_R1 | NULL , NULL }, //??
124 { CARD_CMD56_GEN_CMD_MMC /*MMC*/ , 56 , NULL | CARD_SDIO_R1B | NULL , NULL }, //??
127 { CARD_ACMD6_SET_BUS_WIDTH /*SD*/ , 6 , NULL | CARD_SDIO_R1 | NULL , NULL },
128 { CARD_ACMD13_SD_STATUS /*SD*/ , 13 , NULL | CARD_SDIO_R1 | NULL , NULL },
129 { CARD_ACMD22_SEND_NUM_WR_BLCOKS /*SD*/ , 22 , NULL | CARD_SDIO_R1 | NULL , NULL },
130 { CARD_ACMD23_SET_WR_BLK_ERASE_COUNT /*SD*/, 23, NULL | CARD_SDIO_R1 | NULL , NULL },
131 { CARD_ACMD41_SD_SEND_OP_COND /*SD*/ , 41 , NULL | CARD_SDIO_R3 | NULL , NULL },
132 { CARD_ACMD42_SET_CLR_CARD_DETECT /*SD*/ , 42 , NULL | CARD_SDIO_R1 | NULL , NULL },
133 { CARD_ACMD51_SEND_SCR /*SD*/ , 51 , NULL | CARD_SDIO_R1 | NULL , NULL }, // ??
135 { CARD_CMDMAX , 0 , NULL | CARD_SDIO_NO_RSP | NULL , NULL }
140 static const CMD_CTL_FLG s_cmdDetail[] =
142 // cmdindex,rsp,transmode
143 //#define CMDname cmdindex ,data int filter + (cmd int filter+)rsp(+cmd error filter) + ,data error filter ,transmode
144 { CARD_CMD0_GO_IDLE_STATE ,0 ,NULL | CARD_SDIO_NO_RSP |NULL ,NULL },
145 //{ 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},
146 { CARD_CMD1_SEND_OP_COND /*MMC*/ ,1 ,NULL | CARD_SDIO_R3 |NULL ,NULL },
147 { CARD_CMD2_ALL_SEND_CID ,2 ,NULL | CARD_SDIO_R2 |NULL ,NULL },
148 { CARD_CMD3_SEND_RELATIVE_ADDR /*SD*/ ,3 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
149 { CARD_CMD3_SET_RELATIVE_ADDR /*MMC*/ ,3 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
150 { CARD_CMD4_SET_DSR ,4 ,NULL | CARD_SDIO_NO_RSP |NULL ,NULL },
151 { 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 },
152 { CARD_CMD7_SELECT_DESELECT_CARD ,7 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
153 //{ CARD_CMD8_SEND_IF_COND /*SD*/ ,8 ,NULL | CARD_SDIO_R7 |NULL ,NULL },
154 { 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 },
155 { CARD_CMD9_SEND_CSD ,9 ,NULL | CARD_SDIO_R2 |NULL ,NULL },
156 { CARD_CMD10_SEND_CID ,10 ,NULL | CARD_SDIO_R2 |NULL ,NULL },
157 { 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 },
158 { 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 },
159 { CARD_CMD12_STOP_TRANSMISSION ,12 ,SIG_TRANS_CMP | CARD_SDIO_R1B |NULL ,NULL }, //It is auto performed by Host
160 { CARD_CMD13_SEND_STATUS ,13 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
161 { CARD_CMD15_GO_INACTIVE_STATE ,15 ,NULL | CARD_SDIO_NO_RSP |NULL ,NULL },
162 { CARD_CMD16_SET_BLOCKLEN ,16 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
163 { 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 },
164 { 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 },
165 { 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 },
166 { 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 },
167 { 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 },
168 { CARD_CMD23_SET_BLOCK_COUNT /*MMC*/ ,23 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
169 { CARD_CMD24_WRITE_BLOCK ,24 ,SIG_TRANS_CMP | CARD_SDIO_R1 | ERR_DATA_CRC| ERR_DATA_TIMEOUT , TRANS_MODE_DMA_EN| CMD_HAVE_DATA },
170 { 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 },
171 { 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 },
173 { CARD_CMD26_PROGRAM_CID /*MMC*/ ,26 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
174 { CARD_CMD27_PROGRAM_CSD ,27 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
175 { CARD_CMD28_SET_WRITE_PROT ,28 ,SIG_TRANS_CMP | CARD_SDIO_R1B |NULL ,NULL },
176 { CARD_CMD29_CLR_WRITE_PROT ,29 ,SIG_TRANS_CMP | CARD_SDIO_R1B |NULL ,NULL },
177 { CARD_CMD30_SEND_WRITE_PROT ,30 ,NULL | CARD_SDIO_R1 |NULL ,NULL }, // ??
179 { CARD_CMD32_ERASE_WR_BLK_START /*SD*/ ,32 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
180 { CARD_CMD33_ERASE_WR_BLK_END /*SD*/ ,33 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
182 { CARD_CMD35_ERASE_GROUP_START /*MMC*/ ,35 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
183 { CARD_CMD36_ERASE_GROUP_END /*MMC*/ ,36 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
185 { CARD_CMD38_ERASE ,38 ,SIG_TRANS_CMP | CARD_SDIO_R1B |NULL ,NULL },
187 { CARD_CMD39_FAST_IO /*MMC*/ ,39 ,NULL | CARD_SDIO_R4 |NULL ,NULL },
188 { CARD_CMD40_GO_IRQ_STATE /*MMC*/ ,40 ,NULL | CARD_SDIO_R5 |NULL ,NULL },
190 { CARD_CMD42_LOCK_UNLOCK_SD /*SD*/ ,42 ,NULL | CARD_SDIO_R1 |NULL ,NULL }, // ??
191 { CARD_CMD42_LOCK_UNLOCK_MMC /*MMC*/ ,42 ,NULL | CARD_SDIO_R1B |NULL ,NULL }, // ??
192 { CARD_CMD55_APP_CMD ,55 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
193 { CARD_CMD56_GEN_CMD_SD /*SD*/ ,56 ,NULL | CARD_SDIO_R1 |NULL ,NULL }, //??
194 { CARD_CMD56_GEN_CMD_MMC /*MMC*/ ,56 ,NULL | CARD_SDIO_R1B |NULL ,NULL }, //??
197 { CARD_ACMD6_SET_BUS_WIDTH /*SD*/ ,6 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
198 { CARD_ACMD13_SD_STATUS /*SD*/ ,13 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
199 { CARD_ACMD22_SEND_NUM_WR_BLCOKS /*SD*/ ,22 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
200 { CARD_ACMD23_SET_WR_BLK_ERASE_COUNT /*SD*/,23,NULL | CARD_SDIO_R1 |NULL ,NULL },
201 { CARD_ACMD41_SD_SEND_OP_COND /*SD*/ ,41 ,NULL | CARD_SDIO_R3 |NULL ,NULL },
202 { CARD_ACMD42_SET_CLR_CARD_DETECT /*SD*/ ,42 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
203 { CARD_ACMD51_SEND_SCR /*SD*/ ,51 ,NULL | CARD_SDIO_R1 |NULL ,NULL }, // ??
205 { CARD_ACMD6_SET_EXT_CSD /*SD*/ ,6 ,NULL | CARD_SDIO_R1B |NULL ,NULL },
207 #if defined(SPRD_SUPPORT_MCEX)
208 { 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 },
209 { 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 },
210 { 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 },
211 { CARD_CMD37_CTL_TRM ,37 ,NULL | CARD_SDIO_R1 |NULL ,NULL },
214 { CARD_CMDMAX ,0 ,NULL | CARD_SDIO_NO_RSP |NULL ,NULL }
218 #define SDIO_CARD_PAL_MAGICNUM 0x5344494F
220 typedef struct SDIO_CARD_PAL_Struct
223 uint32 MagicNum; // "SDIO"
225 SDHOST_HANDLE sdio_port;
227 #if defined (UCOS_BSD_EVENT)
228 OS_FLAG_GRP *sdio_event;
229 #elif defined (CARD_SDIO_EVENT)
230 SCI_EVENT_GROUP_PTR sdio_event;
233 SDIO_CARD_PAL_SLOT_E sdio_No;
234 SDIO_CARD_PAL_TYPE_E sdio_type;
235 } SDIO_CARD_PAL_Struct_T;
237 #if defined (UCOS_BSD_EVENT)
238 #elif defined (CARD_SDIO_EVENT)
239 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}};
241 LOCAL SDIO_CARD_PAL_Struct_T s_sdioCardPalHd[SDHOST_SLOT_MAX_NUM] = {{FALSE,0,0},{FALSE,0,0},{FALSE,0,0},{FALSE,0,0}};
244 #ifdef DUAL_TCARD_SUPPORT
245 LOCAL SDIO_CARD_PAL_SLOT_E s_activeslot = SDIO_CARD_PAL_SLOT_MAX;
248 #if defined (UCOS_BSD_EVENT)
250 #elif defined (CARD_SDIO_EVENT)
253 LOCAL volatile uint32 s_CardEvent = 0;
255 LOCAL volatile uint32 s_CardErrCode = 0;
257 //-----------------------------------------------------------------------------------
258 // Clear all event happened before ,and prepare next transmission
259 //-----------------------------------------------------------------------------------
260 LOCAL void _InitCardEvent (SDIO_CARD_PAL_HANDLE handle)
263 #if defined (UCOS_BSD_EVENT)
266 OSFlagPost (handle->sdio_event, 0xFFFFFFFF, OS_FLAG_CLR, &err);
268 #elif defined (CARD_SDIO_EVENT)
269 SCI_SetEvent (handle->sdio_event,0,SCI_AND);
275 //-----------------------------------------------------------------------------------
276 // After the transmission begin , wait event during the transmission
277 //-----------------------------------------------------------------------------------
278 LOCAL uint32 _WaitCardEvent (SDIO_CARD_PAL_HANDLE handle,uint32 EventId)
280 #if defined (UCOS_BSD_EVENT)
282 OSFlagPend (handle->sdio_event, EventId, OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME, 1000, &err);
284 if (OS_TIMEOUT == err)
286 s_CardErrCode |= BIT_31;
289 #elif defined (CARD_SDIO_EVENT)
294 eRet = SCI_GetEvent (handle->sdio_event,EventId,SCI_AND_CLEAR,&actualFlag,3000);
295 if (SCI_SUCCESS != eRet)
297 s_CardErrCode |= BIT_31;
298 SDIO_CARD_PRINT(("SCM Wait event error!!! eRet = 0x%x",eRet));
303 // CARD_PRINT(("SD20 Wait event before %x",EventId));
304 if(EventId == (s_CardEvent&EventId))
313 // CARD_PRINT(("SD20 Wait event end %x",s_CardEvent));
317 //-----------------------------------------------------------------------------------
318 // After the transmission begin , this funtion used to give event
319 //-----------------------------------------------------------------------------------
320 LOCAL void _SetCardEvent (SDIO_CARD_PAL_HANDLE handle,uint32 EventId)
322 #if defined (UCOS_BSD_EVENT)
324 OSFlagPost (handle->sdio_event, EventId, OS_FLAG_SET, &err);
325 #elif defined (CARD_SDIO_EVENT)
326 SCI_SetEvent (handle->sdio_event,EventId,SCI_OR);
328 s_CardEvent |= EventId;
332 //-----------------------------------------------------------------------------------
333 // 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
334 //-----------------------------------------------------------------------------------
337 LOCAL uint32 s_irqCardProc_msg;
338 LOCAL uint32 s_sdio_dma_addr[4] = {NULL};
340 LOCAL void _irqCardProc (uint32 msg, uint32 errCode, SDHOST_SLOT_NO slotNum)
342 SDIO_CARD_PAL_HANDLE handle;
343 handle = &s_sdioCardPalHd[slotNum];
345 if (0 != (SIG_CARD_IN&msg)) // card interrupt happened , may be some operation error happened
347 _SetCardEvent (handle,SIG_CARD_IN);
350 if (0 != (SIG_CARD_INSERT&msg)) // card is inserted in slot
352 _SetCardEvent (handle,SIG_CARD_INSERT);
354 else if (0 != (SIG_CARD_REMOVE&msg)) // card is plug out from slot
356 _SetCardEvent (handle,SIG_CARD_REMOVE);
358 else if (0 != (SIG_ERR&msg)) // some error happened during the transmission
360 s_CardErrCode |= errCode; // get the error detail
361 _SetCardEvent (handle,SIG_ALL);
365 if (0 != (SIG_TRANS_CMP&msg)) // transmission complete
367 /* clear transfer complete timeout bit! */
368 s_CardErrCode &= ~ERR_DATA_TIMEOUT;
369 _SetCardEvent (handle,SIG_TRANS_CMP);
371 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
373 volatile uint32 nextAdd;
375 s_irqCardProc_msg = msg;
377 nextAdd = SDHOST_GetDmaAddr (handle->sdio_port);
378 SDHOST_SetDmaAddr (handle->sdio_port, nextAdd);
380 s_sdio_dma_addr[3] = SDHOST_GetDmaAddr (handle->sdio_port);
382 SDHOST_NML_IntStatus_En (handle->sdio_port, SIG_DMA_INT);
383 SDHOST_NML_IntSig_En (handle->sdio_port, SIG_DMA_INT);
386 if (0 != (SIG_CMD_CMP&msg)) // during the transmission ,the command has be confirmed by card
388 s_CardErrCode &= ~ERR_CMD_TIMEOUT;
389 _SetCardEvent (handle,SIG_CMD_CMP);
393 #ifdef DUAL_TCARD_SUPPORT
394 LOCAL void _SlotSelect(SDIO_CARD_PAL_SLOT_E slotNo)
396 SDIO_CARD_PAL_SLOT_E i;
397 SDIO_CARD_PAL_HANDLE handle;
399 SDIO_CARD_PAL_ASSERT(SDHOST_SLOT_MAX_NUM > slotNo); /*assert verified*/
401 SDHOST_Slot_select((SDHOST_SLOT_NO)slotNo);
403 for(i = 0; i < SDHOST_SLOT_MAX_NUM; i ++)
405 handle = &s_sdioCardPalHd[i];
406 if(PNULL == handle->sdio_port)
412 SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);
416 SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_OFF);
423 PUBLIC SDIO_CARD_PAL_HANDLE SDIO_Card_Pal_Open (SDIO_CARD_PAL_SLOT_E slotNo)
425 SDIO_CARD_PAL_IRQ_DECLARE;
427 SDIO_CARD_PAL_ASSERT (SDHOST_SLOT_MAX_NUM > slotNo); /*assert verified*/
429 SDIO_CARD_PAL_DISABLE_IRQ;
431 if (TRUE == s_sdioCardPalHd[slotNo].flag)
433 SDIO_CARD_PAL_ENABLE_IRQ;
434 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
437 s_sdioCardPalHd[slotNo].flag = TRUE;
438 SDIO_CARD_PAL_ENABLE_IRQ;
440 s_sdioCardPalHd[slotNo].MagicNum = SDIO_CARD_PAL_MAGICNUM;
441 #if defined (UCOS_BSD_EVENT)
444 s_sdioCardPalHd[slotNo].sdio_event = PNULL;
445 s_sdioCardPalHd[slotNo].sdio_event = OSFlagCreate (0, &err);
447 if (PNULL == s_sdioCardPalHd[slotNo].sdio_event)
449 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
452 #elif defined (CARD_SDIO_EVENT)
453 s_sdioCardPalHd[slotNo].sdio_event = PNULL;
454 s_sdioCardPalHd[slotNo].sdio_event = SCI_CreateEvent ("SDIO_EVENT");
456 if (PNULL == s_sdioCardPalHd[slotNo].sdio_event)
458 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
465 s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE) SDHOST_Register ( (SDHOST_SLOT_NO) slotNo,_irqCardProc);
467 if (0 == s_sdioCardPalHd[slotNo].sdio_port)
469 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
472 s_sdioCardPalHd[slotNo].sdio_No = slotNo;
473 #ifdef DUAL_TCARD_SUPPORT
474 s_activeslot = slotNo;
478 return &s_sdioCardPalHd[slotNo];
482 PUBLIC BOOLEAN SDIO_Card_Pal_Pwr (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_PWR_E onOrOff)
485 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
486 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
487 && (TRUE == handle->flag)
490 #ifdef DUAL_TCARD_SUPPORT
491 switch(handle->sdio_No)
493 case SDIO_CARD_PAL_SLOT_0:
494 case SDIO_CARD_PAL_SLOT_1:
496 if(s_activeslot != handle->sdio_No)
498 s_activeslot = handle->sdio_No;
499 _SlotSelect(handle->sdio_No);
506 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
514 case SDIO_CARD_PAL_ON:
516 SDHOST_RST(handle->sdio_port, RST_MODULE);
517 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_1BIT_WIDTH);
518 SDHOST_Cfg_SpeedMode (handle->sdio_port, SDIO_LOWSPEED/*EMMC_SDR12*/);
519 #if defined(CONFIG_FPGA)
521 SDHOST_Cfg_Voltage (handle->sdio_port,VOL_3_0);
523 SDHOST_SD_POWER (handle->sdio_port,POWR_ON);
525 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,400000);
526 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_ON);
528 SDHOST_internalClk_OnOff (handle->sdio_port,CLK_ON);
532 case SDIO_CARD_PAL_OFF:
534 SDHOST_SD_POWER (handle->sdio_port,POWR_OFF);
535 SDHOST_RST (handle->sdio_port,RST_ALL);
536 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
537 SDHOST_internalClk_OnOff (handle->sdio_port,CLK_OFF);
539 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
545 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
553 PUBLIC BOOLEAN SDIO_Card_Pal_SetClk (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_CLKTYPE_E clkType)
555 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
556 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
557 && (TRUE == handle->flag)
560 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
564 case SDIO_CARD_PAL_400KHz:
566 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,400000);
569 #if defined (CONFIG_SC8825) || defined(CONFIG_SC7710G2) || defined (CONFIG_SC8830) || (defined CONFIG_SC9630)
570 case SDIO_CARD_PAL_1MHz:
571 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,1000000);
573 case SDIO_CARD_PAL_2MHz:
574 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,2000000);
576 case SDIO_CARD_PAL_4MHz:
577 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,4000000);
579 case SDIO_CARD_PAL_8MHz:
580 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,8000000);
582 case SDIO_CARD_PAL_12MHz:
583 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,12000000);
586 case SDIO_CARD_PAL_20MHz:
588 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,20000000);
592 case SDIO_CARD_PAL_25MHz:
594 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,25000000);
598 case SDIO_CARD_PAL_50MHz:
600 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,50000000);
606 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
612 SDHOST_internalClk_OnOff (handle->sdio_port,CLK_ON);
614 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_ON);
620 PUBLIC BOOLEAN SDIO_Card_Pal_SetBusWidth (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_BUFWIDTH_E widthType)
622 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
623 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
624 && (TRUE == handle->flag)
629 case SDIO_CARD_PAL_1_BIT:
631 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_1BIT_WIDTH);
635 case SDIO_CARD_PAL_4_BIT:
637 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_4BIT_WIDTH);
641 case SDIO_CARD_PAL_8_BIT:
643 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_8BIT_WIDTH);
649 SDIO_CARD_PAL_ASSERT (0); /*assert verified*/
658 PUBLIC BOOLEAN SDIO_Card_Pal_SetSpeedMode (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_SPEEDMODE_E speedMode)
660 SDIO_CARD_PAL_ASSERT ( /*assert verified*/
661 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
662 && (TRUE == handle->flag)
664 #if defined (CONFIG_SC8825) || defined(CONFIG_SC7710G2) || defined(CONFIG_SC8830) || (defined CONFIG_SC9630)
667 case EMMC_SPEED_SDR12:
668 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR12);
670 case EMMC_SPEED_SDR25:
671 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR25);
673 case EMMC_SPEED_SDR50:
674 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR50);
676 case EMMC_SPEED_SDR104:
677 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR104);
679 case EMMC_SPEED_DDR50:
680 SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_DDR50);
690 case SDIO_CARD_PAL_LOW_SPEED:
692 SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_LOWSPEED);
696 case SDIO_CARD_PAL_HIGH_SPEED:
698 SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_HIGHSPEED);
704 SDIO_CARD_PAL_ASSERT(0); /*assert verified*/
711 // if ahb_clk < 96M, then not enter highspeed mode.
712 /*if(CHIP_GetAhbClk() < 96000000)
722 //-----------------------------------------------------------------------------------
723 // Send command to card
724 //-----------------------------------------------------------------------------------
726 LOCAL CARD_DATA_PARAM_T s_dataParam;
729 PUBLIC void SDIO_Card_Pal_SetType(SDIO_CARD_PAL_HANDLE handle, SDIO_CARD_PAL_TYPE_E sdio_type)
731 handle->sdio_type = sdio_type;
734 PUBLIC SDIO_CARD_PAL_ERROR_E SDIO_Card_Pal_SendCmd (
735 /*IN*/SDIO_CARD_PAL_HANDLE handle,
736 /*IN*/SDIO_CARD_PAL_CMD_E cmd,
737 /*IN*/uint32 argument,
738 /*IN*/CARD_DATA_PARAM_T *dataParam,
744 const CMD_CTL_FLG* curCmdInfo = NULL;
745 #if defined CONFIG_SC8830 || (defined CONFIG_SC9630)
746 if (handle->sdio_type == SDIO_CARD_PAL_TYPE_SD)
747 curCmdInfo = &s_SDCmdDetail[cmd];
750 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);