[136] | 1 | /* Arduino Sd2Card Library
|
---|
| 2 | * Copyright (C) 2009 by William Greiman
|
---|
| 3 | *
|
---|
| 4 | * This file is part of the Arduino Sd2Card Library
|
---|
| 5 | *
|
---|
| 6 | * This Library is free software: you can redistribute it and/or modify
|
---|
| 7 | * it under the terms of the GNU General Public License as published by
|
---|
| 8 | * the Free Software Foundation, either version 3 of the License, or
|
---|
| 9 | * (at your option) any later version.
|
---|
| 10 | *
|
---|
| 11 | * This Library is distributed in the hope that it will be useful,
|
---|
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 14 | * GNU General Public License for more details.
|
---|
| 15 | *
|
---|
| 16 | * You should have received a copy of the GNU General Public License
|
---|
| 17 | * along with the Arduino Sd2Card Library. If not, see
|
---|
| 18 | * <http://www.gnu.org/licenses/>.
|
---|
| 19 | */
|
---|
| 20 | #ifndef SdInfo_h
|
---|
| 21 | #define SdInfo_h
|
---|
| 22 | #include <stdint.h>
|
---|
| 23 | // Based on the document:
|
---|
| 24 | //
|
---|
| 25 | // SD Specifications
|
---|
| 26 | // Part 1
|
---|
| 27 | // Physical Layer
|
---|
| 28 | // Simplified Specification
|
---|
| 29 | // Version 2.00
|
---|
| 30 | // September 25, 2006
|
---|
| 31 | //
|
---|
| 32 | // www.sdcard.org/developers/tech/sdcard/pls/Simplified_Physical_Layer_Spec.pdf
|
---|
| 33 | //------------------------------------------------------------------------------
|
---|
| 34 | // SD card commands
|
---|
| 35 | /** GO_IDLE_STATE - init card in spi mode if CS low */
|
---|
| 36 | uint8_t const CMD0 = 0X00;
|
---|
| 37 | /** SEND_IF_COND - verify SD Memory Card interface operating condition.*/
|
---|
| 38 | uint8_t const CMD8 = 0X08;
|
---|
| 39 | /** SEND_CSD - read the Card Specific Data (CSD register) */
|
---|
| 40 | uint8_t const CMD9 = 0X09;
|
---|
| 41 | /** SEND_CID - read the card identification information (CID register) */
|
---|
| 42 | uint8_t const CMD10 = 0X0A;
|
---|
| 43 | /** SEND_STATUS - read the card status register */
|
---|
| 44 | uint8_t const CMD13 = 0X0D;
|
---|
| 45 | /** READ_BLOCK - read a single data block from the card */
|
---|
| 46 | uint8_t const CMD17 = 0X11;
|
---|
| 47 | /** WRITE_BLOCK - write a single data block to the card */
|
---|
| 48 | uint8_t const CMD24 = 0X18;
|
---|
| 49 | /** WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION */
|
---|
| 50 | uint8_t const CMD25 = 0X19;
|
---|
| 51 | /** ERASE_WR_BLK_START - sets the address of the first block to be erased */
|
---|
| 52 | uint8_t const CMD32 = 0X20;
|
---|
| 53 | /** ERASE_WR_BLK_END - sets the address of the last block of the continuous
|
---|
| 54 | range to be erased*/
|
---|
| 55 | uint8_t const CMD33 = 0X21;
|
---|
| 56 | /** ERASE - erase all previously selected blocks */
|
---|
| 57 | uint8_t const CMD38 = 0X26;
|
---|
| 58 | /** APP_CMD - escape for application specific command */
|
---|
| 59 | uint8_t const CMD55 = 0X37;
|
---|
| 60 | /** READ_OCR - read the OCR register of a card */
|
---|
| 61 | uint8_t const CMD58 = 0X3A;
|
---|
| 62 | /** SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be
|
---|
| 63 | pre-erased before writing */
|
---|
| 64 | uint8_t const ACMD23 = 0X17;
|
---|
| 65 | /** SD_SEND_OP_COMD - Sends host capacity support information and
|
---|
| 66 | activates the card's initialization process */
|
---|
| 67 | uint8_t const ACMD41 = 0X29;
|
---|
| 68 | //------------------------------------------------------------------------------
|
---|
| 69 | /** status for card in the ready state */
|
---|
| 70 | uint8_t const R1_READY_STATE = 0X00;
|
---|
| 71 | /** status for card in the idle state */
|
---|
| 72 | uint8_t const R1_IDLE_STATE = 0X01;
|
---|
| 73 | /** status bit for illegal command */
|
---|
| 74 | uint8_t const R1_ILLEGAL_COMMAND = 0X04;
|
---|
| 75 | /** start data token for read or write single block*/
|
---|
| 76 | uint8_t const DATA_START_BLOCK = 0XFE;
|
---|
| 77 | /** stop token for write multiple blocks*/
|
---|
| 78 | uint8_t const STOP_TRAN_TOKEN = 0XFD;
|
---|
| 79 | /** start data token for write multiple blocks*/
|
---|
| 80 | uint8_t const WRITE_MULTIPLE_TOKEN = 0XFC;
|
---|
| 81 | /** mask for data response tokens after a write block operation */
|
---|
| 82 | uint8_t const DATA_RES_MASK = 0X1F;
|
---|
| 83 | /** write data accepted token */
|
---|
| 84 | uint8_t const DATA_RES_ACCEPTED = 0X05;
|
---|
| 85 | //------------------------------------------------------------------------------
|
---|
| 86 | typedef struct CID {
|
---|
| 87 | // byte 0
|
---|
| 88 | uint8_t mid; // Manufacturer ID
|
---|
| 89 | // byte 1-2
|
---|
| 90 | char oid[2]; // OEM/Application ID
|
---|
| 91 | // byte 3-7
|
---|
| 92 | char pnm[5]; // Product name
|
---|
| 93 | // byte 8
|
---|
| 94 | unsigned prv_m : 4; // Product revision n.m
|
---|
| 95 | unsigned prv_n : 4;
|
---|
| 96 | // byte 9-12
|
---|
| 97 | uint32_t psn; // Product serial number
|
---|
| 98 | // byte 13
|
---|
| 99 | unsigned mdt_year_high : 4; // Manufacturing date
|
---|
| 100 | unsigned reserved : 4;
|
---|
| 101 | // byte 14
|
---|
| 102 | unsigned mdt_month : 4;
|
---|
| 103 | unsigned mdt_year_low :4;
|
---|
| 104 | // byte 15
|
---|
| 105 | unsigned always1 : 1;
|
---|
| 106 | unsigned crc : 7;
|
---|
| 107 | }cid_t;
|
---|
| 108 | //------------------------------------------------------------------------------
|
---|
| 109 | // CSD for version 1.00 cards
|
---|
| 110 | typedef struct CSDV1 {
|
---|
| 111 | // byte 0
|
---|
| 112 | unsigned reserved1 : 6;
|
---|
| 113 | unsigned csd_ver : 2;
|
---|
| 114 | // byte 1
|
---|
| 115 | uint8_t taac;
|
---|
| 116 | // byte 2
|
---|
| 117 | uint8_t nsac;
|
---|
| 118 | // byte 3
|
---|
| 119 | uint8_t tran_speed;
|
---|
| 120 | // byte 4
|
---|
| 121 | uint8_t ccc_high;
|
---|
| 122 | // byte 5
|
---|
| 123 | unsigned read_bl_len : 4;
|
---|
| 124 | unsigned ccc_low : 4;
|
---|
| 125 | // byte 6
|
---|
| 126 | unsigned c_size_high : 2;
|
---|
| 127 | unsigned reserved2 : 2;
|
---|
| 128 | unsigned dsr_imp : 1;
|
---|
| 129 | unsigned read_blk_misalign :1;
|
---|
| 130 | unsigned write_blk_misalign : 1;
|
---|
| 131 | unsigned read_bl_partial : 1;
|
---|
| 132 | // byte 7
|
---|
| 133 | uint8_t c_size_mid;
|
---|
| 134 | // byte 8
|
---|
| 135 | unsigned vdd_r_curr_max : 3;
|
---|
| 136 | unsigned vdd_r_curr_min : 3;
|
---|
| 137 | unsigned c_size_low :2;
|
---|
| 138 | // byte 9
|
---|
| 139 | unsigned c_size_mult_high : 2;
|
---|
| 140 | unsigned vdd_w_cur_max : 3;
|
---|
| 141 | unsigned vdd_w_curr_min : 3;
|
---|
| 142 | // byte 10
|
---|
| 143 | unsigned sector_size_high : 6;
|
---|
| 144 | unsigned erase_blk_en : 1;
|
---|
| 145 | unsigned c_size_mult_low : 1;
|
---|
| 146 | // byte 11
|
---|
| 147 | unsigned wp_grp_size : 7;
|
---|
| 148 | unsigned sector_size_low : 1;
|
---|
| 149 | // byte 12
|
---|
| 150 | unsigned write_bl_len_high : 2;
|
---|
| 151 | unsigned r2w_factor : 3;
|
---|
| 152 | unsigned reserved3 : 2;
|
---|
| 153 | unsigned wp_grp_enable : 1;
|
---|
| 154 | // byte 13
|
---|
| 155 | unsigned reserved4 : 5;
|
---|
| 156 | unsigned write_partial : 1;
|
---|
| 157 | unsigned write_bl_len_low : 2;
|
---|
| 158 | // byte 14
|
---|
| 159 | unsigned reserved5: 2;
|
---|
| 160 | unsigned file_format : 2;
|
---|
| 161 | unsigned tmp_write_protect : 1;
|
---|
| 162 | unsigned perm_write_protect : 1;
|
---|
| 163 | unsigned copy : 1;
|
---|
| 164 | unsigned file_format_grp : 1;
|
---|
| 165 | // byte 15
|
---|
| 166 | unsigned always1 : 1;
|
---|
| 167 | unsigned crc : 7;
|
---|
| 168 | }csd1_t;
|
---|
| 169 | //------------------------------------------------------------------------------
|
---|
| 170 | // CSD for version 2.00 cards
|
---|
| 171 | typedef struct CSDV2 {
|
---|
| 172 | // byte 0
|
---|
| 173 | unsigned reserved1 : 6;
|
---|
| 174 | unsigned csd_ver : 2;
|
---|
| 175 | // byte 1
|
---|
| 176 | uint8_t taac;
|
---|
| 177 | // byte 2
|
---|
| 178 | uint8_t nsac;
|
---|
| 179 | // byte 3
|
---|
| 180 | uint8_t tran_speed;
|
---|
| 181 | // byte 4
|
---|
| 182 | uint8_t ccc_high;
|
---|
| 183 | // byte 5
|
---|
| 184 | unsigned read_bl_len : 4;
|
---|
| 185 | unsigned ccc_low : 4;
|
---|
| 186 | // byte 6
|
---|
| 187 | unsigned reserved2 : 4;
|
---|
| 188 | unsigned dsr_imp : 1;
|
---|
| 189 | unsigned read_blk_misalign :1;
|
---|
| 190 | unsigned write_blk_misalign : 1;
|
---|
| 191 | unsigned read_bl_partial : 1;
|
---|
| 192 | // byte 7
|
---|
| 193 | unsigned reserved3 : 2;
|
---|
| 194 | unsigned c_size_high : 6;
|
---|
| 195 | // byte 8
|
---|
| 196 | uint8_t c_size_mid;
|
---|
| 197 | // byte 9
|
---|
| 198 | uint8_t c_size_low;
|
---|
| 199 | // byte 10
|
---|
| 200 | unsigned sector_size_high : 6;
|
---|
| 201 | unsigned erase_blk_en : 1;
|
---|
| 202 | unsigned reserved4 : 1;
|
---|
| 203 | // byte 11
|
---|
| 204 | unsigned wp_grp_size : 7;
|
---|
| 205 | unsigned sector_size_low : 1;
|
---|
| 206 | // byte 12
|
---|
| 207 | unsigned write_bl_len_high : 2;
|
---|
| 208 | unsigned r2w_factor : 3;
|
---|
| 209 | unsigned reserved5 : 2;
|
---|
| 210 | unsigned wp_grp_enable : 1;
|
---|
| 211 | // byte 13
|
---|
| 212 | unsigned reserved6 : 5;
|
---|
| 213 | unsigned write_partial : 1;
|
---|
| 214 | unsigned write_bl_len_low : 2;
|
---|
| 215 | // byte 14
|
---|
| 216 | unsigned reserved7: 2;
|
---|
| 217 | unsigned file_format : 2;
|
---|
| 218 | unsigned tmp_write_protect : 1;
|
---|
| 219 | unsigned perm_write_protect : 1;
|
---|
| 220 | unsigned copy : 1;
|
---|
| 221 | unsigned file_format_grp : 1;
|
---|
| 222 | // byte 15
|
---|
| 223 | unsigned always1 : 1;
|
---|
| 224 | unsigned crc : 7;
|
---|
| 225 | }csd2_t;
|
---|
| 226 | //------------------------------------------------------------------------------
|
---|
| 227 | // union of old and new style CSD register
|
---|
| 228 | union csd_t {
|
---|
| 229 | csd1_t v1;
|
---|
| 230 | csd2_t v2;
|
---|
| 231 | };
|
---|
| 232 | #endif // SdInfo_h
|
---|