mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-10 06:59:54 +08:00
[sdlogger] added sdcard error status
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
<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="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.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" />
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 */
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user