Merge pull request #6868 from jflyper/bfdev-consolidate-sdcard-spi-and-sdio-part-2
SDCARD: Consolidation of SPI and SDIO variants (Part 2: Use VTable to switch between SPI and SDIO)
This commit is contained in:
commit
a598d06fe5
|
@ -32,6 +32,8 @@
|
||||||
#include "drivers/bus_spi.h"
|
#include "drivers/bus_spi.h"
|
||||||
#include "drivers/time.h"
|
#include "drivers/time.h"
|
||||||
|
|
||||||
|
#include "pg/sdcard.h"
|
||||||
|
|
||||||
#include "sdcard.h"
|
#include "sdcard.h"
|
||||||
#include "sdcard_impl.h"
|
#include "sdcard_impl.h"
|
||||||
#include "sdcard_standard.h"
|
#include "sdcard_standard.h"
|
||||||
|
@ -93,4 +95,76 @@ bool sdcard_isInserted(void)
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dispatch
|
||||||
|
*/
|
||||||
|
sdcardVTable_t *sdcardVTable;
|
||||||
|
|
||||||
|
void sdcard_init(const sdcardConfig_t *config)
|
||||||
|
{
|
||||||
|
switch (config->mode) {
|
||||||
|
#ifdef USE_SDCARD_SPI
|
||||||
|
case SDCARD_MODE_SPI:
|
||||||
|
sdcardVTable = &sdcardSpiVTable;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef USE_SDCARD_SDIO
|
||||||
|
case SDCARD_MODE_SDIO:
|
||||||
|
sdcardVTable = &sdcardSdioVTable;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sdcardVTable) {
|
||||||
|
sdcardVTable->sdcard_init(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sdcard_readBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
||||||
|
{
|
||||||
|
return sdcardVTable->sdcard_readBlock(blockIndex, buffer, callback, callbackData);
|
||||||
|
}
|
||||||
|
|
||||||
|
sdcardOperationStatus_e sdcard_beginWriteBlocks(uint32_t blockIndex, uint32_t blockCount)
|
||||||
|
{
|
||||||
|
return sdcardVTable->sdcard_beginWriteBlocks(blockIndex, blockCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
sdcardOperationStatus_e sdcard_writeBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
||||||
|
{
|
||||||
|
return sdcardVTable->sdcard_writeBlock(blockIndex, buffer, callback, callbackData);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sdcard_poll(void)
|
||||||
|
{
|
||||||
|
// sdcard_poll is called from taskMain() via afatfs_poll() and for USE_SDCARD.
|
||||||
|
if (sdcardVTable) {
|
||||||
|
return sdcardVTable->sdcard_poll();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sdcard_isFunctional(void)
|
||||||
|
{
|
||||||
|
// sdcard_isFunctional is called from multiple places
|
||||||
|
if (sdcardVTable) {
|
||||||
|
return sdcardVTable->sdcard_isFunctional();
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sdcard_isInitialized(void)
|
||||||
|
{
|
||||||
|
return sdcardVTable->sdcard_isInitialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
const sdcardMetadata_t* sdcard_getMetadata(void)
|
||||||
|
{
|
||||||
|
return sdcardVTable->sdcard_getMetadata();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -111,3 +111,24 @@ STATIC_ASSERT(sizeof(sdcardCSD_t) == 16, sdcard_csd_bitfields_didnt_pack_properl
|
||||||
void sdcardInsertionDetectInit(void);
|
void sdcardInsertionDetectInit(void);
|
||||||
void sdcardInsertionDetectDeinit(void);
|
void sdcardInsertionDetectDeinit(void);
|
||||||
bool sdcard_isInserted(void);
|
bool sdcard_isInserted(void);
|
||||||
|
|
||||||
|
typedef struct sdcardVTable_s {
|
||||||
|
void (*sdcard_init)(const sdcardConfig_t *config);
|
||||||
|
bool (*sdcard_readBlock)(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData);
|
||||||
|
sdcardOperationStatus_e (*sdcard_beginWriteBlocks)(uint32_t blockIndex, uint32_t blockCount);
|
||||||
|
sdcardOperationStatus_e (*sdcard_writeBlock)(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData);
|
||||||
|
bool (*sdcard_poll)(void);
|
||||||
|
bool (*sdcard_isFunctional)(void);
|
||||||
|
bool (*sdcard_isInitialized)(void);
|
||||||
|
const sdcardMetadata_t* (*sdcard_getMetadata)(void);
|
||||||
|
#ifdef SDCARD_PROFILING
|
||||||
|
void (*sdcardSdio_setProfilerCallback)(sdcard_profilerCallback_c callback);
|
||||||
|
#endif
|
||||||
|
} sdcardVTable_t;
|
||||||
|
|
||||||
|
#ifdef USE_SDCARD_SPI
|
||||||
|
extern sdcardVTable_t sdcardSpiVTable;
|
||||||
|
#endif
|
||||||
|
#ifdef USE_SDCARD_SDIO
|
||||||
|
extern sdcardVTable_t sdcardSdioVTable;
|
||||||
|
#endif
|
||||||
|
|
|
@ -72,7 +72,7 @@ void cache_reset(void)
|
||||||
* Returns true if the card has already been, or is currently, initializing and hasn't encountered enough errors to
|
* Returns true if the card has already been, or is currently, initializing and hasn't encountered enough errors to
|
||||||
* trip our error threshold and be disabled (i.e. our card is in and working!)
|
* trip our error threshold and be disabled (i.e. our card is in and working!)
|
||||||
*/
|
*/
|
||||||
bool sdcard_isFunctional(void)
|
static bool sdcardSdio_isFunctional(void)
|
||||||
{
|
{
|
||||||
return sdcard.state != SDCARD_STATE_NOT_PRESENT;
|
return sdcard.state != SDCARD_STATE_NOT_PRESENT;
|
||||||
}
|
}
|
||||||
|
@ -187,7 +187,7 @@ static bool sdcard_checkInitDone(void)
|
||||||
/**
|
/**
|
||||||
* Begin the initialization process for the SD card. This must be called first before any other sdcard_ routine.
|
* Begin the initialization process for the SD card. This must be called first before any other sdcard_ routine.
|
||||||
*/
|
*/
|
||||||
void sdcard_init(const sdcardConfig_t *config)
|
static void sdcardSdio_init(const sdcardConfig_t *config)
|
||||||
{
|
{
|
||||||
sdcard.enabled = config->enabled;
|
sdcard.enabled = config->enabled;
|
||||||
if (!sdcard.enabled) {
|
if (!sdcard.enabled) {
|
||||||
|
@ -273,7 +273,7 @@ static sdcardOperationStatus_e sdcard_endWriteBlocks()
|
||||||
*
|
*
|
||||||
* Returns true if the card is ready to accept commands.
|
* Returns true if the card is ready to accept commands.
|
||||||
*/
|
*/
|
||||||
bool sdcard_poll(void)
|
static bool sdcardSdio_poll(void)
|
||||||
{
|
{
|
||||||
if (!sdcard.enabled) {
|
if (!sdcard.enabled) {
|
||||||
sdcard.state = SDCARD_STATE_NOT_PRESENT;
|
sdcard.state = SDCARD_STATE_NOT_PRESENT;
|
||||||
|
@ -448,7 +448,7 @@ bool sdcard_poll(void)
|
||||||
* SDCARD_OPERATION_BUSY - The card is already busy and cannot accept your write
|
* SDCARD_OPERATION_BUSY - The card is already busy and cannot accept your write
|
||||||
* SDCARD_OPERATION_FAILURE - Your write was rejected by the card, card will be reset
|
* SDCARD_OPERATION_FAILURE - Your write was rejected by the card, card will be reset
|
||||||
*/
|
*/
|
||||||
sdcardOperationStatus_e sdcard_writeBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
static sdcardOperationStatus_e sdcardSdio_writeBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef SDCARD_PROFILING
|
#ifdef SDCARD_PROFILING
|
||||||
|
@ -531,7 +531,7 @@ sdcardOperationStatus_e sdcard_writeBlock(uint32_t blockIndex, uint8_t *buffer,
|
||||||
* SDCARD_OPERATION_BUSY - The card is already busy and cannot accept your write
|
* SDCARD_OPERATION_BUSY - The card is already busy and cannot accept your write
|
||||||
* SDCARD_OPERATION_FAILURE - A fatal error occured, card will be reset
|
* SDCARD_OPERATION_FAILURE - A fatal error occured, card will be reset
|
||||||
*/
|
*/
|
||||||
sdcardOperationStatus_e sdcard_beginWriteBlocks(uint32_t blockIndex, uint32_t blockCount)
|
static sdcardOperationStatus_e sdcardSdio_beginWriteBlocks(uint32_t blockIndex, uint32_t blockCount)
|
||||||
{
|
{
|
||||||
if (sdcard.state != SDCARD_STATE_READY) {
|
if (sdcard.state != SDCARD_STATE_READY) {
|
||||||
if (sdcard.state == SDCARD_STATE_WRITING_MULTIPLE_BLOCKS) {
|
if (sdcard.state == SDCARD_STATE_WRITING_MULTIPLE_BLOCKS) {
|
||||||
|
@ -564,7 +564,7 @@ sdcardOperationStatus_e sdcard_beginWriteBlocks(uint32_t blockIndex, uint32_t bl
|
||||||
* true - The operation was successfully queued for later completion, your callback will be called later
|
* true - The operation was successfully queued for later completion, your callback will be called later
|
||||||
* false - The operation could not be started due to the card being busy (try again later).
|
* false - The operation could not be started due to the card being busy (try again later).
|
||||||
*/
|
*/
|
||||||
bool sdcard_readBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
static bool sdcardSdio_readBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
||||||
{
|
{
|
||||||
if (sdcard.state != SDCARD_STATE_READY) {
|
if (sdcard.state != SDCARD_STATE_READY) {
|
||||||
if (sdcard.state == SDCARD_STATE_WRITING_MULTIPLE_BLOCKS) {
|
if (sdcard.state == SDCARD_STATE_WRITING_MULTIPLE_BLOCKS) {
|
||||||
|
@ -611,23 +611,36 @@ bool sdcard_readBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationComp
|
||||||
/**
|
/**
|
||||||
* Returns true if the SD card has successfully completed its startup procedures.
|
* Returns true if the SD card has successfully completed its startup procedures.
|
||||||
*/
|
*/
|
||||||
bool sdcard_isInitialized(void)
|
static bool sdcardSdio_isInitialized(void)
|
||||||
{
|
{
|
||||||
return sdcard.state >= SDCARD_STATE_READY;
|
return sdcard.state >= SDCARD_STATE_READY;
|
||||||
}
|
}
|
||||||
|
|
||||||
const sdcardMetadata_t* sdcard_getMetadata(void)
|
static const sdcardMetadata_t* sdcardSdio_getMetadata(void)
|
||||||
{
|
{
|
||||||
return &sdcard.metadata;
|
return &sdcard.metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SDCARD_PROFILING
|
#ifdef SDCARD_PROFILING
|
||||||
|
|
||||||
void sdcard_setProfilerCallback(sdcard_profilerCallback_c callback)
|
static void sdcardSdio_setProfilerCallback(sdcard_profilerCallback_c callback)
|
||||||
{
|
{
|
||||||
sdcard.profiler = callback;
|
sdcard.profiler = callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
sdcardVTable_t sdcardSdioVTable = {
|
||||||
|
sdcardSdio_init,
|
||||||
|
sdcardSdio_readBlock,
|
||||||
|
sdcardSdio_beginWriteBlocks,
|
||||||
|
sdcardSdio_writeBlock,
|
||||||
|
sdcardSdio_poll,
|
||||||
|
sdcardSdio_isFunctional,
|
||||||
|
sdcardSdio_isInitialized,
|
||||||
|
sdcardSdio_getMetadata,
|
||||||
|
#ifdef SDCARD_PROFILING
|
||||||
|
sdcardSdio_setProfilerCallback,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
* Returns true if the card has already been, or is currently, initializing and hasn't encountered enough errors to
|
* Returns true if the card has already been, or is currently, initializing and hasn't encountered enough errors to
|
||||||
* trip our error threshold and be disabled (i.e. our card is in and working!)
|
* trip our error threshold and be disabled (i.e. our card is in and working!)
|
||||||
*/
|
*/
|
||||||
bool sdcard_isFunctional(void)
|
static bool sdcardSpi_isFunctional(void)
|
||||||
{
|
{
|
||||||
return sdcard.state != SDCARD_STATE_NOT_PRESENT;
|
return sdcard.state != SDCARD_STATE_NOT_PRESENT;
|
||||||
}
|
}
|
||||||
|
@ -471,7 +471,7 @@ static bool sdcard_checkInitDone(void)
|
||||||
/**
|
/**
|
||||||
* Begin the initialization process for the SD card. This must be called first before any other sdcard_ routine.
|
* Begin the initialization process for the SD card. This must be called first before any other sdcard_ routine.
|
||||||
*/
|
*/
|
||||||
void sdcard_init(const sdcardConfig_t *config)
|
static void sdcardSpi_init(const sdcardConfig_t *config)
|
||||||
{
|
{
|
||||||
sdcard.enabled = config->enabled;
|
sdcard.enabled = config->enabled;
|
||||||
if (!sdcard.enabled) {
|
if (!sdcard.enabled) {
|
||||||
|
@ -587,7 +587,7 @@ static sdcardOperationStatus_e sdcard_endWriteBlocks(void)
|
||||||
*
|
*
|
||||||
* Returns true if the card is ready to accept commands.
|
* Returns true if the card is ready to accept commands.
|
||||||
*/
|
*/
|
||||||
bool sdcard_poll(void)
|
static bool sdcardSpi_poll(void)
|
||||||
{
|
{
|
||||||
if (!sdcard.enabled) {
|
if (!sdcard.enabled) {
|
||||||
sdcard.state = SDCARD_STATE_NOT_PRESENT;
|
sdcard.state = SDCARD_STATE_NOT_PRESENT;
|
||||||
|
@ -897,7 +897,7 @@ bool sdcard_poll(void)
|
||||||
* SDCARD_OPERATION_BUSY - The card is already busy and cannot accept your write
|
* SDCARD_OPERATION_BUSY - The card is already busy and cannot accept your write
|
||||||
* SDCARD_OPERATION_FAILURE - Your write was rejected by the card, card will be reset
|
* SDCARD_OPERATION_FAILURE - Your write was rejected by the card, card will be reset
|
||||||
*/
|
*/
|
||||||
sdcardOperationStatus_e sdcard_writeBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
static sdcardOperationStatus_e sdcardSpi_writeBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
||||||
{
|
{
|
||||||
uint8_t status;
|
uint8_t status;
|
||||||
|
|
||||||
|
@ -964,7 +964,7 @@ sdcardOperationStatus_e sdcard_writeBlock(uint32_t blockIndex, uint8_t *buffer,
|
||||||
* SDCARD_OPERATION_BUSY - The card is already busy and cannot accept your write
|
* SDCARD_OPERATION_BUSY - The card is already busy and cannot accept your write
|
||||||
* SDCARD_OPERATION_FAILURE - A fatal error occured, card will be reset
|
* SDCARD_OPERATION_FAILURE - A fatal error occured, card will be reset
|
||||||
*/
|
*/
|
||||||
sdcardOperationStatus_e sdcard_beginWriteBlocks(uint32_t blockIndex, uint32_t blockCount)
|
static sdcardOperationStatus_e sdcardSpi_beginWriteBlocks(uint32_t blockIndex, uint32_t blockCount)
|
||||||
{
|
{
|
||||||
if (sdcard.state != SDCARD_STATE_READY) {
|
if (sdcard.state != SDCARD_STATE_READY) {
|
||||||
if (sdcard.state == SDCARD_STATE_WRITING_MULTIPLE_BLOCKS) {
|
if (sdcard.state == SDCARD_STATE_WRITING_MULTIPLE_BLOCKS) {
|
||||||
|
@ -1012,7 +1012,7 @@ sdcardOperationStatus_e sdcard_beginWriteBlocks(uint32_t blockIndex, uint32_t bl
|
||||||
* true - The operation was successfully queued for later completion, your callback will be called later
|
* true - The operation was successfully queued for later completion, your callback will be called later
|
||||||
* false - The operation could not be started due to the card being busy (try again later).
|
* false - The operation could not be started due to the card being busy (try again later).
|
||||||
*/
|
*/
|
||||||
bool sdcard_readBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
static bool sdcardSpi_readBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData)
|
||||||
{
|
{
|
||||||
if (sdcard.state != SDCARD_STATE_READY) {
|
if (sdcard.state != SDCARD_STATE_READY) {
|
||||||
if (sdcard.state == SDCARD_STATE_WRITING_MULTIPLE_BLOCKS) {
|
if (sdcard.state == SDCARD_STATE_WRITING_MULTIPLE_BLOCKS) {
|
||||||
|
@ -1056,23 +1056,37 @@ bool sdcard_readBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationComp
|
||||||
/**
|
/**
|
||||||
* Returns true if the SD card has successfully completed its startup procedures.
|
* Returns true if the SD card has successfully completed its startup procedures.
|
||||||
*/
|
*/
|
||||||
bool sdcard_isInitialized(void)
|
static bool sdcardSpi_isInitialized(void)
|
||||||
{
|
{
|
||||||
return sdcard.state >= SDCARD_STATE_READY;
|
return sdcard.state >= SDCARD_STATE_READY;
|
||||||
}
|
}
|
||||||
|
|
||||||
const sdcardMetadata_t* sdcard_getMetadata(void)
|
static const sdcardMetadata_t* sdcardSpi_getMetadata(void)
|
||||||
{
|
{
|
||||||
return &sdcard.metadata;
|
return &sdcard.metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SDCARD_PROFILING
|
#ifdef SDCARD_PROFILING
|
||||||
|
|
||||||
void sdcard_setProfilerCallback(sdcard_profilerCallback_c callback)
|
static void sdcardSpi_setProfilerCallback(sdcard_profilerCallback_c callback)
|
||||||
{
|
{
|
||||||
sdcard.profiler = callback;
|
sdcard.profiler = callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
sdcardVTable_t sdcardSpiVTable = {
|
||||||
|
sdcardSpi_init,
|
||||||
|
sdcardSpi_readBlock,
|
||||||
|
sdcardSpi_beginWriteBlocks,
|
||||||
|
sdcardSpi_writeBlock,
|
||||||
|
sdcardSpi_poll,
|
||||||
|
sdcardSpi_isFunctional,
|
||||||
|
sdcardSpi_isInitialized,
|
||||||
|
sdcardSpi_getMetadata,
|
||||||
|
#ifdef SDCARD_PROFILING
|
||||||
|
sdcardSpi_setProfilerCallback,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue