00001
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #ifndef _SD_MMC_MCI_H_
00047 #define _SD_MMC_MCI_H_
00048
00049
00050
00051
00052 #include "conf_access.h"
00053
00054 #if SD_MMC_MCI_0_MEM == DISABLE && SD_MMC_MCI_1_MEM == DISABLE
00055 #error sd_mmc_mci.h is #included although SD_MMC_MCI_x_MEM are all disabled
00056 #endif
00057
00058
00059 #include "compiler.h"
00060 #include "mci.h"
00061 #include "sd_mmc_cmd.h"
00062
00063
00064
00065
00067 #define SD_MMC_SECTOR_BITS 9
00068
00070 #define SD_MMC_SECTOR_SIZE (1 << SD_MMC_SECTOR_BITS)
00071
00072
00073
00075 #define UNKNOWN_CARD 0x00
00076 #define MMC_CARD 0x01
00077 #define SD_CARD 0x02
00078 #define MMC_CARD_V4 0x04
00079 #define SD_CARD_V2 0x08
00080 #define SD_CARD_HC 0x10
00081 #define MMC_CARD_HC 0x20
00082
00084 #define CARD_UNINSTALLED 0
00085 #define CARD_INSTALLED 1
00086
00088 #define OCR_MSK_BUSY 0x80000000 // Busy flag
00089 #define OCR_MSK_HC 0x40000000 // High Capacity flag
00090 #define OCR_MSK_VOLTAGE_3_2V_3_3V 0x00100000 // Voltage 3.2V to 3.3V flag
00091 #define OCR_MSK_VOLTAGE_ALL 0x00FF8000 // All Voltage flag
00092
00094 #define RCA_RESERVE_ADR 0x00000000
00095 #define RCA_MSK_ADR 0xFFFF0000
00096 #define RCA_DEFAULT_ADR 0x0001FFFF // It can be changed
00097
00099 #define CSD_REG_SIZE 0x10
00100 #define CSD_STRUCT_1_0 0x00
00101 #define CSD_STRUCT_1_1 0x40
00102 #define CSD_STRUCT_1_2 0x80
00103 #define CSD_STRUCT_SUP 0xC0
00104 #define CSD_MSK_STRUCT 0xC0
00105 #define CSD_SPEC_VER_1_0 0x00
00106 #define CSD_SPEC_VER_1_4 0x04
00107 #define CSD_SPEC_VER_2_0 0x08
00108 #define CSD_SPEC_VER_3_1 0x0C
00109 #define CSD_SPEC_VER_4_0 0x10
00110 #define CSD_MSK_SPEC_VER 0x3C
00111 #define CSD_MSK_RBP 0x80
00112 #define CSD_MSK_WBM 0x40
00113 #define CSD_MSK_RBM 0x20
00114 #define CSD_MSK_RBL 0x0F
00115 #define CSD_MSK_CSH 0x03
00116 #define CSD_MSK_CSL 0xC0
00117 #define CSD_MSK_CSM 0x07
00118 #define CSD_MSK_CSMH 0x03
00119 #define CSD_MSK_CSML 0x80
00120 #define CSD_MSK_WBL 0x03
00121 #define CSD_MSK_WBH 0xC0
00122 #define CSD_MSK_WBP 0x20
00123 #define CSD_BLEN_2048 11
00124 #define CSD_BLEN_512 9
00125
00127 #define MMC_STBY_STATE_MSK ((U32)0x01D81E00)
00128 #define MMC_STBY_STATE ((U32)0x00000600) // stby state
00129 #define MMC_DATA_STATE_MSK ((U32)0xE0040E00)
00130 #define MMC_DATA_STATE ((U32)0x00000A00) // data state
00131 #define MMC_RCV_STATE_MSK ((U32)0xE0020E00)
00132 #define MMC_RCV_STATE ((U32)0x00000A00) // rcv state
00133 #define MMC_TRAN_STATE_MSK ((U32)0xE0020E00)
00134 #define MMC_TRAN_STATE ((U32)0x00000800) // tran state
00135
00137 #define CS_FLAGERROR_RD_WR (CS_ADR_OUT_OF_RANGE|CS_ADR_MISALIGN|CS_BLOCK_LEN_ERROR|CS_ERASE_SEQ_ERROR|CS_ILLEGAL_COMMAND|CS_CARD_ERROR)
00138 #define CS_ADR_OUT_OF_RANGE (1<<31)
00139 #define CS_ADR_MISALIGN (1<<30)
00140 #define CS_BLOCK_LEN_ERROR (1<<29)
00141 #define CS_ERASE_SEQ_ERROR (1<<28)
00142 #define CS_ERASE_PARAM (1<<27)
00143 #define CS_WP_VIOLATION (1<<26)
00144 #define CS_CARD_IS_LOCKED (1<<25)
00145 #define CS_LOCK_UNLOCK_ (1<<24)
00146 #define CS_COM_CRC_ERROR (1<<23)
00147 #define CS_ILLEGAL_COMMAND (1<<22)
00148 #define CS_CARD_ECC_FAILED (1<<21)
00149 #define CS_CARD_ERROR (1<<20)
00150 #define CS_EXEC_ERROR (1<<19)
00151 #define CS_UNDERRUN (1<<18)
00152 #define CS_OVERRUN (1<<17)
00153 #define CS_CIDCSD_OVERWRITE (1<<16)
00154 #define CS_WP_ERASE_SKIP (1<<15)
00155 #define CS_ERASE_RESET (1<<13)
00156 #define CS_READY_FOR_DATA (1<<8)
00157 #define CS_SWITCH_ERROR (1<<7)
00158 #define CS_APP_CMD (1<<5)
00159
00161 #define SD_BUS_1_BIT MCI_BUS_SIZE_1_BIT
00162 #define SD_BUS_4_BIT MCI_BUS_SIZE_4_BIT
00163 #define SD_BUS_8_BIT MCI_BUS_SIZE_8_BIT
00164
00165
00166 #define MMC_GO_IDLE_STATE 0
00167 #define MMC_SEND_OP_COND 1
00168 #define MMC_CMD2 2
00169 #define MMC_SEND_CSD 9
00170 #define MMC_SEND_CID 10
00171 #define MMC_SEND_STATUS 13
00172 #define MMC_SET_BLOCKLEN 16
00173 #define MMC_READ_SINGLE_BLOCK 17
00174 #define MMC_WRITE_BLOCK 24
00175 #define MMC_PROGRAM_CSD 27
00176 #define MMC_SET_WRITE_PROT 28
00177 #define MMC_CLR_WRITE_PROT 29
00178 #define MMC_SEND_WRITE_PROT 30
00179 #define SD_TAG_WR_ERASE_GROUP_START 32
00180 #define SD_TAG_WR_ERASE_GROUP_END 33
00181 #define MMC_TAG_SECTOR_START 32
00182 #define MMC_TAG_SECTOR_END 33
00183 #define MMC_UNTAG_SECTOR 34
00184 #define MMC_TAG_ERASE_GROUP_START 35
00185 #define MMC_TAG_ERASE_GROUP_END 36
00186 #define MMC_UNTAG_ERASE_GROUP 37
00187 #define MMC_ERASE 38
00188 #define SD_SEND_OP_COND_ACMD 41
00189 #define MMC_LOCK_UNLOCK 42
00190 #define SD_APP_CMD55 55
00191 #define MMC_CRC_ON_OFF 59
00192 // R1 Response bit-defines
00193 #define MMC_R1_BUSY 0x80
00194 #define MMC_R1_PARAMETER 0x40
00195 #define MMC_R1_ADDRESS 0x20
00196 #define MMC_R1_ERASE_SEQ 0x10
00197 #define MMC_R1_COM_CRC 0x08
00198 #define MMC_R1_ILLEGAL_COM 0x04
00199 #define MMC_R1_ERASE_RESET 0x02
00200 #define MMC_R1_IDLE_STATE 0x01
00201
00202 #define MMC_STARTBLOCK_READ 0xFE
00203 #define MMC_STARTBLOCK_WRITE 0xFE
00204 #define MMC_STARTBLOCK_MWRITE 0xFC
00205
00206 #define MMC_STOPTRAN_WRITE 0xFD
00207
00208 #define MMC_DE_MASK 0x1F
00209 #define MMC_DE_ERROR 0x01
00210 #define MMC_DE_CC_ERROR 0x02
00211 #define MMC_DE_ECC_FAIL 0x04
00212 #define MMC_DE_OUT_OF_RANGE 0x04
00213 #define MMC_DE_CARD_LOCKED 0x04
00214
00215 #define MMC_DR_MASK 0x1F
00216 #define MMC_DR_ACCEPT 0x05
00217 #define MMC_DR_REJECT_CRC 0x0B
00218 #define MMC_DR_REJECT_WRITE_ERROR 0x0D
00219
00220 #define MMC_SWITCH_WRITE ((U8)03)
00221 #define MMC_SWITCH_BUS_WIDTH ((U8)183)
00222 #define MMC_SWITCH_HIGH_SPEED ((U8)185)
00223 #define MMC_SWITCH_CMD_SET ((U8)03)
00224 #define MMC_SWITCH_VAL_LS ((U8)00)
00225 #define MMC_SWITCH_VAL_HS ((U8)01)
00226 #define MMC_SWITCH_VAL_1BIT ((U8)00)
00227 #define MMC_SWITCH_VAL_4BIT ((U8)01)
00228 #define MMC_SWITCH_VAL_8BIT ((U8)02)
00229
00230 #define CMD_FULL_ERASE 0x08
00231 #define CMD_UNLOCK 0x00
00232 #define CMD_CLEAR 0x02
00233 #define CMD_LOCK 0x01
00234
00235
00236
00237
00238 typedef struct
00239 {
00240 union
00241 {
00242 unsigned int cardStatus;
00243 struct
00244 {
00245 unsigned int outOfRange :1;
00246 unsigned int addressserror :1;
00247 unsigned int blockLenError :1;
00248 unsigned int eraseSeqErro :1;
00249 unsigned int eraseParam :1;
00250 unsigned int wpViolation :1;
00251 unsigned int cardIsLocked :1;
00252 unsigned int lockUnlockFailed :1;
00253 unsigned int comCrcError :1;
00254 unsigned int illegalCommand :1;
00255 unsigned int cardEccFailed :1;
00256 unsigned int ccError :1;
00257 unsigned int error :1;
00258 unsigned int :2;
00259 unsigned int csdOverwrite :1;
00260 unsigned int wpEraseSkip :1;
00261 unsigned int cardEccDisabled :1;
00262 unsigned int eraseReset :1;
00263 unsigned int currentState :4;
00264 unsigned int readyForData :1;
00265 unsigned int :2;
00266 unsigned int appCmd :1;
00267 unsigned int :1;
00268 unsigned int akeSeqError :1;
00269 unsigned int :3;
00270 };
00271 };
00272 }card_status_t;
00273
00274
00275 typedef struct
00276 {
00277 union
00278 {
00279 unsigned int ocr;
00280 struct
00281 {
00282 unsigned int busy :1;
00283 unsigned int ccs :1;
00284 unsigned int :6;
00285 unsigned int vRange :9;
00286 unsigned int :15;
00287 };
00288 };
00289 }ocr_t;
00290
00291 typedef struct
00292 {
00293
00294 unsigned int csdStructure :2;
00295 unsigned int :6;
00296 unsigned int taac :8;
00297 unsigned int nsac :8;
00298 unsigned int tranSpeed :8;
00299
00300 unsigned int ccc :12;
00301 unsigned int readBlLen :4;
00302 unsigned int readBlePartial :1;
00303 unsigned int writeBlkMisalign :1;
00304 unsigned int readBlkMisalign :1;
00305 unsigned int dsrImp :1;
00306 unsigned int :2;
00307 unsigned int deviceSizeH :10;
00308
00309 unsigned int deviceSizeL :2;
00310 unsigned int vddRCurrMin :3;
00311 unsigned int vddRCurrMax :3;
00312 unsigned int vddWCurrMin :3;
00313 unsigned int vddWCurrMax :3;
00314 unsigned int cSizeMult :3;
00315 unsigned int eraseBlkEn :1;
00316 unsigned int sectorSize :7;
00317 unsigned int wpGrpSize :7;
00318
00319 unsigned int wpGrpEnable :1;
00320 unsigned int :2;
00321 unsigned int r2wFactor :3;
00322 unsigned int writeBlLen :4;
00323 unsigned int writeBlPartial :1;
00324 unsigned int :5;
00325 unsigned int fileFormatGrp :1;
00326 unsigned int copy :1;
00327 unsigned int permWriteProtect :1;
00328 unsigned int tmpWriteProtect :1;
00329 unsigned int fileFormat :2;
00330 unsigned int :2;
00331 unsigned int crc :7;
00332 unsigned int :1;
00333 }csd_v1_t;
00334
00335
00336 typedef struct
00337 {
00338
00339 unsigned int csdStructure :2;
00340 unsigned int :6;
00341 unsigned int taac :8;
00342 unsigned int nsac :8;
00343 unsigned int tranSpeed :8;
00344
00345 unsigned int ccc :12;
00346 unsigned int readBlLen :4;
00347 unsigned int readBlePartial :1;
00348 unsigned int writeBlkMisalign :1;
00349 unsigned int readBlkMisalign :1;
00350 unsigned int dsrImp :1;
00351 unsigned int :6;
00352 unsigned int deviceSizeH :6;
00353
00354 unsigned int deviceSizeL :16;
00355 unsigned int :1;
00356 unsigned int eraseBlkEn :1;
00357 unsigned int sectorSize :7;
00358 unsigned int wpGrpSize :7;
00359
00360 unsigned int wpGrpEnable :1;
00361 unsigned int :2;
00362 unsigned int r2wFactor :3;
00363 unsigned int writeBlLen :4;
00364 unsigned int writeBlPartial :1;
00365 unsigned int :5;
00366 unsigned int fileFormatGrp :1;
00367 unsigned int copy :1;
00368 unsigned int permWriteProtect :1;
00369 unsigned int tmpWriteProtect :1;
00370 unsigned int fileFormat :2;
00371 unsigned int :2;
00372 unsigned int crc :7;
00373 unsigned int :1;
00374 }csd_v2_t;
00375
00376
00377 typedef struct
00378 {
00379 union
00380 {
00381 unsigned int csd[4];
00382 union
00383 {
00384 csd_v1_t csd_v1;
00385 csd_v2_t csd_v2;
00386 };
00387 };
00388 }csd_t;
00389
00390 typedef struct
00391 {
00392 union
00393 {
00394 unsigned int cid[4];
00395 struct
00396 {
00397 unsigned int mid :8;
00398 unsigned int oid :16;
00399 unsigned int pnmh :32;
00400 unsigned int pnml :8;
00401 unsigned int prv :8;
00402 unsigned int psn :32;
00403 unsigned int :4;
00404 unsigned int mdt :12;
00405 unsigned int crc :7;
00406 unsigned int :1;
00407 };
00408 };
00409 }cid_t;
00410
00411
00412 typedef struct
00413 {
00414 union
00415 {
00416 unsigned int rep1[2];
00417 struct
00418 {
00419 unsigned int startBit :1;
00420 unsigned int transBit :1;
00421 unsigned int cmdIndex :6;
00422 card_status_t cardStatus;
00423 unsigned int crc7 :6;
00424 unsigned int endBit :1;
00425 unsigned int pad :16;
00426 };
00427 };
00428 }rep1_t;
00429
00430
00431 typedef struct
00432 {
00433 union
00434 {
00435 unsigned int rep2[5];
00436 struct
00437 {
00438 union
00439 {
00440 cid_t cid;
00441 csd_t csd;
00442 };
00443 unsigned int endBit :1;
00444 unsigned int pad :32;
00445 };
00446 };
00447 }rep2_t;
00448
00449
00450 typedef struct
00451 {
00452 union
00453 {
00454 unsigned int rep3[2];
00455 struct
00456 {
00457 unsigned int startBit :1;
00458 unsigned int transBit :1;
00459 unsigned int :6;
00460 ocr_t ocr;
00461 unsigned int :7;
00462 unsigned int endBit :1;
00463 unsigned int pad :16;
00464 };
00465 };
00466 }rep3_t;
00467
00468
00469
00470
00473
00474
00484 extern Bool sd_mmc_mci_init(const mci_options_t *mci_opt, long pbb_hz, long cpu_hz);
00485
00493 extern Bool sd_mmc_mci_card_init(U8 slot);
00494
00501 extern Bool is_sd_mmc_mci_card_present(U8 slot);
00502
00509 extern Bool is_sd_mmc_mci_card_protected(U8 slot);
00510
00517 extern Bool sd_mmc_mci_mem_check(U8 slot);
00518
00530 extern Bool sd_mmc_mci_read_open(U8 slot, U32 sector, U16 nb_sector);
00531
00544 extern Bool sd_mmc_mci_dma_read_open(U8 slot, U32 sector, void* ram, U16 nb_sector );
00545
00552 extern Bool sd_mmc_mci_read_close(U8 slot);
00553
00566 extern Bool sd_mmc_mci_write_open(U8 slot, U32 sector, U16 nb_sector);
00567
00581 extern Bool sd_mmc_mci_dma_write_open(U8 slot, U32 sector, const void* ram, U16 nb_sector);
00582
00589 extern Bool sd_mmc_mci_write_close(U8 slot);
00590
00592
00593
00596
00597
00612 extern Bool sd_mmc_mci_read_multiple_sector(U8 slot, U16 nb_sector);
00613
00619 extern void sd_mmc_mci_read_multiple_sector_callback(const void *psector);
00620
00635 extern Bool sd_mmc_mci_write_multiple_sector(U8 slot, U16 nb_sector);
00636
00642 extern void sd_mmc_mci_write_multiple_sector_callback(void *psector);
00643
00656 extern Bool sd_mmc_mci_read_multiple_sector_2_ram(U8 slot, void *ram, U32 nb_sector);
00657
00670 extern Bool sd_mmc_mci_dma_read_multiple_sector_2_ram(U8 slot, void *ram, U32 nb_sector);
00671
00684 extern Bool sd_mmc_mci_write_multiple_sector_from_ram(U8 slot, const void *ram, U32 nb_sector);
00685
00698 extern Bool sd_mmc_mci_dma_write_multiple_sector_from_ram(U8 slot, const void *ram, U32 nb_sector);
00699
00701
00702
00705
00706
00718 extern Bool sd_mmc_mci_read_sector_2_ram(U8 slot, void *ram);
00719
00731 extern Bool sd_mmc_mci_dma_read_sector_2_ram(U8 slot, void *ram);
00732
00744 extern Bool sd_mmc_mci_write_sector_from_ram(U8 slot, const void *ram);
00745
00757 extern Bool sd_mmc_mci_dma_write_sector_from_ram(U8 slot, const void *ram);
00759
00762
00763
00776 extern Bool sd_mmc_mci_lock_unlock (U8 slot, U8 cmd, U8 pwd_len, U8 * password);
00777
00786 extern Bool is_sd_mmc_mci_locked(U8 slot);
00787
00796 extern Bool sd_mmc_mci_lock_unlock_failed(U8 slot);
00797
00806 extern Bool sd_mmc_mci_cmd_send_status(U8 slot);
00808
00809 #endif // _SD_MMC_MCI_H_