mirror of https://github.com/ARMmbed/mbed-os.git
Added response type handling for _cmd
parent
27ceeee5b5
commit
e10c59d134
|
@ -169,24 +169,6 @@
|
||||||
#define CRC_SUPPORT 0 /*!< CRC - Not supported */
|
#define CRC_SUPPORT 0 /*!< CRC - Not supported */
|
||||||
#define SPI_CMD(x) (0x40 | (x & 0x3f))
|
#define SPI_CMD(x) (0x40 | (x & 0x3f))
|
||||||
|
|
||||||
|
|
||||||
SDBlockDevice::SDBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName cs)
|
|
||||||
: _spi(mosi, miso, sclk), _cs(cs), _is_initialized(0)
|
|
||||||
{
|
|
||||||
_cs = 1;
|
|
||||||
|
|
||||||
// Set default to 100kHz for initialisation and 1MHz for data transfer
|
|
||||||
_init_sck = 100000;
|
|
||||||
_transfer_sck = 1000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDBlockDevice::~SDBlockDevice()
|
|
||||||
{
|
|
||||||
if (_is_initialized) {
|
|
||||||
deinit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* R1 Response Format */
|
/* R1 Response Format */
|
||||||
#define R1_NO_RESPONSE (0xFF)
|
#define R1_NO_RESPONSE (0xFF)
|
||||||
#define R1_RESPONSE_RECV (0x80)
|
#define R1_RESPONSE_RECV (0x80)
|
||||||
|
@ -249,6 +231,23 @@ SDBlockDevice::~SDBlockDevice()
|
||||||
#define SPI_READ_ERROR_ECC_C (0x1 << 2) /*!< Card ECC failed */
|
#define SPI_READ_ERROR_ECC_C (0x1 << 2) /*!< Card ECC failed */
|
||||||
#define SPI_READ_ERROR_OFR (0x1 << 3) /*!< Out of Range */
|
#define SPI_READ_ERROR_OFR (0x1 << 3) /*!< Out of Range */
|
||||||
|
|
||||||
|
SDBlockDevice::SDBlockDevice(PinName mosi, PinName miso, PinName sclk, PinName cs)
|
||||||
|
: _spi(mosi, miso, sclk), _cs(cs), _is_initialized(0)
|
||||||
|
{
|
||||||
|
_cs = 1;
|
||||||
|
_card_type = SDCARD_None;
|
||||||
|
// Set default to 100kHz for initialisation and 1MHz for data transfer
|
||||||
|
_init_sck = 100000;
|
||||||
|
_transfer_sck = 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDBlockDevice::~SDBlockDevice()
|
||||||
|
{
|
||||||
|
if (_is_initialized) {
|
||||||
|
deinit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int SDBlockDevice::_initialise_card()
|
int SDBlockDevice::_initialise_card()
|
||||||
{
|
{
|
||||||
_dbg = SD_DBG;
|
_dbg = SD_DBG;
|
||||||
|
@ -499,6 +498,47 @@ int SDBlockDevice::_cmd(SDBlockDevice::cmdSupported cmd, uint32_t arg, uint32_t
|
||||||
status = SD_BLOCK_DEVICE_ERROR_CRC; // Retry for CRC
|
status = SD_BLOCK_DEVICE_ERROR_CRC; // Retry for CRC
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get rest of the response part for other commands
|
||||||
|
switch(cmd) {
|
||||||
|
case CMD8_SEND_IF_COND: // Response R7
|
||||||
|
// Illegal command is for Ver1 or not SD Card
|
||||||
|
if(response & R1_ILLEGAL_COMMAND) {
|
||||||
|
debug_if(SD_DBG, "Illegal command response - CMD8\n");
|
||||||
|
_card_type = CARD_UNKNOWN;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
debug_if(SD_DBG, "V2-Version Card\n");
|
||||||
|
_card_type = SDCARD_V2;
|
||||||
|
}
|
||||||
|
// Note: No break here, need to read rest of the response
|
||||||
|
case CMD58_READ_OCR: // Response R3
|
||||||
|
if(NULL == resp) {
|
||||||
|
status = SD_BLOCK_DEVICE_ERROR_PARAMETER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*resp = (_spi.write(0xFF) << 24);
|
||||||
|
*resp |= (_spi.write(0xFF) << 16);
|
||||||
|
*resp |= (_spi.write(0xFF) << 8);
|
||||||
|
*resp |= (_spi.write(0xFF) << 0);
|
||||||
|
debug_if(SD_DBG, "CMD:%d \t arg:0x%x \t Response:0x%x 0x%x \n", cmd, arg, response, *resp);
|
||||||
|
break;
|
||||||
|
case CMD12_STOP_TRANSMISSION: // Response R1b
|
||||||
|
case CMD38_ERASE: // TODO:
|
||||||
|
debug_if(SD_DBG, "CMD:%d \t arg:0x%x \t Response:0x%x \n", cmd, arg, response);
|
||||||
|
break;
|
||||||
|
case CMD13_SEND_STATUS: // Response R2
|
||||||
|
if(NULL == resp) {
|
||||||
|
status = SD_BLOCK_DEVICE_ERROR_PARAMETER;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
*resp = _spi.write(0xFF);
|
||||||
|
debug_if(SD_DBG, "CMD:%d \t arg:0x%x \t Response:0x%x 0x%x \n", cmd, arg, response, *resp);
|
||||||
|
break;
|
||||||
|
default: // Response R1
|
||||||
|
debug_if(SD_DBG, "CMD:%d \t arg:0x%x \t Response:0x%x \n", cmd, arg, response);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Deselect card
|
// Deselect card
|
||||||
_deselect();
|
_deselect();
|
||||||
return status;
|
return status;
|
||||||
|
|
|
@ -168,6 +168,7 @@ private:
|
||||||
ACMD51_SEND_SCR = 51,
|
ACMD51_SEND_SCR = 51,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint8_t _card_type;
|
||||||
int _cmd(SDBlockDevice::cmdSupported cmd, uint32_t arg, uint32_t *resp=NULL);
|
int _cmd(SDBlockDevice::cmdSupported cmd, uint32_t arg, uint32_t *resp=NULL);
|
||||||
int _cmd8();
|
int _cmd8();
|
||||||
int _cmd58();
|
int _cmd58();
|
||||||
|
|
Loading…
Reference in New Issue