Switch between SPI and SDIO based on mode

This commit is contained in:
jflyper 2018-10-03 01:32:56 +09:00
parent f34af48dcd
commit a1589766a2
4 changed files with 140 additions and 18 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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