202 lines
4.9 KiB
C++
202 lines
4.9 KiB
C++
#include "HAL.h"
|
|
#include "HAL/HAL_Config.h"
|
|
#include "driver/sdmmc_host.h"
|
|
#include "driver/sdspi_host.h"
|
|
#include "esp_log.h"
|
|
#include "esp_vfs_fat.h"
|
|
/* print sdmmc info support */
|
|
#include "sdmmc_cmd.h"
|
|
static const char *TAG = "SDCARD";
|
|
|
|
#define MOUNT_POINT "/sdcard"
|
|
/* SDCard DMA CHANNEL select */
|
|
#define SPI_DMA_CHAN 2
|
|
/* SDcard Pin Config */
|
|
#define PIN_NUM_MISO 26
|
|
#define PIN_NUM_MOSI 13
|
|
#define PIN_NUM_CLK 14
|
|
#define PIN_NUM_CS 15
|
|
#define SD_OCR_SDHC_CAP (1<<30)
|
|
|
|
static bool SD_IsReady = false;
|
|
static uint64_t SD_CardSize = 0;
|
|
static SD_CallbackFunction_t SD_EventCallback = nullptr;
|
|
|
|
sdmmc_card_t* card;
|
|
|
|
/*
|
|
* User provided date time callback function.
|
|
* See SdFile::dateTimeCallback() for usage.
|
|
*/
|
|
// static void SD_GetDateTime(uint16_t* date, uint16_t* time)
|
|
// {
|
|
// // User gets date and time from GPS or real-time
|
|
// // clock in real callback function
|
|
// // HAL::Clock_Info_t clock;
|
|
// // HAL::Clock_GetInfo(&clock);
|
|
|
|
// // // return date using FAT_DATE macro to format fields
|
|
// // *date = FAT_DATE(clock.year, clock.month, clock.day);
|
|
|
|
// // // return time using FAT_TIME macro to format fields
|
|
// // *time = FAT_TIME(clock.hour, clock.minute, clock.second);
|
|
// }
|
|
|
|
// static bool SD_CheckDir(const char* path)
|
|
// {
|
|
// bool retval = true;
|
|
// // if(!SD.exists(path))
|
|
// // {
|
|
// // Serial.printf("SD: Auto create path \"%s\"...", path);
|
|
// // retval = SD.mkdir(path);
|
|
// // Serial.println(retval ? "success" : "failed");
|
|
// // }
|
|
// return retval;
|
|
// }
|
|
|
|
const char* SD_GetCardName(){
|
|
if(SD_IsReady){
|
|
return card->cid.name;
|
|
}
|
|
return "None SDcard";
|
|
}
|
|
|
|
float SD_GetCardSizeMB()
|
|
{
|
|
if(SD_IsReady == false){
|
|
SD_CardSize = 0;
|
|
return 0.0f;
|
|
}
|
|
SD_CardSize = ((uint64_t) card->csd.capacity) * card->
|
|
csd.sector_size / (1024 * 1024);
|
|
float size = (float)SD_CardSize;
|
|
return size;
|
|
}
|
|
|
|
|
|
uint8_t SD_Init()
|
|
{
|
|
bool retval = true;
|
|
const char mount_point[] = MOUNT_POINT;
|
|
|
|
ESP_LOGI(TAG, "SDCard Init bus. ");
|
|
|
|
spi_bus_config_t bus_cfg = {
|
|
.mosi_io_num = PIN_NUM_MOSI,
|
|
.miso_io_num = PIN_NUM_MISO,
|
|
.sclk_io_num = PIN_NUM_CLK,
|
|
.quadwp_io_num = -1,
|
|
.quadhd_io_num = -1,
|
|
.max_transfer_sz = 4000,
|
|
.flags = 0,
|
|
.intr_flags = 0
|
|
};
|
|
sdmmc_host_t host = SDSPI_HOST_DEFAULT();
|
|
sdspi_device_config_t slot_config = SDSPI_DEVICE_CONFIG_DEFAULT();
|
|
|
|
/* Init SPI Bus */
|
|
esp_err_t ret = spi_bus_initialize(SDSPI_DEFAULT_HOST, &bus_cfg, SPI_DMA_CHAN);
|
|
if (ret != ESP_OK) {
|
|
ESP_LOGE(TAG, "Failed to initialize bus.");
|
|
return false;
|
|
}
|
|
|
|
ESP_LOGI(TAG, "SDCard Mount System. ");
|
|
/* Configration mount SDSPI FAT System. */
|
|
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
|
|
.format_if_mount_failed = false,
|
|
.max_files = 5,
|
|
.allocation_unit_size = 16 * 1024
|
|
};
|
|
|
|
slot_config.gpio_cs = (gpio_num_t)PIN_NUM_CS;
|
|
slot_config.host_id = (spi_host_device_t)host.slot;
|
|
ret = esp_vfs_fat_sdspi_mount(mount_point, &host, &slot_config, &mount_config, &card);
|
|
|
|
if (ret != ESP_OK) {
|
|
if (ret == ESP_FAIL) {
|
|
ESP_LOGE(TAG, "Failed to mount filesystem.");
|
|
} else {
|
|
ESP_LOGE(TAG, "Failed to initialize the card (%s).", esp_err_to_name(ret));
|
|
}
|
|
return false;
|
|
}
|
|
|
|
SD_IsReady = true;
|
|
/* Print sdcard infomation. */
|
|
//sdmmc_card_print_info(stdout, card);
|
|
|
|
FILE* stream = stdout;
|
|
|
|
fprintf(stream, "Name: %s\n", SD_GetCardName());
|
|
fprintf(stream, "Size: %.2fMB\n", SD_GetCardSizeMB());
|
|
fprintf(stream, "Type: %s\n", SD_GetTypeName());
|
|
return retval;
|
|
}
|
|
|
|
|
|
|
|
uint8_t SD_GetReady()
|
|
{
|
|
return (uint8_t)SD_IsReady;
|
|
}
|
|
|
|
|
|
const char* SD_GetTypeName()
|
|
{
|
|
const char* type = "Unknown";
|
|
/* Check card Size. */
|
|
if(!SD_CardSize){
|
|
goto failed;
|
|
}
|
|
/* Check card type. */
|
|
if (card->is_sdio) {
|
|
type = "SDIO";
|
|
}else if (card->is_mmc) {
|
|
type = "MMC";
|
|
}else{
|
|
type = (card->ocr & SD_OCR_SDHC_CAP) ? "SDHC/SDXC" : "SDSC";
|
|
}
|
|
failed:
|
|
return type;
|
|
}
|
|
|
|
// static void SD_Check(bool isInsert)
|
|
// {
|
|
// // if(isInsert)
|
|
// // {
|
|
// // bool ret = HAL::SD_Init();
|
|
|
|
// // if(ret && SD_EventCallback)
|
|
// // {
|
|
// // SD_EventCallback(true);
|
|
// // }
|
|
|
|
// // HAL::Audio_PlayMusic(ret ? "DeviceInsert" : "Error");
|
|
// // }
|
|
// // else
|
|
// // {
|
|
// // SD_IsReady = false;
|
|
|
|
// // if(SD_EventCallback)
|
|
// // {
|
|
// // SD_EventCallback(false);
|
|
// // SD_CardSize = 0;
|
|
// // }
|
|
|
|
// // HAL::Audio_PlayMusic("DevicePullout");
|
|
// // }
|
|
// }
|
|
|
|
void SD_SetEventCallback(SD_CallbackFunction_t callback)
|
|
{
|
|
SD_EventCallback = callback;
|
|
}
|
|
|
|
void SD_Update()
|
|
{
|
|
// bool isInsert = (digitalRead(CONFIG_SD_CD_PIN) == LOW);
|
|
|
|
// CM_VALUE_MONITOR(isInsert, SD_Check(isInsert));
|
|
}
|