Merge branch 'flag_Crc' of ssh://github.com/deepikabhavnani/mbed-os into rollup

pull/8686/head
Cruz Monrreal II 2018-11-08 13:24:18 -06:00
commit 62c043677b
3 changed files with 30 additions and 5 deletions

View File

@ -247,9 +247,15 @@
// Only HC block size is supported. Making this a static constant reduces code size. // Only HC block size is supported. Making this a static constant reduces code size.
const uint32_t SDBlockDevice::_block_size = BLOCK_SIZE_HC; const uint32_t SDBlockDevice::_block_size = BLOCK_SIZE_HC;
#if MBED_CONF_SD_CRC_ENABLED
SDBlockDevice::SDBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName cs, uint64_t hz, bool crc_on) SDBlockDevice::SDBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName cs, uint64_t hz, bool crc_on)
: _sectors(0), _spi(mosi, miso, sclk), _cs(cs), _is_initialized(0), : _sectors(0), _spi(mosi, miso, sclk), _cs(cs), _is_initialized(0),
_crc_on(crc_on), _init_ref_count(0), _crc16(0, 0, false, false) _init_ref_count(0), _crc_on(crc_on), _crc16(0, 0, false, false)
#else
SDBlockDevice::SDBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName cs, uint64_t hz, bool crc_on)
: _sectors(0), _spi(mosi, miso, sclk), _cs(cs), _is_initialized(0),
_init_ref_count(0)
#endif
{ {
_cs = 1; _cs = 1;
_card_type = SDCARD_NONE; _card_type = SDCARD_NONE;
@ -293,10 +299,12 @@ int SDBlockDevice::_initialise_card()
return status; return status;
} }
#if MBED_CONF_SD_CRC_ENABLED
if (_crc_on) { if (_crc_on) {
// Enable CRC // Enable CRC
status = _cmd(CMD59_CRC_ON_OFF, _crc_on); status = _cmd(CMD59_CRC_ON_OFF, _crc_on);
} }
#endif
// Read OCR - CMD58 Response contains OCR register // Read OCR - CMD58 Response contains OCR register
if (BD_ERROR_OK != (status = _cmd(CMD58_READ_OCR, 0x0, 0x0, &response))) { if (BD_ERROR_OK != (status = _cmd(CMD58_READ_OCR, 0x0, 0x0, &response))) {
@ -350,10 +358,15 @@ int SDBlockDevice::_initialise_card()
debug_if(SD_DBG, "Card Initialized: Version 1.x Card\n"); debug_if(SD_DBG, "Card Initialized: Version 1.x Card\n");
} }
#if MBED_CONF_SD_CRC_ENABLED
if (!_crc_on) { if (!_crc_on) {
// Disable CRC // Disable CRC
status = _cmd(CMD59_CRC_ON_OFF, _crc_on); status = _cmd(CMD59_CRC_ON_OFF, _crc_on);
} }
#else
status = _cmd(CMD59_CRC_ON_OFF, 0);
#endif
return status; return status;
} }
@ -649,7 +662,6 @@ uint8_t SDBlockDevice::_cmd_spi(SDBlockDevice::cmdSupported cmd, uint32_t arg)
{ {
uint8_t response; uint8_t response;
char cmdPacket[PACKET_SIZE]; char cmdPacket[PACKET_SIZE];
uint32_t crc;
// Prepare the command packet // Prepare the command packet
cmdPacket[0] = SPI_CMD(cmd); cmdPacket[0] = SPI_CMD(cmd);
@ -658,10 +670,14 @@ uint8_t SDBlockDevice::_cmd_spi(SDBlockDevice::cmdSupported cmd, uint32_t arg)
cmdPacket[3] = (arg >> 8); cmdPacket[3] = (arg >> 8);
cmdPacket[4] = (arg >> 0); cmdPacket[4] = (arg >> 0);
#if MBED_CONF_SD_CRC_ENABLED
uint32_t crc;
if (_crc_on) { if (_crc_on) {
_crc7.compute((void *)cmdPacket, 5, &crc); _crc7.compute((void *)cmdPacket, 5, &crc);
cmdPacket[5] = (char)(crc | 0x01); cmdPacket[5] = (char)(crc | 0x01);
} else { } else
#endif
{
// CMD0 is executed in SD mode, hence should have correct CRC // CMD0 is executed in SD mode, hence should have correct CRC
// CMD8 CRC verification is always enabled // CMD8 CRC verification is always enabled
switch (cmd) { switch (cmd) {
@ -874,6 +890,7 @@ int SDBlockDevice::_read_bytes(uint8_t *buffer, uint32_t length)
crc = (_spi.write(SPI_FILL_CHAR) << 8); crc = (_spi.write(SPI_FILL_CHAR) << 8);
crc |= _spi.write(SPI_FILL_CHAR); crc |= _spi.write(SPI_FILL_CHAR);
#if MBED_CONF_SD_CRC_ENABLED
if (_crc_on) { if (_crc_on) {
uint32_t crc_result; uint32_t crc_result;
// Compute and verify checksum // Compute and verify checksum
@ -885,6 +902,7 @@ int SDBlockDevice::_read_bytes(uint8_t *buffer, uint32_t length)
return SD_BLOCK_DEVICE_ERROR_CRC; return SD_BLOCK_DEVICE_ERROR_CRC;
} }
} }
#endif
_deselect(); _deselect();
return 0; return 0;
@ -907,6 +925,7 @@ int SDBlockDevice::_read(uint8_t *buffer, uint32_t length)
crc = (_spi.write(SPI_FILL_CHAR) << 8); crc = (_spi.write(SPI_FILL_CHAR) << 8);
crc |= _spi.write(SPI_FILL_CHAR); crc |= _spi.write(SPI_FILL_CHAR);
#if MBED_CONF_SD_CRC_ENABLED
if (_crc_on) { if (_crc_on) {
uint32_t crc_result; uint32_t crc_result;
// Compute and verify checksum // Compute and verify checksum
@ -917,6 +936,7 @@ int SDBlockDevice::_read(uint8_t *buffer, uint32_t length)
return SD_BLOCK_DEVICE_ERROR_CRC; return SD_BLOCK_DEVICE_ERROR_CRC;
} }
} }
#endif
return 0; return 0;
} }
@ -933,10 +953,12 @@ uint8_t SDBlockDevice::_write(const uint8_t *buffer, uint8_t token, uint32_t len
// write the data // write the data
_spi.write((char *)buffer, length, NULL, 0); _spi.write((char *)buffer, length, NULL, 0);
#if MBED_CONF_SD_CRC_ENABLED
if (_crc_on) { if (_crc_on) {
// Compute CRC // Compute CRC
_crc16.compute((void *)buffer, length, &crc); _crc16.compute((void *)buffer, length, &crc);
} }
#endif
// write the checksum CRC16 // write the checksum CRC16
_spi.write(crc >> 8); _spi.write(crc >> 8);

View File

@ -218,11 +218,13 @@ private:
uint32_t _erase_size; uint32_t _erase_size;
bool _is_initialized; bool _is_initialized;
bool _dbg; bool _dbg;
bool _crc_on;
uint32_t _init_ref_count; uint32_t _init_ref_count;
#if MBED_CONF_SD_CRC_ENABLED
bool _crc_on;
mbed::MbedCRC<POLY_7BIT_SD, 7> _crc7; mbed::MbedCRC<POLY_7BIT_SD, 7> _crc7;
mbed::MbedCRC<POLY_16BIT_CCITT, 16> _crc16; mbed::MbedCRC<POLY_16BIT_CCITT, 16> _crc16;
#endif
}; };
#endif /* DEVICE_SPI */ #endif /* DEVICE_SPI */

View File

@ -8,7 +8,8 @@
"FSFAT_SDCARD_INSTALLED": 1, "FSFAT_SDCARD_INSTALLED": 1,
"CMD_TIMEOUT": 10000, "CMD_TIMEOUT": 10000,
"CMD0_IDLE_STATE_RETRIES": 5, "CMD0_IDLE_STATE_RETRIES": 5,
"SD_INIT_FREQUENCY": 100000 "INIT_FREQUENCY": 100000,
"CRC_ENABLED": 1
}, },
"target_overrides": { "target_overrides": {
"DISCO_F051R8": { "DISCO_F051R8": {