/*++
Copyright (c) 1999 - 2014, Intel Corporation. All rights reserved
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
--*/
/*++
Module Name:
MMC.h
Abstract:
Header file for Industry MMC 4.2 spec.
--*/
#ifndef _MMC_H
#define _MMC_H
#pragma pack(1)
//
//Command definition
//
#define CMD0 0
#define CMD1 1
#define CMD2 2
#define CMD3 3
#define CMD4 4
#define CMD6 6
#define CMD7 7
#define CMD8 8
#define CMD9 9
#define CMD10 10
#define CMD11 11
#define CMD12 12
#define CMD13 13
#define CMD14 14
#define CMD15 15
#define CMD16 16
#define CMD17 17
#define CMD18 18
#define CMD19 19
#define CMD20 20
#define CMD23 23
#define CMD24 24
#define CMD25 25
#define CMD26 26
#define CMD27 27
#define CMD28 28
#define CMD29 29
#define CMD30 30
#define CMD35 35
#define CMD36 36
#define CMD38 38
#define CMD39 39
#define CMD40 40
#define CMD42 42
#define CMD55 55
#define CMD56 56
#define GO_IDLE_STATE CMD0
#define SEND_OP_COND CMD1
#define ALL_SEND_CID CMD2
#define SET_RELATIVE_ADDR CMD3
#define SET_DSR CMD4
#define SWITCH CMD6
#define SELECT_DESELECT_CARD CMD7
#define SEND_EXT_CSD CMD8
#define SEND_CSD CMD9
#define SEND_CID CMD10
#define READ_DAT_UNTIL_STOP CMD11
#define STOP_TRANSMISSION CMD12
#define SEND_STATUS CMD13
#define BUSTEST_R CMD14
#define GO_INACTIVE_STATE CMD15
#define SET_BLOCKLEN CMD16
#define READ_SINGLE_BLOCK CMD17
#define READ_MULTIPLE_BLOCK CMD18
#define BUSTEST_W CMD19
#define WRITE_DAT_UNTIL_STOP CMD20
#define SET_BLOCK_COUNT CMD23
#define WRITE_BLOCK CMD24
#define WRITE_MULTIPLE_BLOCK CMD25
#define PROGRAM_CID CMD26
#define PROGRAM_CSD CMD27
#define SET_WRITE_PROT CMD28
#define CLR_WRITE_PROT CMD29
#define SEND_WRITE_PROT CMD30
#define ERASE_GROUP_START CMD35
#define ERASE_GROUP_END CMD36
#define ERASE CMD38
#define FAST_IO CMD39
#define GO_IRQ_STATE CMD40
#define LOCK_UNLOCK CMD42
#define APP_CMD CMD55
#define GEN_CMD CMD56
#define B_PERM_WP_DIS 0x10
#define B_PWR_WP_EN 0x01
#define US_PERM_WP_DIS 0x10
#define US_PWR_WP_EN 0x01
#define FREQUENCY_OD (400 * 1000)
#define FREQUENCY_MMC_PP (26 * 1000 * 1000)
#define FREQUENCY_MMC_PP_HIGH (52 * 1000 * 1000)
#define DEFAULT_DSR_VALUE 0x404
//
//Registers definition
//
typedef struct {
UINT32 Reserved0: 7; // 0
UINT32 V170_V195: 1; // 1.70V - 1.95V
UINT32 V200_V260: 7; // 2.00V - 2.60V
UINT32 V270_V360: 9; // 2.70V - 3.60V
UINT32 Reserved1: 5; // 0
UINT32 AccessMode: 2; // 00b (byte mode), 10b (sector mode)
UINT32 Busy: 1; // This bit is set to LOW if the card has not finished the power up routine
} OCR;
typedef struct {
UINT8 NotUsed: 1; // 1
UINT8 CRC: 7; // CRC7 checksum
UINT8 MDT; // Manufacturing date
UINT32 PSN; // Product serial number
UINT8 PRV; // Product revision
UINT8 PNM[6]; // Product name
UINT16 OID; // OEM/Application ID
UINT8 MID; // Manufacturer ID
} CID;
typedef struct {
UINT8 NotUsed: 1; // 1 [0:0]
UINT8 CRC: 7; // CRC [7:1]
UINT8 ECC: 2; // ECC code [9:8]
UINT8 FILE_FORMAT: 2; // File format [11:10]
UINT8 TMP_WRITE_PROTECT: 1; // Temporary write protection [12:12]
UINT8 PERM_WRITE_PROTECT: 1; // Permanent write protection [13:13]
UINT8 COPY: 1; // Copy flag (OTP) [14:14]
UINT8 FILE_FORMAT_GRP: 1; // File format group [15:15]
UINT16 CONTENT_PROT_APP: 1; // Content protection application [16:16]
UINT16 Reserved0: 4; // 0 [20:17]
UINT16 WRITE_BL_PARTIAL: 1; // Partial blocks for write allowed [21:21]
UINT16 WRITE_BL_LEN: 4; // Max. write data block length [25:22]
UINT16 R2W_FACTOR: 3; // Write speed factor [28:26]
UINT16 DEFAULT_ECC: 2; // Manufacturer default ECC [30:29]
UINT16 WP_GRP_ENABLE: 1; // Write protect group enable [31:31]
UINT32 WP_GRP_SIZE: 5; // Write protect group size [36:32]
UINT32 ERASE_GRP_MULT: 5; // Erase group size multiplier [41:37]
UINT32 ERASE_GRP_SIZE: 5; // Erase group size [46:42]
UINT32 C_SIZE_MULT: 3; // Device size multiplier [49:47]
UINT32 VDD_W_CURR_MAX: 3; // Max. write current @ VDD max [52:50]
UINT32 VDD_W_CURR_MIN: 3; // Max. write current @ VDD min [55:53]
UINT32 VDD_R_CURR_MAX: 3; // Max. read current @ VDD max [58:56]
UINT32 VDD_R_CURR_MIN: 3; // Max. read current @ VDD min [61:59]
UINT32 C_SIZELow2: 2;// Device size [73:62]
UINT32 C_SIZEHigh10: 10;// Device size [73:62]
UINT32 Reserved1: 2; // 0 [75:74]
UINT32 DSR_IMP: 1; // DSR implemented [76:76]
UINT32 READ_BLK_MISALIGN: 1; // Read block misalignment [77:77]
UINT32 WRITE_BLK_MISALIGN: 1; // Write block misalignment [78:78]
UINT32 READ_BL_PARTIAL: 1; // Partial blocks for read allowed [79:79]
UINT32 READ_BL_LEN: 4; // Max. read data block length [83:80]
UINT32 CCC: 12;// Card command classes [95:84]
UINT8 TRAN_SPEED ; // Max. bus clock frequency [103:96]
UINT8 NSAC ; // Data read access-time 2 in CLK cycles (NSAC*100) [111:104]
UINT8 TAAC ; // Data read access-time 1 [119:112]
UINT8 Reserved2: 2; // 0 [121:120]
UINT8 SPEC_VERS: 4; // System specification version [125:122]
UINT8 CSD_STRUCTURE: 2; // CSD structure [127:126]
} CSD;
typedef struct {
UINT8 Reserved133_0[134]; // [133:0] 0
UINT8 SEC_BAD_BLOCK_MGMNT; // [134] Bad Block Management mode
UINT8 Reserved135; // [135] 0
UINT8 ENH_START_ADDR[4]; // [139:136] Enhanced User Data Start Address
UINT8 ENH_SIZE_MULT[3]; // [142:140] Enhanced User Data Start Size
UINT8 GP_SIZE_MULT_1[3]; // [145:143] GPP1 Size
UINT8 GP_SIZE_MULT_2[3]; // [148:146] GPP2 Size
UINT8 GP_SIZE_MULT_3[3]; // [151:149] GPP3 Size
UINT8 GP_SIZE_MULT_4[3]; // [154:152] GPP4 Size
UINT8 PARTITION_SETTING_COMPLETED; // [155] Partitioning Setting
UINT8 PARTITIONS_ATTRIBUTES; // [156] Partitions attributes
UINT8 MAX_ENH_SIZE_MULT[3]; // [159:157] GPP4 Start Size
UINT8 PARTITIONING_SUPPORT; // [160] Partitioning Support
UINT8 HPI_MGMT; // [161] HPI management
UINT8 RST_n_FUNCTION; // [162] H/W reset function
UINT8 BKOPS_EN; // [163] Enable background operations handshake
UINT8 BKOPS_START; // [164] Manually start background operations
UINT8 Reserved165; // [165] 0
UINT8 WR_REL_PARAM; // [166] Write reliability parameter register
UINT8 WR_REL_SET; // [167] Write reliability setting register
UINT8 RPMB_SIZE_MULT; // [168] RPMB Size
UINT8 FW_CONFIG; // [169] FW configuration
UINT8 Reserved170; // [170] 0
UINT8 USER_WP; // [171] User area write protection
UINT8 Reserved172; // [172] 0
UINT8 BOOT_WP; // [173] Boot area write protection
UINT8 Reserved174; // [174] 0
UINT8 ERASE_GROUP_DEF; // [175] High density erase group definition
UINT8 Reserved176; // [176] 0
UINT8 BOOT_BUS_WIDTH; // [177] Boot bus width
UINT8 BOOT_CONFIG_PROT; // [178] Boot config protection
UINT8 PARTITION_CONFIG; // [179] Partition config
UINT8 Reserved180; // [180] 0
UINT8 ERASED_MEM_CONT; // [181] Erased Memory Content
UINT8 Reserved182; // [182] 0
UINT8 BUS_WIDTH; // [183] Bus Width Mode
UINT8 Reserved184; // [184] 0
UINT8 HS_TIMING; // [185] High Speed Interface Timing
UINT8 Reserved186; // [186] 0
UINT8 POWER_CLASS; // [187] Power Class
UINT8 Reserved188; // [188] 0
UINT8 CMD_SET_REV; // [189] Command Set Revision
UINT8 Reserved190; // [190] 0
UINT8 CMD_SET; // [191] Command Set
UINT8 EXT_CSD_REV; // [192] Extended CSD Revision
UINT8 Reserved193; // [193] 0
UINT8 CSD_STRUCTURE; // [194] CSD Structure Version
UINT8 Reserved195; // [195] 0
UINT8 CARD_TYPE; // [196] Card Type
UINT8 Reserved197; // [197] 0
UINT8 OUT_OF_INTERRUPT_TIME; // [198] Out-of-interrupt busy timing
UINT8 PARTITION_SWITCH_TIME; // [199] Partition switching timing
UINT8 PWR_CL_52_195; // [200] Power Class for 52MHz @ 1.95V
UINT8 PWR_CL_26_195; // [201] Power Class for 26MHz @ 1.95V
UINT8 PWR_CL_52_360; // [202] Power Class for 52MHz @ 3.6V
UINT8 PWR_CL_26_360; // [203] Power Class for 26MHz @ 3.6V
UINT8 Reserved204; // [204] 0
UINT8 MIN_PERF_R_4_26; // [205] Minimum Read Performance for 4bit @26MHz
UINT8 MIN_PERF_W_4_26; // [206] Minimum Write Performance for 4bit @26MHz
UINT8 MIN_PERF_R_8_26_4_52; // [207] Minimum Read Performance for 8bit @26MHz/4bit @52MHz
UINT8 MIN_PERF_W_8_26_4_52; // [208] Minimum Write Performance for 8bit @26MHz/4bit @52MHz
UINT8 MIN_PERF_R_8_52; // [209] Minimum Read Performance for 8bit @52MHz
UINT8 MIN_PERF_W_8_52; // [210] Minimum Write Performance for 8bit @52MHz
UINT8 Reserved211; // [211] 0
UINT8 SEC_COUNT[4]; // [215:212] Sector Count
UINT8 Reserved216; // [216] 0
UINT8 S_A_TIMEOUT; // [217] Sleep/awake timeout
UINT8 Reserved218; // [218] 0
UINT8 S_C_VCCQ; // [219] Sleep current (VCCQ)
UINT8 S_C_VCC; // [220] Sleep current (VCC)
UINT8 HC_WP_GRP_SIZE; // [221] High-capacity write protect group size
UINT8 REL_WR_SEC_C; // [222] Reliable write sector count
UINT8 ERASE_TIMEOUT_MULT; // [223] High-capacity erase timeout
UINT8 HC_ERASE_GRP_SIZE; // [224] High-capacity erase unit size
UINT8 ACC_SIZE; // [225] Access size
UINT8 BOOT_SIZE_MULTI; // [226] Boot partition size
UINT8 Reserved227; // [227] 0
UINT8 BOOT_INFO; // [228] Boot information
UINT8 SEC_TRIM_MULT; // [229] Secure TRIM Multiplier
UINT8 SEC_ERASE_MULT; // [230] Secure Erase Multiplier
UINT8 SEC_FEATURE_SUPPORT; // [231] Secure Feature support
UINT8 TRIM_MULT; // [232] TRIM Multiplier
UINT8 Reserved233; // [233] 0
UINT8 MIN_PERF_DDR_R_8_52; // [234] Min Read Performance for 8-bit @ 52MHz
UINT8 MIN_PERF_DDR_W_8_52; // [235] Min Write Performance for 8-bit @ 52MHz
UINT8 Reserved237_236[2]; // [237:236] 0
UINT8 PWR_CL_DDR_52_195; // [238] Power class for 52MHz, DDR at 1.95V
UINT8 PWR_CL_DDR_52_360; // [239] Power class for 52MHz, DDR at 3.6V
UINT8 Reserved240; // [240] 0
UINT8 INI_TIMEOUT_AP; // [241] 1st initialization time after partitioning
UINT8 CORRECTLY_PRG_SECTORS_NUM[4]; // [245:242] Number of correctly programmed sectors
UINT8 BKOPS_STATUS; // [246] Background operations status
UINT8 Reserved501_247[255]; // [501:247] 0
UINT8 BKOPS_SUPPORT; // [502] Background operations support
UINT8 HPI_FEATURES; // [503] HPI features
UINT8 S_CMD_SET; // [504] Sector Count
UINT8 Reserved511_505[7]; // [511:505] Sector Count
} EXT_CSD;
//
//Card Status definition
//
typedef struct {
UINT32 Reserved0: 2; //Reserved for Manufacturer Test Mode
UINT32 Reserved1: 2; //Reserved for Application Specific commands
UINT32 Reserved2: 1; //
UINT32 SAPP_CMD: 1; //
UINT32 Reserved3: 1; //Reserved
UINT32 SWITCH_ERROR: 1; //
UINT32 READY_FOR_DATA: 1; //
UINT32 CURRENT_STATE: 4; //
UINT32 ERASE_RESET: 1; //
UINT32 Reserved4: 1; //Reserved
UINT32 WP_ERASE_SKIP: 1; //
UINT32 CID_CSD_OVERWRITE: 1; //
UINT32 OVERRUN: 1; //
UINT32 UNDERRUN: 1; //
UINT32 ERROR: 1; //
UINT32 CC_ERROR: 1; //
UINT32 CARD_ECC_FAILED: 1; //
UINT32 ILLEGAL_COMMAND: 1; //
UINT32 COM_CRC_ERROR: 1; //
UINT32 LOCK_UNLOCK_FAILED: 1; //
UINT32 CARD_IS_LOCKED: 1; //
UINT32 WP_VIOLATION: 1; //
UINT32 ERASE_PARAM: 1; //
UINT32 ERASE_SEQ_ERROR: 1; //
UINT32 BLOCK_LEN_ERROR: 1; //
UINT32 ADDRESS_MISALIGN: 1; //
UINT32 ADDRESS_OUT_OF_RANGE:1; //
} CARD_STATUS;
typedef struct {
UINT32 CmdSet: 3;
UINT32 Reserved0: 5;
UINT32 Value: 8;
UINT32 Index: 8;
UINT32 Access: 2;
UINT32 Reserved1: 6;
} SWITCH_ARGUMENT;
#define CommandSet_Mode 0
#define SetBits_Mode 1
#define ClearBits_Mode 2
#define WriteByte_Mode 3
#define Idle_STATE 0
#define Ready_STATE 1
#define Ident_STATE 2
#define Stby_STATE 3
#define Tran_STATE 4
#define Data_STATE 5
#define Rcv_STATE 6
#define Prg_STATE 7
#define Dis_STATE 8
#define Btst_STATE 9
#pragma pack()
#endif