-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathSdReader.h
169 lines (163 loc) · 5.69 KB
/
SdReader.h
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
/* Arduino WaveHC Library
* Copyright (C) 2008 by William Greiman
*
* This file is part of the Arduino FAT16 Library
*
* This Library 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, either version 3 of the License, or
* (at your option) any later version.
*
* This Library 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 the Arduino Fat16 Library. If not, see
* <http://www.gnu.org/licenses/>.
*/
#ifndef SdReader_h
#define SdReader_h
#include <SdInfo.h>
/**
* \file
* SdReader class
*/
/**
* Some SD card are very sensitive to the SPI bus speed for initialization.
* Try setting SPI_INIT_SLOW nonzero if you have initialization problems.
*
* Set SPI_INIT_SLOW nonzero to reduce the SPI bus speed for SD initaizaton
* to F_CPU/128. F_CPU/64 is used if
*/
#define SPI_INIT_SLOW 0
/**
* Default card SPI speed. Change to true for Wave Shield V1.0
* The SPI speed is 4 Mhz for 'true' and 8 Mhz for 'false'.
*/
#define SPI_DEFAULT_HALF_SPEED false
/** read timeout ms */
#define SD_READ_TIMEOUT 300
// SD card errors
/** timeout error for command CMD0 */
#define SD_CARD_ERROR_CMD0 0X1
/** CMD8 was not accepted - not a valid SD card*/
#define SD_CARD_ERROR_CMD8 0X2
/** card returned an error response for CMD17 (read block) */
#define SD_CARD_ERROR_CMD17 0X3
/** card returned an error response for CMD24 (write block) */
#define SD_CARD_ERROR_CMD24 0X4
/** card returned an error response for CMD58 (read OCR) */
#define SD_CARD_ERROR_CMD58 0X5
/** card's ACMD41 initialization process timeout */
#define SD_CARD_ERROR_ACMD41 0X6
/** card returned a bad CSR version field */
#define SD_CARD_ERROR_BAD_CSD 0X7
/** read CID or CSD failed */
#define SD_CARD_ERROR_READ_REG 0X8
/** bad response echo from CMD8 */
#define SD_CARD_ERROR_CMD8_ECHO 0X09
/** timeout while waiting for start of read data */
#define SD_CARD_ERROR_READ_TIMEOUT 0XD
/** card returned an error token instead of read data */
#define SD_CARD_ERROR_READ 0X10
//
// card types
/** Standard capacity V1 SD card */
#define SD_CARD_TYPE_SD1 1
/** Standard capacity V2 SD card */
#define SD_CARD_TYPE_SD2 2
/** High Capacity SD card */
#define SD_CARD_TYPE_SDHC 3
//------------------------------------------------------------------------------
/**
* \class SdReader
* \brief Hardware access class for SD flash cards
*
* Supports raw access to SD and SDHC flash memory cards.
*
*/
class SdReader {
uint32_t block_;
uint8_t errorCode_;
uint8_t errorData_;
uint8_t inBlock_;
uint16_t offset_;
uint8_t partialBlockRead_;
uint8_t response_;
uint8_t type_;
uint8_t cardCommand(uint8_t cmd, uint32_t arg);
void error(uint8_t code) { errorCode_ = code; }
void error(uint8_t code, uint8_t data) {
errorCode_ = code;
errorData_ = data;
}
uint8_t readRegister(uint8_t cmd, uint8_t *dst);
void type(uint8_t value) { type_ = value; }
uint8_t waitNotBusy(uint16_t timeoutMillis);
uint8_t waitStartBlock(void);
public:
/** Construct an instance of SdReader. */
SdReader(void) : errorCode_(0), inBlock_(0), partialBlockRead_(0), type_(0){};
uint32_t cardSize(void);
/** \return error code for last error */
uint8_t errorCode(void) { return errorCode_; }
/** \return error data for last error */
uint8_t errorData(void) { return errorData_; }
uint8_t init(uint8_t slow = SPI_DEFAULT_HALF_SPEED);
/**
* Enable or disable partial block reads.
*
* Enabling partial block reads improves performance by allowing a block
* to be read over the SPI bus as several sub-blocks. Errors will occur
* if the time between reads is too long since the SD card will timeout.
*
* Use this for applications like the Adafruit Wave Shield.
*
* \param[in] value The value TRUE (non-zero) or FALSE (zero).)
*/
void partialBlockRead(uint8_t value) {
readEnd();
partialBlockRead_ = value;
}
/**
* Read a 512 byte block from a SD card device.
*
* \param[in] block Logical block to be read.
* \param[out] dst Pointer to the location that will receive the data.
*
* \return The value one, true, is returned for success and
* the value zero, false, is returned for failure.
*/
uint8_t readBlock(uint32_t block, uint8_t *dst) {
return readData(block, 0, dst, 512);
}
uint8_t readData(uint32_t block, uint16_t offset, uint8_t *dst,
uint16_t count);
/**
* Read a cards CID register. The CID contains card identification information
* such as Manufacturer ID, Product name, Product serial number and
* Manufacturing date. */
/*!
@brief Read a cards CID register. The CID contains card identification
information such as Manufacturer ID, Product name, Product serial number
and Manufacturing date.
@param cid the pointer to the cid struct the data should be placed in
@returns the return code after the read
*/
uint8_t readCID(cid_t &cid) { return readRegister(CMD10, (uint8_t *)&cid); }
/*!
@brief Read a cards CSD register. The CSD contains Card-Specific Data that
provides information regarding access to the card contents.
@param csd pointer to the struct the data should be placed in.
@returns the return code after the read.
*/
uint8_t readCSD(csd_t &csd) { return readRegister(CMD9, (uint8_t *)&csd); }
void readEnd(void);
/*!
@brief Return the card type: SD V1, SD V2 or SDHC
@returns the type
*/
uint8_t type() { return type_; }
};
#endif // SdReader_h