Skip to content

Commit fa02288

Browse files
authored
Get correct Flash Chip Mode
1 parent d7f892d commit fa02288

File tree

2 files changed

+33
-49
lines changed

2 files changed

+33
-49
lines changed

cores/esp32/Esp.cpp

Lines changed: 32 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ extern "C" {
3030
}
3131
#include <MD5Builder.h>
3232

33+
#include "soc/spi_reg.h"
3334
#include "esp_system.h"
3435
#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+
3536
#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4
@@ -55,6 +56,14 @@ extern "C" {
5556
#define ESP_FLASH_IMAGE_BASE 0x1000
5657
#endif
5758

59+
// REG_SPI_BASE is not defined for S3/C3 ??
60+
61+
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3
62+
#ifndef REG_SPI_BASE
63+
#define REG_SPI_BASE(i) (DR_REG_SPI1_BASE + (((i)>1) ? (((i)* 0x1000) + 0x20000) : (((~(i)) & 1)* 0x1000 )))
64+
#endif // REG_SPI_BASE
65+
#endif // TARGET
66+
5867
/**
5968
* User-defined Literals
6069
* usage:
@@ -192,7 +201,7 @@ static uint32_t sketchSize(sketchSize_t response) {
192201
return data.image_len;
193202
}
194203
}
195-
204+
196205
uint32_t EspClass::getSketchSize () {
197206
return sketchSize(SKETCH_SIZE_TOTAL);
198207
}
@@ -327,31 +336,28 @@ uint32_t EspClass::getFlashChipSpeed(void)
327336
return magicFlashChipSpeed(fhdr.spi_speed);
328337
}
329338

330-
FlashMode_t EspClass::getFlashChipMode(void)
331-
{
332-
esp_image_header_t fhdr;
333-
if(flashRead(ESP_FLASH_IMAGE_BASE, (uint32_t*)&fhdr, sizeof(esp_image_header_t)) && fhdr.magic != ESP_IMAGE_HEADER_MAGIC) {
334-
return FM_UNKNOWN;
335-
}
336-
return magicFlashChipMode(fhdr.spi_mode);
337-
}
338-
339-
uint32_t EspClass::magicFlashChipSize(uint8_t byte)
340-
{
341-
switch(byte & 0x0F) {
342-
case 0x0: // 8 MBit (1MB)
343-
return (1_MB);
344-
case 0x1: // 16 MBit (2MB)
345-
return (2_MB);
346-
case 0x2: // 32 MBit (4MB)
347-
return (4_MB);
348-
case 0x3: // 64 MBit (8MB)
349-
return (8_MB);
350-
case 0x4: // 128 MBit (16MB)
351-
return (16_MB);
352-
default: // fail?
353-
return 0;
354-
}
339+
const char * EspClass::getFlashChipMode(void)
340+
{
341+
#if CONFIG_IDF_TARGET_ESP32S2
342+
uint32_t spi_ctrl = REG_READ(PERIPHS_SPI_FLASH_CTRL);
343+
#else
344+
uint32_t spi_ctrl = REG_READ(SPI_CTRL_REG(0));
345+
#endif
346+
/* Not all of the following constants are already defined in older versions of spi_reg.h, so do it manually for now*/
347+
if (spi_ctrl & BIT(24)) { //SPI_FREAD_QIO
348+
return ("QIO");
349+
} else if (spi_ctrl & BIT(20)) { //SPI_FREAD_QUAD
350+
return ("QOUT");
351+
} else if (spi_ctrl & BIT(23)) { //SPI_FREAD_DIO
352+
return ("DIO");
353+
} else if (spi_ctrl & BIT(14)) { // SPI_FREAD_DUAL
354+
return ("DOUT");
355+
} else if (spi_ctrl & BIT(13)) { //SPI_FASTRD_MODE
356+
return ("Fast");
357+
} else {
358+
return ("Slow");
359+
}
360+
return ("DOUT");
355361
}
356362

357363
uint32_t EspClass::magicFlashChipSpeed(uint8_t byte)
@@ -370,15 +376,6 @@ uint32_t EspClass::magicFlashChipSpeed(uint8_t byte)
370376
}
371377
}
372378

373-
FlashMode_t EspClass::magicFlashChipMode(uint8_t byte)
374-
{
375-
FlashMode_t mode = (FlashMode_t) byte;
376-
if(mode > FM_SLOW_READ) {
377-
mode = FM_UNKNOWN;
378-
}
379-
return mode;
380-
}
381-
382379
bool EspClass::flashEraseSector(uint32_t sector)
383380
{
384381
return spi_flash_erase_sector(sector) == ESP_OK;

cores/esp32/Esp.h

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,6 @@ typedef enum {
4141
WDTO_8S = 8000 //!< WDTO_8S
4242
} WDTO_t;
4343

44-
45-
typedef enum {
46-
FM_QIO = 0x00,
47-
FM_QOUT = 0x01,
48-
FM_DIO = 0x02,
49-
FM_DOUT = 0x03,
50-
FM_FAST_READ = 0x04,
51-
FM_SLOW_READ = 0x05,
52-
FM_UNKNOWN = 0xff
53-
} FlashMode_t;
54-
5544
typedef enum {
5645
SKETCH_SIZE_TOTAL = 0,
5746
SKETCH_SIZE_FREE = 1
@@ -87,11 +76,9 @@ class EspClass
8776

8877
uint32_t getFlashChipSize();
8978
uint32_t getFlashChipSpeed();
90-
FlashMode_t getFlashChipMode();
79+
const char * getFlashChipMode();
9180

92-
uint32_t magicFlashChipSize(uint8_t byte);
9381
uint32_t magicFlashChipSpeed(uint8_t byte);
94-
FlashMode_t magicFlashChipMode(uint8_t byte);
9582

9683
uint32_t getSketchSize();
9784
String getSketchMD5();

0 commit comments

Comments
 (0)