tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / mmc / sdio_card_pal.c
1
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"
8
9 //#include "asm/arch/deep_sleep.h"
10 //#include "asm/arch/deepsleep_drvapi.h"
11
12 //#define DUAL_TCARD_SUPPORT
13 #ifndef OS_NONE
14 #define CARD_SDIO_EVENT
15 #endif
16
17 #undef NULL
18 #define NULL 0x0
19
20 //#define UCOS_BSD_EVENT
21
22 //#define DUAL_TCARD_SUPPORT
23 /*lint -save -e551*/
24 /*-----------------------------------------*/
25 //  Debug Function
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
30 #else
31 #define SDIO_CARD_PRINT(x) SCI_TRACE_LOW x
32 #endif
33 /*-----------------------------------------*/
34 //  IRQ Function
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
40 #else
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
44 #endif
45 /*-----------------------------------------*/
46
47
48 typedef struct
49 {
50     SDIO_CARD_PAL_CMD_E cmd;
51     uint32 cmdIndex;
52     uint32 intFilter;
53     CMD_RSP_TYPE_E Response;
54     uint32 errFilter;
55     uint32 transmode;
56 } CMD_CTL_FLG;
57
58
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
70
71
72 LOCAL const CMD_CTL_FLG s_SDCmdDetail[]=
73 {
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   },
102
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                                                                                                                                                                                                                                                          },      // ??
108
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                                                                                                                                                                                                                                                          },
111
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                                                                                                                                                                                                                                                          },
114
115         {       CARD_CMD38_ERASE                                                , 38    , SIG_TRANS_CMP         |       CARD_SDIO_R1B           | NULL                                                                                                                  , NULL                                                                                                                                                                                                                                                          },
116
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                                                                                                                                                                                                                                                          },
119
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                                                                                                                                                                                                                                                          },      //??
125
126
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                                                                                                                                                                                                                                                          },      // ??
134
135         {       CARD_CMDMAX                                                     , 0 , NULL                              |       CARD_SDIO_NO_RSP        | NULL                                                                                                                  , NULL                                                                                                                                                                                                                                                          }
136
137 };
138
139
140 static const CMD_CTL_FLG s_cmdDetail[] =
141 {
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   },
172
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                                                                                                                               },  // ??
178
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                                                                                                                               },
181
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                                                                                                                               },
184
185     {   CARD_CMD38_ERASE                        ,38 ,SIG_TRANS_CMP      |   CARD_SDIO_R1B       |NULL                                                           ,NULL                                                                                                                               },
186
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                                                                                                                               },
189
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                                                                                                                               },  //??
195
196
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                                                                                                                               },  // ??
204
205     {   CARD_ACMD6_SET_EXT_CSD     /*SD*/     ,6  ,NULL               |   CARD_SDIO_R1B        |NULL                                                           ,NULL                                                                                                                               },
206
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                                                                                                                               },
212 #endif
213
214     {   CARD_CMDMAX                             ,0  ,NULL               |   CARD_SDIO_NO_RSP    |NULL                                                           ,NULL                                                                                                                               }
215
216 };
217
218 #define SDIO_CARD_PAL_MAGICNUM 0x5344494F
219
220 typedef struct SDIO_CARD_PAL_Struct
221 {
222     BOOLEAN flag;
223     uint32 MagicNum;            // "SDIO"
224
225     SDHOST_HANDLE sdio_port;
226
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;
231 #endif
232
233     SDIO_CARD_PAL_SLOT_E sdio_No;
234         SDIO_CARD_PAL_TYPE_E sdio_type;
235 } SDIO_CARD_PAL_Struct_T;
236
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}};
240 #else
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}};
242 #endif
243
244 #ifdef DUAL_TCARD_SUPPORT
245 LOCAL SDIO_CARD_PAL_SLOT_E s_activeslot = SDIO_CARD_PAL_SLOT_MAX;
246 #endif
247
248 #if defined (UCOS_BSD_EVENT)
249
250 #elif defined (CARD_SDIO_EVENT)
251
252 #else
253 LOCAL volatile uint32 s_CardEvent = 0;
254 #endif
255 LOCAL volatile uint32 s_CardErrCode = 0;
256
257 //-----------------------------------------------------------------------------------
258 //  Clear all event  happened before ,and prepare next transmission
259 //-----------------------------------------------------------------------------------
260 LOCAL void _InitCardEvent (SDIO_CARD_PAL_HANDLE handle)
261 {
262     s_CardErrCode = 0;
263 #if defined (UCOS_BSD_EVENT)
264     {
265         INT8U err;
266         OSFlagPost (handle->sdio_event, 0xFFFFFFFF, OS_FLAG_CLR, &err);
267     }
268 #elif defined (CARD_SDIO_EVENT)
269     SCI_SetEvent (handle->sdio_event,0,SCI_AND);
270 #else
271     s_CardEvent = 0;
272 #endif
273 }
274
275 //-----------------------------------------------------------------------------------
276 //  After the transmission begin , wait event during the transmission
277 //-----------------------------------------------------------------------------------
278 LOCAL uint32 _WaitCardEvent (SDIO_CARD_PAL_HANDLE handle,uint32 EventId)
279 {
280 #if defined (UCOS_BSD_EVENT)
281     INT8U err;
282     OSFlagPend (handle->sdio_event, EventId, OS_FLAG_WAIT_SET_ALL|OS_FLAG_CONSUME, 1000, &err);
283
284     if (OS_TIMEOUT == err)
285     {
286         s_CardErrCode |= BIT_31;
287     }
288
289 #elif defined (CARD_SDIO_EVENT)
290     {
291         uint32 actualFlag;
292         uint32 eRet;
293
294         eRet = SCI_GetEvent (handle->sdio_event,EventId,SCI_AND_CLEAR,&actualFlag,3000);
295         if (SCI_SUCCESS != eRet)
296         {
297             s_CardErrCode |= BIT_31;
298             SDIO_CARD_PRINT(("SCM Wait event error!!! eRet = 0x%x",eRet));
299         }
300     }
301 #else
302
303     //  CARD_PRINT(("SD20 Wait event before %x",EventId));
304     if(EventId == (s_CardEvent&EventId))
305     {
306         return 0;
307     }
308     else
309     {
310         return 1;
311     }
312
313     //  CARD_PRINT(("SD20 Wait event end %x",s_CardEvent));
314 #endif
315 }
316
317 //-----------------------------------------------------------------------------------
318 //  After the transmission begin , this funtion used to give event
319 //-----------------------------------------------------------------------------------
320 LOCAL void _SetCardEvent (SDIO_CARD_PAL_HANDLE handle,uint32 EventId)
321 {
322 #if defined (UCOS_BSD_EVENT)
323     INT8U err;
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);
327 #else
328     s_CardEvent |= EventId;
329 #endif
330 }
331
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 //-----------------------------------------------------------------------------------
335 #define DEBUG_SDIO
336 #ifdef DEBUG_SDIO
337 LOCAL uint32 s_irqCardProc_msg;
338 LOCAL uint32 s_sdio_dma_addr[4] = {NULL};
339 #endif
340 LOCAL void  _irqCardProc (uint32 msg, uint32 errCode, SDHOST_SLOT_NO slotNum)
341 {
342     SDIO_CARD_PAL_HANDLE handle;
343     handle = &s_sdioCardPalHd[slotNum];
344
345     if (0 != (SIG_CARD_IN&msg)) // card interrupt happened , may be some operation error happened
346     {
347         _SetCardEvent (handle,SIG_CARD_IN);
348     }
349
350     if (0 != (SIG_CARD_INSERT&msg)) // card is inserted in slot
351     {
352         _SetCardEvent (handle,SIG_CARD_INSERT);
353     }
354     else if (0 != (SIG_CARD_REMOVE&msg)) // card is plug out from slot
355     {
356         _SetCardEvent (handle,SIG_CARD_REMOVE);
357     }
358     else if (0 != (SIG_ERR&msg)) // some error happened during the transmission
359     {
360         s_CardErrCode |= errCode;   // get the error detail
361         _SetCardEvent (handle,SIG_ALL);
362
363         return;
364     }
365     if (0 != (SIG_TRANS_CMP&msg))       // transmission complete
366     {
367         /* clear transfer complete timeout bit! */
368         s_CardErrCode &= ~ERR_DATA_TIMEOUT;
369         _SetCardEvent (handle,SIG_TRANS_CMP);
370     }
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
372     {
373         volatile uint32 nextAdd;
374 #ifdef DEBUG_SDIO
375         s_irqCardProc_msg = msg;
376 #endif
377         nextAdd = SDHOST_GetDmaAddr (handle->sdio_port);
378         SDHOST_SetDmaAddr (handle->sdio_port, nextAdd);
379 #ifdef DEBUG_SDIO
380         s_sdio_dma_addr[3] = SDHOST_GetDmaAddr (handle->sdio_port);
381 #endif
382         SDHOST_NML_IntStatus_En (handle->sdio_port, SIG_DMA_INT);
383         SDHOST_NML_IntSig_En (handle->sdio_port, SIG_DMA_INT);
384     }
385
386     if (0 != (SIG_CMD_CMP&msg))     // during the transmission ,the command has be confirmed by card
387     {
388         s_CardErrCode &= ~ERR_CMD_TIMEOUT;
389         _SetCardEvent (handle,SIG_CMD_CMP);
390     }
391 }
392
393 #ifdef DUAL_TCARD_SUPPORT
394 LOCAL void _SlotSelect(SDIO_CARD_PAL_SLOT_E slotNo)
395 {
396     SDIO_CARD_PAL_SLOT_E i;
397     SDIO_CARD_PAL_HANDLE handle;
398     
399     SDIO_CARD_PAL_ASSERT(SDHOST_SLOT_MAX_NUM > slotNo); /*assert verified*/
400
401     SDHOST_Slot_select((SDHOST_SLOT_NO)slotNo);
402     
403     for(i = 0; i < SDHOST_SLOT_MAX_NUM; i ++)
404     {
405         handle = &s_sdioCardPalHd[i];
406         if(PNULL == handle->sdio_port)
407         {
408             continue;
409         }
410         if(slotNo == i)
411         {
412                         SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);
413         }
414         else
415         {
416                         SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_OFF);
417         }
418     }
419 }
420 #endif
421
422
423 PUBLIC SDIO_CARD_PAL_HANDLE SDIO_Card_Pal_Open (SDIO_CARD_PAL_SLOT_E slotNo)
424 {
425     SDIO_CARD_PAL_IRQ_DECLARE;
426
427     SDIO_CARD_PAL_ASSERT (SDHOST_SLOT_MAX_NUM > slotNo);        /*assert verified*/
428
429     SDIO_CARD_PAL_DISABLE_IRQ;
430
431     if (TRUE == s_sdioCardPalHd[slotNo].flag)
432     {
433         SDIO_CARD_PAL_ENABLE_IRQ;
434         SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
435     }
436
437     s_sdioCardPalHd[slotNo].flag = TRUE;
438     SDIO_CARD_PAL_ENABLE_IRQ;
439
440     s_sdioCardPalHd[slotNo].MagicNum = SDIO_CARD_PAL_MAGICNUM;
441 #if defined (UCOS_BSD_EVENT)
442     {
443         INT8U err;
444         s_sdioCardPalHd[slotNo].sdio_event = PNULL;
445         s_sdioCardPalHd[slotNo].sdio_event = OSFlagCreate (0, &err);
446
447         if (PNULL == s_sdioCardPalHd[slotNo].sdio_event)
448         {
449             SDIO_CARD_PAL_ASSERT (0);   /*assert verified*/
450         }
451     }
452 #elif defined (CARD_SDIO_EVENT)
453     s_sdioCardPalHd[slotNo].sdio_event = PNULL;
454     s_sdioCardPalHd[slotNo].sdio_event = SCI_CreateEvent ("SDIO_EVENT");
455
456     if (PNULL == s_sdioCardPalHd[slotNo].sdio_event)
457     {
458         SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
459     }
460
461 #else
462     s_CardEvent = 0;
463
464 #endif
465     s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE) SDHOST_Register ( (SDHOST_SLOT_NO) slotNo,_irqCardProc);
466
467     if (0 == s_sdioCardPalHd[slotNo].sdio_port)
468     {
469         SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
470     }
471         
472     s_sdioCardPalHd[slotNo].sdio_No = slotNo;
473 #ifdef DUAL_TCARD_SUPPORT
474     s_activeslot = slotNo;
475     _SlotSelect(slotNo);
476 #endif
477
478     return &s_sdioCardPalHd[slotNo];
479
480 }
481
482 PUBLIC BOOLEAN SDIO_Card_Pal_Pwr (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_PWR_E onOrOff)
483 {
484
485     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
486         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
487         && (TRUE == handle->flag)
488     );
489
490 #ifdef DUAL_TCARD_SUPPORT
491     switch(handle->sdio_No)
492     {
493         case SDIO_CARD_PAL_SLOT_0:
494         case SDIO_CARD_PAL_SLOT_1:
495         {
496              if(s_activeslot !=  handle->sdio_No)
497             {
498                  s_activeslot = handle->sdio_No;
499                  _SlotSelect(handle->sdio_No); 
500              }
501          }
502           break;
503
504         default:
505         {
506             SDIO_CARD_PAL_ASSERT (0);   /*assert verified*/
507         }
508         break;
509     }
510 #endif  
511                 
512     switch (onOrOff)
513     {
514         case SDIO_CARD_PAL_ON:
515             {
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)
520 #else
521                 SDHOST_Cfg_Voltage (handle->sdio_port,VOL_3_0);
522 #endif
523                 SDHOST_SD_POWER (handle->sdio_port,POWR_ON);
524                 udelay(5000);
525                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,400000);
526                                 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_ON);
527                 udelay(1000);
528                 SDHOST_internalClk_OnOff (handle->sdio_port,CLK_ON);
529                 udelay(1000);
530             }
531             break;
532         case SDIO_CARD_PAL_OFF:
533             {
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);
538                 udelay(1000);
539                 SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
540                 udelay(1000);
541             }
542             break;
543         default:
544             {
545                 SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
546             }
547             break;
548     }
549
550     return TRUE;
551 }
552
553 PUBLIC BOOLEAN SDIO_Card_Pal_SetClk (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_CLKTYPE_E clkType)
554 {
555     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
556         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
557         && (TRUE == handle->flag)
558     );
559
560     SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_OFF);
561
562     switch (clkType)
563     {
564         case SDIO_CARD_PAL_400KHz:
565             {
566                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,400000);
567             }
568             break;
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);
572                                 break;
573                 case SDIO_CARD_PAL_2MHz:
574                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,2000000);
575                                 break;
576                 case SDIO_CARD_PAL_4MHz:
577                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,4000000);
578                                 break;
579                 case SDIO_CARD_PAL_8MHz:
580                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,8000000);
581                                 break;
582                 case SDIO_CARD_PAL_12MHz:
583                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,12000000);
584                                 break;
585 #endif                          
586         case SDIO_CARD_PAL_20MHz:
587             {
588                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,20000000);
589             }
590             break;
591
592         case SDIO_CARD_PAL_25MHz:
593             {
594                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,25000000);
595             }
596             break;
597
598         case SDIO_CARD_PAL_50MHz:
599             {
600                 SDHOST_SD_Clk_Freq_Set (handle->sdio_port,50000000);
601             }
602             break;
603
604         default:
605             {
606                 SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
607             }
608             break;
609
610     }
611
612     SDHOST_internalClk_OnOff (handle->sdio_port,CLK_ON);
613     SDHOST_Delayus(200);
614     SDHOST_SD_clk_OnOff (handle->sdio_port,CLK_ON);
615
616     return TRUE;
617
618 }
619
620 PUBLIC BOOLEAN SDIO_Card_Pal_SetBusWidth (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_BUFWIDTH_E widthType)
621 {
622     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
623         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
624         && (TRUE == handle->flag)
625     );
626
627     switch (widthType)
628     {
629         case SDIO_CARD_PAL_1_BIT:
630             {
631                 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_1BIT_WIDTH);
632             }
633             break;
634
635         case SDIO_CARD_PAL_4_BIT:
636             {
637                 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_4BIT_WIDTH);
638             }
639             break;
640
641         case SDIO_CARD_PAL_8_BIT:
642             {
643                 SDHOST_Cfg_BusWidth (handle->sdio_port,SDIO_8BIT_WIDTH);
644             }
645             break;
646
647         default:
648             {
649                 SDIO_CARD_PAL_ASSERT (0);       /*assert verified*/
650             }
651             break;
652
653     }
654
655     return TRUE;
656 }
657
658 PUBLIC BOOLEAN SDIO_Card_Pal_SetSpeedMode (SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_SPEEDMODE_E speedMode)
659 {
660     SDIO_CARD_PAL_ASSERT (      /*assert verified*/
661         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)
662         && (TRUE == handle->flag)
663     );
664 #if defined (CONFIG_SC8825) || defined(CONFIG_SC7710G2) || defined(CONFIG_SC8830) || (defined CONFIG_SC9630)
665         switch (speedMode)
666         {
667                 case EMMC_SPEED_SDR12:
668                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR12);
669                         break;
670                 case EMMC_SPEED_SDR25:
671                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR25);
672                         break;
673                 case EMMC_SPEED_SDR50:
674                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR50);
675                         break;
676                 case EMMC_SPEED_SDR104:
677                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_SDR104);
678                         break;
679                 case EMMC_SPEED_DDR50:
680                         SDHOST_Cfg_SpeedMode (handle->sdio_port,EMMC_DDR50);
681                         break;
682                 default:
683                         return FALSE;
684         }
685 #else
686     // dummy function
687     #if 0
688     switch(speedMode)
689     {
690         case SDIO_CARD_PAL_LOW_SPEED:
691         {
692             SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_LOWSPEED);
693         }
694         break;
695
696         case SDIO_CARD_PAL_HIGH_SPEED:
697         {
698             SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_HIGHSPEED);
699         }
700         break;
701
702         default:
703         {
704             SDIO_CARD_PAL_ASSERT(0);    /*assert verified*/
705         }
706         break;
707
708     }
709     #endif
710
711     // if ahb_clk < 96M, then not enter highspeed mode.
712     /*if(CHIP_GetAhbClk() < 96000000)
713         return FALSE;
714     else  */
715 #endif
716         return TRUE;
717
718 }
719
720
721
722 //-----------------------------------------------------------------------------------
723 //  Send command to card
724 //-----------------------------------------------------------------------------------
725 #ifdef DEBUG_SDIO
726 LOCAL CARD_DATA_PARAM_T s_dataParam;
727 #endif
728
729 PUBLIC void  SDIO_Card_Pal_SetType(SDIO_CARD_PAL_HANDLE handle, SDIO_CARD_PAL_TYPE_E sdio_type)
730 {
731         handle->sdio_type = sdio_type;
732 }
733
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,
739     /*OUT*/uint8 *rspBuf
740 )
741 {
742     uint32 tmpIntFilter;
743         int tmOut = 0;
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];
748         else
749 #endif
750                 curCmdInfo = &s_cmdDetail[cmd];
751
752
753 #ifdef OS_NONE
754         uint32  isr_status;
755 #endif
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 }