diff --git a/src/sdcard.cpp b/src/sdcard.cpp index e33f285..2bcb924 100644 --- a/src/sdcard.cpp +++ b/src/sdcard.cpp @@ -1,90 +1,69 @@ /* * SD card * + * https://github.com/espressif/arduino-esp32/blob/master/libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino * https://github.com/espressif/esp-idf/tree/master/examples/storage/sd_card */ -#include -#include -#include -#include -#include "esp_err.h" -#include "esp_log.h" -#include "esp_vfs_fat.h" -#include "driver/sdmmc_host.h" -#include "driver/sdmmc_defs.h" -#include "sdmmc_cmd.h" +#include "Arduino.h" +#include "FS.h" +#include "SD.h" +#include "SPI.h" #include "sdcard.h" using namespace std; static const char* TAG = "SDCard"; +#define PIN_SD_CD 17 SDCard::SDCard() { } void SDCard::mount() { - ESP_LOGI(TAG, "Initializing SD card"); - - sdmmc_host_t host = SDMMC_HOST_DEFAULT(); - - // To use 1-line SD mode, uncomment the following line: - // host.flags = SDMMC_HOST_FLAG_1BIT; - - // This initializes the slot without card detect (CD) and write protect (WP) signals. - // Modify slot_config.gpio_cd and slot_config.gpio_wp if your board has these signals. - sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT(); - - // Options for mounting the filesystem. - // If format_if_mount_failed is set to true, SD card will be partitioned and formatted - // in case when mounting fails. - esp_vfs_fat_sdmmc_mount_config_t mount_config = { - .format_if_mount_failed = false, - .max_files = 5 - }; + pinMode(PIN_SD_CD, INPUT); + if (!digitalRead(PIN_SD_CD)) { + Serial.println("No card detected!"); + } + if(!SD.begin(5)){ + Serial.println("Card Mount Failed"); + return; + } + this->cardType = SD.cardType(); - // Use settings defined above to initialize SD card and mount FAT filesystem. - // Note: esp_vfs_fat_sdmmc_mount is an all-in-one convenience function. - // Please check its source code and implement error recovery when developing - // production applications. - sdmmc_card_t* card; - esp_err_t ret = esp_vfs_fat_sdmmc_mount("/sdcard", &host, &slot_config, &mount_config, &card); - if (ret != ESP_OK) { - if (ret == ESP_FAIL) { - ESP_LOGE(TAG, "Failed to mount filesystem. If you want the card to be formatted, set format_if_mount_failed = true."); - } else { - ESP_LOGE(TAG, "Failed to initialize the card (%d). Make sure SD card lines have pull-up resistors in place.", ret); - } + if(this->cardType == CARD_NONE){ + Serial.println("No SD card attached"); return; } - // Card has been initialized, print its properties - sdmmc_card_print_info(stdout, card); + Serial.print("SD_MMC Card Type: "); + if(this->cardType == CARD_MMC){ + Serial.println("MMC"); + } else if(this->cardType == CARD_SD){ + Serial.println("SDSC"); + } else if(this->cardType == CARD_SDHC){ + Serial.println("SDHC"); + } else { + Serial.println("UNKNOWN"); + } + + this->cardSize = SD.cardSize() / (1024 * 1024); + Serial.printf("SD_MMC Card Size: %lluMB\n", this->cardSize); } void SDCard::umount() { - // All done, unmount partition and disable SDMMC host peripheral - esp_vfs_fat_sdmmc_unmount(); - ESP_LOGI(TAG, "Card unmounted"); + SD.end(); } -int SDCard::readFile(const char *path){ - ESP_LOGI(TAG, "Reading file"); - FILE* f = fopen("/sdcard/foo.txt", "r"); - if (f == NULL) { - ESP_LOGE(TAG, "Failed to open file for reading"); - return -1; - } - char line[64]; - fgets(line, sizeof(line), f); - fclose(f); - // strip newline - char* pos = strchr(line, '\n'); - if (pos) { - *pos = '\0'; +void SDCard::readFile(const char *path){ + File file = fs.open(path); + if(!file){ + Serial.println("Failed to open file for reading"); + return; } - ESP_LOGI(TAG, "Read from file: '%s'", line); - return 0; + Serial.print("Read from file: "); + while(file.available()){ + Serial.write(file.read()); + } } diff --git a/src/sdcard.h b/src/sdcard.h index adc42b3..eb7d77d 100644 --- a/src/sdcard.h +++ b/src/sdcard.h @@ -1,13 +1,21 @@ #ifndef _SDCARD_H #define _SDCARD_H +#include "Arduino.h" +#include "FS.h" +#include "SD.h" +#include "SPI.h" + class SDCard { public: SDCard(); void mount(); void umount(); - int readFile(const char *path); + void readFile(const char *path); private: + fs::FS &fs = SD; + uint8_t cardType; + uint64_t cardSize; }; #endif /* _SDCARD_H */