From eef767ed461742acbc3918866f11901dd6f7828d Mon Sep 17 00:00:00 2001 From: Bart Slinger Date: Wed, 28 Oct 2015 21:08:09 +0100 Subject: [PATCH] [sdlogger] added sdcard error status --- conf/modules/logger_sd_spi_direct.xml | 1 + sw/airborne/peripherals/sdcard_spi.c | 16 ++++++++++++++++ sw/airborne/peripherals/sdcard_spi.h | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/conf/modules/logger_sd_spi_direct.xml b/conf/modules/logger_sd_spi_direct.xml index 117c2e803f..b68f109338 100644 --- a/conf/modules/logger_sd_spi_direct.xml +++ b/conf/modules/logger_sd_spi_direct.xml @@ -13,6 +13,7 @@ + diff --git a/sw/airborne/peripherals/sdcard_spi.c b/sw/airborne/peripherals/sdcard_spi.c index 88f7268d84..2c1cc6e1df 100644 --- a/sw/airborne/peripherals/sdcard_spi.c +++ b/sw/airborne/peripherals/sdcard_spi.c @@ -89,6 +89,7 @@ void sdcard_spi_init(struct SDCard *sdcard, struct spi_periph *spi_p, const uint sdcard->status = SDCard_BeforeDummyClock; sdcard->card_type = SDCardType_Unknown; + sdcard->error_status = SDCardError_None; } /** @@ -179,6 +180,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_SendingCMD8; } else if (sdcard1.response_counter >= 9) { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_InitializationNoResponse; } else { sdcard_spi_request_bytes(&sdcard1, 1); } @@ -198,6 +200,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_ReadingCMD8Parameter; } else if (sdcard1.response_counter >= 9) { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_CardInfoNoResponse; } else { sdcard_spi_request_bytes(&sdcard1, 1); } @@ -211,6 +214,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.timeout_counter = 0; } else { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_InvalidCardInfo; } break; @@ -228,12 +232,14 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_SendingACMD41v2; } else { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_ACMD41Timeout; } } else if (t->input_buf[0] == 0x00) { sdcard_spi_send_cmd(&sdcard1, 58, 0x00000000); sdcard1.status = SDCard_SendingCMD58; } else if (sdcard1.response_counter >= 9) { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_ACMD41NoResponse; } else { sdcard_spi_request_bytes(&sdcard1, 1); } @@ -250,6 +256,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) case SDCard_ReadingCMD58Resp: if (sdcard1.response_counter >= 9) { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_CMD58NoResponse; } else if (sdcard1.input_buf[0] == 0x00) { sdcard_spi_request_bytes(&sdcard1, 4); sdcard1.status = SDCard_ReadingCMD58Parameter; @@ -271,6 +278,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) } } else { // bit 31 not set, CCS bit is unvalid sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_CCSBitInvalid; } break; @@ -287,6 +295,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_Idle; } else if (sdcard1.response_counter >= 9) { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_SetBlockSizeNoResponse; } else { sdcard_spi_request_bytes(&sdcard1, 1); } @@ -306,6 +315,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_BeforeSendingDataBlock; } else if (sdcard1.response_counter >= 9) { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_WriteBlockNoResponse; } else { sdcard_spi_request_bytes(&sdcard1, 1); } @@ -325,6 +335,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_SendingDataBlock; } else { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_SpiDriverError; } break; @@ -334,6 +345,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_Busy; } else { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_BlockWriteError; } sdcard1.spi_t.output_buf = sdcard1.output_buf; break; @@ -359,6 +371,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_WaitingForDataToken; } else if (sdcard1.response_counter >= 9) { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_ReadBlockNoResponse; } else { sdcard_spi_request_bytes(&sdcard1, 1); } @@ -379,6 +392,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_ReadingDataBlock; } else if (sdcard1.timeout_counter > 498) { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_ReadBlockTimeout; } break; @@ -404,6 +418,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) sdcard1.status = SDCard_MultiWriteIdle; } else if (sdcard1.response_counter >= 9) { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_MultiWriteNoResponse; } else { sdcard_spi_request_bytes(&sdcard1, 1); } @@ -418,6 +433,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t) } } else { sdcard1.status = SDCard_Error; + sdcard1.error_status = SDCardError_MultiWriteError; } break; diff --git a/sw/airborne/peripherals/sdcard_spi.h b/sw/airborne/peripherals/sdcard_spi.h index c8a976083e..e95505e907 100644 --- a/sw/airborne/peripherals/sdcard_spi.h +++ b/sw/airborne/peripherals/sdcard_spi.h @@ -87,6 +87,25 @@ enum SDCardStatus { SDCard_MultiWriteStopping, /**< Busy sending the stop token */ }; +enum SDCardErrorStatus { + SDCardError_None, + SDCardError_InitializationNoResponse, + SDCardError_CardInfoNoResponse, + SDCardError_InvalidCardInfo, + SDCardError_ACMD41Timeout, + SDCardError_ACMD41NoResponse, + SDCardError_CMD58NoResponse, + SDCardError_CCSBitInvalid, + SDCardError_SetBlockSizeNoResponse, + SDCardError_WriteBlockNoResponse, + SDCardError_SpiDriverError, + SDCardError_BlockWriteError, + SDCardError_ReadBlockNoResponse, + SDCardError_ReadBlockTimeout, + SDCardError_MultiWriteNoResponse, + SDCardError_MultiWriteError, +}; + struct SDCard { struct spi_periph *spi_p; /**< The SPI peripheral for the connection */ struct spi_transaction spi_t; /**< The SPI transaction used for the writing and reading of registers */ @@ -96,6 +115,7 @@ struct SDCard { uint8_t response_counter; /**< Response counter used at various locations */ uint32_t timeout_counter; /**< Timeout counter used for initialization checks with ACMD41 */ enum SDCardType card_type; /**< Type of SDCard */ + enum SDCardErrorStatus error_status; /**< Contains information on where the error has occured */ SDCardCallback external_callback; /**< Callback to call when external operation finishes */ };