mmc: sprd: remove build warnings
[profile/mobile/platform/kernel/u-boot-tm1.git] / drivers / mmc / sdio_card_pal.c
1 #include <common.h>
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"
9
10 //#include "asm/arch/deep_sleep.h"
11 //#include "asm/arch/deepsleep_drvapi.h"
12
13 //#define DUAL_TCARD_SUPPORT
14 #ifndef OS_NONE
15 #define CARD_SDIO_EVENT
16 #endif
17
18 #undef NULL
19 #define NULL 0x0
20
21 //#define UCOS_BSD_EVENT
22
23 //#define DUAL_TCARD_SUPPORT
24 /*lint -save -e551*/
25 /*-----------------------------------------*/
26 //  Debug Function
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
31 #else
32 #define SDIO_CARD_PRINT(x) SCI_TRACE_LOW x
33 #endif
34 /*-----------------------------------------*/
35 //  IRQ Function
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
41 #else
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
45 #endif
46 /*-----------------------------------------*/
47
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);
51
52 typedef struct
53 {
54     SDIO_CARD_PAL_CMD_E cmd;
55     uint32 cmdIndex;
56     uint32 intFilter;
57     CMD_RSP_TYPE_E Response;
58     uint32 errFilter;
59     uint32 transmode;
60 } CMD_CTL_FLG;
61
62
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
74
75
76 LOCAL const CMD_CTL_FLG s_SDCmdDetail[]=
77 {
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   },
106
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                                                                                                                                                                                                                                                          },      // ??
112
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                                                                                                                                                                                                                                                          },
115
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                                                                                                                                                                                                                                                          },
118
119         {       CARD_CMD38_ERASE                                                , 38    , SIG_TRANS_CMP         |       CARD_SDIO_R1B           | NULL                                                                                                                  , NULL                                                                                                                                                                                                                                                          },
120
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                                                                                                                                                                                                                                                          },
123
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                                                                                                                                                                                                                                                          },      //??
129
130
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                                                                                                                                                                                                                                                          },      // ??
138
139         {       CARD_CMDMAX                                                     , 0 , NULL                              |       CARD_SDIO_NO_RSP        | NULL                                                                                                                  , NULL                                                                                                                                                                                                                                                          }
140
141 };
142
143
144 static const CMD_CTL_FLG s_cmdDetail[] =
145 {
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   },
176
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                                                                                                                               },  // ??
182
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                                                                                                                               },
185
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                                                                                                                               },
188
189     {   CARD_CMD38_ERASE                        ,38 ,SIG_TRANS_CMP      |   CARD_SDIO_R1B       |NULL                                                           ,NULL                                                                                                                               },
190
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                                                                                                                               },
193
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                                                                                                                               },  //??
199
200
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                                                                                                                               },  // ??
208
209     {   CARD_ACMD6_SET_EXT_CSD     /*SD*/     ,6  ,NULL               |   CARD_SDIO_R1B        |NULL                                                           ,NULL                                                                                                                               },
210
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                                                                                                                               },
216 #endif
217
218     {   CARD_CMDMAX                             ,0  ,NULL               |   CARD_SDIO_NO_RSP    |NULL                                                           ,NULL                                                                                                                               }
219
220 };
221
222 #define SDIO_CARD_PAL_MAGICNUM 0x5344494F
223
224 typedef struct SDIO_CARD_PAL_Struct
225 {
226     BOOLEAN flag;
227     uint32 MagicNum;            // "SDIO"
228
229     SDHOST_HANDLE sdio_port;
230
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;
235 #endif
236
237     SDIO_CARD_PAL_SLOT_E sdio_No;
238         SDIO_CARD_PAL_TYPE_E sdio_type;
239 } SDIO_CARD_PAL_Struct_T;
240
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}};
244 #else
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}};
246 #endif
247
248 #ifdef DUAL_TCARD_SUPPORT
249 LOCAL SDIO_CARD_PAL_SLOT_E s_activeslot = SDIO_CARD_PAL_SLOT_MAX;
250 #endif
251
252 #if defined (UCOS_BSD_EVENT)
253
254 #elif defined (CARD_SDIO_EVENT)
255
256 #else
257 LOCAL volatile uint32 s_CardEvent = 0;
258 #endif
259 LOCAL volatile uint32 s_CardErrCode = 0;
260
261 //-----------------------------------------------------------------------------------
262 //  Clear all event  happened before ,and prepare next transmission
263 //-----------------------------------------------------------------------------------
264 LOCAL void _InitCardEvent (SDIO_CARD_PAL_HANDLE handle)
265 {
266     s_CardErrCode = 0;
267 #if defined (UCOS_BSD_EVENT)
268     {
269         INT8U err;
270         OSFlagPost (handle->sdio_event, 0xFFFFFFFF, OS_FLAG_CLR, &err);
271     }
272 #elif defined (CARD_SDIO_EVENT)
273     SCI_SetEvent (handle->sdio_event,0,SCI_AND);
274 #else
275     s_CardEvent = 0;
276 #endif
277 }
278
279 //-----------------------------------------------------------------------------------
280 //  After the transmission begin , wait event during the transmission
281 //-----------------------------------------------------------------------------------
282 LOCAL uint32 _WaitCardEvent (SDIO_CARD_PAL_HANDLE handle,uint32 EventId)
283 {
284 #if defined (UCOS_BSD_EVENT)
285     INT8U err;
286     OSFlagPend (handle->sdio_event, EventId, OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME, 1000, &err);
287
288     if (OS_TIMEOUT == err)
289     {
290         s_CardErrCode |= BIT_31;
291     }
292
293 #elif defined (CARD_SDIO_EVENT)
294     {
295         uint32 actualFlag;
296         uint32 eRet;
297
298         eRet = SCI_GetEvent (handle->sdio_event,EventId,SCI_AND_CLEAR,&actualFlag,3000);
299         if (SCI_SUCCESS != eRet)
300         {
301             s_CardErrCode |= BIT_31;
302             SDIO_CARD_PRINT(("SCM Wait event error!!! eRet = 0x%x",eRet));
303         }
304     }
305 #else
306
307     //  CARD_PRINT(("SD20 Wait event before %x",EventId));
308     if(EventId == (s_CardEvent&EventId))
309     {
310         return 0;
311     }
312     else
313     {
314         return 1;
315     }
316
317     //  CARD_PRINT(("SD20 Wait event end %x",s_CardEvent));
318 #endif
319 }
320
321 //-----------------------------------------------------------------------------------
322 //  After the transmission begin , this funtion used to give event
323 //-----------------------------------------------------------------------------------
324 LOCAL void _SetCardEvent (SDIO_CARD_PAL_HANDLE handle,uint32 EventId)
325 {
326 #if defined (UCOS_BSD_EVENT)
327     INT8U err;
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);
331 #else
332     s_CardEvent |= EventId;
333 #endif
334 }
335
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 //-----------------------------------------------------------------------------------
339 #define DEBUG_SDIO
340 #ifdef DEBUG_SDIO
341 LOCAL uint32 s_irqCardProc_msg;
342 LOCAL uint32 s_sdio_dma_addr[4] = {NULL};
343 #endif
344 LOCAL void  _irqCardProc (uint32 msg, uint32 errCode, SDHOST_SLOT_NO slotNum)
345 {
346     SDIO_CARD_PAL_HANDLE handle;
347     handle = &s_sdioCardPalHd[slotNum];
348
349     if (0 != (SIG_CARD_IN&msg)) // card interrupt happened , may be some operation error happened
350     {
351         _SetCardEvent (handle,SIG_CARD_IN);
352     }
353
354     if (0 != (SIG_CARD_INSERT&msg)) // card is inserted in slot
355     {
356         _SetCardEvent (handle,SIG_CARD_INSERT);
357     }
358     else if (0 != (SIG_CARD_REMOVE&msg)) // card is plug out from slot
359     {
360         _SetCardEvent (handle,SIG_CARD_REMOVE);
361     }
362     else if (0 != (SIG_ERR&msg)) // some error happened during the transmission
363     {
364         s_CardErrCode |= errCode;   // get the error detail
365         _SetCardEvent (handle,SIG_ALL);
366
367         return;
368     }
369     if (0 != (SIG_TRANS_CMP&msg))       // transmission complete
370     {
371         /* clear transfer complete timeout bit! */
372         s_CardErrCode &= ~ERR_DATA_TIMEOUT;
373         _SetCardEvent (handle,SIG_TRANS_CMP);
374     }
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
376     {
377         volatile uint32 nextAdd;
378 #ifdef DEBUG_SDIO
379         s_irqCardProc_msg = msg;
380 #endif
381         nextAdd = SDHOST_GetDmaAddr (handle->sdio_port);
382         SDHOST_SetDmaAddr (handle->sdio_port, nextAdd);
383 #ifdef DEBUG_SDIO
384         s_sdio_dma_addr[3] = SDHOST_GetDmaAddr (handle->sdio_port);
385 #endif
386         SDHOST_NML_IntStatus_En (handle->sdio_port, SIG_DMA_INT);
387         SDHOST_NML_IntSig_En (handle->sdio_port, SIG_DMA_INT);
388     }
389
390     if (0 != (SIG_CMD_CMP&msg))     // during the transmission ,the command has be confirmed by card
391     {
392         s_CardErrCode &= ~ERR_CMD_TIMEOUT;
393         _SetCardEvent (handle,SIG_CMD_CMP);
394     }
395 }
396
397 #ifdef DUAL_TCARD_SUPPORT
398 LOCAL void _SlotSelect(SDIO_CARD_PAL_SLOT_E slotNo)
399 {
400     SDIO_CARD_PAL_SLOT_E i;
401     SDIO_CARD_PAL_HANDLE handle;
402     
403     SDIO_CARD_PAL_ASSERT(SDHOST_SLOT_MAX_NUM > slotNo); /*assert verified*/
404
405     SDHOST_Slot_select((SDHOST_SLOT_NO)slotNo);
406     
407     for(i = 0; i < SDHOST_SLOT_MAX_NUM; i ++)
408     {
409         handle = &s_sdioCardPalHd[i];
410         if(PNULL == handle->sdio_port)
411         {
412             continue;
413         }
414         if(slotNo == i)
415         {
416                         SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);
417         }
418         else
419         {
420                         SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_OFF);
421         }
422     }
423 }
424 #endif
425
426
427 PUBLIC SDIO_CARD_PAL_HANDLE SDIO_Card_Pal_Open (SDIO_CARD_PAL_SLOT_E slotNo)
428 {
429     SDIO_CARD_PAL_IRQ_DECLARE;
430
431     SDIO_CARD_PAL_ASSERT (SDHOST_SLOT_MAX_NUM > slotNo);        /*assert verified*/
432
433     SDIO_CARD_PAL_DISABLE_IRQ;
434
435     if (TRUE == s_sdioCardPalHd[slotNo].flag)
436     {
437         SDIO_CARD_PAL_ENABLE_IRQ;
438         SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
439     }
440
441     s_sdioCardPalHd[slotNo].flag = TRUE;
442     SDIO_CARD_PAL_ENABLE_IRQ;
443
444     s_sdioCardPalHd[slotNo].MagicNum = SDIO_CARD_PAL_MAGICNUM;
445 #if defined (UCOS_BSD_EVENT)
446     {
447         INT8U err;
448         s_sdioCardPalHd[slotNo].sdio_event = PNULL;
449         s_sdioCardPalHd[slotNo].sdio_event = OSFlagCreate (0, &err);
450
451         if (PNULL == s_sdioCardPalHd[slotNo].sdio_event)
452         {
453             SDIO_CARD_PAL_ASSERT (0);   /*assert verified*/
454         }
455     }
456 #elif defined (CARD_SDIO_EVENT)
457     s_sdioCardPalHd[slotNo].sdio_event = PNULL;
458     s_sdioCardPalHd[slotNo].sdio_event = SCI_CreateEvent ("SDIO_EVENT");
459
460     if (PNULL == s_sdioCardPalHd[slotNo].sdio_event)
461     {
462         SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
463     }
464
465 #else
466     s_CardEvent = 0;
467
468 #endif
469     s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE) SDHOST_Register ( (SDHOST_SLOT_NO) slotNo,_irqCardProc);
470
471     if (0 == s_sdioCardPalHd[slotNo].sdio_port)
472     {
473         SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
474     }
475         
476     s_sdioCardPalHd[slotNo].sdio_No = slotNo;
477 #ifdef DUAL_TCARD_SUPPORT
478     s_activeslot = slotNo;
479     _SlotSelect(slotNo);
480 #endif
481
482     return &s_sdioCardPalHd[slotNo];
483
484 }
485
486 PUBLIC BOOLEAN SDIO_Card_Pal_Pwr (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_PWR_E onOrOff)
487 {
488
489     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
490         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
491         && (TRUE == handle->flag)
492     );
493
494 #ifdef DUAL_TCARD_SUPPORT
495     switch(handle->sdio_No)
496     {
497         case SDIO_CARD_PAL_SLOT_0:
498         case SDIO_CARD_PAL_SLOT_1:
499         {
500              if(s_activeslot !=  handle->sdio_No)
501             {
502                  s_activeslot = handle->sdio_No;
503                  _SlotSelect(handle->sdio_No); 
504              }
505          }
506           break;
507
508         default:
509         {
510             SDIO_CARD_PAL_ASSERT (0);   /*assert verified*/
511         }
512         break;
513     }
514 #endif  
515                 
516     switch (onOrOff)
517     {
518         case SDIO_CARD_PAL_ON:
519             {
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)
524 #else
525                 SDHOST_Cfg_Voltage (handle->sdio_port,VOL_3_0);
526 #endif
527                 SDHOST_SD_POWER (handle->sdio_port,POWR_ON);
528                 udelay(5000);
529                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,400000);
530                                 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_ON);
531                 udelay(1000);
532                 SDHOST_internalClk_OnOff (handle->sdio_port,CLK_ON);
533                 udelay(1000);
534             }
535             break;
536         case SDIO_CARD_PAL_OFF:
537             {
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);
542                 udelay(1000);
543                 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
544                 udelay(1000);
545             }
546             break;
547         default:
548             {
549                 SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
550             }
551             break;
552     }
553
554     return TRUE;
555 }
556
557 PUBLIC BOOLEAN SDIO_Card_Pal_SetClk (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_CLKTYPE_E clkType)
558 {
559     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
560         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
561         && (TRUE == handle->flag)
562     );
563
564     SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
565
566     switch (clkType)
567     {
568         case SDIO_CARD_PAL_400KHz:
569             {
570                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,400000);
571             }
572             break;
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);
576                                 break;
577                 case SDIO_CARD_PAL_2MHz:
578                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,2000000);
579                                 break;
580                 case SDIO_CARD_PAL_4MHz:
581                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,4000000);
582                                 break;
583                 case SDIO_CARD_PAL_8MHz:
584                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,8000000);
585                                 break;
586                 case SDIO_CARD_PAL_12MHz:
587                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,12000000);
588                                 break;
589 #endif                          
590         case SDIO_CARD_PAL_20MHz:
591             {
592                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,20000000);
593             }
594             break;
595
596         case SDIO_CARD_PAL_25MHz:
597             {
598                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,25000000);
599             }
600             break;
601
602         case SDIO_CARD_PAL_50MHz:
603             {
604                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,50000000);
605             }
606             break;
607
608         default:
609             {
610                 SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
611             }
612             break;
613
614     }
615
616     SDHOST_internalClk_OnOff (handle->sdio_port,CLK_ON);
617     SDHOST_Delayus(200);
618     SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_ON);
619
620     return TRUE;
621
622 }
623
624 PUBLIC BOOLEAN SDIO_Card_Pal_SetBusWidth (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_BUFWIDTH_E widthType)
625 {
626     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
627         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
628         && (TRUE == handle->flag)
629     );
630
631     switch (widthType)
632     {
633         case SDIO_CARD_PAL_1_BIT:
634             {
635                 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_1BIT_WIDTH);
636             }
637             break;
638
639         case SDIO_CARD_PAL_4_BIT:
640             {
641                 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_4BIT_WIDTH);
642             }
643             break;
644
645         case SDIO_CARD_PAL_8_BIT:
646             {
647                 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_8BIT_WIDTH);
648             }
649             break;
650
651         default:
652             {
653                 SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
654             }
655             break;
656
657     }
658
659     return TRUE;
660 }
661
662 PUBLIC BOOLEAN SDIO_Card_Pal_SetSpeedMode (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_SPEEDMODE_E speedMode)
663 {
664     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
665         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
666         && (TRUE == handle->flag)
667     );
668 #if defined (CONFIG_SC8825) || defined(CONFIG_SC7710G2) || defined(CONFIG_SC8830) || (defined CONFIG_SC9630)
669         switch (speedMode)
670         {
671                 case EMMC_SPEED_SDR12:
672                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR12);
673                         break;
674                 case EMMC_SPEED_SDR25:
675                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR25);
676                         break;
677                 case EMMC_SPEED_SDR50:
678                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR50);
679                         break;
680                 case EMMC_SPEED_SDR104:
681                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR104);
682                         break;
683                 case EMMC_SPEED_DDR50:
684                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_DDR50);
685                         break;
686                 default:
687                         return FALSE;
688         }
689 #else
690     // dummy function
691     #if 0
692     switch(speedMode)
693     {
694         case SDIO_CARD_PAL_LOW_SPEED:
695         {
696             SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_LOWSPEED);
697         }
698         break;
699
700         case SDIO_CARD_PAL_HIGH_SPEED:
701         {
702             SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_HIGHSPEED);
703         }
704         break;
705
706         default:
707         {
708             SDIO_CARD_PAL_ASSERT(0);    /*assert verified*/
709         }
710         break;
711
712     }
713     #endif
714
715     // if ahb_clk < 96M, then not enter highspeed mode.
716     /*if(CHIP_GetAhbClk() < 96000000)
717         return FALSE;
718     else  */
719 #endif
720         return TRUE;
721
722 }
723
724
725
726 //-----------------------------------------------------------------------------------
727 //  Send command to card
728 //-----------------------------------------------------------------------------------
729 #ifdef DEBUG_SDIO
730 LOCAL CARD_DATA_PARAM_T s_dataParam;
731 #endif
732
733 PUBLIC void  SDIO_Card_Pal_SetType(SDIO_CARD_PAL_HANDLE handle, SDIO_CARD_PAL_TYPE_E sdio_type)
734 {
735         handle->sdio_type = sdio_type;
736 }
737
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,
743     /*OUT*/uint8 *rspBuf
744 )
745 {
746     uint32 tmpIntFilter;
747         int tmOut = 0;
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];
752         else
753 #endif
754                 curCmdInfo = &s_cmdDetail[cmd];
755
756         SDIO_CARD_PRINT(("%s : cmd:%x, cmdIndex:%x, argument:%x\r\n", __FUNCTION__, cmd, curCmdInfo->cmdIndex, argument));
757         
758     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
759         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
760         && (TRUE == handle->flag)
761     );
762     SDIO_CARD_PAL_ASSERT (cmd == curCmdInfo->cmd);      /*assert verified*/
763
764 #ifndef OS_NONE    
765     SCI_SDIO_EnableDeepSleep (DISABLE_AHB_SLEEP);
766     CHNG_FREQ_Event_Clr (FREQ_CHNG_EVENT_SDIO,SYS_MODE_NORMAL);
767 #endif
768
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);
772
773     //--
774     SDHOST_SetDataTimeOutValue (handle->sdio_port,0xE);
775
776     //--
777     SDHOST_SetErrCodeFilter (handle->sdio_port, curCmdInfo->errFilter);
778
779     tmpIntFilter = curCmdInfo->intFilter;
780
781     if (NULL != curCmdInfo->errFilter)
782     {
783         tmpIntFilter |= SIG_ERR;
784     }
785
786     if (NULL != dataParam)
787     {
788         tmpIntFilter |= SIG_DMA_INT;
789     }
790
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) )
794 #ifdef OS_NONE
795         *(volatile uint32 *)(INT_IRQ_EN) |= (0x1<<TB_SDIO1_INT);
796 #endif
797 #endif
798     _InitCardEvent (handle);
799
800     if (NULL != dataParam)
801     {
802         uint32 bufferSize = 0;
803 #ifdef DEBUG_SDIO
804         s_dataParam = *dataParam;
805 #endif
806         bufferSize = dataParam->blkLen  *  (dataParam->blkNum);
807         //if(dataParam->direction == SDIO_DMA_OUT)
808         {
809                Dcache_CleanRegion((unsigned int)(dataParam->databuf), bufferSize);
810                Dcache_InvalRegion((unsigned int)(dataParam->databuf), bufferSize);
811         }
812         //MMU_DmaCacheSync( (uint32) (dataParam->databuf), bufferSize, DMABUFFER_BIDIRECTIONAL);
813        
814         SDHOST_SetDmaAddr (handle->sdio_port, (uint32) (dataParam->databuf));
815         SDHOST_SetDataParam (handle->sdio_port, dataParam->blkLen, dataParam->blkNum, SDIO_DMA_512K);
816 #ifdef DEBUG_SDIO
817         s_sdio_dma_addr[0] = SDHOST_GetDmaAddr (handle->sdio_port);
818 #endif
819     }
820
821     SDHOST_SetCmdArg (handle->sdio_port,argument);
822     SDHOST_SetCmd (handle->sdio_port,curCmdInfo->cmdIndex,curCmdInfo->transmode,CMD_TYPE_NORMAL, curCmdInfo->Response);
823
824         while (0 != _WaitCardEvent(handle,curCmdInfo->intFilter))
825         {
826                 _SDHOST_IrqHandle(handle->sdio_No);
827
828                 if (CARD_CMD38_ERASE == cmd)
829                 {
830                         SDHOST_Delayus(200);
831                         tmOut++;
832                         if(tmOut > 50000)
833                         {
834                                 s_CardErrCode = ERR_DATA_TIMEOUT;
835                                 break;
836                         }
837                 }
838         }
839
840     SDHOST_RST (handle->sdio_port,RST_CMD_DAT_LINE);
841
842 #ifndef OS_NONE 
843     SCI_SDIO_EnableDeepSleep (ENABLE_AHB_SLEEP);
844     CHNG_FREQ_Event_Set (FREQ_CHNG_EVENT_SDIO,SYS_MODE_NORMAL);
845 #endif
846
847     if (0 != s_CardErrCode)
848     {
849         if ( (CARD_CMD38_ERASE == cmd) && (ERR_DATA_TIMEOUT == s_CardErrCode))
850         {
851             SDIO_CARD_PRINT ( ("SDIO_Card may be erase R1b is too long"));
852             tmOut = SCI_GetTickCount();
853
854             while (0 == (BIT_20 & SDHOST_GetPinState (handle->sdio_port)))
855             {
856                 SDHOST_Delayus (1000);
857
858                 if ( (tmOut+20000) < SCI_GetTickCount())
859                 {
860                     #ifdef DEBUG_SDIO
861                         if (NULL != dataParam)
862                         {
863                             s_sdio_dma_addr[2] = SDHOST_GetDmaAddr (handle->sdio_port);
864                         }
865                     #endif
866                     SDHOST_RST (handle->sdio_port,RST_CMD_DAT_LINE);
867                     return s_CardErrCode;
868                 }
869             }
870                 s_CardErrCode &= ~ERR_DATA_TIMEOUT;
871         }
872         else
873         {
874             SDIO_CARD_PRINT ( ("SDIO_Card error = 0x%x",s_CardErrCode));
875             return s_CardErrCode;
876         }
877     }
878
879       /* if (NULL != dataParam)
880        {
881           if(dataParam->direction == SDIO_DMA_IN)                  
882                               Dcache_InvalRegion((unsigned int)(dataParam->databuf), dataParam->blkLen  *  dataParam->blkNum);
883        }*/
884
885     SDHOST_GetRspFromBuf (handle->sdio_port, curCmdInfo->Response, rspBuf);
886
887         SDIO_CARD_PRINT(("resp[0-4]:%02X, %02X, %02X, %02X\r\n", rspBuf[0], rspBuf[1], rspBuf[2], rspBuf[3]));
888
889     return SDIO_CARD_PAL_ERR_NONE;
890 }
891
892 PUBLIC BOOLEAN SDIO_Card_Pal_Close (SDIO_CARD_PAL_HANDLE handle)
893 {
894     SDIO_CARD_PAL_IRQ_DECLARE;
895
896     // ´ËÄ£¿éÖ»Ìṩ¸øCard_sdio.cÕâ¸öЭÒéʹÓã¬Ð­Òé´úÂë±¾ÉíÒѾ­±£Ö¤¸ÃhandleµÄÓÐЧÐÔ£¬Òò´ËÔÚÕâÀï²»×öÌرðÑϵļì²é
897     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
898         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
899         && (TRUE == handle->flag)
900     );
901
902     SDIO_CARD_PAL_DISABLE_IRQ;
903     handle->flag = FALSE;
904     SDIO_CARD_PAL_ENABLE_IRQ;
905
906     SDHOST_UnRegister (handle->sdio_port);
907
908 #if defined (UCOS_BSD_EVENT)
909     {
910         INT8U err;
911         OSFlagDel (handle->sdio_event, OS_DEL_ALWAYS, &err);
912         handle->sdio_event = PNULL;
913     }
914 #elif defined (CARD_SDIO_EVENT)
915     SCI_DeleteEvent (handle->sdio_event);
916     handle->sdio_event = PNULL;
917 #else
918     s_CardEvent = 0;
919 #endif
920
921     return TRUE;
922 }
923 #if !(defined(CONFIG_SC8830) || defined(CONFIG_SC9630) )
924 #ifdef CONFIG_EMMC_BOOT
925 uint32 SCI_GetTickCount(void)
926 {
927         volatile uint32 tmp_tick1;
928         volatile uint32 tmp_tick2;
929
930         tmp_tick1 = SYSTEM_CURRENT_CLOCK;
931         tmp_tick2 = SYSTEM_CURRENT_CLOCK;
932
933         while (tmp_tick1 != tmp_tick2)
934   {
935           tmp_tick1 = tmp_tick2;
936           tmp_tick2 = SYSTEM_CURRENT_CLOCK;
937           }
938
939         return tmp_tick1;
940 }
941 #endif
942 #endif
943
944 void SDIO_Card_Pal_DisSdClk(SDIO_CARD_PAL_HANDLE handle)
945 {
946         SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
947 }