mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-04 05:42:49 +08:00
[sdlogger] added sdcard error status
This commit is contained in:
@@ -13,6 +13,7 @@
|
|||||||
<dl_settings NAME="SD Logger">
|
<dl_settings NAME="SD Logger">
|
||||||
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.status" min="0" max="20" step="1"/>
|
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.status" min="0" max="20" step="1"/>
|
||||||
<dl_setting module="loggers/sdlogger_spi_direct" var="sdcard1.status" min="0" max="40" step="1"/>
|
<dl_setting module="loggers/sdlogger_spi_direct" var="sdcard1.status" min="0" max="40" step="1"/>
|
||||||
|
<dl_setting module="loggers/sdlogger_spi_direct" var="sdcard1.error_status" min="0" max="15" step="1"/>
|
||||||
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.last_completed" min="0" max="42" step="1"/>
|
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.last_completed" min="0" max="42" step="1"/>
|
||||||
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.next_available_address" min="16384" max="4294967295" step="1" />
|
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.next_available_address" min="16384" max="4294967295" step="1" />
|
||||||
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.command" min="1" max="42" step="1" />
|
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.command" min="1" max="42" step="1" />
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ void sdcard_spi_init(struct SDCard *sdcard, struct spi_periph *spi_p, const uint
|
|||||||
|
|
||||||
sdcard->status = SDCard_BeforeDummyClock;
|
sdcard->status = SDCard_BeforeDummyClock;
|
||||||
sdcard->card_type = SDCardType_Unknown;
|
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;
|
sdcard1.status = SDCard_SendingCMD8;
|
||||||
} else if (sdcard1.response_counter >= 9) {
|
} else if (sdcard1.response_counter >= 9) {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_InitializationNoResponse;
|
||||||
} else {
|
} else {
|
||||||
sdcard_spi_request_bytes(&sdcard1, 1);
|
sdcard_spi_request_bytes(&sdcard1, 1);
|
||||||
}
|
}
|
||||||
@@ -198,6 +200,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.status = SDCard_ReadingCMD8Parameter;
|
sdcard1.status = SDCard_ReadingCMD8Parameter;
|
||||||
} else if (sdcard1.response_counter >= 9) {
|
} else if (sdcard1.response_counter >= 9) {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_CardInfoNoResponse;
|
||||||
} else {
|
} else {
|
||||||
sdcard_spi_request_bytes(&sdcard1, 1);
|
sdcard_spi_request_bytes(&sdcard1, 1);
|
||||||
}
|
}
|
||||||
@@ -211,6 +214,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.timeout_counter = 0;
|
sdcard1.timeout_counter = 0;
|
||||||
} else {
|
} else {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_InvalidCardInfo;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -228,12 +232,14 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.status = SDCard_SendingACMD41v2;
|
sdcard1.status = SDCard_SendingACMD41v2;
|
||||||
} else {
|
} else {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_ACMD41Timeout;
|
||||||
}
|
}
|
||||||
} else if (t->input_buf[0] == 0x00) {
|
} else if (t->input_buf[0] == 0x00) {
|
||||||
sdcard_spi_send_cmd(&sdcard1, 58, 0x00000000);
|
sdcard_spi_send_cmd(&sdcard1, 58, 0x00000000);
|
||||||
sdcard1.status = SDCard_SendingCMD58;
|
sdcard1.status = SDCard_SendingCMD58;
|
||||||
} else if (sdcard1.response_counter >= 9) {
|
} else if (sdcard1.response_counter >= 9) {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_ACMD41NoResponse;
|
||||||
} else {
|
} else {
|
||||||
sdcard_spi_request_bytes(&sdcard1, 1);
|
sdcard_spi_request_bytes(&sdcard1, 1);
|
||||||
}
|
}
|
||||||
@@ -250,6 +256,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
case SDCard_ReadingCMD58Resp:
|
case SDCard_ReadingCMD58Resp:
|
||||||
if (sdcard1.response_counter >= 9) {
|
if (sdcard1.response_counter >= 9) {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_CMD58NoResponse;
|
||||||
} else if (sdcard1.input_buf[0] == 0x00) {
|
} else if (sdcard1.input_buf[0] == 0x00) {
|
||||||
sdcard_spi_request_bytes(&sdcard1, 4);
|
sdcard_spi_request_bytes(&sdcard1, 4);
|
||||||
sdcard1.status = SDCard_ReadingCMD58Parameter;
|
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
|
} else { // bit 31 not set, CCS bit is unvalid
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_CCSBitInvalid;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -287,6 +295,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.status = SDCard_Idle;
|
sdcard1.status = SDCard_Idle;
|
||||||
} else if (sdcard1.response_counter >= 9) {
|
} else if (sdcard1.response_counter >= 9) {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_SetBlockSizeNoResponse;
|
||||||
} else {
|
} else {
|
||||||
sdcard_spi_request_bytes(&sdcard1, 1);
|
sdcard_spi_request_bytes(&sdcard1, 1);
|
||||||
}
|
}
|
||||||
@@ -306,6 +315,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.status = SDCard_BeforeSendingDataBlock;
|
sdcard1.status = SDCard_BeforeSendingDataBlock;
|
||||||
} else if (sdcard1.response_counter >= 9) {
|
} else if (sdcard1.response_counter >= 9) {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_WriteBlockNoResponse;
|
||||||
} else {
|
} else {
|
||||||
sdcard_spi_request_bytes(&sdcard1, 1);
|
sdcard_spi_request_bytes(&sdcard1, 1);
|
||||||
}
|
}
|
||||||
@@ -325,6 +335,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.status = SDCard_SendingDataBlock;
|
sdcard1.status = SDCard_SendingDataBlock;
|
||||||
} else {
|
} else {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_SpiDriverError;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -334,6 +345,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.status = SDCard_Busy;
|
sdcard1.status = SDCard_Busy;
|
||||||
} else {
|
} else {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_BlockWriteError;
|
||||||
}
|
}
|
||||||
sdcard1.spi_t.output_buf = sdcard1.output_buf;
|
sdcard1.spi_t.output_buf = sdcard1.output_buf;
|
||||||
break;
|
break;
|
||||||
@@ -359,6 +371,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.status = SDCard_WaitingForDataToken;
|
sdcard1.status = SDCard_WaitingForDataToken;
|
||||||
} else if (sdcard1.response_counter >= 9) {
|
} else if (sdcard1.response_counter >= 9) {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_ReadBlockNoResponse;
|
||||||
} else {
|
} else {
|
||||||
sdcard_spi_request_bytes(&sdcard1, 1);
|
sdcard_spi_request_bytes(&sdcard1, 1);
|
||||||
}
|
}
|
||||||
@@ -379,6 +392,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.status = SDCard_ReadingDataBlock;
|
sdcard1.status = SDCard_ReadingDataBlock;
|
||||||
} else if (sdcard1.timeout_counter > 498) {
|
} else if (sdcard1.timeout_counter > 498) {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_ReadBlockTimeout;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -404,6 +418,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
sdcard1.status = SDCard_MultiWriteIdle;
|
sdcard1.status = SDCard_MultiWriteIdle;
|
||||||
} else if (sdcard1.response_counter >= 9) {
|
} else if (sdcard1.response_counter >= 9) {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_MultiWriteNoResponse;
|
||||||
} else {
|
} else {
|
||||||
sdcard_spi_request_bytes(&sdcard1, 1);
|
sdcard_spi_request_bytes(&sdcard1, 1);
|
||||||
}
|
}
|
||||||
@@ -418,6 +433,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
sdcard1.status = SDCard_Error;
|
sdcard1.status = SDCard_Error;
|
||||||
|
sdcard1.error_status = SDCardError_MultiWriteError;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,25 @@ enum SDCardStatus {
|
|||||||
SDCard_MultiWriteStopping, /**< Busy sending the stop token */
|
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 SDCard {
|
||||||
struct spi_periph *spi_p; /**< The SPI peripheral for the connection */
|
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 */
|
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 */
|
uint8_t response_counter; /**< Response counter used at various locations */
|
||||||
uint32_t timeout_counter; /**< Timeout counter used for initialization checks with ACMD41 */
|
uint32_t timeout_counter; /**< Timeout counter used for initialization checks with ACMD41 */
|
||||||
enum SDCardType card_type; /**< Type of SDCard */
|
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 */
|
SDCardCallback external_callback; /**< Callback to call when external operation finishes */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user