Updates to use newly merged SD card code
This commit is contained in:
parent
dce49d4abb
commit
6055ab2432
|
@ -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
|
||||
|
|
|
@ -227,7 +227,7 @@ uint8_t SD_ReadByte(void);
|
|||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
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();
|
||||
|
|
|
@ -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 <mixer>\r\n"
|
||||
"\treverse <servo> <source> 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, "<length> <address>", 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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue