Unverified Commit 93f10609 authored by Serguei S. Dukachev's avatar Serguei S. Dukachev Committed by GitHub

SDMMC frequency selection based on board type (#5688)

* SDMMC frequency selection based on board type

On Olimex ESP32 EVB I/O operations with SD card can cause error when LAN is used in same time.
Problem is disappearing if SD MMC frequency lower down from SDMMC_FREQ_HIGHSPEED to SDMMC_FREQ_DEFAULT.

No problem if WiFi used instead LAN.

* Code rewritten according to https://github.com/espressif/arduino-esp32/pull/5688#pullrequestreview-759359645
parent 67583e84
...@@ -36,7 +36,7 @@ SDMMCFS::SDMMCFS(FSImplPtr impl) ...@@ -36,7 +36,7 @@ SDMMCFS::SDMMCFS(FSImplPtr impl)
: FS(impl), _card(NULL) : FS(impl), _card(NULL)
{} {}
bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount_failed) bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount_failed, int sdmmc_frequency)
{ {
if(_card) { if(_card) {
return true; return true;
...@@ -46,7 +46,7 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount ...@@ -46,7 +46,7 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
sdmmc_host_t host; sdmmc_host_t host;
host.flags = SDMMC_HOST_FLAG_4BIT; host.flags = SDMMC_HOST_FLAG_4BIT;
host.slot = SDMMC_HOST_SLOT_1; host.slot = SDMMC_HOST_SLOT_1;
host.max_freq_khz = SDMMC_FREQ_HIGHSPEED; host.max_freq_khz = sdmmc_frequency;
host.io_voltage = 3.3f; host.io_voltage = 3.3f;
host.init = &sdmmc_host_init; host.init = &sdmmc_host_init;
host.set_bus_width = &sdmmc_host_set_bus_width; host.set_bus_width = &sdmmc_host_set_bus_width;
......
...@@ -21,6 +21,13 @@ ...@@ -21,6 +21,13 @@
#include "driver/sdmmc_types.h" #include "driver/sdmmc_types.h"
#include "sd_defines.h" #include "sd_defines.h"
// If reading/writing to the SD card is unstable,
// you can define BOARD_MAX_SDMMC_FREQ with lower value (Ex. SDMMC_FREQ_DEFAULT)
// in pins_arduino.h for your board variant.
#ifndef BOARD_MAX_SDMMC_FREQ
#define BOARD_MAX_SDMMC_FREQ SDMMC_FREQ_HIGHSPEED
#endif
namespace fs namespace fs
{ {
...@@ -31,7 +38,7 @@ protected: ...@@ -31,7 +38,7 @@ protected:
public: public:
SDMMCFS(FSImplPtr impl); SDMMCFS(FSImplPtr impl);
bool begin(const char * mountpoint="/sdcard", bool mode1bit=false, bool format_if_mount_failed=false); bool begin(const char * mountpoint="/sdcard", bool mode1bit=false, bool format_if_mount_failed=false, int sdmmc_frequency=BOARD_MAX_SDMMC_FREQ);
void end(); void end();
sdcard_type_t cardType(); sdcard_type_t cardType();
uint64_t cardSize(); uint64_t cardSize();
......
...@@ -29,5 +29,6 @@ static const uint8_t MISO = 15; ...@@ -29,5 +29,6 @@ static const uint8_t MISO = 15;
static const uint8_t SCK = 14; static const uint8_t SCK = 14;
#define BOARD_HAS_1BIT_SDMMC #define BOARD_HAS_1BIT_SDMMC
#define BOARD_MAX_SDMMC_FREQ SDMMC_FREQ_DEFAULT
#endif /* Pins_Arduino_h */ #endif /* Pins_Arduino_h */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment