From 724baf7910797d930f8302a376bf312f8aee4449 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 30 Apr 2015 10:42:17 +0200 Subject: [PATCH] add functions to read out the flash config Serial.print(F("Flash Chip Size: ")); Serial.println(ESP.getFlashChipSize()); Serial.print(F("Flash Chip Speed: ")); Serial.println(ESP.getFlashChipSpeed()); Serial.print(F("Flash Chip Mode: 0x")); Serial.println(ESP.getFlashChipMode(), HEX); --- cores/esp8266/Arduino.h | 12 +++++++ cores/esp8266/Esp.cpp | 72 ++++++++++++++++++++++++++++++++++++++--- cores/esp8266/Esp.h | 15 ++++++++- 3 files changed, 93 insertions(+), 6 deletions(-) diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index 19c25e899..31b6fc5d8 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -82,6 +82,18 @@ void yield(void); #define degrees(rad) ((rad)*RAD_TO_DEG) #define sq(x) ((x)*(x)) +#define kHz (1000L) +#define MHz (1000L*kHz) +#define GHz (1000L*MHz) + +#define kBit (1024L) +#define MBit (1024L*kBit) +#define GBit (1024L*kBit) + +#define kB (1024L) +#define MB (1024L*kB) +#define GB (1024L*MB) + void ets_intr_lock(); void ets_intr_unlock(); diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index eb1cade8c..5362da4da 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -89,11 +89,6 @@ uint32_t EspClass::getChipId(void) return system_get_chip_id(); } -uint32_t EspClass::getFlashChipId(void) -{ - return spi_flash_get_id(); -} - const char * EspClass::getSDKversion(void) { return system_get_sdk_version(); @@ -113,3 +108,70 @@ uint8_t EspClass::getCPUfreqMHz(void) { return system_get_cpu_freq(); } + + +uint32_t EspClass::getFlashChipId(void) +{ + return spi_flash_get_id(); +} + +uint32_t EspClass::getFlashChipSize(void) +{ + uint32_t data; + uint8_t * bytes = (uint8_t *) &data; + // read first 4 byte (magic byte + flash config) + if(spi_flash_read(0x0000, &data, 4) == SPI_FLASH_RESULT_OK) { + switch((bytes[3] & 0xF0) >> 4) { + case 0x0: // 4 Mbit (512KB) + return (512 * kB); + case 0x1: // 2 MBit (256KB) + return (256 * kB); + case 0x2: // 8 MBit (1MB) + return (1 * MB); + case 0x3: // 16 MBit (2MB) + return (2 * MB); + case 0x4: // 32 MBit (4MB) + return (4 * MB); + default: // fail? + return 0; + } + } + return 0; +} + +uint32_t EspClass::getFlashChipSpeed(void) +{ + uint32_t data; + uint8_t * bytes = (uint8_t *) &data; + // read first 4 byte (magic byte + flash config) + if(spi_flash_read(0x0000, &data, 4) == SPI_FLASH_RESULT_OK) { + switch(bytes[3] & 0x0F) { + case 0x0: // 40 MHz + return (40 * MHz); + case 0x1: // 26 MHz + return (26 * MHz); + case 0x2: // 20 MHz + return (20 * MHz); + case 0xF: // 80 MHz + return (80 * MHz); + default: // fail? + return 0; + } + } + return 0; +} + +FlashMode_t EspClass::getFlashChipMode(void) +{ + FlashMode_t mode = FM_FAILD; + uint32_t data; + uint8_t * bytes = (uint8_t *) &data; + // read first 4 byte (magic byte + flash config) + if(spi_flash_read(0x0000, &data, 4) == SPI_FLASH_RESULT_OK) { + mode = (FlashMode_t) bytes[2]; + if(mode > FM_DOUT) { + mode = FM_FAILD; + } + } + return mode; +} diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index 1b55cf051..97a614c71 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -49,6 +49,14 @@ enum WakeMode { WAKE_RF_DISABLED = 4 // disable RF after deep-sleep wake up, just like modem sleep, there will be the smallest current. }; +typedef enum { + FM_QIO = 0x00, + FM_QOUT = 0x01, + FM_DIO = 0x02, + FM_DOUT = 0x03, + FM_FAILD = 0xFF +} FlashMode_t; + class EspClass { public: EspClass(); @@ -69,7 +77,7 @@ class EspClass { uint32_t getFreeHeap(void); uint32_t getChipId(void); - uint32_t getFlashChipId(void); + const char * getSDKversion(void); @@ -78,6 +86,11 @@ class EspClass { uint8_t getCPUfreqMHz(void); + uint32_t getFlashChipId(void); + uint32_t getFlashChipSize(void); + uint32_t getFlashChipSpeed(void); + FlashMode_t getFlashChipMode(void); + }; extern EspClass ESP;