Skip to content

Commit cd2b7de

Browse files
committed
libraries/sd: Fixed SDFileSystem when no card present (or failed its initialization).
1 parent b87dac9 commit cd2b7de

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

libraries/fs/sd/SDFileSystem.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@
120120
#define SD_DBG 0
121121

122122
SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) :
123-
FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs) {
123+
FATFileSystem(name), _spi(mosi, miso, sclk), _cs(cs), _is_initialized(0) {
124124
_cs = 1;
125125
}
126126

@@ -200,8 +200,12 @@ int SDFileSystem::initialise_card_v2() {
200200
}
201201

202202
int SDFileSystem::disk_initialize() {
203-
int i = initialise_card();
204-
debug_if(SD_DBG, "init card = %d\n", i);
203+
_is_initialized = initialise_card();
204+
if (_is_initialized == 0) {
205+
debug("Fail to initialize card\n");
206+
return 1;
207+
}
208+
debug_if(SD_DBG, "init card = %d\n", _is_initialized);
205209
_sectors = _sd_sectors();
206210

207211
// Set block length to 512 (CMD16)
@@ -215,6 +219,10 @@ int SDFileSystem::disk_initialize() {
215219
}
216220

217221
int SDFileSystem::disk_write(const uint8_t *buffer, uint64_t block_number) {
222+
if (!_is_initialized) {
223+
return -1;
224+
}
225+
218226
// set write address for single block (CMD24)
219227
if (_cmd(24, block_number * cdv) != 0) {
220228
return 1;
@@ -226,6 +234,10 @@ int SDFileSystem::disk_write(const uint8_t *buffer, uint64_t block_number) {
226234
}
227235

228236
int SDFileSystem::disk_read(uint8_t *buffer, uint64_t block_number) {
237+
if (!_is_initialized) {
238+
return -1;
239+
}
240+
229241
// set read address for single block (CMD17)
230242
if (_cmd(17, block_number * cdv) != 0) {
231243
return 1;
@@ -236,7 +248,15 @@ int SDFileSystem::disk_read(uint8_t *buffer, uint64_t block_number) {
236248
return 0;
237249
}
238250

239-
int SDFileSystem::disk_status() { return 0; }
251+
int SDFileSystem::disk_status() {
252+
// FATFileSystem::disk_status() returns 0 when initialized
253+
if (_is_initialized) {
254+
return 0;
255+
} else {
256+
return 1;
257+
}
258+
}
259+
240260
int SDFileSystem::disk_sync() { return 0; }
241261
uint64_t SDFileSystem::disk_sectors() { return _sectors; }
242262

libraries/fs/sd/SDFileSystem.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class SDFileSystem : public FATFileSystem {
7777
SPI _spi;
7878
DigitalOut _cs;
7979
int cdv;
80+
int _is_initialized;
8081
};
8182

8283
#endif

0 commit comments

Comments
 (0)