Sat, 07 Nov 2015 13:23:07 +0100
Initial code from reprappro Marlin repository
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 | ||
21 | #include "Marlin.h" | |
22 | #ifdef SDSUPPORT | |
23 | ||
24 | #ifndef Sd2Card_h | |
25 | #define Sd2Card_h | |
26 | /** | |
27 | * \file | |
28 | * \brief Sd2Card class for V2 SD/SDHC cards | |
29 | */ | |
30 | #include "SdFatConfig.h" | |
31 | #include "Sd2PinMap.h" | |
32 | #include "SdInfo.h" | |
33 | //------------------------------------------------------------------------------ | |
34 | // SPI speed is F_CPU/2^(1 + index), 0 <= index <= 6 | |
35 | /** Set SCK to max rate of F_CPU/2. See Sd2Card::setSckRate(). */ | |
36 | uint8_t const SPI_FULL_SPEED = 0; | |
37 | /** Set SCK rate to F_CPU/4. See Sd2Card::setSckRate(). */ | |
38 | uint8_t const SPI_HALF_SPEED = 1; | |
39 | /** Set SCK rate to F_CPU/8. See Sd2Card::setSckRate(). */ | |
40 | uint8_t const SPI_QUARTER_SPEED = 2; | |
41 | /** Set SCK rate to F_CPU/16. See Sd2Card::setSckRate(). */ | |
42 | uint8_t const SPI_EIGHTH_SPEED = 3; | |
43 | /** Set SCK rate to F_CPU/32. See Sd2Card::setSckRate(). */ | |
44 | uint8_t const SPI_SIXTEENTH_SPEED = 4; | |
45 | //------------------------------------------------------------------------------ | |
46 | /** init timeout ms */ | |
47 | uint16_t const SD_INIT_TIMEOUT = 2000; | |
48 | /** erase timeout ms */ | |
49 | uint16_t const SD_ERASE_TIMEOUT = 10000; | |
50 | /** read timeout ms */ | |
51 | uint16_t const SD_READ_TIMEOUT = 300; | |
52 | /** write time out ms */ | |
53 | uint16_t const SD_WRITE_TIMEOUT = 600; | |
54 | //------------------------------------------------------------------------------ | |
55 | // SD card errors | |
56 | /** timeout error for command CMD0 (initialize card in SPI mode) */ | |
57 | uint8_t const SD_CARD_ERROR_CMD0 = 0X1; | |
58 | /** CMD8 was not accepted - not a valid SD card*/ | |
59 | uint8_t const SD_CARD_ERROR_CMD8 = 0X2; | |
60 | /** card returned an error response for CMD12 (write stop) */ | |
61 | uint8_t const SD_CARD_ERROR_CMD12 = 0X3; | |
62 | /** card returned an error response for CMD17 (read block) */ | |
63 | uint8_t const SD_CARD_ERROR_CMD17 = 0X4; | |
64 | /** card returned an error response for CMD18 (read multiple block) */ | |
65 | uint8_t const SD_CARD_ERROR_CMD18 = 0X5; | |
66 | /** card returned an error response for CMD24 (write block) */ | |
67 | uint8_t const SD_CARD_ERROR_CMD24 = 0X6; | |
68 | /** WRITE_MULTIPLE_BLOCKS command failed */ | |
69 | uint8_t const SD_CARD_ERROR_CMD25 = 0X7; | |
70 | /** card returned an error response for CMD58 (read OCR) */ | |
71 | uint8_t const SD_CARD_ERROR_CMD58 = 0X8; | |
72 | /** SET_WR_BLK_ERASE_COUNT failed */ | |
73 | uint8_t const SD_CARD_ERROR_ACMD23 = 0X9; | |
74 | /** ACMD41 initialization process timeout */ | |
75 | uint8_t const SD_CARD_ERROR_ACMD41 = 0XA; | |
76 | /** card returned a bad CSR version field */ | |
77 | uint8_t const SD_CARD_ERROR_BAD_CSD = 0XB; | |
78 | /** erase block group command failed */ | |
79 | uint8_t const SD_CARD_ERROR_ERASE = 0XC; | |
80 | /** card not capable of single block erase */ | |
81 | uint8_t const SD_CARD_ERROR_ERASE_SINGLE_BLOCK = 0XD; | |
82 | /** Erase sequence timed out */ | |
83 | uint8_t const SD_CARD_ERROR_ERASE_TIMEOUT = 0XE; | |
84 | /** card returned an error token instead of read data */ | |
85 | uint8_t const SD_CARD_ERROR_READ = 0XF; | |
86 | /** read CID or CSD failed */ | |
87 | uint8_t const SD_CARD_ERROR_READ_REG = 0X10; | |
88 | /** timeout while waiting for start of read data */ | |
89 | uint8_t const SD_CARD_ERROR_READ_TIMEOUT = 0X11; | |
90 | /** card did not accept STOP_TRAN_TOKEN */ | |
91 | uint8_t const SD_CARD_ERROR_STOP_TRAN = 0X12; | |
92 | /** card returned an error token as a response to a write operation */ | |
93 | uint8_t const SD_CARD_ERROR_WRITE = 0X13; | |
94 | /** attempt to write protected block zero */ | |
95 | uint8_t const SD_CARD_ERROR_WRITE_BLOCK_ZERO = 0X14; // REMOVE - not used | |
96 | /** card did not go ready for a multiple block write */ | |
97 | uint8_t const SD_CARD_ERROR_WRITE_MULTIPLE = 0X15; | |
98 | /** card returned an error to a CMD13 status check after a write */ | |
99 | uint8_t const SD_CARD_ERROR_WRITE_PROGRAMMING = 0X16; | |
100 | /** timeout occurred during write programming */ | |
101 | uint8_t const SD_CARD_ERROR_WRITE_TIMEOUT = 0X17; | |
102 | /** incorrect rate selected */ | |
103 | uint8_t const SD_CARD_ERROR_SCK_RATE = 0X18; | |
104 | /** init() not called */ | |
105 | uint8_t const SD_CARD_ERROR_INIT_NOT_CALLED = 0X19; | |
106 | //------------------------------------------------------------------------------ | |
107 | // card types | |
108 | /** Standard capacity V1 SD card */ | |
109 | uint8_t const SD_CARD_TYPE_SD1 = 1; | |
110 | /** Standard capacity V2 SD card */ | |
111 | uint8_t const SD_CARD_TYPE_SD2 = 2; | |
112 | /** High Capacity SD card */ | |
113 | uint8_t const SD_CARD_TYPE_SDHC = 3; | |
114 | /** | |
115 | * define SOFTWARE_SPI to use bit-bang SPI | |
116 | */ | |
117 | //------------------------------------------------------------------------------ | |
118 | #if MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__)) | |
119 | #define SOFTWARE_SPI | |
120 | #elif USE_SOFTWARE_SPI | |
121 | #define SOFTWARE_SPI | |
122 | #endif // MEGA_SOFT_SPI | |
123 | //------------------------------------------------------------------------------ | |
124 | // SPI pin definitions - do not edit here - change in SdFatConfig.h | |
125 | // | |
126 | #ifndef SOFTWARE_SPI | |
127 | // hardware pin defs | |
128 | /** The default chip select pin for the SD card is SS. */ | |
129 | uint8_t const SD_CHIP_SELECT_PIN = SS_PIN; | |
130 | // The following three pins must not be redefined for hardware SPI. | |
131 | /** SPI Master Out Slave In pin */ | |
132 | uint8_t const SPI_MOSI_PIN = MOSI_PIN; | |
133 | /** SPI Master In Slave Out pin */ | |
134 | uint8_t const SPI_MISO_PIN = MISO_PIN; | |
135 | /** SPI Clock pin */ | |
136 | uint8_t const SPI_SCK_PIN = SCK_PIN; | |
137 | ||
138 | #else // SOFTWARE_SPI | |
139 | ||
140 | /** SPI chip select pin */ | |
141 | uint8_t const SD_CHIP_SELECT_PIN = SOFT_SPI_CS_PIN; | |
142 | /** SPI Master Out Slave In pin */ | |
143 | uint8_t const SPI_MOSI_PIN = SOFT_SPI_MOSI_PIN; | |
144 | /** SPI Master In Slave Out pin */ | |
145 | uint8_t const SPI_MISO_PIN = SOFT_SPI_MISO_PIN; | |
146 | /** SPI Clock pin */ | |
147 | uint8_t const SPI_SCK_PIN = SOFT_SPI_SCK_PIN; | |
148 | #endif // SOFTWARE_SPI | |
149 | //------------------------------------------------------------------------------ | |
150 | /** | |
151 | * \class Sd2Card | |
152 | * \brief Raw access to SD and SDHC flash memory cards. | |
153 | */ | |
154 | class Sd2Card { | |
155 | public: | |
156 | /** Construct an instance of Sd2Card. */ | |
157 | Sd2Card() : errorCode_(SD_CARD_ERROR_INIT_NOT_CALLED), type_(0) {} | |
158 | uint32_t cardSize(); | |
159 | bool erase(uint32_t firstBlock, uint32_t lastBlock); | |
160 | bool eraseSingleBlockEnable(); | |
161 | /** | |
162 | * Set SD error code. | |
163 | * \param[in] code value for error code. | |
164 | */ | |
165 | void error(uint8_t code) {errorCode_ = code;} | |
166 | /** | |
167 | * \return error code for last error. See Sd2Card.h for a list of error codes. | |
168 | */ | |
169 | int errorCode() const {return errorCode_;} | |
170 | /** \return error data for last error. */ | |
171 | int errorData() const {return status_;} | |
172 | /** | |
173 | * Initialize an SD flash memory card with default clock rate and chip | |
174 | * select pin. See sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin). | |
175 | * | |
176 | * \return true for success or false for failure. | |
177 | */ | |
178 | bool init(uint8_t sckRateID = SPI_FULL_SPEED, | |
179 | uint8_t chipSelectPin = SD_CHIP_SELECT_PIN); | |
180 | bool readBlock(uint32_t block, uint8_t* dst); | |
181 | /** | |
182 | * Read a card's CID register. The CID contains card identification | |
183 | * information such as Manufacturer ID, Product name, Product serial | |
184 | * number and Manufacturing date. | |
185 | * | |
186 | * \param[out] cid pointer to area for returned data. | |
187 | * | |
188 | * \return true for success or false for failure. | |
189 | */ | |
190 | bool readCID(cid_t* cid) { | |
191 | return readRegister(CMD10, cid); | |
192 | } | |
193 | /** | |
194 | * Read a card's CSD register. The CSD contains Card-Specific Data that | |
195 | * provides information regarding access to the card's contents. | |
196 | * | |
197 | * \param[out] csd pointer to area for returned data. | |
198 | * | |
199 | * \return true for success or false for failure. | |
200 | */ | |
201 | bool readCSD(csd_t* csd) { | |
202 | return readRegister(CMD9, csd); | |
203 | } | |
204 | bool readData(uint8_t *dst); | |
205 | bool readStart(uint32_t blockNumber); | |
206 | bool readStop(); | |
207 | bool setSckRate(uint8_t sckRateID); | |
208 | /** Return the card type: SD V1, SD V2 or SDHC | |
209 | * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. | |
210 | */ | |
211 | int type() const {return type_;} | |
212 | bool writeBlock(uint32_t blockNumber, const uint8_t* src); | |
213 | bool writeData(const uint8_t* src); | |
214 | bool writeStart(uint32_t blockNumber, uint32_t eraseCount); | |
215 | bool writeStop(); | |
216 | private: | |
217 | //---------------------------------------------------------------------------- | |
218 | uint8_t chipSelectPin_; | |
219 | uint8_t errorCode_; | |
220 | uint8_t spiRate_; | |
221 | uint8_t status_; | |
222 | uint8_t type_; | |
223 | // private functions | |
224 | uint8_t cardAcmd(uint8_t cmd, uint32_t arg) { | |
225 | cardCommand(CMD55, 0); | |
226 | return cardCommand(cmd, arg); | |
227 | } | |
228 | uint8_t cardCommand(uint8_t cmd, uint32_t arg); | |
229 | ||
230 | bool readData(uint8_t* dst, uint16_t count); | |
231 | bool readRegister(uint8_t cmd, void* buf); | |
232 | void chipSelectHigh(); | |
233 | void chipSelectLow(); | |
234 | void type(uint8_t value) {type_ = value;} | |
235 | bool waitNotBusy(uint16_t timeoutMillis); | |
236 | bool writeData(uint8_t token, const uint8_t* src); | |
237 | }; | |
238 | #endif // Sd2Card_h | |
239 | ||
240 | ||
241 | #endif |