#ifdef ESP_PLATFORM #pragma once #include "Tactility/hal/SdCard.h" #include #include #include #include #include namespace tt::hal { /** * SD card interface at the default SPI interface */ class SpiSdCard final : public tt::hal::SdCard { public: struct Config { Config( gpio_num_t spiPinCs, gpio_num_t spiPinCd, gpio_num_t spiPinWp, gpio_num_t spiPinInt, MountBehaviour mountBehaviourAtBoot, std::shared_ptr lockable = std::make_shared(), std::vector csPinWorkAround = std::vector(), spi_host_device_t spiHost = SPI2_HOST, int spiFrequencyKhz = SDMMC_FREQ_DEFAULT ) : spiFrequencyKhz(spiFrequencyKhz), spiPinCs(spiPinCs), spiPinCd(spiPinCd), spiPinWp(spiPinWp), spiPinInt(spiPinInt), mountBehaviourAtBoot(mountBehaviourAtBoot), lockable(std::move(lockable)), csPinWorkAround(std::move(csPinWorkAround)), spiHost(spiHost) { assert(this->lockable != nullptr); } int spiFrequencyKhz; gpio_num_t spiPinCs; // Clock gpio_num_t spiPinCd; // Card detect gpio_num_t spiPinWp; // Write-protect gpio_num_t spiPinInt; // Interrupt SdCard::MountBehaviour mountBehaviourAtBoot; std::shared_ptr _Nullable lockable; std::vector csPinWorkAround; spi_host_device_t spiHost; bool formatOnMountFailed = false; uint16_t maxOpenFiles = 4; uint16_t allocUnitSize = 16 * 1024; bool statusCheckEnabled = false; }; private: std::string mountPath; sdmmc_card_t* card = nullptr; std::shared_ptr config; bool applyGpioWorkAround(); bool mountInternal(const std::string& mountPath); public: explicit SpiSdCard(std::unique_ptr config) : SdCard(config->mountBehaviourAtBoot), config(std::move(config)) {} std::string getName() const final { return "SD Card"; } std::string getDescription() const final { return "SD card via SPI interface"; } bool mount(const std::string& mountPath) final; bool unmount() final; std::string getMountPath() const final { return mountPath; } std::shared_ptr getLockable() const final { return config->lockable; } State getState() const override; sdmmc_card_t* _Nullable getCard() { return card; } }; } #endif