Hendrik Langer
8 years ago
2 changed files with 49 additions and 62 deletions
@ -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 <stdio.h> |
|||
#include <string.h> |
|||
#include <sys/unistd.h> |
|||
#include <sys/stat.h> |
|||
#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(); |
|||
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(); |
|||
|
|||
// 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 |
|||
}; |
|||
if(this->cardType == CARD_NONE){ |
|||
Serial.println("No SD card attached"); |
|||
return; |
|||
} |
|||
|
|||
// 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."); |
|||
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 { |
|||
ESP_LOGE(TAG, "Failed to initialize the card (%d). Make sure SD card lines have pull-up resistors in place.", ret); |
|||
} |
|||
return; |
|||
Serial.println("UNKNOWN"); |
|||
} |
|||
|
|||
// Card has been initialized, print its properties
|
|||
sdmmc_card_print_info(stdout, card); |
|||
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()); |
|||
} |
|||
} |
|||
|
@ -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 */ |
|||
|
Loading…
Reference in new issue