1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
|
/*
* (C) Copyright 2008
* Texas Instruments, <www.ti.com>
* Syed Mohammed Khasim <khasim@ti.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation's version 2 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#ifndef MMC_H
#define MMC_H
#include "mmc_host_def.h"
/* Responses */
#define RSP_TYPE_NONE (RSP_TYPE_NORSP | CCCE_NOCHECK | CICE_NOCHECK)
#define RSP_TYPE_R1 (RSP_TYPE_LGHT48 | CCCE_CHECK | CICE_CHECK)
#define RSP_TYPE_R1B (RSP_TYPE_LGHT48B | CCCE_CHECK | CICE_CHECK)
#define RSP_TYPE_R2 (RSP_TYPE_LGHT136 | CCCE_CHECK | CICE_NOCHECK)
#define RSP_TYPE_R3 (RSP_TYPE_LGHT48 | CCCE_NOCHECK | CICE_NOCHECK)
#define RSP_TYPE_R4 (RSP_TYPE_LGHT48 | CCCE_NOCHECK | CICE_NOCHECK)
#define RSP_TYPE_R5 (RSP_TYPE_LGHT48 | CCCE_CHECK | CICE_CHECK)
#define RSP_TYPE_R6 (RSP_TYPE_LGHT48 | CCCE_CHECK | CICE_CHECK)
#define RSP_TYPE_R7 (RSP_TYPE_LGHT48 | CCCE_CHECK | CICE_CHECK)
/* All supported commands */
#define MMC_CMD0 (INDEX(0) | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD1 (INDEX(1) | RSP_TYPE_R3 | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD2 (INDEX(2) | RSP_TYPE_R2 | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD3 (INDEX(3) | RSP_TYPE_R1 | DP_NO_DATA | DDIR_WRITE)
#define MMC_SDCMD3 (INDEX(3) | RSP_TYPE_R6 | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD4 (INDEX(4) | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD6 (INDEX(6) | RSP_TYPE_R1B | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD7_SELECT (INDEX(7) | RSP_TYPE_R1B | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD7_DESELECT (INDEX(7) | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD8 (INDEX(8) | RSP_TYPE_R1 | DP_DATA | DDIR_READ)
#define MMC_SDCMD8 (INDEX(8) | RSP_TYPE_R7 | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD9 (INDEX(9) | RSP_TYPE_R2 | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD12 (INDEX(12) | RSP_TYPE_R1B | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD13 (INDEX(13) | RSP_TYPE_R1 | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD15 (INDEX(15) | RSP_TYPE_NONE | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD16 (INDEX(16) | RSP_TYPE_R1 | DP_NO_DATA | DDIR_WRITE)
#define MMC_CMD17 (INDEX(17) | RSP_TYPE_R1 | DP_DATA | DDIR_READ)
#define MMC_CMD24 (INDEX(24) | RSP_TYPE_R1 | DP_DATA | DDIR_WRITE)
#define MMC_ACMD6 (INDEX(6) | RSP_TYPE_R1 | DP_NO_DATA | DDIR_WRITE)
#define MMC_ACMD41 (INDEX(41) | RSP_TYPE_R3 | DP_NO_DATA | DDIR_WRITE)
#define MMC_ACMD51 (INDEX(51) | RSP_TYPE_R1 | DP_DATA | DDIR_READ)
#define MMC_CMD55 (INDEX(55) | RSP_TYPE_R1 | DP_NO_DATA | DDIR_WRITE)
#define MMC_AC_CMD_RCA_MASK (unsigned int)(0xFFFF << 16)
#define MMC_BC_CMD_DSR_MASK (unsigned int)(0xFFFF << 16)
#define MMC_DSR_DEFAULT (0x0404)
#define SD_CMD8_CHECK_PATTERN (0xAA)
#define SD_CMD8_2_7_3_6_V_RANGE (0x01 << 8)
/* Clock Configurations and Macros */
#define MMC_CLOCK_REFERENCE (96)
#define MMC_RELATIVE_CARD_ADDRESS (0x1234)
#define MMC_INIT_SEQ_CLK (MMC_CLOCK_REFERENCE * 1000 / 80)
#define MMC_400kHz_CLK (MMC_CLOCK_REFERENCE * 1000 / 400)
#define CLKDR(r, f, u) ((((r)*100) / ((f)*(u))) + 1)
#define CLKD(f, u) (CLKDR(MMC_CLOCK_REFERENCE, f, u))
#define MMC_OCR_REG_ACCESS_MODE_MASK (0x3 << 29)
#define MMC_OCR_REG_ACCESS_MODE_BYTE (0x0 << 29)
#define MMC_OCR_REG_ACCESS_MODE_SECTOR (0x2 << 29)
#define MMC_OCR_REG_HOST_CAPACITY_SUPPORT_MASK (0x1 << 30)
#define MMC_OCR_REG_HOST_CAPACITY_SUPPORT_BYTE (0x0 << 30)
#define MMC_OCR_REG_HOST_CAPACITY_SUPPORT_SECTOR (0x1 << 30)
#define MMC_SD2_CSD_C_SIZE_LSB_MASK (0xFFFF)
#define MMC_SD2_CSD_C_SIZE_MSB_MASK (0x003F)
#define MMC_SD2_CSD_C_SIZE_MSB_OFFSET (16)
#define MMC_CSD_C_SIZE_LSB_MASK (0x0003)
#define MMC_CSD_C_SIZE_MSB_MASK (0x03FF)
#define MMC_CSD_C_SIZE_MSB_OFFSET (2)
#define MMC_CSD_TRAN_SPEED_UNIT_MASK (0x07 << 0)
#define MMC_CSD_TRAN_SPEED_FACTOR_MASK (0x0F << 3)
#define MMC_CSD_TRAN_SPEED_UNIT_100MHZ (0x3 << 0)
#define MMC_CSD_TRAN_SPEED_FACTOR_1_0 (0x01 << 3)
#define MMC_CSD_TRAN_SPEED_FACTOR_8_0 (0x0F << 3)
typedef struct {
unsigned not_used:1;
unsigned crc:7;
unsigned ecc:2;
unsigned file_format:2;
unsigned tmp_write_protect:1;
unsigned perm_write_protect:1;
unsigned copy:1;
unsigned file_format_grp:1;
unsigned content_prot_app:1;
unsigned reserved_1:4;
unsigned write_bl_partial:1;
unsigned write_bl_len:4;
unsigned r2w_factor:3;
unsigned default_ecc:2;
unsigned wp_grp_enable:1;
unsigned wp_grp_size:5;
unsigned erase_grp_mult:5;
unsigned erase_grp_size:5;
unsigned c_size_mult:3;
unsigned vdd_w_curr_max:3;
unsigned vdd_w_curr_min:3;
unsigned vdd_r_curr_max:3;
unsigned vdd_r_curr_min:3;
unsigned c_size_lsb:2;
unsigned c_size_msb:10;
unsigned reserved_2:2;
unsigned dsr_imp:1;
unsigned read_blk_misalign:1;
unsigned write_blk_misalign:1;
unsigned read_bl_partial:1;
unsigned read_bl_len:4;
unsigned ccc:12;
unsigned tran_speed:8;
unsigned nsac:8;
unsigned taac:8;
unsigned reserved_3:2;
unsigned spec_vers:4;
unsigned csd_structure:2;
} mmc_csd_reg_t;
/* csd for sd2.0 */
typedef struct {
unsigned not_used:1;
unsigned crc:7;
unsigned reserved_1:2;
unsigned file_format:2;
unsigned tmp_write_protect:1;
unsigned perm_write_protect:1;
unsigned copy:1;
unsigned file_format_grp:1;
unsigned reserved_2:5;
unsigned write_bl_partial:1;
unsigned write_bl_len:4;
unsigned r2w_factor:3;
unsigned reserved_3:2;
unsigned wp_grp_enable:1;
unsigned wp_grp_size:7;
unsigned sector_size:7;
unsigned erase_blk_len:1;
unsigned reserved_4:1;
unsigned c_size_lsb:16;
unsigned c_size_msb:6;
unsigned reserved_5:6;
unsigned dsr_imp:1;
unsigned read_blk_misalign:1;
unsigned write_blk_misalign:1;
unsigned read_bl_partial:1;
unsigned read_bl_len:4;
unsigned ccc:12;
unsigned tran_speed:8;
unsigned nsac:8;
unsigned taac:8;
unsigned reserved_6:6;
unsigned csd_structure:2;
} mmc_sd2_csd_reg_t;
/* extended csd - 512 bytes long */
typedef struct {
unsigned char reserved_1[181];
unsigned char erasedmemorycontent;
unsigned char reserved_2;
unsigned char buswidthmode;
unsigned char reserved_3;
unsigned char highspeedinterfacetiming;
unsigned char reserved_4;
unsigned char powerclass;
unsigned char reserved_5;
unsigned char commandsetrevision;
unsigned char reserved_6;
unsigned char commandset;
unsigned char extendedcsdrevision;
unsigned char reserved_7;
unsigned char csdstructureversion;
unsigned char reserved_8;
unsigned char cardtype;
unsigned char reserved_9[3];
unsigned char powerclass_52mhz_1_95v;
unsigned char powerclass_26mhz_1_95v;
unsigned char powerclass_52mhz_3_6v;
unsigned char powerclass_26mhz_3_6v;
unsigned char reserved_10;
unsigned char minreadperf_4b_26mhz;
unsigned char minwriteperf_4b_26mhz;
unsigned char minreadperf_8b_26mhz_4b_52mhz;
unsigned char minwriteperf_8b_26mhz_4b_52mhz;
unsigned char minreadperf_8b_52mhz;
unsigned char minwriteperf_8b_52mhz;
unsigned char reserved_11;
unsigned int sectorcount;
unsigned char reserved_12[288];
unsigned char supportedcommandsets;
unsigned char reserved_13[7];
} mmc_extended_csd_reg_t;
/* mmc sd responce */
typedef struct {
unsigned int ocr;
} mmc_resp_r3;
typedef struct {
unsigned short cardstatus;
unsigned short newpublishedrca;
} mmc_resp_r6;
extern mmc_card_data mmc_dev;
unsigned char mmc_lowlevel_init(void);
unsigned char mmc_send_command(unsigned int cmd, unsigned int arg,
unsigned int *response);
unsigned char mmc_setup_clock(unsigned int iclk, unsigned short clkd);
unsigned char mmc_set_opendrain(unsigned char state);
unsigned char mmc_read_data(unsigned int *output_buf);
#endif /* MMC_H */
|