From cdbbea6c52cebadd4d3757c239454abdc99090b5 Mon Sep 17 00:00:00 2001 From: Deepika Date: Mon, 10 Jul 2017 15:59:33 -0500 Subject: [PATCH 1/3] Fix: SD read failed for Strontium Card CMD9 fails for few cards if spi.write is performed during deslect of card Card immediately sends start packet token, which goes missing in this dummy write to SPI. Should not clock SPI bus in deselect operation. --- SDBlockDevice.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/SDBlockDevice.cpp b/SDBlockDevice.cpp index ba45dc296c..ab170ae53e 100644 --- a/SDBlockDevice.cpp +++ b/SDBlockDevice.cpp @@ -1010,7 +1010,6 @@ void SDBlockDevice::_select() { void SDBlockDevice::_deselect() { _cs = 1; - _spi.write(0xFF); _spi.unlock(); } #endif /* DEVICE_SPI */ From 21e6f47aa48bcd2021064d2cf4a8f0226836e92f Mon Sep 17 00:00:00 2001 From: Deepika Date: Tue, 11 Jul 2017 08:31:30 -0500 Subject: [PATCH 2/3] Error handling for CMD9 --- SDBlockDevice.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/SDBlockDevice.cpp b/SDBlockDevice.cpp index ab170ae53e..976deea3a2 100644 --- a/SDBlockDevice.cpp +++ b/SDBlockDevice.cpp @@ -344,6 +344,11 @@ int SDBlockDevice::init() } debug_if(SD_DBG, "init card = %d\n", _is_initialized); _sectors = _sd_sectors(); + // CMD9 failed + if (0 == _sectors) { + _lock.unlock(); + return BD_ERROR_DEVICE_ERROR; + } // Set block length to 512 (CMD16) if (_cmd(CMD16_SET_BLOCKLEN, _block_size) != 0) { @@ -358,12 +363,10 @@ int SDBlockDevice::init() _lock.unlock(); return err; } - _lock.unlock(); return BD_ERROR_OK; } - int SDBlockDevice::deinit() { return 0; From 954167fb40191e68b924f0ce1a05edf9972fa124 Mon Sep 17 00:00:00 2001 From: Deepika Date: Tue, 11 Jul 2017 14:30:59 -0500 Subject: [PATCH 3/3] Clear _is_initialized flag during deinit --- SDBlockDevice.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SDBlockDevice.cpp b/SDBlockDevice.cpp index 976deea3a2..50455399fe 100644 --- a/SDBlockDevice.cpp +++ b/SDBlockDevice.cpp @@ -369,6 +369,9 @@ int SDBlockDevice::init() int SDBlockDevice::deinit() { + _lock.lock(); + _is_initialized = false; + _lock.unlock(); return 0; }