From 2a1fc4469cad0a26bf91189374c3640c2fea0d44 Mon Sep 17 00:00:00 2001 From: mverch67 Date: Mon, 17 Mar 2025 10:20:55 +0100 Subject: [PATCH] fix SD_MMC --- include/graphics/common/SdCard.h | 8 +-- source/graphics/TFT/TFTView_320x240.cpp | 14 +++-- source/graphics/common/SdCard.cpp | 72 +++++++++++++++++++++++-- source/graphics/map/SdFatService.cpp | 2 +- 4 files changed, 84 insertions(+), 12 deletions(-) diff --git a/include/graphics/common/SdCard.h b/include/graphics/common/SdCard.h index 903ef99..5ee04da 100644 --- a/include/graphics/common/SdCard.h +++ b/include/graphics/common/SdCard.h @@ -6,7 +6,7 @@ extern fs::FS &SDFs; #elif defined(HAS_SD_MMC) #include "SD_MMC.h" // TODO: replace by SdFat SDIO -extern fs::SDMMCFS &SD; +extern fs::SDMMCFS &SDFs; #elif defined(HAS_SDCARD) #include "SdFat.h" @@ -54,7 +54,7 @@ class ISdCard bool updated = false; }; -#if defined(ARCH_PORTDUINO) +#if defined(ARCH_PORTDUINO) || defined(HAS_SD_MMC) class SDCard : public ISdCard { public: @@ -66,10 +66,10 @@ class SDCard : public ISdCard uint64_t cardSize(void) override; std::set loadMapStyles(const char *folder) override; - virtual ~SDCard(void) {} + virtual ~SDCard(void); }; -#elif defined(HAS_SDCARD) || defined(HAS_SD_MMC) +#elif defined(HAS_SDCARD) class SdFsCard : public ISdCard { public: diff --git a/source/graphics/TFT/TFTView_320x240.cpp b/source/graphics/TFT/TFTView_320x240.cpp index 2fcaad3..bc5397c 100644 --- a/source/graphics/TFT/TFTView_320x240.cpp +++ b/source/graphics/TFT/TFTView_320x240.cpp @@ -32,6 +32,8 @@ #include "util/LinuxHelper.h" // #include "graphics/map/LinuxFileSystemService.h" #include "graphics/map/SDCardService.h" +#elif defined(HAS_SD_MMC) +#include "graphics/map/SDCardService.h" #else #include "graphics/map/SdFatService.h" #endif @@ -4090,7 +4092,7 @@ void TFTView_320x240::handleAddMessage(char *msg) if (channelOrNode < c_max_channels) { ch = (uint8_t)channelOrNode; - requestId = requests.addRequest(ch, ResponseHandler::TextMessageRequest, (void *)ch, callback); + requestId = requests.addRequest(ch, ResponseHandler::TextMessageRequest, (void *)(long)ch, callback); } else { ch = (uint8_t)(unsigned long)nodes[channelOrNode]->user_data; to = channelOrNode; @@ -5635,7 +5637,7 @@ void TFTView_320x240::backup(uint32_t option) std::stringstream path; path << "/keys/" << std::hex << std::setw(8) << std::setfill('0') << ownNode << ".yml"; -#if defined(ARCH_PORTDUINO) +#if defined(ARCH_PORTDUINO) || defined(HAS_SD_MMC) SDFs.mkdir("/keys"); File sd = SDFs.open(path.str().c_str(), FILE_WRITE); #else @@ -5667,7 +5669,7 @@ void TFTView_320x240::restore(uint32_t option) std::stringstream path; path << "/keys/" << std::hex << std::setw(8) << std::setfill('0') << ownNode << ".yml"; -#if defined(ARCH_PORTDUINO) +#if defined(ARCH_PORTDUINO) || defined(HAS_SD_MMC) File sd = SDFs.open(path.str().c_str(), FILE_READ); #else FsFile sd = SDFs.open(path.str().c_str(), O_RDONLY); @@ -6637,9 +6639,13 @@ bool TFTView_320x240::updateSDCard(void) } #ifdef HAS_SDCARD char buf[64]; +#ifdef HAS_SD_MMC + sdCard = new SDCard; +#else sdCard = new SdFsCard; +#endif if (sdCard->init() && sdCard->cardType() != ISdCard::eNone) { - ILOG_DEBUG("SdFsCard init successful, card type: %d", sdCard->cardType()); + ILOG_DEBUG("SdCard init successful, card type: %d", sdCard->cardType()); ISdCard::CardType cardType = sdCard->cardType(); ISdCard::FatType fatType = sdCard->fatType(); uint32_t usedSpace = sdCard->usedBytes() / (1024 * 1024); diff --git a/source/graphics/common/SdCard.cpp b/source/graphics/common/SdCard.cpp index ddca9f7..b0a2a1b 100644 --- a/source/graphics/common/SdCard.cpp +++ b/source/graphics/common/SdCard.cpp @@ -6,7 +6,6 @@ #endif #if defined(HAS_SD_MMC) -SPIClass SDHandler; // TODO allow specification of spi bus fs::SDMMCFS &SDFs = SD_MMC; #elif defined(ARCH_PORTDUINO) fs::FS &SDFs = PortduinoFS; @@ -19,6 +18,7 @@ using File = FsFile; ISdCard *sdCard = nullptr; #if defined(ARCH_PORTDUINO) + bool SDCard::init(void) { return true; @@ -49,6 +49,69 @@ uint64_t SDCard::cardSize(void) return 1; } +SDCard::~SDCard(void) +{ + +} + +#elif defined(HAS_SD_MMC) + +bool SDCard::init(void) +{ +//#ifndef BOARD_HAS_1BIT_SDMMC +// SDFs.setPins(SDMMC_CLK, SDMMC_CMD, SDMMC_D0, SDMMC_D1, SDMMC_D2, SDMMC_D3); +// return SDFs.begin("/sdcard", false); +//#else + SDFs.setPins(SD_SCLK_PIN, SD_MOSI_PIN, SD_MISO_PIN); + return SDFs.begin("/sdcard", true); +//#endif +} + +ISdCard::CardType SDCard::cardType(void) +{ + switch(SDFs.cardType()) { + case CARD_NONE: + return CardType::eNone; + case CARD_MMC: + return CardType::eMMC; + case CARD_SD: + return CardType::eSD; + case CARD_SDHC: + return CardType::eSDHC; + case CARD_UNKNOWN: + default: + return CardType::eUnknown; + } + return CardType::eUnknown; +} + +ISdCard::FatType SDCard::fatType(void) +{ + return SDFs.cardSize() > 4Ull * 1024Ull * 1024Ull * 1024Ull ? FatType::eFat32 : FatType::eFat16; +} + +uint64_t SDCard::usedBytes(void) +{ + return SDFs.usedBytes(); +} + +uint64_t SDCard::freeBytes(void) +{ + return SDFs.totalBytes() - SDFs.usedBytes(); +} + +uint64_t SDCard::cardSize(void) +{ + return SDFs.totalBytes(); +} + +SDCard::~SDCard(void) +{ + SDFs.end(); +} +#endif + +#if defined(ARCH_PORTDUINO) || defined(HAS_SD_MMC) std::set SDCard::loadMapStyles(const char *folder) { std::set styles; @@ -83,15 +146,18 @@ std::set SDCard::loadMapStyles(const char *folder) return styles; } -#elif defined(HAS_SDCARD) || defined(HAS_SD_MMC) - +#elif defined(HAS_SDCARD) bool SdFsCard::init(void) { // TODO: allow specification of SPI bus // TODO: use begin(SdioConfig(FIFO_SDIO)) for SDIO (T-HMI) // Note: this can also be done via #define BUILTIN_SDCARD SDCARD_CS using begin(SDCARD_CS) // see also HAS_SDIO_CLASS +#if defined(HAS_SDIO_CLASS) + return SDFs.begin(SdioConfig(FIFO_SDIO)); +#else return SDFs.begin(SdSpiConfig(SDCARD_CS, SHARED_SPI, SD_SPI_FREQUENCY, &SDHandler)); +#endif } ISdCard::CardType SdFsCard::cardType(void) diff --git a/source/graphics/map/SdFatService.cpp b/source/graphics/map/SdFatService.cpp index 9b18f8f..a69d198 100644 --- a/source/graphics/map/SdFatService.cpp +++ b/source/graphics/map/SdFatService.cpp @@ -1,4 +1,4 @@ -#if defined(HAS_SDCARD) && not defined(ARCH_PORTDUINO) +#if defined(HAS_SDCARD) && not defined(HAS_SD_MMC) && not defined(ARCH_PORTDUINO) #include "lvgl.h"