|
81 | 81 | #include "soc/cache_memory.h"
|
82 | 82 | #endif
|
83 | 83 |
|
| 84 | +#include "soc/efuse_reg.h" |
84 | 85 | #include "soc/rtc_cntl_reg.h"
|
85 | 86 |
|
86 | 87 | #include "esp_debug_helpers.h"
|
87 | 88 |
|
| 89 | +#include "bootloader_flash_config.h" |
| 90 | +#include "esp_efuse.h" |
88 | 91 | #include "esp_ipc.h"
|
| 92 | +#include "esp_rom_efuse.h" |
| 93 | + |
| 94 | +#ifdef CONFIG_IDF_TARGET_ESP32 |
| 95 | +#include "esp32/rom/efuse.h" |
| 96 | +#endif |
89 | 97 |
|
90 | 98 | #ifdef CONFIG_SPIRAM
|
91 | 99 | #include "esp32/spiram.h"
|
@@ -134,6 +142,93 @@ STATIC void tick_timer_cb(void *arg) {
|
134 | 142 |
|
135 | 143 | void sleep_timer_cb(void *arg);
|
136 | 144 |
|
| 145 | +// The ESP-IDF determines these pins at runtime so we do too. This code is based on: |
| 146 | +// https://github.com/espressif/esp-idf/blob/6d85d53ceec30c818a92c2fff8f5437d21c4720f/components/esp_hw_support/port/esp32/spiram_psram.c#L810 |
| 147 | +// IO-pins for PSRAM. |
| 148 | +// WARNING: PSRAM shares all but the CS and CLK pins with the flash, so these defines |
| 149 | +// hardcode the flash pins as well, making this code incompatible with either a setup |
| 150 | +// that has the flash on non-standard pins or ESP32s with built-in flash. |
| 151 | +#define PSRAM_SPIQ_SD0_IO 7 |
| 152 | +#define PSRAM_SPID_SD1_IO 8 |
| 153 | +#define PSRAM_SPIWP_SD3_IO 10 |
| 154 | +#define PSRAM_SPIHD_SD2_IO 9 |
| 155 | + |
| 156 | +#define FLASH_HSPI_CLK_IO 14 |
| 157 | +#define FLASH_HSPI_CS_IO 15 |
| 158 | +#define PSRAM_HSPI_SPIQ_SD0_IO 12 |
| 159 | +#define PSRAM_HSPI_SPID_SD1_IO 13 |
| 160 | +#define PSRAM_HSPI_SPIWP_SD3_IO 2 |
| 161 | +#define PSRAM_HSPI_SPIHD_SD2_IO 4 |
| 162 | + |
| 163 | +// PSRAM clock and cs IO should be configured based on hardware design. |
| 164 | +// For ESP32-WROVER or ESP32-WROVER-B module, the clock IO is IO17, the cs IO is IO16, |
| 165 | +// they are the default value for these two configs. |
| 166 | +#define D0WD_PSRAM_CLK_IO CONFIG_D0WD_PSRAM_CLK_IO // Default value is 17 |
| 167 | +#define D0WD_PSRAM_CS_IO CONFIG_D0WD_PSRAM_CS_IO // Default value is 16 |
| 168 | + |
| 169 | +#define D2WD_PSRAM_CLK_IO CONFIG_D2WD_PSRAM_CLK_IO // Default value is 9 |
| 170 | +#define D2WD_PSRAM_CS_IO CONFIG_D2WD_PSRAM_CS_IO // Default value is 10 |
| 171 | + |
| 172 | +// There is no reason to change the pin of an embedded psram. |
| 173 | +// So define the number of pin directly, instead of configurable. |
| 174 | +#define D0WDR2_V3_PSRAM_CLK_IO 6 |
| 175 | +#define D0WDR2_V3_PSRAM_CS_IO 16 |
| 176 | + |
| 177 | +// For ESP32-PICO chip, the psram share clock with flash. The flash clock pin is fixed, which is IO6. |
| 178 | +#define PICO_PSRAM_CLK_IO 6 |
| 179 | +#define PICO_PSRAM_CS_IO CONFIG_PICO_PSRAM_CS_IO // Default value is 10 |
| 180 | + |
| 181 | +#define PICO_V3_02_PSRAM_CLK_IO 10 |
| 182 | +#define PICO_V3_02_PSRAM_CS_IO 9 |
| 183 | + |
| 184 | +static void _never_reset_spi_ram_flash(void) { |
| 185 | + #if defined(CONFIG_IDF_TARGET_ESP32) |
| 186 | + uint32_t pkg_ver = esp_efuse_get_pkg_ver(); |
| 187 | + if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5) { |
| 188 | + never_reset_pin_number(D2WD_PSRAM_CLK_IO); |
| 189 | + never_reset_pin_number(D2WD_PSRAM_CS_IO); |
| 190 | + } else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4 && esp_efuse_get_chip_ver() >= 3) { |
| 191 | + // This chip is ESP32-PICO-V3 and doesn't have PSRAM. |
| 192 | + } else if ((pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2) || (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4)) { |
| 193 | + never_reset_pin_number(PICO_PSRAM_CLK_IO); |
| 194 | + never_reset_pin_number(PICO_PSRAM_CS_IO); |
| 195 | + } else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOV302) { |
| 196 | + never_reset_pin_number(PICO_V3_02_PSRAM_CLK_IO); |
| 197 | + never_reset_pin_number(PICO_V3_02_PSRAM_CS_IO); |
| 198 | + } else if ((pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D0WDQ6) || (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D0WDQ5)) { |
| 199 | + never_reset_pin_number(D0WD_PSRAM_CLK_IO); |
| 200 | + never_reset_pin_number(D0WD_PSRAM_CS_IO); |
| 201 | + } else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D0WDR2V3) { |
| 202 | + never_reset_pin_number(D0WDR2_V3_PSRAM_CLK_IO); |
| 203 | + never_reset_pin_number(D0WDR2_V3_PSRAM_CS_IO); |
| 204 | + } |
| 205 | + |
| 206 | + const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info(); |
| 207 | + if (spiconfig == ESP_ROM_EFUSE_FLASH_DEFAULT_SPI) { |
| 208 | + never_reset_pin_number(SPI_IOMUX_PIN_NUM_CLK); |
| 209 | + never_reset_pin_number(SPI_IOMUX_PIN_NUM_CS); |
| 210 | + never_reset_pin_number(PSRAM_SPIQ_SD0_IO); |
| 211 | + never_reset_pin_number(PSRAM_SPID_SD1_IO); |
| 212 | + never_reset_pin_number(PSRAM_SPIWP_SD3_IO); |
| 213 | + never_reset_pin_number(PSRAM_SPIHD_SD2_IO); |
| 214 | + } else if (spiconfig == ESP_ROM_EFUSE_FLASH_DEFAULT_HSPI) { |
| 215 | + never_reset_pin_number(FLASH_HSPI_CLK_IO); |
| 216 | + never_reset_pin_number(FLASH_HSPI_CS_IO); |
| 217 | + never_reset_pin_number(PSRAM_HSPI_SPIQ_SD0_IO); |
| 218 | + never_reset_pin_number(PSRAM_HSPI_SPID_SD1_IO); |
| 219 | + never_reset_pin_number(PSRAM_HSPI_SPIWP_SD3_IO); |
| 220 | + never_reset_pin_number(PSRAM_HSPI_SPIHD_SD2_IO); |
| 221 | + } else { |
| 222 | + never_reset_pin_number(EFUSE_SPICONFIG_RET_SPICLK(spiconfig)); |
| 223 | + never_reset_pin_number(EFUSE_SPICONFIG_RET_SPICS0(spiconfig)); |
| 224 | + never_reset_pin_number(EFUSE_SPICONFIG_RET_SPIQ(spiconfig)); |
| 225 | + never_reset_pin_number(EFUSE_SPICONFIG_RET_SPID(spiconfig)); |
| 226 | + never_reset_pin_number(EFUSE_SPICONFIG_RET_SPIHD(spiconfig)); |
| 227 | + never_reset_pin_number(bootloader_flash_get_wp_pin()); |
| 228 | + } |
| 229 | + #endif |
| 230 | +} |
| 231 | + |
137 | 232 | safe_mode_t port_init(void) {
|
138 | 233 | esp_timer_create_args_t args;
|
139 | 234 | args.callback = &tick_timer_cb;
|
@@ -214,6 +309,8 @@ safe_mode_t port_init(void) {
|
214 | 309 | }
|
215 | 310 | #endif
|
216 | 311 |
|
| 312 | + _never_reset_spi_ram_flash(); |
| 313 | + |
217 | 314 | if (heap == NULL) {
|
218 | 315 | size_t heap_total = heap_caps_get_total_size(MALLOC_CAP_8BIT);
|
219 | 316 | heap_size = MIN(heap_caps_get_largest_free_block(MALLOC_CAP_8BIT), heap_total / 2);
|
|
0 commit comments