summaryrefslogtreecommitdiff
path: root/main/storage.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2022-10-04 13:13:58 +1100
committerjacqueline <me@jacqueline.id.au>2022-10-04 13:13:58 +1100
commit6d20efc702b488c8f347a115a41dde9d0abdd883 (patch)
treeaba4cc6a814b8f975579887e39f29e33b46ad8cc /main/storage.cpp
parent23671453c01848d4d5591dbbfd31db16e7c6cf53 (diff)
downloadtangara-fw-6d20efc702b488c8f347a115a41dde9d0abdd883.tar.gz
SPI and SD card initialisation
Diffstat (limited to 'main/storage.cpp')
-rw-r--r--main/storage.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/main/storage.cpp b/main/storage.cpp
new file mode 100644
index 00000000..b1d5aa6c
--- /dev/null
+++ b/main/storage.cpp
@@ -0,0 +1,72 @@
+#include "storage.h"
+
+#include "esp_check.h"
+#include "driver/sdspi_host.h"
+#include "esp_err.h"
+#include "gpio-expander.h"
+#include "hal/gpio_types.h"
+#include "hal/spi_types.h"
+#include "sdmmc_cmd.h"
+
+namespace gay_ipod {
+
+SdStorage::SdStorage(GpioExpander *gpio) {
+ this->gpio_ = gpio;
+}
+
+SdStorage::~SdStorage() {
+ ESP_ERROR_CHECK(sdspi_host_deinit());
+}
+
+esp_err_t SdStorage::Acquire(void) {
+ // First switch to this device, and pull CS.
+ gpio_->set_sd_mux(GpioExpander::ESP);
+ gpio_->set_sd_cs(false);
+ gpio_->Write();
+
+ // Now we can init the driver and set up the SD card into SPI mode.
+ sdspi_host_init();
+
+ sdspi_device_config_t config = {
+ .host_id = VSPI_HOST,
+ // CS handled manually bc it's on the GPIO expander
+ .gpio_cs = GPIO_NUM_2,
+ .gpio_cd = SDSPI_SLOT_NO_CD,
+ .gpio_wp = SDSPI_SLOT_NO_WP,
+ .gpio_int = GPIO_NUM_NC,
+ };
+ esp_err_t ret = sdspi_host_init_device(&config, &handle_);
+ if (ret != ESP_OK) {
+ gpio_->set_sd_cs(true);
+ gpio_->Write();
+ return ret;
+ }
+
+ host_ = sdmmc_host_t SDSPI_HOST_DEFAULT();
+ host_.slot = handle_;
+ // Will return ESP_ERR_INVALID_RESPONSE if there is no card
+ // TODO: use our own error code
+ ret = sdmmc_card_init(&host_, &card_);
+
+ // We're done chatting for now.
+ gpio_->set_sd_cs(true);
+ gpio_->Write();
+
+ return ret;
+}
+
+esp_err_t SdStorage::Release(void) {
+ gpio_->set_sd_cs(false);
+ gpio_->Write();
+
+ sdspi_host_remove_device(this->handle_);
+ sdspi_host_deinit();
+
+ gpio_->set_sd_mux(GpioExpander::USB);
+ gpio_->set_sd_cs(true);
+ gpio_->Write();
+
+ return ESP_OK;
+}
+
+} // namespace gay_ipod