2 #include <asm/arch/bits.h>
\r
3 #include "asm/arch/sci_types.h"
\r
4 #include "sdio_card_pal.h"
\r
6 /*-----------------------------------------*/
\r
8 /*-----------------------------------------*/
\r
9 #define SDIO_CARD_PRINT(x) printf x
\r
10 /*-----------------------------------------*/
\r
12 /*-----------------------------------------*/
\r
13 #if defined(OS_SELF_SIMULATOR)
\r
14 #define SDIO_CARD_PAL_IRQ_DECLARE OS_CPU_SR cpu_sr
\r
15 #define SDIO_CARD_PAL_DISABLE_IRQ OS_ENTER_CRITICAL
\r
16 #define SDIO_CARD_PAL_ENABLE_IRQ OS_EXIT_CRITICAL
\r
18 #define SDIO_CARD_PAL_IRQ_DECLARE
\r
19 #define SDIO_CARD_PAL_DISABLE_IRQ SCI_DisableIRQ
\r
20 #define SDIO_CARD_PAL_ENABLE_IRQ SCI_RestoreIRQ
\r
23 #define SDIO_CLK_24M (24000000)
\r
25 /*-----------------------------------------*/
\r
26 #define SDIO_CARD_PAL_ASSERT(x) \
\r
29 SDIO_CARD_PRINT(("assert in function %s line %d",__func__, __LINE__)); \
\r
33 #define mdelay(x) udelay(1000*x)
\r
37 SDIO_MASTER_PAL_CMD_E cmd;
\r
38 unsigned int cmdIndex;
\r
39 unsigned int intFilter;
\r
40 CMD_RSP_TYPE_E Response;
\r
41 unsigned int errFilter;
\r
42 unsigned int transmode;
\r
43 unsigned int cmdTyte;
\r
47 // response Name cmd int filter ,rsp ,cmd error filter
\r
48 #define SDIO_MASTER_R4 SIG_CMD_CMP ,CMD_RSP_R4 ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
\r
49 #define SDIO_MASTER_R5 SIG_CMD_CMP ,CMD_RSP_R5 ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
\r
50 #define SDIO_MASTER_R6 SIG_CMD_CMP ,CMD_RSP_R6 ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
\r
51 #define SDIO_MASTER_R1B SIG_CMD_CMP ,CMD_RSP_R1B ,ERR_RSP|ERR_CMD_INDEX| ERR_CMD_END| ERR_CMD_CRC| ERR_CMD_TIMEOUT
\r
53 static CMD_CTL_FLG s_cmdDetail[] =
\r
55 // cmdindex,rsp,transmode
\r
56 //#define CMDname cmdindex ,data int filter + (cmd int filter+)rsp(+cmd error filter) + ,data error filter ,transmode
\r
57 {SDIO_CMD3_SEND_RELATIVE_ADDR, 3 ,SDIO_MASTER_R6,0,CMD_TYPE_NORMAL },
\r
58 {SDIO_CMD5_SEND_OP_COND, 5 ,SDIO_MASTER_R4,0,CMD_TYPE_NORMAL },
\r
59 {SDIO_CMD7_SELECT_DESELECT_CARD,7 ,SDIO_MASTER_R1B,0,CMD_TYPE_NORMAL },
\r
60 {SDIO_CMD52_IO_RW_DIRECT, 52 ,SDIO_MASTER_R5,0,CMD_TYPE_NORMAL },
\r
61 {SDIO_CMD53_READ_BYTES, 53 ,SIG_TRANS_CMP|SDIO_MASTER_R5|ERR_DATA_END|ERR_DATA_CRC|ERR_DATA_TIMEOUT,
\r
62 TRANS_MODE_READ|TRANS_MODE_DMA_EN| CMD_HAVE_DATA ,CMD_TYPE_NORMAL },
\r
63 {SDIO_CMD53_READ_BLOCKS, 53 ,SIG_TRANS_CMP|SDIO_MASTER_R5|ERR_DATA_END|ERR_DATA_CRC|ERR_DATA_TIMEOUT,
\r
64 TRANS_MODE_MULTI_BLOCK|TRANS_MODE_READ|TRANS_MODE_BLOCK_COUNT_EN|TRANS_MODE_DMA_EN|CMD_HAVE_DATA,CMD_TYPE_NORMAL },
\r
65 {SDIO_CMD53_WRITE_BYTES, 53 ,SIG_TRANS_CMP|SDIO_MASTER_R5 | ERR_DATA_CRC|ERR_DATA_TIMEOUT, TRANS_MODE_DMA_EN|CMD_HAVE_DATA,CMD_TYPE_NORMAL },
\r
66 {SDIO_CMD53_WRITE_BLOCKS , 53 ,SIG_TRANS_CMP|SDIO_MASTER_R5|ERR_DATA_CRC|ERR_DATA_TIMEOUT,
\r
67 TRANS_MODE_MULTI_BLOCK|TRANS_MODE_BLOCK_COUNT_EN|TRANS_MODE_DMA_EN| CMD_HAVE_DATA ,CMD_TYPE_NORMAL },
\r
70 #define SDIO_CARD_PAL_MAGICNUM 0x5344494F
\r
72 extern void _SDHOST_IrqHandle(unsigned int isrnum);
\r
73 static SDIO_CARD_PAL_Struct_T s_sdioCardPalHd[SDHOST_SLOT_MAX_NUM] = {{FALSE,0,0,0}};
\r
74 static volatile unsigned int s_CardErrCode = 0;
\r
76 //-----------------------------------------------------------------------------------
\r
77 // Clear all event happened before ,and prepare next transmission
\r
78 //-----------------------------------------------------------------------------------
\r
79 void _InitCardEvent(SDIO_CARD_PAL_HANDLE handle)
\r
82 handle->s_CardEvent = 0;
\r
85 //-----------------------------------------------------------------------------------
\r
86 // After the transmission begin , wait event during the transmission
\r
87 //-----------------------------------------------------------------------------------
\r
88 int _WaitCardEvent(SDIO_CARD_PAL_HANDLE handle,unsigned int EventId)
\r
90 if(EventId != (handle->s_CardEvent&EventId)){
\r
96 //-----------------------------------------------------------------------------------
\r
97 // After the transmission begin , this funtion used to give event
\r
98 //-----------------------------------------------------------------------------------
\r
99 static void _SetCardEvent(SDIO_CARD_PAL_HANDLE handle,unsigned int EventId)
\r
101 handle->s_CardEvent |= EventId;
\r
104 unsigned int GetCardEvent(SDIO_CARD_PAL_HANDLE handle)
\r
106 return handle->s_CardEvent;
\r
109 //-----------------------------------------------------------------------------------
\r
110 // 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
\r
111 //-----------------------------------------------------------------------------------
\r
112 static void _irqCardProc(unsigned int msg, unsigned int errCode, SDHOST_SLOT_NO slotNum)
\r
114 SDIO_CARD_PAL_HANDLE handle;
\r
116 if(slotNum >=SDHOST_SLOT_MAX_NUM ) slotNum = SDHOST_SLOT_MAX_NUM - 1;
\r
117 handle = &s_sdioCardPalHd[slotNum];
\r
119 SDIO_CARD_PRINT(("slot0 msg = 0x%08x err = 0x%08x\n",msg,errCode));
\r
120 if(0 != (SIG_CARD_IN&msg)){ // card interrupt happened , may be some operation error happened
\r
121 _SetCardEvent(handle,SIG_CARD_IN);
\r
123 if(0 != (SIG_CARD_INSERT&msg)){ // card is inserted in slot
\r
124 _SetCardEvent(handle,SIG_CARD_INSERT);
\r
126 else if(0 != (SIG_CARD_REMOVE&msg)){ // card is plug out from slot
\r
127 _SetCardEvent(handle,SIG_CARD_REMOVE);
\r
129 else if(0 != (SIG_ERR&msg)){ // some error happened during the transmission
\r
130 if(ERR_DATA_TIMEOUT == errCode && (0 != (SIG_TRANS_CMP&msg)))
\r
131 errCode &= ~ERR_DATA_TIMEOUT;
\r
134 s_CardErrCode |= errCode; // get the error detail
\r
135 _SetCardEvent(handle,SIG_ALL);
\r
139 if(0 != (SIG_BLK_CAP&msg))
\r
140 _SetCardEvent(handle,SIG_BLK_CAP);
\r
141 if(0 != (SIG_TRANS_CMP&msg)) // transmission complete
\r
142 _SetCardEvent(handle,SIG_TRANS_CMP);
\r
143 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
\r
144 volatile unsigned int nextAdd;
\r
145 nextAdd = SDHOST_GetDmaAddr(handle->sdio_port);
\r
146 SDHOST_SetDmaAddr(handle->sdio_port, nextAdd);
\r
147 SDHOST_NML_IntStatus_En(handle->sdio_port, SIG_DMA_INT);
\r
148 SDHOST_NML_IntSig_En(handle->sdio_port, SIG_DMA_INT);
\r
151 //test code-----------------------------------------
\r
152 else if(0 != (SIG_BUF_RD_RDY&msg)){
\r
153 SDHOST_NML_IntStatus_En(handle->sdio_port, SIG_BUF_RD_RDY);
\r
154 SDHOST_NML_IntSig_En(handle->sdio_port, SIG_BUF_RD_RDY);
\r
155 _SetCardEvent(handle,SIG_BUF_RD_RDY);
\r
156 }else if(0 != (SIG_BUF_WD_RDY&msg)){
\r
157 SDHOST_NML_IntStatus_En(handle->sdio_port, SIG_BUF_WD_RDY);
\r
158 SDHOST_NML_IntSig_En(handle->sdio_port, SIG_BUF_WD_RDY);
\r
159 _SetCardEvent(handle,SIG_BUF_WD_RDY);
\r
161 //test end--------------------------------------------
\r
163 if(0 != (SIG_CMD_CMP&msg)){ // during the transmission ,the command has be confirmed by card
\r
164 _SetCardEvent(handle,SIG_CMD_CMP);
\r
168 SDIO_CARD_PAL_SLOT_E Handle2SlotNo(SDIO_CARD_PAL_HANDLE handle)
\r
170 SDIO_CARD_PAL_SLOT_E slotNo;
\r
171 for(slotNo=SDIO_CARD_PAL_SLOT_0;SDHOST_SLOT_MAX_NUM > slotNo;slotNo++)
\r
172 if(handle == &s_sdioCardPalHd[slotNo])
\r
174 return SDIO_CARD_PAL_SLOT_MAX;
\r
177 SDIO_CARD_PAL_HANDLE SPRD_SDSlave_Pal_Open(SDIO_CARD_PAL_SLOT_E slotNo)
\r
180 SDIO_CARD_PAL_ASSERT(SDHOST_SLOT_MAX_NUM > slotNo);
\r
182 if(TRUE == s_sdioCardPalHd[slotNo].flag)
\r
185 s_sdioCardPalHd[slotNo].flag = TRUE;
\r
187 s_sdioCardPalHd[slotNo].MagicNum = SDIO_CARD_PAL_MAGICNUM;
\r
188 s_sdioCardPalHd[slotNo].s_CardEvent = 0;
\r
189 //s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE)SDHOST_Register((SDHOST_SLOT_NO)slotNo,_irqCardProc);
\r
190 #if defined(CONFIG_SP7702)
\r
191 s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE)SDHOST_Register((SDHOST_SLOT_NO)1,_irqCardProc);
\r
192 #elif defined(CONFIG_SC7710G2)
\r
193 s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE)SDHOST_Register((SDHOST_SLOT_NO)slotNo,_irqCardProc);
\r
195 s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE)SDHOST_Register((SDHOST_SLOT_NO)0,_irqCardProc);
\r
197 if(s_sdioCardPalHd[slotNo].sdio_port == NULL){
\r
200 SDHOST_NML_IntStatus_En(s_sdioCardPalHd[slotNo].sdio_port, SIG_ALL|ERR_ALL);
\r
201 SDHOST_NML_IntSig_En(s_sdioCardPalHd[slotNo].sdio_port, SIG_ALL|ERR_ALL);
\r
202 return &s_sdioCardPalHd[slotNo];
\r
206 int SPRD_SDSlave_Pal_Pwr(SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_PWR_E onOrOff)
\r
208 SDIO_CARD_PAL_ASSERT(
\r
209 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
\r
210 &&(TRUE == handle->flag)
\r
215 case SDIO_CARD_PAL_ON:
\r
217 SDHOST_Cfg_BusWidth(handle->sdio_port,SDIO_1BIT_WIDTH);
\r
218 SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_LOWSPEED);
\r
219 SDHOST_Cfg_Voltage(handle->sdio_port,VOL_3_0);
\r
221 SDHOST_SD_POWER(handle->sdio_port,POWR_ON);
\r
222 SDHOST_SD_Clk_Freq_Set(handle->sdio_port,200*1000);
\r
223 SDHOST_internalClk_OnOff(handle->sdio_port,CLK_ON);
\r
224 SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);
\r
227 // OSTimeDlyHMSM (0, 0, 2, 0);
\r
231 case SDIO_CARD_PAL_OFF:
\r
233 SDHOST_SD_POWER(handle->sdio_port,POWR_OFF);
\r
234 SDHOST_RST(handle->sdio_port,RST_ALL);
\r
235 SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_OFF);
\r
236 SDHOST_internalClk_OnOff(handle->sdio_port,CLK_OFF);
\r
237 // OSTimeDlyHMSM (0, 0, 0, 200);
\r
243 SDIO_CARD_PAL_ASSERT(0);
\r
251 int SPRD_SDSlave_Pal_SetClk(SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_CLKTYPE_E clkType)
\r
253 SDIO_CARD_PAL_ASSERT(
\r
254 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
\r
255 &&(TRUE == handle->flag)
\r
258 SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_OFF);
\r
261 case SDIO_CARD_PAL_400KHz:
\r
263 SDHOST_SD_Clk_Freq_Set(handle->sdio_port,400000);
\r
267 case SDIO_CARD_PAL_20MHz:
\r
269 SDHOST_SD_Clk_Freq_Set(handle->sdio_port,20000000);
\r
273 case SDIO_CARD_PAL_25MHz:
\r
275 SDHOST_SD_Clk_Freq_Set(handle->sdio_port,25000000);
\r
279 case SDIO_CARD_PAL_50MHz:
\r
281 SDHOST_SD_Clk_Freq_Set(handle->sdio_port,50000000);
\r
287 SDIO_CARD_PAL_ASSERT(0);
\r
292 SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);
\r
298 int SPRD_SDSlave_Pal_SetBusWidth(SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_BUFWIDTH_E widthType)
\r
300 SDIO_CARD_PAL_ASSERT(
\r
301 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
\r
302 &&(TRUE == handle->flag)
\r
307 case SDIO_CARD_PAL_1_BIT:
\r
309 SDHOST_Cfg_BusWidth(handle->sdio_port,SDIO_1BIT_WIDTH);
\r
313 case SDIO_CARD_PAL_4_BIT:
\r
315 SDHOST_Cfg_BusWidth(handle->sdio_port,SDIO_4BIT_WIDTH);
\r
319 case SDIO_CARD_PAL_8_BIT:
\r
321 SDHOST_Cfg_BusWidth(handle->sdio_port,SDIO_8BIT_WIDTH);
\r
327 SDIO_CARD_PAL_ASSERT(0);
\r
336 int SPRD_SDSlave_Pal_SetSpeedMode(SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_SPEEDMODE_E speedMode)
\r
338 SDIO_CARD_PAL_ASSERT(
\r
339 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
\r
340 &&(TRUE == handle->flag)
\r
347 //-----------------------------------------------------------------------------------
\r
348 // Send command to card
\r
349 //-----------------------------------------------------------------------------------
\r
350 SDIO_CARD_PAL_ERROR_E SPRD_SDSlave_Pal_SendCmd(
\r
351 /*IN*/SDIO_CARD_PAL_HANDLE handle,
\r
352 /*IN*/SDIO_MASTER_PAL_CMD_E cmd,
\r
353 /*IN*/unsigned int argument,
\r
354 /*IN*/CARD_DATA_PARAM_T* dataParam,
\r
355 /*OUT*/unsigned char* rspBuf
\r
358 unsigned int tmpIntFilter;
\r
360 SDIO_CARD_PAL_ASSERT(
\r
361 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
\r
362 &&(TRUE == handle->flag)
\r
364 SDIO_CARD_PAL_ASSERT(cmd == s_cmdDetail[cmd].cmd);
\r
365 SDHOST_SetDataTimeOutValue(handle->sdio_port,0xE);
\r
366 SDHOST_SetErrCodeFilter(handle->sdio_port, s_cmdDetail[cmd].errFilter);
\r
368 tmpIntFilter = s_cmdDetail[cmd].intFilter;
\r
369 if(0 != s_cmdDetail[cmd].errFilter)
\r
371 tmpIntFilter |= SIG_ERR;
\r
373 if(NULL != dataParam)
\r
375 tmpIntFilter |= SIG_DMA_INT;
\r
377 SDHOST_NML_IntStatus_En(handle->sdio_port, tmpIntFilter);
\r
378 SDHOST_NML_IntSig_En(handle->sdio_port, tmpIntFilter);
\r
381 _InitCardEvent(handle);
\r
383 if(NULL != dataParam)
\r
385 //MMU_InvalideDCACHE();
\r
386 SDHOST_SetDmaAddr(handle->sdio_port, (unsigned int)(dataParam->databuf));
\r
387 SDHOST_SetDataParam(handle->sdio_port, dataParam->blkLen, dataParam->blkNum, SDIO_DMA_512K);
\r
389 if(NULL != dataParam)
\r
390 ;//SDIO_CARD_PRINT(("\ncmd%d:(0x%08x,0x%x,0x%x)\n",cmd,argument,tmpIntFilter,s_cmdDetail[cmd].transmode));
\r
391 SDHOST_SetCmdArg(handle->sdio_port,argument);
\r
392 SDHOST_SetCmd(handle->sdio_port,s_cmdDetail[cmd].cmdIndex,s_cmdDetail[cmd].transmode,s_cmdDetail[cmd].cmdTyte, s_cmdDetail[cmd].Response);
\r
394 if(NULL == dataParam){
\r
395 SDIO_CARD_PRINT(("\ncmd%d:(0x%08x 0x%x 0x%x)\n",cmd,argument,tmpIntFilter,s_cmdDetail[cmd].transmode));
\r
397 extern int req_clk_status(void);
\r
400 status = req_clk_status();
\r
402 ;//printf("(C) = %d \n",status);
\r
407 //_SDHOST_IrqHandle(Handle2SlotNo(handle));
\r
408 _SDHOST_IrqHandle(SDIO_APCP_HOST_SLOT_NUM);
\r
409 }while(_WaitCardEvent(handle,s_cmdDetail[cmd].intFilter)==0);
\r
412 if(0 != s_CardErrCode){
\r
413 SDIO_CARD_PRINT(("SDIO_Card error = 0x%x",s_CardErrCode));
\r
414 SDHOST_RST(handle->sdio_port,RST_CMD_DAT_LINE);
\r
415 // SDHOST_Dump_SDIO_Registers(1);
\r
416 return s_CardErrCode;
\r
419 SDHOST_GetRspFromBuf(handle->sdio_port, s_cmdDetail[cmd].Response, rspBuf);
\r
421 return SDIO_CARD_PAL_ERR_NONE;
\r
424 void SPRD_SDSlave_Pal_Close(SDIO_CARD_PAL_HANDLE handle)
\r
427 SDIO_CARD_PAL_ASSERT(
\r
428 (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
\r
429 &&(TRUE == handle->flag)
\r
432 handle->flag = FALSE;
\r
434 SDHOST_UnRegister(handle->sdio_port);
\r
436 handle->s_CardEvent = 0;
\r
440 void SDIO_Card_Pal_SlotSelect(SDIO_CARD_PAL_SLOT_E slotNo)
\r
442 SDIO_CARD_PAL_SLOT_E i;
\r
443 SDIO_CARD_PAL_HANDLE handle;
\r
445 SDIO_CARD_PAL_ASSERT(SDHOST_SLOT_MAX_NUM > slotNo);
\r
446 SDHOST_Slot_select(slotNo);
\r
447 for(i = 0; i < SDHOST_SLOT_MAX_NUM; i ++)
\r
449 handle = &s_sdioCardPalHd[i];
\r
450 if(NULL == handle->sdio_port)
\r
454 SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);
\r