root / arduino-1.0 / libraries / SD / utility / SdInfo.h @ 58d82c77
History | View | Annotate | Download (7.09 KB)
1 | 58d82c77 | Tom Mullins | /* 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 |