From 6055ab2432240fefff0300ec58fed1fab7b49cc2 Mon Sep 17 00:00:00 2001 From: Nicholas Sherlock Date: Tue, 24 Nov 2015 14:23:48 +1300 Subject: [PATCH] Updates to use newly merged SD card code --- src/main/drivers/sdcard.c | 63 +++++++++++++- src/main/drivers/sdcard.h | 10 ++- src/main/io/serial_cli.c | 106 +++++------------------- src/main/main.c | 3 +- src/main/target/CHEBUZZF3/target.h | 32 ++++--- src/main/target/SPRACINGF3MINI/target.h | 35 +++++--- 6 files changed, 135 insertions(+), 114 deletions(-) diff --git a/src/main/drivers/sdcard.c b/src/main/drivers/sdcard.c index c39d0d246..7707aa9cc 100644 --- a/src/main/drivers/sdcard.c +++ b/src/main/drivers/sdcard.c @@ -24,6 +24,7 @@ #include "platform.h" #include "nvic.h" +#include "gpio.h" #include "drivers/bus_spi.h" #include "drivers/system.h" @@ -95,6 +96,56 @@ static sdcard_t sdcard; STATIC_ASSERT(sizeof(sdcardCSD_t) == 16, sdcard_csd_bitfields_didnt_pack_properly); +void sdcardInsertionDetectDeinit(void) +{ +#ifdef SDCARD_DETECT_PIN + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.GPIO_Pin = SDCARD_DETECT_PIN; + GPIO_Init(SDCARD_DETECT_GPIO_PORT, &GPIO_InitStructure); +#endif +} + +void sdcardInsertionDetectInit(void) +{ +#ifdef SDCARD_DETECT_PIN + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_InitStructure.GPIO_Pin = SDCARD_DETECT_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(SDCARD_DETECT_GPIO_PORT, &GPIO_InitStructure); +#endif +} + +/** + * @brief Detect if SD card is correctly plugged in the memory slot. + * @param None + * @retval Return if SD is detected or not + */ +bool sdcard_isInserted(void) +{ +#ifdef SDCARD_DETECT_PIN + /*!< Check GPIO to detect SD */ + if ((GPIO_ReadInputData(SDCARD_DETECT_GPIO_PORT) & SDCARD_DETECT_PIN) != 0) + { +#ifdef SD_DETECT_INVERTED + return false; +#else + return true; +#endif + } else { +#ifdef SD_DETECT_INVERTED + return true; +#else + return false; +#endif + } +#else + return true; +#endif +} + static void sdcard_select() { SET_CS_LOW; @@ -759,8 +810,16 @@ bool sdcard_readBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationComp } } -bool sdcard_isReady() { - return sdcard.state == SDCARD_STATE_READY; +/** + * Returns true if the SD card has successfully completed its startup procedures. + */ +bool sdcard_isInitialized() { + return sdcard.state >= SDCARD_STATE_READY; +} + +const sdcardMetadata_t* sdcard_getMetadata() +{ + return &sdcard.metadata; } #endif diff --git a/src/main/drivers/sdcard.h b/src/main/drivers/sdcard.h index 05ff6ef55..1419069c0 100644 --- a/src/main/drivers/sdcard.h +++ b/src/main/drivers/sdcard.h @@ -227,7 +227,7 @@ uint8_t SD_ReadByte(void); #include #include -typedef struct sdcard_metadata_t { +typedef struct sdcardMetadata_t { uint8_t manufacturerID; uint16_t oemID; @@ -263,6 +263,10 @@ void sdcard_init(bool useDMA); bool sdcard_readBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData); sdcardOperationStatus_e sdcard_writeBlock(uint32_t blockIndex, uint8_t *buffer, sdcard_operationCompleteCallback_c callback, uint32_t callbackData); -void sdcard_poll(); -bool sdcard_isReady(); +void sdcardInsertionDetectDeinit(void); +void sdcardInsertionDetectInit(void); +bool sdcard_isInserted(); +void sdcard_poll(); +bool sdcard_isInitialized(); +const sdcardMetadata_t* sdcard_getMetadata(); diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index c87540a50..4b54fe1a1 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -160,9 +160,8 @@ static void cliFlashRead(char *cmdline); static void cliUSB1Wire(char *cmdline); #endif -#ifdef USE_SD_CARD +#ifdef USE_SDCARD static void cliSdInfo(char *cmdline); -static void cliSdRead(char *cmdline); #endif // buffer @@ -302,9 +301,8 @@ const clicmd_t cmdTable[] = { "\tload \r\n" "\treverse r|n", cliServoMix), #endif -#ifdef USE_SD_CARD +#ifdef USE_SDCARD CLI_COMMAND_DEF("sd_info", "sdcard info", NULL, cliSdInfo), - CLI_COMMAND_DEF("sd_read", NULL, "
", cliSdRead), #endif CLI_COMMAND_DEF("status", "show status", NULL, cliStatus), #ifndef SKIP_TASK_STATISTICS @@ -1496,101 +1494,41 @@ static void cliServoMix(char *cmdline) } #endif -#ifdef USE_SD_CARD +#ifdef USE_SDCARD -static void cliSdShowError(char *message, SD_Error error) +static void cliWriteBytes(const uint8_t *buffer, int count) { - cliPrintf("%s: %d\r\n", message, error); + while (count > 0) { + cliWrite(*buffer); + buffer++; + count--; + } } static void cliSdInfo(char *cmdline) { UNUSED(cmdline); - uint8_t sdPresent = SD_Detect(); - if (sdPresent != SD_PRESENT) { + if (!sdcard_isInitialized()) { cliPrint("sd card not present\r\n"); return; } - SD_Error error; - error = SD_Init(); - cliSdShowError("SD init result", error); + const sdcardMetadata_t *metadata = sdcard_getMetadata(); - SD_CardInfo cardInfo; - memset(&cardInfo, 0, sizeof(cardInfo)); - error = SD_GetCardInfo(&cardInfo); + cliPrintf("manufacturer 0x%x, capacity: %ukB, %02d/%04d, v%d.%d, '", + metadata->manufacturerID, + metadata->numBlocks / 2, /* One block is half a kB */ + metadata->productionMonth, + metadata->productionYear, + metadata->productRevisionMajor, + metadata->productRevisionMinor + ); - cliSdShowError("SD card info result", error); - if (error == SD_RESPONSE_NO_ERROR) { - cliPrintf("capacity: %d, block size: %d\r\n", - cardInfo.CardCapacity, - cardInfo.CardBlockSize - ); - } - SD_DeInit(); + cliWriteBytes((uint8_t*)metadata->productName, sizeof(metadata->productName)); + + cliPrint("'\r\n"); } -static void cliSdRead(char *cmdline) -{ - uint32_t address = atoi(cmdline); - uint32_t length; - int i; - - uint8_t buffer[32]; - - uint8_t sdPresent = SD_Detect(); - if (sdPresent != SD_PRESENT) { - cliPrint("sd card not present\r\n"); - return; - } - - SD_Error error; - - error = SD_Init(); - if (error) { - SD_DeInit(); - return; - } - - char *nextArg = strchr(cmdline, ' '); - - if (!nextArg) { - cliShowParseError(); - } else { - length = atoi(nextArg); - - cliPrintf("Reading %u bytes at %u:\r\n", length, address); - - while (length > 0) { - int bytesRead; - int bytesToRead = length < sizeof(buffer) ? length : sizeof(buffer); - - error = SD_ReadBlock(buffer, address, bytesToRead); - - if (error != SD_RESPONSE_NO_ERROR) { - cliSdShowError("SD init result", error); - break; - } - - bytesRead = bytesToRead; - - for (i = 0; i < bytesRead; i++) { - cliWrite(buffer[i]); - } - - length -= bytesRead; - address += bytesRead; - - if (bytesRead == 0) { - //Assume we reached the end of the volume or something fatal happened - break; - } - } - cliPrintf("\r\n"); - } - - SD_DeInit(); -} #endif #ifdef USE_FLASHFS diff --git a/src/main/main.c b/src/main/main.c index 6c5201744..20a62851f 100644 --- a/src/main/main.c +++ b/src/main/main.c @@ -49,7 +49,6 @@ #include "drivers/bus_spi.h" #include "drivers/inverter.h" #include "drivers/flash_m25p16.h" -#include "drivers/sdcard.h" #include "drivers/sonar_hcsr04.h" #include "drivers/gyro_sync.h" #include "drivers/sdcard.h" @@ -536,6 +535,8 @@ void init(void) #ifdef USE_SDCARD bool sdcardUseDMA = false; + sdcardInsertionDetectInit(); + #ifdef SDCARD_DMA_CHANNEL_TX #if defined(LED_STRIP) && defined(WS2811_DMA_CHANNEL) diff --git a/src/main/target/CHEBUZZF3/target.h b/src/main/target/CHEBUZZF3/target.h index 088f18b64..15b54d015 100644 --- a/src/main/target/CHEBUZZF3/target.h +++ b/src/main/target/CHEBUZZF3/target.h @@ -50,19 +50,29 @@ #define SPI2_MOSI_PIN Pin_15 #define SPI2_MOSI_PIN_SOURCE GPIO_PinSource15 -#define USE_SD_CARD +#define USE_SDCARD +#define USE_SDCARD_SPI2 -#define SD_DETECT_PIN GPIO_Pin_14 -#define SD_DETECT_EXTI_LINE EXTI_Line14 -#define SD_DETECT_EXTI_PIN_SOURCE EXTI_PinSource14 -#define SD_DETECT_GPIO_PORT GPIOC -#define SD_DETECT_GPIO_CLK RCC_AHBPeriph_GPIOC -#define SD_DETECT_EXTI_PORT_SOURCE EXTI_PortSourceGPIOC -#define SD_DETECT_EXTI_IRQn EXTI15_10_IRQn +#define SDCARD_DETECT_PIN GPIO_Pin_14 +#define SDCARD_DETECT_EXTI_LINE EXTI_Line14 +#define SDCARD_DETECT_EXTI_PIN_SOURCE EXTI_PinSource14 +#define SDCARD_DETECT_GPIO_PORT GPIOC +#define SDCARD_DETECT_GPIO_CLK RCC_AHBPeriph_GPIOC +#define SDCARD_DETECT_EXTI_PORT_SOURCE EXTI_PortSourceGPIOC +#define SDCARD_DETECT_EXTI_IRQn EXTI15_10_IRQn -#define SD_CS_GPIO GPIOB -#define SD_CS_PIN GPIO_Pin_12 -#define SD_SPI_INSTANCE SPI2 +#define SDCARD_SPI_INSTANCE SPI2 +#define SDCARD_SPI_CS_GPIO SPI2_GPIO +#define SDCARD_SPI_CS_PIN SPI2_NSS_PIN + +// SPI2 is on the APB1 bus whose clock runs at 36MHz. Divide to under 400kHz for init: +#define SDCARD_SPI_INITIALIZATION_CLOCK_DIVIDER 128 +// Divide to under 25MHz for normal operation: +#define SDCARD_SPI_FULL_SPEED_CLOCK_DIVIDER 2 + +// Note, this is the same DMA channel as USART1_RX. Luckily we don't use DMA for USART Rx. +#define SDCARD_DMA_CHANNEL_TX DMA1_Channel5 +#define SDCARD_DMA_CHANNEL_TX_COMPLETE_FLAG DMA1_FLAG_TC5 //#define USE_FLASHFS //#define USE_FLASH_M25P16 diff --git a/src/main/target/SPRACINGF3MINI/target.h b/src/main/target/SPRACINGF3MINI/target.h index 767800a0e..2594fe0c5 100644 --- a/src/main/target/SPRACINGF3MINI/target.h +++ b/src/main/target/SPRACINGF3MINI/target.h @@ -120,22 +120,31 @@ #define SPI2_MOSI_PIN Pin_15 #define SPI2_MOSI_PIN_SOURCE GPIO_PinSource15 -#define USE_SD_CARD +#define USE_SDCARD +#define USE_SDCARD_SPI2 -#define SD_DETECT_INVERTED +#define SDCARD_DETECT_INVERTED -#define SD_DETECT_PIN GPIO_Pin_14 -#define SD_DETECT_EXTI_LINE EXTI_Line14 -#define SD_DETECT_EXTI_PIN_SOURCE EXTI_PinSource14 -#define SD_DETECT_GPIO_PORT GPIOC -#define SD_DETECT_GPIO_CLK RCC_AHBPeriph_GPIOC -#define SD_DETECT_EXTI_PORT_SOURCE EXTI_PortSourceGPIOC -#define SD_DETECT_EXTI_IRQn EXTI15_10_IRQn +#define SDCARD_DETECT_PIN GPIO_Pin_14 +#define SDCARD_DETECT_EXTI_LINE EXTI_Line14 +#define SDCARD_DETECT_EXTI_PIN_SOURCE EXTI_PinSource14 +#define SDCARD_DETECT_GPIO_PORT GPIOC +#define SDCARD_DETECT_GPIO_CLK RCC_AHBPeriph_GPIOC +#define SDCARD_DETECT_EXTI_PORT_SOURCE EXTI_PortSourceGPIOC +#define SDCARD_DETECT_EXTI_IRQn EXTI15_10_IRQn -#define SD_CS_GPIO SPI2_GPIO -#define SD_CS_PIN SPI2_NSS_PIN -#define SD_SPI_INSTANCE SPI2 -#define SD_CS_GPIO_CLK RCC_AHBPeriph_GPIOB +#define SDCARD_SPI_INSTANCE SPI2 +#define SDCARD_SPI_CS_GPIO SPI2_GPIO +#define SDCARD_SPI_CS_PIN SPI2_NSS_PIN + +// SPI2 is on the APB1 bus whose clock runs at 36MHz. Divide to under 400kHz for init: +#define SDCARD_SPI_INITIALIZATION_CLOCK_DIVIDER 128 +// Divide to under 25MHz for normal operation: +#define SDCARD_SPI_FULL_SPEED_CLOCK_DIVIDER 2 + +// Note, this is the same DMA channel as USART1_RX. Luckily we don't use DMA for USART Rx. +#define SDCARD_DMA_CHANNEL_TX DMA1_Channel5 +#define SDCARD_DMA_CHANNEL_TX_COMPLETE_FLAG DMA1_FLAG_TC5 #define USE_ADC #define BOARD_HAS_VOLTAGE_DIVIDER