Fri, 17 Nov 2017 10:13:31 +0100
proper configuration, homing and planner optimization
0 | 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 | #include "Marlin.h" | |
21 | #ifdef SDSUPPORT | |
22 | ||
23 | #ifndef SdInfo_h | |
24 | #define SdInfo_h | |
25 | #include <stdint.h> | |
26 | // Based on the document: | |
27 | // | |
28 | // SD Specifications | |
29 | // Part 1 | |
30 | // Physical Layer | |
31 | // Simplified Specification | |
32 | // Version 3.01 | |
33 | // May 18, 2010 | |
34 | // | |
35 | // http://www.sdcard.org/developers/tech/sdcard/pls/simplified_specs | |
36 | //------------------------------------------------------------------------------ | |
37 | // SD card commands | |
38 | /** GO_IDLE_STATE - init card in spi mode if CS low */ | |
39 | uint8_t const CMD0 = 0X00; | |
40 | /** SEND_IF_COND - verify SD Memory Card interface operating condition.*/ | |
41 | uint8_t const CMD8 = 0X08; | |
42 | /** SEND_CSD - read the Card Specific Data (CSD register) */ | |
43 | uint8_t const CMD9 = 0X09; | |
44 | /** SEND_CID - read the card identification information (CID register) */ | |
45 | uint8_t const CMD10 = 0X0A; | |
46 | /** STOP_TRANSMISSION - end multiple block read sequence */ | |
47 | uint8_t const CMD12 = 0X0C; | |
48 | /** SEND_STATUS - read the card status register */ | |
49 | uint8_t const CMD13 = 0X0D; | |
50 | /** READ_SINGLE_BLOCK - read a single data block from the card */ | |
51 | uint8_t const CMD17 = 0X11; | |
52 | /** READ_MULTIPLE_BLOCK - read a multiple data blocks from the card */ | |
53 | uint8_t const CMD18 = 0X12; | |
54 | /** WRITE_BLOCK - write a single data block to the card */ | |
55 | uint8_t const CMD24 = 0X18; | |
56 | /** WRITE_MULTIPLE_BLOCK - write blocks of data until a STOP_TRANSMISSION */ | |
57 | uint8_t const CMD25 = 0X19; | |
58 | /** ERASE_WR_BLK_START - sets the address of the first block to be erased */ | |
59 | uint8_t const CMD32 = 0X20; | |
60 | /** ERASE_WR_BLK_END - sets the address of the last block of the continuous | |
61 | range to be erased*/ | |
62 | uint8_t const CMD33 = 0X21; | |
63 | /** ERASE - erase all previously selected blocks */ | |
64 | uint8_t const CMD38 = 0X26; | |
65 | /** APP_CMD - escape for application specific command */ | |
66 | uint8_t const CMD55 = 0X37; | |
67 | /** READ_OCR - read the OCR register of a card */ | |
68 | uint8_t const CMD58 = 0X3A; | |
69 | /** SET_WR_BLK_ERASE_COUNT - Set the number of write blocks to be | |
70 | pre-erased before writing */ | |
71 | uint8_t const ACMD23 = 0X17; | |
72 | /** SD_SEND_OP_COMD - Sends host capacity support information and | |
73 | activates the card's initialization process */ | |
74 | uint8_t const ACMD41 = 0X29; | |
75 | //------------------------------------------------------------------------------ | |
76 | /** status for card in the ready state */ | |
77 | uint8_t const R1_READY_STATE = 0X00; | |
78 | /** status for card in the idle state */ | |
79 | uint8_t const R1_IDLE_STATE = 0X01; | |
80 | /** status bit for illegal command */ | |
81 | uint8_t const R1_ILLEGAL_COMMAND = 0X04; | |
82 | /** start data token for read or write single block*/ | |
83 | uint8_t const DATA_START_BLOCK = 0XFE; | |
84 | /** stop token for write multiple blocks*/ | |
85 | uint8_t const STOP_TRAN_TOKEN = 0XFD; | |
86 | /** start data token for write multiple blocks*/ | |
87 | uint8_t const WRITE_MULTIPLE_TOKEN = 0XFC; | |
88 | /** mask for data response tokens after a write block operation */ | |
89 | uint8_t const DATA_RES_MASK = 0X1F; | |
90 | /** write data accepted token */ | |
91 | uint8_t const DATA_RES_ACCEPTED = 0X05; | |
92 | //------------------------------------------------------------------------------ | |
93 | /** Card IDentification (CID) register */ | |
94 | typedef struct CID { | |
95 | // byte 0 | |
96 | /** Manufacturer ID */ | |
97 | unsigned char mid; | |
98 | // byte 1-2 | |
99 | /** OEM/Application ID */ | |
100 | char oid[2]; | |
101 | // byte 3-7 | |
102 | /** Product name */ | |
103 | char pnm[5]; | |
104 | // byte 8 | |
105 | /** Product revision least significant digit */ | |
106 | unsigned char prv_m : 4; | |
107 | /** Product revision most significant digit */ | |
108 | unsigned char prv_n : 4; | |
109 | // byte 9-12 | |
110 | /** Product serial number */ | |
111 | uint32_t psn; | |
112 | // byte 13 | |
113 | /** Manufacturing date year low digit */ | |
114 | unsigned char mdt_year_high : 4; | |
115 | /** not used */ | |
116 | unsigned char reserved : 4; | |
117 | // byte 14 | |
118 | /** Manufacturing date month */ | |
119 | unsigned char mdt_month : 4; | |
120 | /** Manufacturing date year low digit */ | |
121 | unsigned char mdt_year_low :4; | |
122 | // byte 15 | |
123 | /** not used always 1 */ | |
124 | unsigned char always1 : 1; | |
125 | /** CRC7 checksum */ | |
126 | unsigned char crc : 7; | |
127 | }cid_t; | |
128 | //------------------------------------------------------------------------------ | |
129 | /** CSD for version 1.00 cards */ | |
130 | typedef struct CSDV1 { | |
131 | // byte 0 | |
132 | unsigned char reserved1 : 6; | |
133 | unsigned char csd_ver : 2; | |
134 | // byte 1 | |
135 | unsigned char taac; | |
136 | // byte 2 | |
137 | unsigned char nsac; | |
138 | // byte 3 | |
139 | unsigned char tran_speed; | |
140 | // byte 4 | |
141 | unsigned char ccc_high; | |
142 | // byte 5 | |
143 | unsigned char read_bl_len : 4; | |
144 | unsigned char ccc_low : 4; | |
145 | // byte 6 | |
146 | unsigned char c_size_high : 2; | |
147 | unsigned char reserved2 : 2; | |
148 | unsigned char dsr_imp : 1; | |
149 | unsigned char read_blk_misalign :1; | |
150 | unsigned char write_blk_misalign : 1; | |
151 | unsigned char read_bl_partial : 1; | |
152 | // byte 7 | |
153 | unsigned char c_size_mid; | |
154 | // byte 8 | |
155 | unsigned char vdd_r_curr_max : 3; | |
156 | unsigned char vdd_r_curr_min : 3; | |
157 | unsigned char c_size_low :2; | |
158 | // byte 9 | |
159 | unsigned char c_size_mult_high : 2; | |
160 | unsigned char vdd_w_cur_max : 3; | |
161 | unsigned char vdd_w_curr_min : 3; | |
162 | // byte 10 | |
163 | unsigned char sector_size_high : 6; | |
164 | unsigned char erase_blk_en : 1; | |
165 | unsigned char c_size_mult_low : 1; | |
166 | // byte 11 | |
167 | unsigned char wp_grp_size : 7; | |
168 | unsigned char sector_size_low : 1; | |
169 | // byte 12 | |
170 | unsigned char write_bl_len_high : 2; | |
171 | unsigned char r2w_factor : 3; | |
172 | unsigned char reserved3 : 2; | |
173 | unsigned char wp_grp_enable : 1; | |
174 | // byte 13 | |
175 | unsigned char reserved4 : 5; | |
176 | unsigned char write_partial : 1; | |
177 | unsigned char write_bl_len_low : 2; | |
178 | // byte 14 | |
179 | unsigned char reserved5: 2; | |
180 | unsigned char file_format : 2; | |
181 | unsigned char tmp_write_protect : 1; | |
182 | unsigned char perm_write_protect : 1; | |
183 | unsigned char copy : 1; | |
184 | /** Indicates the file format on the card */ | |
185 | unsigned char file_format_grp : 1; | |
186 | // byte 15 | |
187 | unsigned char always1 : 1; | |
188 | unsigned char crc : 7; | |
189 | }csd1_t; | |
190 | //------------------------------------------------------------------------------ | |
191 | /** CSD for version 2.00 cards */ | |
192 | typedef struct CSDV2 { | |
193 | // byte 0 | |
194 | unsigned char reserved1 : 6; | |
195 | unsigned char csd_ver : 2; | |
196 | // byte 1 | |
197 | /** fixed to 0X0E */ | |
198 | unsigned char taac; | |
199 | // byte 2 | |
200 | /** fixed to 0 */ | |
201 | unsigned char nsac; | |
202 | // byte 3 | |
203 | unsigned char tran_speed; | |
204 | // byte 4 | |
205 | unsigned char ccc_high; | |
206 | // byte 5 | |
207 | /** This field is fixed to 9h, which indicates READ_BL_LEN=512 Byte */ | |
208 | unsigned char read_bl_len : 4; | |
209 | unsigned char ccc_low : 4; | |
210 | // byte 6 | |
211 | /** not used */ | |
212 | unsigned char reserved2 : 4; | |
213 | unsigned char dsr_imp : 1; | |
214 | /** fixed to 0 */ | |
215 | unsigned char read_blk_misalign :1; | |
216 | /** fixed to 0 */ | |
217 | unsigned char write_blk_misalign : 1; | |
218 | /** fixed to 0 - no partial read */ | |
219 | unsigned char read_bl_partial : 1; | |
220 | // byte 7 | |
221 | /** not used */ | |
222 | unsigned char reserved3 : 2; | |
223 | /** high part of card size */ | |
224 | unsigned char c_size_high : 6; | |
225 | // byte 8 | |
226 | /** middle part of card size */ | |
227 | unsigned char c_size_mid; | |
228 | // byte 9 | |
229 | /** low part of card size */ | |
230 | unsigned char c_size_low; | |
231 | // byte 10 | |
232 | /** sector size is fixed at 64 KB */ | |
233 | unsigned char sector_size_high : 6; | |
234 | /** fixed to 1 - erase single is supported */ | |
235 | unsigned char erase_blk_en : 1; | |
236 | /** not used */ | |
237 | unsigned char reserved4 : 1; | |
238 | // byte 11 | |
239 | unsigned char wp_grp_size : 7; | |
240 | /** sector size is fixed at 64 KB */ | |
241 | unsigned char sector_size_low : 1; | |
242 | // byte 12 | |
243 | /** write_bl_len fixed for 512 byte blocks */ | |
244 | unsigned char write_bl_len_high : 2; | |
245 | /** fixed value of 2 */ | |
246 | unsigned char r2w_factor : 3; | |
247 | /** not used */ | |
248 | unsigned char reserved5 : 2; | |
249 | /** fixed value of 0 - no write protect groups */ | |
250 | unsigned char wp_grp_enable : 1; | |
251 | // byte 13 | |
252 | unsigned char reserved6 : 5; | |
253 | /** always zero - no partial block read*/ | |
254 | unsigned char write_partial : 1; | |
255 | /** write_bl_len fixed for 512 byte blocks */ | |
256 | unsigned char write_bl_len_low : 2; | |
257 | // byte 14 | |
258 | unsigned char reserved7: 2; | |
259 | /** Do not use always 0 */ | |
260 | unsigned char file_format : 2; | |
261 | unsigned char tmp_write_protect : 1; | |
262 | unsigned char perm_write_protect : 1; | |
263 | unsigned char copy : 1; | |
264 | /** Do not use always 0 */ | |
265 | unsigned char file_format_grp : 1; | |
266 | // byte 15 | |
267 | /** not used always 1 */ | |
268 | unsigned char always1 : 1; | |
269 | /** checksum */ | |
270 | unsigned char crc : 7; | |
271 | }csd2_t; | |
272 | //------------------------------------------------------------------------------ | |
273 | /** union of old and new style CSD register */ | |
274 | union csd_t { | |
275 | csd1_t v1; | |
276 | csd2_t v2; | |
277 | }; | |
278 | #endif // SdInfo_h | |
279 | ||
280 | #endif |