Merge pull request #3789 from opentx/projectkk2glider/issue_3771_sd_lockup
Projectkk2glider/issue 3771 sd lockup
This commit is contained in:
@@ -808,7 +808,7 @@ void AudioQueue::wakeup()
|
||||
|
||||
// push the buffer if needed
|
||||
if (size > 0) {
|
||||
__disable_irq();
|
||||
audioDisableIrq();
|
||||
// TRACE("pushing buffer %d\n", bufferWIdx);
|
||||
bufferWIdx = nextBufferIdx(bufferWIdx);
|
||||
buffer->size = size;
|
||||
@@ -819,7 +819,7 @@ void AudioQueue::wakeup()
|
||||
}
|
||||
#endif
|
||||
audioPushBuffer(buffer);
|
||||
__enable_irq();
|
||||
audioEnableIrq();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -48,7 +48,7 @@ void debugPrintf(const char * format, ...)
|
||||
static struct TraceElement traceBuffer[TRACE_BUFFER_LEN];
|
||||
static uint8_t traceBufferPos;
|
||||
extern Fifo<uint8_t, 512> serial2TxFifo;
|
||||
gtime_t filltm(gtime_t *t, struct gtm *tp);
|
||||
gtime_t filltm(const gtime_t *t, struct gtm *tp);
|
||||
|
||||
void trace_event(enum TraceEvent event, uint32_t data)
|
||||
{
|
||||
|
||||
+13
-5
@@ -54,9 +54,8 @@ uint8_t serial2TracesEnabled();
|
||||
}
|
||||
#endif
|
||||
|
||||
#define TRACE_PING(...) do { debugPrintf(__VA_ARGS__); } while(0)
|
||||
#define TRACE_NOCRLF(...) do { debugPrintf(__VA_ARGS__); } while(0)
|
||||
#define TRACE(...) do { debugPrintf(__VA_ARGS__); debugPrintf("\r\n"); } while(0)
|
||||
#define TRACE_WP(...) debugPrintf(__VA_ARGS__)
|
||||
#define DUMP(data, size) dump(data, size)
|
||||
#define TRACE_DEBUG(...) debugPrintf("-D- " __VA_ARGS__)
|
||||
#define TRACE_DEBUG_WP(...) debugPrintf(__VA_ARGS__)
|
||||
@@ -101,8 +100,11 @@ enum TraceEvent {
|
||||
sd_disk_ioctl_MMC_GET_SDSTAT_1,
|
||||
sd_disk_ioctl_MMC_GET_SDSTAT_2,
|
||||
sd_spi_reset,
|
||||
sd_wait_read,
|
||||
sd_wait_write,
|
||||
sd_irq,
|
||||
|
||||
ff_f_write_validate = 30,
|
||||
ff_f_write_validate = 40,
|
||||
ff_f_write_flag,
|
||||
ff_f_write_clst,
|
||||
ff_f_write_sync_window,
|
||||
@@ -112,20 +114,26 @@ enum TraceEvent {
|
||||
ff_f_write_disk_read,
|
||||
ff_f_write_move_window,
|
||||
|
||||
audio_getNextFilledBuffer_skip = 50,
|
||||
audio_getNextFilledBuffer_skip = 60,
|
||||
};
|
||||
|
||||
struct TraceElement {
|
||||
gtime_t time;
|
||||
uint8_t time_ms;
|
||||
event_t event;
|
||||
enum TraceEvent event;
|
||||
uint32_t data;
|
||||
};
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
void trace_event(enum TraceEvent event, uint32_t data);
|
||||
void trace_event_i(enum TraceEvent event, uint32_t data);
|
||||
const struct TraceElement * getTraceElement(uint16_t idx);
|
||||
void dumpTraceBuffer();
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#define TRACE_EVENT(condition, event, data) if (condition) { trace_event(event, data); }
|
||||
#define TRACEI_EVENT(condition, event, data) if (condition) { trace_event_i(event, data); }
|
||||
|
||||
+26
-3
@@ -159,10 +159,24 @@ bool gpsNewFrameNMEA(char c)
|
||||
if (param == 0) {
|
||||
// Frame identification (accept all GPS talkers (GP: GPS, GL:Glonass, GN:combination, etc...))
|
||||
gps_frame = NO_FRAME;
|
||||
if (string[0] == 'G' && string[2] == 'G' && string[3] == 'G' && string[4] == 'A')
|
||||
if (string[0] == 'G' && string[2] == 'G' && string[3] == 'G' && string[4] == 'A') {
|
||||
gps_frame = FRAME_GGA;
|
||||
if (string[0] == 'G' && string[2] == 'R' && string[3] == 'M' && string[4] == 'C')
|
||||
}
|
||||
else if (string[0] == 'G' && string[2] == 'R' && string[3] == 'M' && string[4] == 'C') {
|
||||
gps_frame = FRAME_RMC;
|
||||
}
|
||||
else {
|
||||
// turn off this frame (do this only once a second)
|
||||
static gtime_t lastGpsCmdSent = 0;
|
||||
if (string[0] == 'G' && g_rtcTime != lastGpsCmdSent) {
|
||||
lastGpsCmdSent = g_rtcTime;
|
||||
char cmd[] = "$PUBX,40,GSV,0,0,0,0";
|
||||
cmd[9] = string[2];
|
||||
cmd[10] = string[3];
|
||||
cmd[11] = string[4];
|
||||
gpsSendFrame(cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch (gps_frame) {
|
||||
@@ -203,6 +217,14 @@ bool gpsNewFrameNMEA(char c)
|
||||
case 1:
|
||||
gps_Msg.time = grab_fields(string, 0);
|
||||
break;
|
||||
case 2:
|
||||
if (string[0] == 'A') {
|
||||
gps_Msg.fix = 1;
|
||||
}
|
||||
else {
|
||||
gps_Msg.fix = 0;
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
gps_Msg.speed = ((grab_fields(string, 1) * 5144L) / 1000L); // speed in cm/s added by Mis
|
||||
break;
|
||||
@@ -309,6 +331,7 @@ void gpsSendFrame(const char * frame)
|
||||
{
|
||||
// send given frame, add checksum and CRLF
|
||||
uint8_t parity = 0;
|
||||
TRACE_NOCRLF("gps> %s", frame);
|
||||
while (*frame) {
|
||||
if (*frame != '$') parity ^= *frame;
|
||||
gpsSendByte(*frame);
|
||||
@@ -319,7 +342,7 @@ void gpsSendFrame(const char * frame)
|
||||
gpsSendByte(hex(parity & 0x0F));
|
||||
gpsSendByte('\r');
|
||||
gpsSendByte('\n');
|
||||
TRACE("parity %02x", parity);
|
||||
TRACE("*%02x", parity);
|
||||
}
|
||||
|
||||
#endif // #if defined(DEBUG)
|
||||
|
||||
@@ -101,7 +101,7 @@ void menuRadioSdManager(event_t _event)
|
||||
if (warningResult) {
|
||||
warningResult = 0;
|
||||
showMessageBox(STR_FORMATTING);
|
||||
closeLogs();
|
||||
logsClose();
|
||||
#if defined(PCBSKY9X)
|
||||
Card_state = SD_ST_DATA;
|
||||
#endif
|
||||
|
||||
@@ -348,7 +348,7 @@ void menuModelSensor(event_t event)
|
||||
case SENSOR_FIELD_LOGS:
|
||||
ON_OFF_MENU_ITEM(sensor->logs, SENSOR_2ND_COLUMN, y, STR_LOGS, attr, event);
|
||||
if (attr && checkIncDec_Ret) {
|
||||
closeLogs();
|
||||
logsClose();
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@ void menuRadioSdManager(event_t _event)
|
||||
if (warningResult) {
|
||||
warningResult = 0;
|
||||
showMessageBox(STR_FORMATTING);
|
||||
closeLogs();
|
||||
logsClose();
|
||||
audioQueue.stopSD();
|
||||
if (f_mkfs(0, 1, 0) == FR_OK) {
|
||||
f_chdir("/");
|
||||
|
||||
@@ -358,7 +358,7 @@ bool menuModelSensor(event_t event)
|
||||
lcdDrawText(MENUS_MARGIN_LEFT, y, STR_LOGS);
|
||||
sensor->logs = editCheckBox(sensor->logs, SENSOR_2ND_COLUMN, y, attr, event);
|
||||
if (attr && checkIncDec_Ret) {
|
||||
closeLogs();
|
||||
logsClose();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -153,7 +153,7 @@ bool menuRadioSdManager(event_t _event)
|
||||
if (warningResult) {
|
||||
warningResult = 0;
|
||||
showMessageBox(STR_FORMATTING);
|
||||
closeLogs();
|
||||
logsClose();
|
||||
audioQueue.stopSD();
|
||||
if (f_mkfs(0, 1, 0) == FR_OK) {
|
||||
f_chdir("/");
|
||||
|
||||
@@ -217,8 +217,8 @@ bool menuStatsTraces(event_t event)
|
||||
lcdDrawNumber(STATS_TRACES_EVENT_POS, y, te->event, LEADING0|LEFT, 3);
|
||||
// data
|
||||
lcdDrawSizedText(STATS_TRACES_DATA_POS, y, "0x", 2);
|
||||
lcdDrawHexNumber(STATS_TRACES_DATA_POS + 20, y, (uint16_t)(te->data >> 16));
|
||||
lcdDrawHexNumber(STATS_TRACES_DATA_POS+ 60, y, (uint16_t)(te->data & 0xFFFF));
|
||||
lcdDrawHexNumber(lcdNextPos, y, (uint16_t)(te->data >> 16));
|
||||
lcdDrawHexNumber(lcdNextPos, y, (uint16_t)(te->data & 0xFFFF));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+15
-7
@@ -21,10 +21,12 @@
|
||||
#include "opentx.h"
|
||||
#include "ff.h"
|
||||
|
||||
FIL g_oLogFile = {0};
|
||||
FIL g_oLogFile __DMA;
|
||||
const pm_char * g_logError = NULL;
|
||||
uint8_t logDelay;
|
||||
|
||||
void writeHeader();
|
||||
|
||||
#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS)
|
||||
#define GET_2POS_STATE(sw) (switchState(SW_ ## sw ## 0) ? -1 : 1)
|
||||
#else
|
||||
@@ -33,7 +35,13 @@ uint8_t logDelay;
|
||||
|
||||
#define GET_3POS_STATE(sw) (switchState(SW_ ## sw ## 0) ? -1 : (switchState(SW_ ## sw ## 2) ? 1 : 0))
|
||||
|
||||
const pm_char * openLogs()
|
||||
|
||||
void logsInit()
|
||||
{
|
||||
memset(&g_oLogFile, 0, sizeof(g_oLogFile));
|
||||
}
|
||||
|
||||
const pm_char * logsOpen()
|
||||
{
|
||||
// Determine and set log file filename
|
||||
FRESULT result;
|
||||
@@ -111,7 +119,7 @@ const pm_char * openLogs()
|
||||
|
||||
tmr10ms_t lastLogTime = 0;
|
||||
|
||||
void closeLogs()
|
||||
void logsClose()
|
||||
{
|
||||
if (f_close(&g_oLogFile) != FR_OK) {
|
||||
// close failed, forget file
|
||||
@@ -204,7 +212,7 @@ uint32_t getLogicalSwitchesStates(uint8_t first)
|
||||
return result;
|
||||
}
|
||||
|
||||
void writeLogs()
|
||||
void logsWrite()
|
||||
{
|
||||
static const pm_char * error_displayed = NULL;
|
||||
|
||||
@@ -214,7 +222,7 @@ void writeLogs()
|
||||
lastLogTime = tmr10ms;
|
||||
|
||||
if (!g_oLogFile.fs) {
|
||||
const pm_char * result = openLogs();
|
||||
const pm_char * result = logsOpen();
|
||||
if (result != NULL) {
|
||||
if (result != error_displayed) {
|
||||
error_displayed = result;
|
||||
@@ -370,14 +378,14 @@ void writeLogs()
|
||||
if (result<0 && !error_displayed) {
|
||||
error_displayed = STR_SDCARD_ERROR;
|
||||
POPUP_WARNING(STR_SDCARD_ERROR);
|
||||
closeLogs();
|
||||
logsClose();
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
error_displayed = NULL;
|
||||
if (g_oLogFile.fs) {
|
||||
closeLogs();
|
||||
logsClose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -391,8 +391,7 @@ void perMain()
|
||||
#endif
|
||||
checkSpeakerVolume();
|
||||
checkEeprom();
|
||||
sdMountPoll();
|
||||
writeLogs();
|
||||
logsWrite();
|
||||
handleUsbConnection();
|
||||
checkTrainerSettings();
|
||||
periodicTick();
|
||||
|
||||
@@ -97,7 +97,7 @@ void perMain()
|
||||
|
||||
#if defined(SDCARD)
|
||||
sdMountPoll();
|
||||
writeLogs();
|
||||
logsWrite();
|
||||
#endif
|
||||
|
||||
event_t evt = getEvent();
|
||||
|
||||
@@ -1993,7 +1993,7 @@ void opentxClose(uint8_t shutdown)
|
||||
}
|
||||
|
||||
#if defined(SDCARD)
|
||||
closeLogs();
|
||||
logsClose();
|
||||
#endif
|
||||
|
||||
saveTimers();
|
||||
@@ -2551,6 +2551,7 @@ void opentxInit(OPENTX_INIT_ARGS)
|
||||
else {
|
||||
#if defined(SDCARD) && !defined(PCBMEGA2560)
|
||||
sdInit();
|
||||
logsInit();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
+9
-1
@@ -446,6 +446,7 @@ void gettime(struct gtm * tm)
|
||||
filltm(&g_rtcTime, tm); // create a struct tm date/time structure from global unix time stamp
|
||||
}
|
||||
|
||||
void rtcGetTime(struct gtm * t);
|
||||
|
||||
#define RTC_ADJUST_PERIOD 60 // how often RTC is checked for accuracy [seconds]
|
||||
#define RTC_ADJUST_TRESHOLD 20 // how much clock must differ before adjustment is made [seconds]
|
||||
@@ -473,7 +474,14 @@ uint8_t rtcAdjust(uint16_t year, uint8_t mon, uint8_t day, uint8_t hour, uint8_t
|
||||
t.tm_sec = sec;
|
||||
gtime_t newTime = gmktime(&t) + g_eeGeneral.timezone * 3600;
|
||||
gtime_t diff = (g_rtcTime > newTime) ? (g_rtcTime - newTime) : (newTime - g_rtcTime);
|
||||
TRACE("rtc: %d, new: %d, diff: %d", g_rtcTime, newTime, diff);
|
||||
|
||||
#if defined(DEBUG)
|
||||
struct gtm utm;
|
||||
rtcGetTime(&utm);
|
||||
gtime_t rtcTime = gmktime(&utm);
|
||||
TRACE("rtc: %d, grtc: %d, gps: %d, diff: %d, ", rtcTime, g_rtcTime, newTime, diff);
|
||||
#endif
|
||||
|
||||
if (diff > RTC_ADJUST_TRESHOLD) {
|
||||
// convert newTime to struct gtm and set RTC clock
|
||||
filltm(&newTime, &t);
|
||||
|
||||
+3
-4
@@ -80,10 +80,9 @@ extern FATFS g_FATFS_Obj;
|
||||
extern FIL g_oLogFile;
|
||||
|
||||
extern uint8_t logDelay;
|
||||
const pm_char *openLogs();
|
||||
void writeHeader();
|
||||
void closeLogs();
|
||||
void writeLogs();
|
||||
void logsInit();
|
||||
void logsClose();
|
||||
void logsWrite();
|
||||
|
||||
uint32_t sdGetNoSectors();
|
||||
uint32_t sdGetSize();
|
||||
|
||||
@@ -484,7 +484,7 @@ const pm_char * eeBackupModel(uint8_t i_fileSrc)
|
||||
UINT written;
|
||||
|
||||
// we must close the logs as we reuse the same FIL structure
|
||||
closeLogs();
|
||||
logsClose();
|
||||
|
||||
// check and create folder here
|
||||
strcpy_P(buf, STR_MODELS_PATH);
|
||||
@@ -567,7 +567,7 @@ const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name)
|
||||
UINT read;
|
||||
|
||||
// we must close the logs as we reuse the same FIL structure
|
||||
closeLogs();
|
||||
logsClose();
|
||||
|
||||
strcpy_P(buf, STR_MODELS_PATH);
|
||||
buf[sizeof(MODELS_PATH)-1] = '/';
|
||||
|
||||
@@ -46,7 +46,7 @@ void preModelLoad()
|
||||
#endif
|
||||
|
||||
#if defined(SDCARD)
|
||||
closeLogs();
|
||||
logsClose();
|
||||
#endif
|
||||
|
||||
if (pulsesStarted()) {
|
||||
|
||||
@@ -161,6 +161,7 @@ void usbSerialPutc(uint8_t c)
|
||||
if (txDataLen >= APP_RX_DATA_SIZE) {
|
||||
txDataLen -= APP_RX_DATA_SIZE;
|
||||
}
|
||||
// TODO timeout exit
|
||||
} while (txDataLen >= (APP_RX_DATA_SIZE - CDC_DATA_MAX_PACKET_SIZE));
|
||||
|
||||
APP_Rx_Buffer[APP_Rx_ptr_in] = c;
|
||||
@@ -172,7 +173,7 @@ void usbSerialPutc(uint8_t c)
|
||||
}
|
||||
else {
|
||||
APP_Rx_ptr_in++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -122,7 +122,6 @@ void sdInit(void);
|
||||
void sdMount(void);
|
||||
void sdDone(void);
|
||||
#define sdPoll10ms()
|
||||
#define sdMountPoll()
|
||||
uint32_t sdMounted(void);
|
||||
#else
|
||||
#define SD_IS_HC() (0)
|
||||
@@ -378,6 +377,8 @@ void usbSerialPutc(uint8_t c);
|
||||
// Audio driver
|
||||
void audioInit(void);
|
||||
void audioConsumeCurrentBuffer(void);
|
||||
#define audioDisableIrq() // interrupts must stay enabled on Horus
|
||||
#define audioEnableIrq() // interrupts must stay enabled on Horus
|
||||
#define setSampleRate(freq)
|
||||
void setScaledVolume(uint8_t volume);
|
||||
void setVolume(uint8_t volume);
|
||||
|
||||
@@ -76,9 +76,10 @@ DSTATUS disk_initialize (
|
||||
}
|
||||
|
||||
/*-------------------------- SD Init ----------------------------- */
|
||||
if (SD_Init() != SD_OK)
|
||||
SD_Error res = SD_Init();
|
||||
if (res != SD_OK)
|
||||
{
|
||||
TRACE("SD_Init() failed");
|
||||
TRACE("SD_Init() failed: %d", res);
|
||||
stat |= STA_NOINIT;
|
||||
}
|
||||
|
||||
@@ -158,7 +159,7 @@ DRESULT __disk_read(
|
||||
if (Status == SD_OK) {
|
||||
SDTransferState State;
|
||||
|
||||
Status = SD_WaitReadOperation(); // Check if the Transfer is finished
|
||||
Status = SD_WaitReadOperation(100*count); // Check if the Transfer is finished
|
||||
|
||||
while ((State = SD_GetStatus()) == SD_TRANSFER_BUSY); // BUSY, OK (DONE), ERROR (FAIL)
|
||||
|
||||
@@ -229,7 +230,7 @@ DRESULT __disk_write(
|
||||
if (Status == SD_OK) {
|
||||
SDTransferState State;
|
||||
|
||||
Status = SD_WaitWriteOperation(); // Check if the Transfer is finished
|
||||
Status = SD_WaitWriteOperation(500*count); // Check if the Transfer is finished
|
||||
|
||||
while((State = SD_GetStatus()) == SD_TRANSFER_BUSY); // BUSY, OK (DONE), ERROR (FAIL)
|
||||
|
||||
|
||||
+573
-485
File diff suppressed because it is too large
Load Diff
@@ -29,27 +29,6 @@
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
// #include "stm32f4_discovery.h"
|
||||
|
||||
/** @addtogroup Utilities
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32_EVAL
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32F4_DISCOVERY
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @addtogroup STM32F4_DISCOVERY_SDIO_SD
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @defgroup STM32F4_DISCOVERY_SDIO_SD_Exported_Types
|
||||
* @{
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
/**
|
||||
@@ -113,21 +92,6 @@ typedef enum
|
||||
SD_TRANSFER_ERROR
|
||||
} SDTransferState;
|
||||
|
||||
/**
|
||||
* @brief SD Card States
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
SD_CARD_READY = ((uint32_t)0x00000001),
|
||||
SD_CARD_IDENTIFICATION = ((uint32_t)0x00000002),
|
||||
SD_CARD_STANDBY = ((uint32_t)0x00000003),
|
||||
SD_CARD_TRANSFER = ((uint32_t)0x00000004),
|
||||
SD_CARD_SENDING = ((uint32_t)0x00000005),
|
||||
SD_CARD_RECEIVING = ((uint32_t)0x00000006),
|
||||
SD_CARD_PROGRAMMING = ((uint32_t)0x00000007),
|
||||
SD_CARD_DISCONNECTED = ((uint32_t)0x00000008),
|
||||
SD_CARD_ERROR = ((uint32_t)0x000000FF)
|
||||
}SDCardState;
|
||||
|
||||
|
||||
/**
|
||||
@@ -194,19 +158,19 @@ typedef struct
|
||||
/**
|
||||
* @brief SD Card Status
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint8_t DAT_BUS_WIDTH;
|
||||
__IO uint8_t SECURED_MODE;
|
||||
__IO uint16_t SD_CARD_TYPE;
|
||||
__IO uint32_t SIZE_OF_PROTECTED_AREA;
|
||||
__IO uint8_t SPEED_CLASS;
|
||||
__IO uint8_t PERFORMANCE_MOVE;
|
||||
__IO uint8_t AU_SIZE;
|
||||
__IO uint16_t ERASE_SIZE;
|
||||
__IO uint8_t ERASE_TIMEOUT;
|
||||
__IO uint8_t ERASE_OFFSET;
|
||||
} SD_CardStatus;
|
||||
// typedef struct
|
||||
// {
|
||||
// __IO uint8_t DAT_BUS_WIDTH;
|
||||
// __IO uint8_t SECURED_MODE;
|
||||
// __IO uint16_t SD_CARD_TYPE;
|
||||
// __IO uint32_t SIZE_OF_PROTECTED_AREA;
|
||||
// __IO uint8_t SPEED_CLASS;
|
||||
// __IO uint8_t PERFORMANCE_MOVE;
|
||||
// __IO uint8_t AU_SIZE;
|
||||
// __IO uint16_t ERASE_SIZE;
|
||||
// __IO uint8_t ERASE_TIMEOUT;
|
||||
// __IO uint8_t ERASE_OFFSET;
|
||||
// } SD_CardStatus;
|
||||
|
||||
|
||||
/**
|
||||
@@ -222,152 +186,30 @@ typedef struct
|
||||
uint8_t CardType;
|
||||
} SD_CardInfo;
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @defgroup STM32F4_DISCOVERY_SDIO_SD_Exported_Constants
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief SDIO Commands Index
|
||||
*/
|
||||
#define SD_CMD_GO_IDLE_STATE ((uint8_t)0)
|
||||
#define SD_CMD_SEND_OP_COND ((uint8_t)1)
|
||||
#define SD_CMD_ALL_SEND_CID ((uint8_t)2)
|
||||
#define SD_CMD_SET_REL_ADDR ((uint8_t)3) /*!< SDIO_SEND_REL_ADDR for SD Card */
|
||||
#define SD_CMD_SET_DSR ((uint8_t)4)
|
||||
#define SD_CMD_SDIO_SEN_OP_COND ((uint8_t)5)
|
||||
#define SD_CMD_HS_SWITCH ((uint8_t)6)
|
||||
#define SD_CMD_SEL_DESEL_CARD ((uint8_t)7)
|
||||
#define SD_CMD_HS_SEND_EXT_CSD ((uint8_t)8)
|
||||
#define SD_CMD_SEND_CSD ((uint8_t)9)
|
||||
#define SD_CMD_SEND_CID ((uint8_t)10)
|
||||
#define SD_CMD_READ_DAT_UNTIL_STOP ((uint8_t)11) /*!< SD Card doesn't support it */
|
||||
#define SD_CMD_STOP_TRANSMISSION ((uint8_t)12)
|
||||
#define SD_CMD_SEND_STATUS ((uint8_t)13)
|
||||
#define SD_CMD_HS_BUSTEST_READ ((uint8_t)14)
|
||||
#define SD_CMD_GO_INACTIVE_STATE ((uint8_t)15)
|
||||
#define SD_CMD_SET_BLOCKLEN ((uint8_t)16)
|
||||
#define SD_CMD_READ_SINGLE_BLOCK ((uint8_t)17)
|
||||
#define SD_CMD_READ_MULT_BLOCK ((uint8_t)18)
|
||||
#define SD_CMD_HS_BUSTEST_WRITE ((uint8_t)19)
|
||||
#define SD_CMD_WRITE_DAT_UNTIL_STOP ((uint8_t)20) /*!< SD Card doesn't support it */
|
||||
#define SD_CMD_SET_BLOCK_COUNT ((uint8_t)23) /*!< SD Card doesn't support it */
|
||||
#define SD_CMD_WRITE_SINGLE_BLOCK ((uint8_t)24)
|
||||
#define SD_CMD_WRITE_MULT_BLOCK ((uint8_t)25)
|
||||
#define SD_CMD_PROG_CID ((uint8_t)26) /*!< reserved for manufacturers */
|
||||
#define SD_CMD_PROG_CSD ((uint8_t)27)
|
||||
#define SD_CMD_SET_WRITE_PROT ((uint8_t)28)
|
||||
#define SD_CMD_CLR_WRITE_PROT ((uint8_t)29)
|
||||
#define SD_CMD_SEND_WRITE_PROT ((uint8_t)30)
|
||||
#define SD_CMD_SD_ERASE_GRP_START ((uint8_t)32) /*!< To set the address of the first write
|
||||
block to be erased. (For SD card only) */
|
||||
#define SD_CMD_SD_ERASE_GRP_END ((uint8_t)33) /*!< To set the address of the last write block of the
|
||||
continuous range to be erased. (For SD card only) */
|
||||
#define SD_CMD_ERASE_GRP_START ((uint8_t)35) /*!< To set the address of the first write block to be erased.
|
||||
(For MMC card only spec 3.31) */
|
||||
|
||||
#define SD_CMD_ERASE_GRP_END ((uint8_t)36) /*!< To set the address of the last write block of the
|
||||
continuous range to be erased. (For MMC card only spec 3.31) */
|
||||
|
||||
#define SD_CMD_ERASE ((uint8_t)38)
|
||||
#define SD_CMD_FAST_IO ((uint8_t)39) /*!< SD Card doesn't support it */
|
||||
#define SD_CMD_GO_IRQ_STATE ((uint8_t)40) /*!< SD Card doesn't support it */
|
||||
#define SD_CMD_LOCK_UNLOCK ((uint8_t)42)
|
||||
#define SD_CMD_APP_CMD ((uint8_t)55)
|
||||
#define SD_CMD_GEN_CMD ((uint8_t)56)
|
||||
#define SD_CMD_NO_CMD ((uint8_t)64)
|
||||
|
||||
/**
|
||||
* @brief Following commands are SD Card Specific commands.
|
||||
* SDIO_APP_CMD should be sent before sending these commands.
|
||||
*/
|
||||
#define SD_CMD_APP_SD_SET_BUSWIDTH ((uint8_t)6) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_STAUS ((uint8_t)13) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_SEND_NUM_WRITE_BLOCKS ((uint8_t)22) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_OP_COND ((uint8_t)41) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_SET_CLR_CARD_DETECT ((uint8_t)42) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_SEND_SCR ((uint8_t)51) /*!< For SD Card only */
|
||||
#define SD_CMD_SDIO_RW_DIRECT ((uint8_t)52) /*!< For SD I/O Card only */
|
||||
#define SD_CMD_SDIO_RW_EXTENDED ((uint8_t)53) /*!< For SD I/O Card only */
|
||||
|
||||
/**
|
||||
* @brief Following commands are SD Card Specific security commands.
|
||||
* SDIO_APP_CMD should be sent before sending these commands.
|
||||
*/
|
||||
#define SD_CMD_SD_APP_GET_MKB ((uint8_t)43) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_GET_MID ((uint8_t)44) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_SET_CER_RN1 ((uint8_t)45) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_GET_CER_RN2 ((uint8_t)46) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_SET_CER_RES2 ((uint8_t)47) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_GET_CER_RES1 ((uint8_t)48) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_SECURE_READ_MULTIPLE_BLOCK ((uint8_t)18) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_SECURE_WRITE_MULTIPLE_BLOCK ((uint8_t)25) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_SECURE_ERASE ((uint8_t)38) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_CHANGE_SECURE_AREA ((uint8_t)49) /*!< For SD Card only */
|
||||
#define SD_CMD_SD_APP_SECURE_WRITE_MKB ((uint8_t)48) /*!< For SD Card only */
|
||||
|
||||
/**
|
||||
* @brief SD detection on its memory slot
|
||||
*/
|
||||
#define SD_PRESENT ((uint8_t)0x01)
|
||||
#define SD_NOT_PRESENT ((uint8_t)0x00)
|
||||
|
||||
/**
|
||||
* @brief Supported SD Memory Cards
|
||||
*/
|
||||
#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((uint32_t)0x00000000)
|
||||
#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((uint32_t)0x00000001)
|
||||
#define SDIO_HIGH_CAPACITY_SD_CARD ((uint32_t)0x00000002)
|
||||
#define SDIO_MULTIMEDIA_CARD ((uint32_t)0x00000003)
|
||||
#define SDIO_SECURE_DIGITAL_IO_CARD ((uint32_t)0x00000004)
|
||||
#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((uint32_t)0x00000005)
|
||||
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((uint32_t)0x00000006)
|
||||
#define SDIO_HIGH_CAPACITY_MMC_CARD ((uint32_t)0x00000007)
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @defgroup STM32F4_DISCOVERY_SDIO_SD_Exported_Macros
|
||||
* @{
|
||||
*/
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/** @defgroup STM32F4_DISCOVERY_SDIO_SD_Exported_Functions
|
||||
* @{
|
||||
*/
|
||||
void SD_DeInit(void);
|
||||
// void SD_DeInit(void);
|
||||
SD_Error SD_Init(void);
|
||||
SDTransferState SD_GetStatus(void);
|
||||
SDCardState SD_GetState(void);
|
||||
uint8_t SD_Detect(void);
|
||||
SD_Error SD_PowerON(void);
|
||||
SD_Error SD_PowerOFF(void);
|
||||
SD_Error SD_InitializeCards(void);
|
||||
SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo);
|
||||
SD_Error SD_GetCardStatus(SD_CardStatus *cardstatus);
|
||||
SD_Error SD_EnableWideBusOperation(uint32_t WideMode);
|
||||
SD_Error SD_SelectDeselect(uint32_t addr);
|
||||
// SD_Error SD_GetCardStatus(SD_CardStatus *cardstatus);
|
||||
SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize);
|
||||
SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);
|
||||
SD_Error SD_ReadMultiBlocksFIXED(uint8_t *readbuff, uint32_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
|
||||
// SD_Error SD_ReadMultiBlocksFIXED(uint8_t *readbuff, uint32_t ReadAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
|
||||
SD_Error SD_WriteBlock(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize);
|
||||
SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);
|
||||
SD_Error SD_WriteMultiBlocksFIXED(uint8_t *writebuff, uint32_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
|
||||
// SD_Error SD_WriteMultiBlocksFIXED(uint8_t *writebuff, uint32_t WriteAddr, uint32_t BlockSize, uint32_t NumberOfBlocks);
|
||||
SDTransferState SD_GetTransferState(void);
|
||||
SD_Error SD_StopTransfer(void);
|
||||
SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr);
|
||||
SD_Error SD_SendStatus(uint32_t *pcardstatus);
|
||||
SD_Error SD_SendSDStatus(uint32_t *psdstatus);
|
||||
SD_Error SD_ProcessIRQSrc(void);
|
||||
void SD_ProcessDMAIRQ(void);
|
||||
SD_Error SD_WaitReadOperation(void);
|
||||
SD_Error SD_WaitWriteOperation(void);
|
||||
// SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr);
|
||||
// SD_Error SD_SendSDStatus(uint32_t *psdstatus);
|
||||
SD_Error SD_WaitReadOperation(uint32_t timeout);
|
||||
SD_Error SD_WaitWriteOperation(uint32_t timeout);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
void audioInit( void ) ;
|
||||
void audioEnd( void ) ;
|
||||
#define audioConsumeCurrentBuffer()
|
||||
#define audioDisableIrq() __disable_irq()
|
||||
#define audioEnableIrq() __enable_irq()
|
||||
|
||||
void setSampleRate( uint32_t frequency ) ;
|
||||
|
||||
|
||||
@@ -260,7 +260,6 @@ void disable_dsm2(uint32_t port);
|
||||
#define sdDone()
|
||||
#else
|
||||
#define sdPoll10ms()
|
||||
void sdMountPoll();
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
@@ -944,73 +944,6 @@ void sdInit()
|
||||
uint8_t sdErrorCount = 0;
|
||||
FATFS g_FATFS_Obj = { 0 };
|
||||
|
||||
void sdMountPoll()
|
||||
{
|
||||
#if 0
|
||||
if (!Card_initialized)
|
||||
return;
|
||||
|
||||
if (!SD_CARD_PRESENT()) {
|
||||
Card_state = SD_ST_EMPTY;
|
||||
Sd_rca = 0;
|
||||
sdErrorCount = 0;
|
||||
}
|
||||
|
||||
switch (Card_state) {
|
||||
case SD_ST_EMPTY:
|
||||
if (SD_CARD_PRESENT()) {
|
||||
Card_state = SD_ST_INIT1;
|
||||
}
|
||||
break;
|
||||
|
||||
case SD_ST_INIT1:
|
||||
sdCmd0();
|
||||
Card_state = SD_ST_INIT2;
|
||||
break;
|
||||
|
||||
case SD_ST_INIT2:
|
||||
sdCmd8(1);
|
||||
Card_state = SD_ST_IDLE;
|
||||
break;
|
||||
|
||||
case SD_ST_IDLE:
|
||||
sdMemInit(1, &Cmd_A41_resp);
|
||||
Card_state = SD_ST_READY;
|
||||
break;
|
||||
|
||||
case SD_ST_READY:
|
||||
if (!sdCmd2()) Card_state = SD_ST_IDENT;
|
||||
break;
|
||||
|
||||
case SD_ST_IDENT:
|
||||
if (!sdCmd3()) Card_state = SD_ST_STBY;
|
||||
break;
|
||||
|
||||
case SD_ST_STBY:
|
||||
sdCmd9();
|
||||
sdCmd7(); // Select Card
|
||||
Card_state = SD_ST_TRAN;
|
||||
break;
|
||||
|
||||
case SD_ST_TRAN:
|
||||
sdAcmd51();
|
||||
sdAcmd6(); // Set bus width to 4 bits, and speed to 9 MHz
|
||||
// Should check the card can do this ****
|
||||
Card_state = SD_ST_DATA;
|
||||
break;
|
||||
|
||||
case SD_ST_DATA:
|
||||
if (!usbPlugged() && f_mount(0, &g_FATFS_Obj) == FR_OK) {
|
||||
Card_state = SD_ST_MOUNTED;
|
||||
}
|
||||
break;
|
||||
|
||||
case SD_ST_ERR:
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void sdInit()
|
||||
{
|
||||
Sd_rca = 0;
|
||||
|
||||
@@ -170,7 +170,7 @@ void usbMassStorage()
|
||||
if (sdMounted()) {
|
||||
Card_state = SD_ST_DATA;
|
||||
audioQueue.stopSD();
|
||||
closeLogs();
|
||||
logsClose();
|
||||
f_mount(NULL, "", 0); // unmount SD
|
||||
}
|
||||
|
||||
|
||||
@@ -146,7 +146,6 @@ void sdInit(void);
|
||||
void sdMount(void);
|
||||
void sdDone(void);
|
||||
void sdPoll10ms(void);
|
||||
#define sdMountPoll()
|
||||
uint32_t sdMounted(void);
|
||||
#define SD_CARD_PRESENT() (~SD_GPIO_PRESENT->IDR & SD_GPIO_PIN_PRESENT)
|
||||
#endif
|
||||
@@ -459,6 +458,8 @@ void setScaledVolume(uint8_t volume);
|
||||
void setVolume(uint8_t volume);
|
||||
int32_t getVolume(void);
|
||||
#define audioConsumeCurrentBuffer()
|
||||
#define audioDisableIrq() __disable_irq()
|
||||
#define audioEnableIrq() __enable_irq()
|
||||
|
||||
// Haptic driver
|
||||
void hapticInit(void);
|
||||
|
||||
Reference in New Issue
Block a user