| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 | // Driver and interface for accessing SD card in SPI mode#include "BlueSCSI_platform.h"#include "BlueSCSI_log.h"#include <hardware/spi.h>#include <SdFat.h>#ifndef SD_USE_SDIOclass RP2040SPIDriver : public SdSpiBaseClass{public:    void begin(SdSpiConfig config) {    }    void activate() {        _spi_init(SD_SPI, m_sckfreq);        spi_set_format(SD_SPI, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);    }    void deactivate() {    }    void wait_idle() {        while (!(spi_get_hw(SD_SPI)->sr & SPI_SSPSR_TFE_BITS));        while (spi_get_hw(SD_SPI)->sr & SPI_SSPSR_BSY_BITS);    }    // Single byte receive    uint8_t receive() {        uint8_t tx = 0xFF;        uint8_t rx;        spi_write_read_blocking(SD_SPI, &tx, &rx, 1);        return rx;    }    // Single byte send    void send(uint8_t data) {        spi_write_blocking(SD_SPI, &data, 1);        wait_idle();    }    // Multiple byte receive    uint8_t receive(uint8_t* buf, size_t count)    {        spi_read_blocking(SD_SPI, 0xFF, buf, count);        return 0;    }    // Multiple byte send    void send(const uint8_t* buf, size_t count) {        spi_write_blocking(SD_SPI, buf, count);    }    void setSckSpeed(uint32_t maxSck) {        m_sckfreq = maxSck;    }private:    uint32_t m_sckfreq;};void sdCsInit(SdCsPin_t pin){}void sdCsWrite(SdCsPin_t pin, bool level){    if (level)        sio_hw->gpio_set = (1 << SD_SPI_CS);    else        sio_hw->gpio_clr = (1 << SD_SPI_CS);}RP2040SPIDriver g_sd_spi_port;SdSpiConfig g_sd_spi_config(0, DEDICATED_SPI, SD_SCK_MHZ(25), &g_sd_spi_port);void platform_set_sd_callback(sd_callback_t func, const uint8_t *buffer){}#endif
 |