diff --git a/radio/src/audio_arm.cpp b/radio/src/audio_arm.cpp index 5022e1819..e90ab3c16 100644 --- a/radio/src/audio_arm.cpp +++ b/radio/src/audio_arm.cpp @@ -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(); } } } diff --git a/radio/src/debug.cpp b/radio/src/debug.cpp index 336f31968..171df5c65 100644 --- a/radio/src/debug.cpp +++ b/radio/src/debug.cpp @@ -48,7 +48,7 @@ void debugPrintf(const char * format, ...) static struct TraceElement traceBuffer[TRACE_BUFFER_LEN]; static uint8_t traceBufferPos; extern Fifo 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) { diff --git a/radio/src/debug.h b/radio/src/debug.h index 9c1e5a777..b04e2f55c 100644 --- a/radio/src/debug.h +++ b/radio/src/debug.h @@ -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); } diff --git a/radio/src/gps.cpp b/radio/src/gps.cpp index 380bb1f07..97091a7af 100644 --- a/radio/src/gps.cpp +++ b/radio/src/gps.cpp @@ -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) diff --git a/radio/src/gui/128x64/radio_sdmanager.cpp b/radio/src/gui/128x64/radio_sdmanager.cpp index d087771f8..4cd745c01 100644 --- a/radio/src/gui/128x64/radio_sdmanager.cpp +++ b/radio/src/gui/128x64/radio_sdmanager.cpp @@ -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 diff --git a/radio/src/gui/212x64/model_telemetry.cpp b/radio/src/gui/212x64/model_telemetry.cpp index e26ac7a7b..f7fbb45b1 100644 --- a/radio/src/gui/212x64/model_telemetry.cpp +++ b/radio/src/gui/212x64/model_telemetry.cpp @@ -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; diff --git a/radio/src/gui/212x64/radio_sdmanager.cpp b/radio/src/gui/212x64/radio_sdmanager.cpp index 1e4cb95d8..8f590879d 100644 --- a/radio/src/gui/212x64/radio_sdmanager.cpp +++ b/radio/src/gui/212x64/radio_sdmanager.cpp @@ -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("/"); diff --git a/radio/src/gui/480x272/model_telemetry.cpp b/radio/src/gui/480x272/model_telemetry.cpp index 4f0e8a009..80e7c76e7 100644 --- a/radio/src/gui/480x272/model_telemetry.cpp +++ b/radio/src/gui/480x272/model_telemetry.cpp @@ -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; } diff --git a/radio/src/gui/480x272/radio_sdmanager.cpp b/radio/src/gui/480x272/radio_sdmanager.cpp index 983c3d15e..1ef189300 100644 --- a/radio/src/gui/480x272/radio_sdmanager.cpp +++ b/radio/src/gui/480x272/radio_sdmanager.cpp @@ -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("/"); diff --git a/radio/src/gui/480x272/view_statistics.cpp b/radio/src/gui/480x272/view_statistics.cpp index 224fdb884..9cf36b441 100644 --- a/radio/src/gui/480x272/view_statistics.cpp +++ b/radio/src/gui/480x272/view_statistics.cpp @@ -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)); } } diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index d7ba17673..58bb59838 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -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(); } } } diff --git a/radio/src/main_arm.cpp b/radio/src/main_arm.cpp index 5a4708d86..a2f712358 100644 --- a/radio/src/main_arm.cpp +++ b/radio/src/main_arm.cpp @@ -391,8 +391,7 @@ void perMain() #endif checkSpeakerVolume(); checkEeprom(); - sdMountPoll(); - writeLogs(); + logsWrite(); handleUsbConnection(); checkTrainerSettings(); periodicTick(); diff --git a/radio/src/main_avr.cpp b/radio/src/main_avr.cpp index 33b29cfb6..24aaa1e9f 100644 --- a/radio/src/main_avr.cpp +++ b/radio/src/main_avr.cpp @@ -97,7 +97,7 @@ void perMain() #if defined(SDCARD) sdMountPoll(); - writeLogs(); + logsWrite(); #endif event_t evt = getEvent(); diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index a47cd5fb4..c225b47e6 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -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 } diff --git a/radio/src/rtc.cpp b/radio/src/rtc.cpp index 9601dd070..d8da110e0 100644 --- a/radio/src/rtc.cpp +++ b/radio/src/rtc.cpp @@ -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); diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index a2269fd62..2db7fe0f5 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -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(); diff --git a/radio/src/storage/eeprom_rlc.cpp b/radio/src/storage/eeprom_rlc.cpp index 65e9b867a..6735d8e6b 100644 --- a/radio/src/storage/eeprom_rlc.cpp +++ b/radio/src/storage/eeprom_rlc.cpp @@ -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] = '/'; diff --git a/radio/src/storage/storage_common.cpp b/radio/src/storage/storage_common.cpp index 216fb1c2d..2f3342c41 100644 --- a/radio/src/storage/storage_common.cpp +++ b/radio/src/storage/storage_common.cpp @@ -46,7 +46,7 @@ void preModelLoad() #endif #if defined(SDCARD) - closeLogs(); + logsClose(); #endif if (pulsesStarted()) { diff --git a/radio/src/targets/common/arm/stm32/usbd_cdc.cpp b/radio/src/targets/common/arm/stm32/usbd_cdc.cpp index daaa70cfb..cd14ffc84 100644 --- a/radio/src/targets/common/arm/stm32/usbd_cdc.cpp +++ b/radio/src/targets/common/arm/stm32/usbd_cdc.cpp @@ -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++; - } + } } /** diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index 5b02664bb..e02d14fad 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -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); diff --git a/radio/src/targets/horus/diskio.cpp b/radio/src/targets/horus/diskio.cpp index 879222d8d..3996543f7 100644 --- a/radio/src/targets/horus/diskio.cpp +++ b/radio/src/targets/horus/diskio.cpp @@ -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) diff --git a/radio/src/targets/horus/sdio_sd.c b/radio/src/targets/horus/sdio_sd.c index 30846319f..29b3d1302 100644 --- a/radio/src/targets/horus/sdio_sd.c +++ b/radio/src/targets/horus/sdio_sd.c @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -21,35 +21,6 @@ #include "sdio_sd.h" #include "../../debug.h" -/** @addtogroup Utilities - * @{ - */ - -/** @addtogroup STM32_EVAL - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY - * @{ - */ - -/** @addtogroup STM32F4_DISCOVERY_SDIO_SD - * @brief This file provides all the SD Card driver firmware functions. - * @{ - */ - -/** @defgroup STM32F4_DISCOVERY_SDIO_SD_Private_Types - * @{ - */ -/** - * @} - */ - - -/** @defgroup STM32F4_DISCOVERY_SDIO_SD_Private_Defines - * @{ - */ - /** * @brief SDIO Static flags, TimeOut, FIFO Address */ @@ -99,7 +70,7 @@ #define SD_SINGLE_BUS_SUPPORT ((uint32_t)0x00010000) #define SD_CARD_LOCKED ((uint32_t)0x02000000) -#define SD_DATATIMEOUT ((uint32_t)0xFFFFFFFF) +#define SD_DATATIMEOUT ((uint32_t)100000) #define SD_0TO7BITS ((uint32_t)0x000000FF) #define SD_8TO15BITS ((uint32_t)0x0000FF00) #define SD_16TO23BITS ((uint32_t)0x00FF0000) @@ -122,12 +93,123 @@ */ #define SDIO_SEND_IF_COND ((uint32_t)0x00000008) + +/** + * @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 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) + + +/** + * @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; + + + static uint32_t CardType = SDIO_STD_CAPACITY_SD_CARD_V1_1; static uint32_t CSD_Tab[4], CID_Tab[4], RCA = 0; -static uint8_t SDSTATUS_Tab[16]; -__IO uint32_t StopCondition = 0; +// static uint8_t SDSTATUS_Tab[16]; +__IO uint8_t StopCondition = 0; __IO SD_Error TransferError = SD_OK; -__IO uint32_t TransferEnd = 0, DMAEndOfTransfer = 0; +__IO uint8_t TransferEnd = 0, DMAEndOfTransfer = 0; SD_CardInfo SDCardInfo; SDIO_InitTypeDef SDIO_InitStructure; @@ -141,52 +223,75 @@ static SD_Error CmdResp3Error(void); static SD_Error CmdResp2Error(void); static SD_Error CmdResp6Error(uint8_t cmd, uint16_t *prca); static SD_Error SDEnWideBus(FunctionalState NewState); -static SD_Error IsCardProgramming(uint8_t *pstatus); +// static SD_Error IsCardProgramming(uint8_t *pstatus); static SD_Error FindSCR(uint16_t rca, uint32_t *pscr); -uint8_t convert_from_bytes_to_power_of_two(uint16_t NumberOfBytes); +// uint8_t convert_from_bytes_to_power_of_two(uint16_t NumberOfBytes); + +SD_Error SD_PowerON(void); +SDCardState SD_GetState(void); +SD_Error SD_InitializeCards(void); +SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo); +SD_Error SD_EnableWideBusOperation(uint32_t WideMode); +SD_Error SD_SelectDeselect(uint32_t addr); +SD_Error SD_StopTransfer(void); +SD_Error SD_SendStatus(uint32_t *pcardstatus); + + + + + + + + + + + + + + /** * @brief DeInitializes the SDIO interface. * @param None * @retval None */ -void SD_LowLevel_DeInit(void) -{ - GPIO_InitTypeDef GPIO_InitStructure; +// void SD_LowLevel_DeInit(void) +// { +// GPIO_InitTypeDef GPIO_InitStructure; - /*!< Disable SDIO Clock */ - SDIO_ClockCmd(DISABLE); +// /*!< Disable SDIO Clock */ +// SDIO_ClockCmd(DISABLE); - /*!< Set Power State to OFF */ - SDIO_SetPowerState(SDIO_PowerState_OFF); +// /*!< Set Power State to OFF */ +// SDIO_SetPowerState(SDIO_PowerState_OFF); - /*!< DeInitializes the SDIO peripheral */ - SDIO_DeInit(); +// /*!< DeInitializes the SDIO peripheral */ +// SDIO_DeInit(); - /* Disable the SDIO APB2 Clock */ - RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, DISABLE); +// /* Disable the SDIO APB2 Clock */ +// RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, DISABLE); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_MCO); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_MCO); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_MCO); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_MCO); - GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_MCO); - GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_MCO); +// GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_MCO); +// GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_MCO); +// GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_MCO); +// GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_MCO); +// GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_MCO); +// GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_MCO); - /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; - GPIO_Init(GPIOC, &GPIO_InitStructure); +// /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */ +// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; +// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; +// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; +// GPIO_Init(GPIOC, &GPIO_InitStructure); - /* Configure PD.02 CMD line */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; - GPIO_Init(GPIOD, &GPIO_InitStructure); +// /* Configure PD.02 CMD line */ +// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; +// GPIO_Init(GPIOD, &GPIO_InitStructure); - /* Configure PC.12 pin: CLK pin */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; - GPIO_Init(GPIOC, &GPIO_InitStructure); -} +// /* Configure PC.12 pin: CLK pin */ +// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; +// GPIO_Init(GPIOC, &GPIO_InitStructure); +// } /** * @brief Initializes the SD Card and put it into StandBy State (Ready for @@ -327,19 +432,19 @@ void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize) */ -/** @defgroup STM32F4_DISCOVERY_SDIO_SD_Private_Functions - * @{ - */ +// /** @defgroup STM32F4_DISCOVERY_SDIO_SD_Private_Functions +// * @{ +// */ -/** - * @brief DeInitializes the SDIO interface. - * @param None - * @retval None - */ -void SD_DeInit(void) -{ - SD_LowLevel_DeInit(); -} +// * +// * @brief DeInitializes the SDIO interface. +// * @param None +// * @retval None + +// void SD_DeInit(void) +// { +// SD_LowLevel_DeInit(); +// } /** * @brief Initializes the SD Card and put it into StandBy State (Ready for data @@ -948,80 +1053,80 @@ OPTIMIZE("O0") SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo) * @arg SDIO_BusWide_1b: 1-bit data transfer * @retval SD_Error: SD Card Error code. */ -OPTIMIZE("O0") SD_Error SD_GetCardStatus(SD_CardStatus *cardstatus) -{ - SD_Error errorstatus = SD_OK; - uint8_t tmp = 0; +// OPTIMIZE("O0") SD_Error SD_GetCardStatus(SD_CardStatus *cardstatus) +// { +// SD_Error errorstatus = SD_OK; +// uint8_t tmp = 0; - errorstatus = SD_SendSDStatus((uint32_t *)SDSTATUS_Tab); +// errorstatus = SD_SendSDStatus((uint32_t *)SDSTATUS_Tab); - if (errorstatus != SD_OK) - { - return(errorstatus); - } +// if (errorstatus != SD_OK) +// { +// return(errorstatus); +// } - /*!< Byte 0 */ - tmp = (uint8_t)((SDSTATUS_Tab[0] & 0xC0) >> 6); - cardstatus->DAT_BUS_WIDTH = tmp; +// /*!< Byte 0 */ +// tmp = (uint8_t)((SDSTATUS_Tab[0] & 0xC0) >> 6); +// cardstatus->DAT_BUS_WIDTH = tmp; - /*!< Byte 0 */ - tmp = (uint8_t)((SDSTATUS_Tab[0] & 0x20) >> 5); - cardstatus->SECURED_MODE = tmp; +// /*!< Byte 0 */ +// tmp = (uint8_t)((SDSTATUS_Tab[0] & 0x20) >> 5); +// cardstatus->SECURED_MODE = tmp; - /*!< Byte 2 */ - tmp = (uint8_t)((SDSTATUS_Tab[2] & 0xFF)); - cardstatus->SD_CARD_TYPE = tmp << 8; +// /*!< Byte 2 */ +// tmp = (uint8_t)((SDSTATUS_Tab[2] & 0xFF)); +// cardstatus->SD_CARD_TYPE = tmp << 8; - /*!< Byte 3 */ - tmp = (uint8_t)((SDSTATUS_Tab[3] & 0xFF)); - cardstatus->SD_CARD_TYPE |= tmp; +// /*!< Byte 3 */ +// tmp = (uint8_t)((SDSTATUS_Tab[3] & 0xFF)); +// cardstatus->SD_CARD_TYPE |= tmp; - /*!< Byte 4 */ - tmp = (uint8_t)(SDSTATUS_Tab[4] & 0xFF); - cardstatus->SIZE_OF_PROTECTED_AREA = tmp << 24; +// /*!< Byte 4 */ +// tmp = (uint8_t)(SDSTATUS_Tab[4] & 0xFF); +// cardstatus->SIZE_OF_PROTECTED_AREA = tmp << 24; - /*!< Byte 5 */ - tmp = (uint8_t)(SDSTATUS_Tab[5] & 0xFF); - cardstatus->SIZE_OF_PROTECTED_AREA |= tmp << 16; +// /*!< Byte 5 */ +// tmp = (uint8_t)(SDSTATUS_Tab[5] & 0xFF); +// cardstatus->SIZE_OF_PROTECTED_AREA |= tmp << 16; - /*!< Byte 6 */ - tmp = (uint8_t)(SDSTATUS_Tab[6] & 0xFF); - cardstatus->SIZE_OF_PROTECTED_AREA |= tmp << 8; +// /*!< Byte 6 */ +// tmp = (uint8_t)(SDSTATUS_Tab[6] & 0xFF); +// cardstatus->SIZE_OF_PROTECTED_AREA |= tmp << 8; - /*!< Byte 7 */ - tmp = (uint8_t)(SDSTATUS_Tab[7] & 0xFF); - cardstatus->SIZE_OF_PROTECTED_AREA |= tmp; +// /*!< Byte 7 */ +// tmp = (uint8_t)(SDSTATUS_Tab[7] & 0xFF); +// cardstatus->SIZE_OF_PROTECTED_AREA |= tmp; - /*!< Byte 8 */ - tmp = (uint8_t)((SDSTATUS_Tab[8] & 0xFF)); - cardstatus->SPEED_CLASS = tmp; +// /*!< Byte 8 */ +// tmp = (uint8_t)((SDSTATUS_Tab[8] & 0xFF)); +// cardstatus->SPEED_CLASS = tmp; - /*!< Byte 9 */ - tmp = (uint8_t)((SDSTATUS_Tab[9] & 0xFF)); - cardstatus->PERFORMANCE_MOVE = tmp; +// /*!< Byte 9 */ +// tmp = (uint8_t)((SDSTATUS_Tab[9] & 0xFF)); +// cardstatus->PERFORMANCE_MOVE = tmp; - /*!< Byte 10 */ - tmp = (uint8_t)((SDSTATUS_Tab[10] & 0xF0) >> 4); - cardstatus->AU_SIZE = tmp; +// /*!< Byte 10 */ +// tmp = (uint8_t)((SDSTATUS_Tab[10] & 0xF0) >> 4); +// cardstatus->AU_SIZE = tmp; - /*!< Byte 11 */ - tmp = (uint8_t)(SDSTATUS_Tab[11] & 0xFF); - cardstatus->ERASE_SIZE = tmp << 8; +// /*!< Byte 11 */ +// tmp = (uint8_t)(SDSTATUS_Tab[11] & 0xFF); +// cardstatus->ERASE_SIZE = tmp << 8; - /*!< Byte 12 */ - tmp = (uint8_t)(SDSTATUS_Tab[12] & 0xFF); - cardstatus->ERASE_SIZE |= tmp; +// /*!< Byte 12 */ +// tmp = (uint8_t)(SDSTATUS_Tab[12] & 0xFF); +// cardstatus->ERASE_SIZE |= tmp; - /*!< Byte 13 */ - tmp = (uint8_t)((SDSTATUS_Tab[13] & 0xFC) >> 2); - cardstatus->ERASE_TIMEOUT = tmp; +// /*!< Byte 13 */ +// tmp = (uint8_t)((SDSTATUS_Tab[13] & 0xFC) >> 2); +// cardstatus->ERASE_TIMEOUT = tmp; - /*!< Byte 13 */ - tmp = (uint8_t)((SDSTATUS_Tab[13] & 0x3)); - cardstatus->ERASE_OFFSET = tmp; +// /*!< Byte 13 */ +// tmp = (uint8_t)((SDSTATUS_Tab[13] & 0x3)); +// cardstatus->ERASE_OFFSET = tmp; - return(errorstatus); -} +// return(errorstatus); +// } /** * @brief Enables wide bus opeartion for the requeseted card if supported by @@ -1133,11 +1238,11 @@ OPTIMIZE("O0") SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint1 DMAEndOfTransfer = 0; SDIO->DCTRL = 0x0; - + SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE); SDIO_DMACmd(ENABLE); SD_LowLevel_DMA_RxConfig((uint32_t *)readbuff, BlockSize); - + if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) BlockSize = 512; else @@ -1160,7 +1265,7 @@ OPTIMIZE("O0") SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint1 SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; SDIO_DataInitStructure.SDIO_DataLength = BlockSize; - SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4; + SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_512b; SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; @@ -1206,7 +1311,7 @@ OPTIMIZE("O0") SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr, TransferEnd = 0; StopCondition = 1; DMAEndOfTransfer = 0; - + SDIO->DCTRL = 0x0; SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE); @@ -1233,9 +1338,9 @@ OPTIMIZE("O0") SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr, return(errorstatus); } - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; + SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT * NumberOfBlocks; SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize; - SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4; + SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_512b; SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; @@ -1267,26 +1372,27 @@ OPTIMIZE("O0") SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr, * @param None. * @retval SD_Error: SD Card Error code. */ -OPTIMIZE("O0") SD_Error SD_WaitReadOperation(void) +OPTIMIZE("O0") SD_Error SD_WaitReadOperation(uint32_t timeout) { SD_Error errorstatus = SD_OK; - uint32_t timeout; - timeout = SD_DATATIMEOUT; - - while ((DMAEndOfTransfer == 0x00) && (TransferEnd == 0) && (TransferError == SD_OK) && (timeout > 0)) + while (!DMAEndOfTransfer && !TransferEnd && (TransferError == SD_OK) && (timeout > 0)) { + delay_ms(1); timeout--; } + TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_read, (TransferError << 8) + (DMAEndOfTransfer << 1) + TransferEnd); - DMAEndOfTransfer = 0x00; + DMAEndOfTransfer = 0; - timeout = SD_DATATIMEOUT; + timeout = 10; while(((SDIO->STA & SDIO_FLAG_RXACT)) && (timeout > 0)) { + delay_ms(1); timeout--; } + TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_read, -1); if (StopCondition == 1) { @@ -1335,7 +1441,7 @@ OPTIMIZE("O0") SD_Error SD_WriteBlock(uint8_t *writebuff, uint32_t WriteAddr, ui StopCondition = 0; SDIO->DCTRL = 0x0; - + SDIO_ITConfig(SDIO_IT_DCRCFAIL | SDIO_IT_DTIMEOUT | SDIO_IT_DATAEND | SDIO_IT_RXOVERR | SDIO_IT_STBITERR, ENABLE); SD_LowLevel_DMA_TxConfig((uint32_t *)writebuff, BlockSize); SDIO_DMACmd(ENABLE); @@ -1377,12 +1483,12 @@ OPTIMIZE("O0") SD_Error SD_WriteBlock(uint8_t *writebuff, uint32_t WriteAddr, ui SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; SDIO_DataInitStructure.SDIO_DataLength = BlockSize; - SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4; + SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_512b; SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard; SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; SDIO_DataConfig(&SDIO_DataInitStructure); - + return(errorstatus); } @@ -1483,9 +1589,9 @@ OPTIMIZE("O0") SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAd return(errorstatus); } - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; + SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT * NumberOfBlocks; SDIO_DataInitStructure.SDIO_DataLength = NumberOfBlocks * BlockSize; - SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4; + SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_512b; SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard; SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; @@ -1503,26 +1609,27 @@ OPTIMIZE("O0") SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAd * @param None. * @retval SD_Error: SD Card Error code. */ -OPTIMIZE("O0") SD_Error SD_WaitWriteOperation(void) +OPTIMIZE("O0") SD_Error SD_WaitWriteOperation(uint32_t timeout) { SD_Error errorstatus = SD_OK; - uint32_t timeout; - timeout = SD_DATATIMEOUT; - - while ((DMAEndOfTransfer == 0x00) && (TransferEnd == 0) && (TransferError == SD_OK) && (timeout > 0)) + while (!DMAEndOfTransfer && !TransferEnd && (TransferError == SD_OK) && (timeout > 0)) { + delay_ms(1); timeout--; } + TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_write, (TransferError << 8) + (DMAEndOfTransfer << 1) + TransferEnd); - DMAEndOfTransfer = 0x00; + DMAEndOfTransfer = 0; - timeout = SD_DATATIMEOUT; + timeout = 10; while(((SDIO->STA & SDIO_FLAG_TXACT)) && (timeout > 0)) { + delay_ms(1); timeout--; } + TRACE_SD_CARD_EVENT((timeout == 0), sd_wait_write, -1); if (StopCondition == 1) { @@ -1596,95 +1703,95 @@ OPTIMIZE("O0") SD_Error SD_StopTransfer(void) * @param endaddr: the end address. * @retval SD_Error: SD Card Error code. */ -OPTIMIZE("O0") SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr) -{ - SD_Error errorstatus = SD_OK; - uint32_t delay = 0; - __IO uint32_t maxdelay = 0; - uint8_t cardstate = 0; +// OPTIMIZE("O0") SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr) +// { +// SD_Error errorstatus = SD_OK; +// uint32_t delay = 0; +// __IO uint32_t maxdelay = 0; +// uint8_t cardstate = 0; - /*!< Check if the card coomnd class supports erase command */ - if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0) - { - errorstatus = SD_REQUEST_NOT_APPLICABLE; - return(errorstatus); - } +// /*!< Check if the card coomnd class supports erase command */ +// if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0) +// { +// errorstatus = SD_REQUEST_NOT_APPLICABLE; +// return(errorstatus); +// } - maxdelay = 120000 / ((SDIO->CLKCR & 0xFF) + 2); +// maxdelay = 120000 / ((SDIO->CLKCR & 0xFF) + 2); - if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) - { - errorstatus = SD_LOCK_UNLOCK_FAILED; - return(errorstatus); - } +// if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) +// { +// errorstatus = SD_LOCK_UNLOCK_FAILED; +// return(errorstatus); +// } - if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) - { - startaddr /= 512; - endaddr /= 512; - } +// if (CardType == SDIO_HIGH_CAPACITY_SD_CARD) +// { +// startaddr /= 512; +// endaddr /= 512; +// } - /*!< According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */ - if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType)) - { - /*!< Send CMD32 SD_ERASE_GRP_START with argument as addr */ - SDIO_CmdInitStructure.SDIO_Argument = startaddr; - SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_START; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); +// /*!< According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */ +// if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType)) +// { +// /*!< Send CMD32 SD_ERASE_GRP_START with argument as addr */ +// SDIO_CmdInitStructure.SDIO_Argument = startaddr; +// SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_START; +// SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; +// SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; +// SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; +// SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_START); - if (errorstatus != SD_OK) - { - return(errorstatus); - } +// errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_START); +// if (errorstatus != SD_OK) +// { +// return(errorstatus); +// } - /*!< Send CMD33 SD_ERASE_GRP_END with argument as addr */ - SDIO_CmdInitStructure.SDIO_Argument = endaddr; - SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_END; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); +// /*!< Send CMD33 SD_ERASE_GRP_END with argument as addr */ +// SDIO_CmdInitStructure.SDIO_Argument = endaddr; +// SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_END; +// SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; +// SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; +// SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; +// SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_END); - if (errorstatus != SD_OK) - { - return(errorstatus); - } - } +// errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_END); +// if (errorstatus != SD_OK) +// { +// return(errorstatus); +// } +// } - /*!< Send CMD38 ERASE */ - SDIO_CmdInitStructure.SDIO_Argument = 0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ERASE; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); +// /*!< Send CMD38 ERASE */ +// SDIO_CmdInitStructure.SDIO_Argument = 0; +// SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ERASE; +// SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; +// SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; +// SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; +// SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SD_CMD_ERASE); +// errorstatus = CmdResp1Error(SD_CMD_ERASE); - if (errorstatus != SD_OK) - { - return(errorstatus); - } +// if (errorstatus != SD_OK) +// { +// return(errorstatus); +// } - for (delay = 0; delay < maxdelay; delay++) - {} +// for (delay = 0; delay < maxdelay; delay++) +// {} - /*!< Wait till the card is in programming state */ - errorstatus = IsCardProgramming(&cardstate); - delay = SD_DATATIMEOUT; - while ((delay > 0) && (errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate))) - { - errorstatus = IsCardProgramming(&cardstate); - delay--; - } +// /*!< Wait till the card is in programming state */ +// errorstatus = IsCardProgramming(&cardstate); +// delay = SD_DATATIMEOUT; +// while ((delay > 0) && (errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate))) +// { +// errorstatus = IsCardProgramming(&cardstate); +// delay--; +// } - return(errorstatus); -} +// return(errorstatus); +// } /** * @brief Returns the current card's status. @@ -1727,117 +1834,117 @@ OPTIMIZE("O0") SD_Error SD_SendStatus(uint32_t *pcardstatus) * (SD Status register). * @retval SD_Error: SD Card Error code. */ -OPTIMIZE("O0") SD_Error SD_SendSDStatus(uint32_t *psdstatus) -{ - SD_Error errorstatus = SD_OK; - uint32_t count = 0; +// OPTIMIZE("O0") SD_Error SD_SendSDStatus(uint32_t *psdstatus) +// { +// SD_Error errorstatus = SD_OK; +// uint32_t count = 0; - if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) - { - errorstatus = SD_LOCK_UNLOCK_FAILED; - return(errorstatus); - } +// if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) +// { +// errorstatus = SD_LOCK_UNLOCK_FAILED; +// return(errorstatus); +// } - /*!< Set block size for card if it is not equal to current block size for card. */ - SDIO_CmdInitStructure.SDIO_Argument = 64; - SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); +// /*!< Set block size for card if it is not equal to current block size for card. */ +// SDIO_CmdInitStructure.SDIO_Argument = 64; +// SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN; +// SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; +// SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; +// SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; +// SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN); +// errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN); - if (errorstatus != SD_OK) - { - return(errorstatus); - } +// if (errorstatus != SD_OK) +// { +// return(errorstatus); +// } - /*!< CMD55 */ - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; - SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SD_CMD_APP_CMD); +// /*!< CMD55 */ +// SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; +// SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD; +// SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; +// SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; +// SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; +// SDIO_SendCommand(&SDIO_CmdInitStructure); +// errorstatus = CmdResp1Error(SD_CMD_APP_CMD); - if (errorstatus != SD_OK) - { - return(errorstatus); - } +// if (errorstatus != SD_OK) +// { +// return(errorstatus); +// } - SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; - SDIO_DataInitStructure.SDIO_DataLength = 64; - SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_64b; - SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; - SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; - SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; - SDIO_DataConfig(&SDIO_DataInitStructure); +// SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT; +// SDIO_DataInitStructure.SDIO_DataLength = 64; +// SDIO_DataInitStructure.SDIO_DataBlockSize = SDIO_DataBlockSize_64b; +// SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO; +// SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block; +// SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; +// SDIO_DataConfig(&SDIO_DataInitStructure); - /*!< Send ACMD13 SD_APP_STAUS with argument as card's RCA.*/ - SDIO_CmdInitStructure.SDIO_Argument = 0; - SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_STAUS; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); - errorstatus = CmdResp1Error(SD_CMD_SD_APP_STAUS); +// /*!< Send ACMD13 SD_APP_STAUS with argument as card's RCA.*/ +// SDIO_CmdInitStructure.SDIO_Argument = 0; +// SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_STAUS; +// SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; +// SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; +// SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; +// SDIO_SendCommand(&SDIO_CmdInitStructure); +// errorstatus = CmdResp1Error(SD_CMD_SD_APP_STAUS); - if (errorstatus != SD_OK) - { - return(errorstatus); - } +// if (errorstatus != SD_OK) +// { +// return(errorstatus); +// } - while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))) - { - if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET) - { - for (count = 0; count < 8; count++) - { - *(psdstatus + count) = SDIO_ReadData(); - } - psdstatus += 8; - } - } +// while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))) +// { +// if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET) +// { +// for (count = 0; count < 8; count++) +// { +// *(psdstatus + count) = SDIO_ReadData(); +// } +// psdstatus += 8; +// } +// } - if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT); - errorstatus = SD_DATA_TIMEOUT; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL); - errorstatus = SD_DATA_CRC_FAIL; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_RXOVERR); - errorstatus = SD_RX_OVERRUN; - return(errorstatus); - } - else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET) - { - SDIO_ClearFlag(SDIO_FLAG_STBITERR); - errorstatus = SD_START_BIT_ERR; - return(errorstatus); - } +// if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET) +// { +// SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT); +// errorstatus = SD_DATA_TIMEOUT; +// return(errorstatus); +// } +// else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET) +// { +// SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL); +// errorstatus = SD_DATA_CRC_FAIL; +// return(errorstatus); +// } +// else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET) +// { +// SDIO_ClearFlag(SDIO_FLAG_RXOVERR); +// errorstatus = SD_RX_OVERRUN; +// return(errorstatus); +// } +// else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET) +// { +// SDIO_ClearFlag(SDIO_FLAG_STBITERR); +// errorstatus = SD_START_BIT_ERR; +// return(errorstatus); +// } - count = SD_DATATIMEOUT; - while ((SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET) && (count > 0)) - { - *psdstatus = SDIO_ReadData(); - psdstatus++; - count--; - } - /*!< Clear all the static status flags*/ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); +// count = SD_DATATIMEOUT; +// while ((SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET) && (count > 0)) +// { +// *psdstatus = SDIO_ReadData(); +// psdstatus++; +// count--; +// } +// /*!< Clear all the static status flags*/ +// SDIO_ClearFlag(SDIO_STATIC_FLAGS); - return(errorstatus); -} +// return(errorstatus); +// } /** * @brief Allows to process all the interrupts that are high. @@ -1893,7 +2000,7 @@ OPTIMIZE("O0") void SD_ProcessDMAIRQ(void) { if(DMA2->LISR & SD_SDIO_DMA_FLAG_TCIF) { - DMAEndOfTransfer = 0x01; + DMAEndOfTransfer = 1; DMA_ClearFlag(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_TCIF|SD_SDIO_DMA_FLAG_FEIF); } } @@ -2364,158 +2471,158 @@ OPTIMIZE("O0") static SD_Error SDEnWideBus(FunctionalState NewState) * @param pstatus: pointer to the variable that will contain the SD card state. * @retval SD_Error: SD Card Error code. */ -OPTIMIZE("O0") static SD_Error IsCardProgramming(uint8_t *pstatus) -{ - SD_Error errorstatus = SD_OK; - __IO uint32_t respR1 = 0, status = 0; +// OPTIMIZE("O0") static SD_Error IsCardProgramming(uint8_t *pstatus) +// { +// SD_Error errorstatus = SD_OK; +// __IO uint32_t respR1 = 0, status = 0; - SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; - SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_STATUS; - SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; - SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; - SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; - SDIO_SendCommand(&SDIO_CmdInitStructure); +// SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) RCA << 16; +// SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_STATUS; +// SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; +// SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No; +// SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable; +// SDIO_SendCommand(&SDIO_CmdInitStructure); - status = SDIO->STA; - while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))) - { - status = SDIO->STA; - } +// status = SDIO->STA; +// while (!(status & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT))) +// { +// status = SDIO->STA; +// } - if (status & SDIO_FLAG_CTIMEOUT) - { - errorstatus = SD_CMD_RSP_TIMEOUT; - SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); - return(errorstatus); - } - else if (status & SDIO_FLAG_CCRCFAIL) - { - errorstatus = SD_CMD_CRC_FAIL; - SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); - return(errorstatus); - } +// if (status & SDIO_FLAG_CTIMEOUT) +// { +// errorstatus = SD_CMD_RSP_TIMEOUT; +// SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); +// return(errorstatus); +// } +// else if (status & SDIO_FLAG_CCRCFAIL) +// { +// errorstatus = SD_CMD_CRC_FAIL; +// SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); +// return(errorstatus); +// } - status = (uint32_t)SDIO_GetCommandResponse(); +// status = (uint32_t)SDIO_GetCommandResponse(); - /*!< Check response received is of desired command */ - if (status != SD_CMD_SEND_STATUS) - { - errorstatus = SD_ILLEGAL_CMD; - return(errorstatus); - } +// /*!< Check response received is of desired command */ +// if (status != SD_CMD_SEND_STATUS) +// { +// errorstatus = SD_ILLEGAL_CMD; +// return(errorstatus); +// } - /*!< Clear all the static flags */ - SDIO_ClearFlag(SDIO_STATIC_FLAGS); +// /*!< Clear all the static flags */ +// SDIO_ClearFlag(SDIO_STATIC_FLAGS); - /*!< We have received response, retrieve it for analysis */ - respR1 = SDIO_GetResponse(SDIO_RESP1); +// /*!< We have received response, retrieve it for analysis */ +// respR1 = SDIO_GetResponse(SDIO_RESP1); - /*!< Find out card status */ - *pstatus = (uint8_t) ((respR1 >> 9) & 0x0000000F); +// /*!< Find out card status */ +// *pstatus = (uint8_t) ((respR1 >> 9) & 0x0000000F); - if ((respR1 & SD_OCR_ERRORBITS) == SD_ALLZERO) - { - return(errorstatus); - } +// if ((respR1 & SD_OCR_ERRORBITS) == SD_ALLZERO) +// { +// return(errorstatus); +// } - if (respR1 & SD_OCR_ADDR_OUT_OF_RANGE) - { - return(SD_ADDR_OUT_OF_RANGE); - } +// if (respR1 & SD_OCR_ADDR_OUT_OF_RANGE) +// { +// return(SD_ADDR_OUT_OF_RANGE); +// } - if (respR1 & SD_OCR_ADDR_MISALIGNED) - { - return(SD_ADDR_MISALIGNED); - } +// if (respR1 & SD_OCR_ADDR_MISALIGNED) +// { +// return(SD_ADDR_MISALIGNED); +// } - if (respR1 & SD_OCR_BLOCK_LEN_ERR) - { - return(SD_BLOCK_LEN_ERR); - } +// if (respR1 & SD_OCR_BLOCK_LEN_ERR) +// { +// return(SD_BLOCK_LEN_ERR); +// } - if (respR1 & SD_OCR_ERASE_SEQ_ERR) - { - return(SD_ERASE_SEQ_ERR); - } +// if (respR1 & SD_OCR_ERASE_SEQ_ERR) +// { +// return(SD_ERASE_SEQ_ERR); +// } - if (respR1 & SD_OCR_BAD_ERASE_PARAM) - { - return(SD_BAD_ERASE_PARAM); - } +// if (respR1 & SD_OCR_BAD_ERASE_PARAM) +// { +// return(SD_BAD_ERASE_PARAM); +// } - if (respR1 & SD_OCR_WRITE_PROT_VIOLATION) - { - return(SD_WRITE_PROT_VIOLATION); - } +// if (respR1 & SD_OCR_WRITE_PROT_VIOLATION) +// { +// return(SD_WRITE_PROT_VIOLATION); +// } - if (respR1 & SD_OCR_LOCK_UNLOCK_FAILED) - { - return(SD_LOCK_UNLOCK_FAILED); - } +// if (respR1 & SD_OCR_LOCK_UNLOCK_FAILED) +// { +// return(SD_LOCK_UNLOCK_FAILED); +// } - if (respR1 & SD_OCR_COM_CRC_FAILED) - { - return(SD_COM_CRC_FAILED); - } +// if (respR1 & SD_OCR_COM_CRC_FAILED) +// { +// return(SD_COM_CRC_FAILED); +// } - if (respR1 & SD_OCR_ILLEGAL_CMD) - { - return(SD_ILLEGAL_CMD); - } +// if (respR1 & SD_OCR_ILLEGAL_CMD) +// { +// return(SD_ILLEGAL_CMD); +// } - if (respR1 & SD_OCR_CARD_ECC_FAILED) - { - return(SD_CARD_ECC_FAILED); - } +// if (respR1 & SD_OCR_CARD_ECC_FAILED) +// { +// return(SD_CARD_ECC_FAILED); +// } - if (respR1 & SD_OCR_CC_ERROR) - { - return(SD_CC_ERROR); - } +// if (respR1 & SD_OCR_CC_ERROR) +// { +// return(SD_CC_ERROR); +// } - if (respR1 & SD_OCR_GENERAL_UNKNOWN_ERROR) - { - return(SD_GENERAL_UNKNOWN_ERROR); - } +// if (respR1 & SD_OCR_GENERAL_UNKNOWN_ERROR) +// { +// return(SD_GENERAL_UNKNOWN_ERROR); +// } - if (respR1 & SD_OCR_STREAM_READ_UNDERRUN) - { - return(SD_STREAM_READ_UNDERRUN); - } +// if (respR1 & SD_OCR_STREAM_READ_UNDERRUN) +// { +// return(SD_STREAM_READ_UNDERRUN); +// } - if (respR1 & SD_OCR_STREAM_WRITE_OVERRUN) - { - return(SD_STREAM_WRITE_OVERRUN); - } +// if (respR1 & SD_OCR_STREAM_WRITE_OVERRUN) +// { +// return(SD_STREAM_WRITE_OVERRUN); +// } - if (respR1 & SD_OCR_CID_CSD_OVERWRIETE) - { - return(SD_CID_CSD_OVERWRITE); - } +// if (respR1 & SD_OCR_CID_CSD_OVERWRIETE) +// { +// return(SD_CID_CSD_OVERWRITE); +// } - if (respR1 & SD_OCR_WP_ERASE_SKIP) - { - return(SD_WP_ERASE_SKIP); - } +// if (respR1 & SD_OCR_WP_ERASE_SKIP) +// { +// return(SD_WP_ERASE_SKIP); +// } - if (respR1 & SD_OCR_CARD_ECC_DISABLED) - { - return(SD_CARD_ECC_DISABLED); - } +// if (respR1 & SD_OCR_CARD_ECC_DISABLED) +// { +// return(SD_CARD_ECC_DISABLED); +// } - if (respR1 & SD_OCR_ERASE_RESET) - { - return(SD_ERASE_RESET); - } +// if (respR1 & SD_OCR_ERASE_RESET) +// { +// return(SD_ERASE_RESET); +// } - if (respR1 & SD_OCR_AKE_SEQ_ERROR) - { - return(SD_AKE_SEQ_ERROR); - } +// if (respR1 & SD_OCR_AKE_SEQ_ERROR) +// { +// return(SD_AKE_SEQ_ERROR); +// } - return(errorstatus); -} +// return(errorstatus); +// } /** * @brief Find the SD card SCR register value. @@ -2632,22 +2739,23 @@ OPTIMIZE("O0") static SD_Error FindSCR(uint16_t rca, uint32_t *pscr) * @param NumberOfBytes: number of bytes. * @retval None */ -OPTIMIZE("O0") uint8_t convert_from_bytes_to_power_of_two(uint16_t NumberOfBytes) -{ - uint8_t count = 0; +// OPTIMIZE("O0") uint8_t convert_from_bytes_to_power_of_two(uint16_t NumberOfBytes) +// { +// uint8_t count = 0; - while (NumberOfBytes != 1) - { - NumberOfBytes >>= 1; - count++; - } - return(count); -} +// while (NumberOfBytes != 1) +// { +// NumberOfBytes >>= 1; +// count++; +// } +// return(count); +// } void SDIO_IRQHandler(void) { DEBUG_INTERRUPT(INT_SDIO); - SD_ProcessIRQ(); + SD_Error err = SD_ProcessIRQ(); + TRACE_SD_CARD_EVENT((err != SD_OK), sd_irq, err); } void SD_SDIO_DMA_IRQHANDLER(void) @@ -2656,24 +2764,4 @@ void SD_SDIO_DMA_IRQHANDLER(void) SD_ProcessDMAIRQ(); } -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/radio/src/targets/horus/sdio_sd.h b/radio/src/targets/horus/sdio_sd.h index b075ee14f..5e35c7dc1 100644 --- a/radio/src/targets/horus/sdio_sd.h +++ b/radio/src/targets/horus/sdio_sd.h @@ -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 diff --git a/radio/src/targets/sky9x/audio_driver.h b/radio/src/targets/sky9x/audio_driver.h index 9ce67e6eb..23ac494f9 100644 --- a/radio/src/targets/sky9x/audio_driver.h +++ b/radio/src/targets/sky9x/audio_driver.h @@ -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 ) ; diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index d3afa53d8..04df46c7a 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -260,7 +260,6 @@ void disable_dsm2(uint32_t port); #define sdDone() #else #define sdPoll10ms() -void sdMountPoll(); #if defined(__cplusplus) extern "C" { #endif diff --git a/radio/src/targets/sky9x/diskio.cpp b/radio/src/targets/sky9x/diskio.cpp index 5694dd338..25dc41ee0 100644 --- a/radio/src/targets/sky9x/diskio.cpp +++ b/radio/src/targets/sky9x/diskio.cpp @@ -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; diff --git a/radio/src/targets/sky9x/massstorage.cpp b/radio/src/targets/sky9x/massstorage.cpp index 8cedee5d3..ce18cca83 100644 --- a/radio/src/targets/sky9x/massstorage.cpp +++ b/radio/src/targets/sky9x/massstorage.cpp @@ -170,7 +170,7 @@ void usbMassStorage() if (sdMounted()) { Card_state = SD_ST_DATA; audioQueue.stopSD(); - closeLogs(); + logsClose(); f_mount(NULL, "", 0); // unmount SD } diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index e8ec5fc8f..a5ace6f17 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -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);