spi_flash: 32M bits address flash map, (for customer use only)

This commit is contained in:
Cao Sen Miao
2023-04-14 11:37:09 +08:00
parent 7d41c5b903
commit c7053641bc
13 changed files with 235 additions and 57 deletions
@@ -123,6 +123,10 @@ esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size)
#include "hal/mmu_hal.h"
#include "hal/mmu_ll.h"
#include "hal/cache_hal.h"
#if CONFIG_IDF_TARGET_ESP32S3
#include "esp32s3/rom/opi_flash.h"
#endif
static const char *TAG = "bootloader_flash";
#if CONFIG_IDF_TARGET_ESP32
@@ -409,6 +413,45 @@ esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size)
return spi_to_esp_err(rc);
}
#if CONFIG_SPI_FLASH_32BIT_ADDR_ENABLE
void bootloader_flash_32bits_address_map_enable(esp_rom_spiflash_read_mode_t flash_mode)
{
esp_rom_opiflash_spi0rd_t cache_rd = {};
switch (flash_mode) {
case ESP_ROM_SPIFLASH_DOUT_MODE:
cache_rd.addr_bit_len = 32;
cache_rd.dummy_bit_len = 8;
cache_rd.cmd = CMD_FASTRD_DUAL_4B;
cache_rd.cmd_bit_len = 8;
break;
case ESP_ROM_SPIFLASH_DIO_MODE:
cache_rd.addr_bit_len = 32;
cache_rd.dummy_bit_len = 4;
cache_rd.cmd = CMD_FASTRD_DIO_4B;
cache_rd.cmd_bit_len = 8;
break;
case ESP_ROM_SPIFLASH_QOUT_MODE:
cache_rd.addr_bit_len = 32;
cache_rd.dummy_bit_len = 8;
cache_rd.cmd = CMD_FASTRD_QUAD_4B;
cache_rd.cmd_bit_len = 8;
break;
case ESP_ROM_SPIFLASH_QIO_MODE:
cache_rd.addr_bit_len = 32;
cache_rd.dummy_bit_len = 6;
cache_rd.cmd = CMD_FASTRD_QIO_4B;
cache_rd.cmd_bit_len = 8;
break;
default:
assert(false);
break;
}
cache_hal_disable(CACHE_TYPE_ALL);
esp_rom_opiflash_cache_mode_config(flash_mode, &cache_rd);
cache_hal_enable(CACHE_TYPE_ALL);
}
#endif
#endif // BOOTLOADER_BUILD
@@ -755,3 +798,40 @@ bool IRAM_ATTR bootloader_flash_is_octal_mode_enabled(void)
return false;
#endif
}
esp_rom_spiflash_read_mode_t bootloader_flash_get_spi_mode(void)
{
esp_rom_spiflash_read_mode_t spi_mode = ESP_ROM_SPIFLASH_FASTRD_MODE;
#if CONFIG_IDF_TARGET_ESP32
uint32_t spi_ctrl = REG_READ(SPI_CTRL_REG(0));
if (spi_ctrl & SPI_FREAD_QIO) {
spi_mode = ESP_ROM_SPIFLASH_QIO_MODE;
} else if (spi_ctrl & SPI_FREAD_QUAD) {
spi_mode = ESP_ROM_SPIFLASH_QOUT_MODE;
} else if (spi_ctrl & SPI_FREAD_DIO) {
spi_mode = ESP_ROM_SPIFLASH_DIO_MODE;
} else if (spi_ctrl & SPI_FREAD_DUAL) {
spi_mode = ESP_ROM_SPIFLASH_DOUT_MODE;
} else if (spi_ctrl & SPI_FASTRD_MODE) {
spi_mode = ESP_ROM_SPIFLASH_FASTRD_MODE;
} else {
spi_mode = ESP_ROM_SPIFLASH_SLOWRD_MODE;
}
#else
uint32_t spi_ctrl = REG_READ(SPI_MEM_CTRL_REG(0));
if (spi_ctrl & SPI_MEM_FREAD_QIO) {
spi_mode = ESP_ROM_SPIFLASH_QIO_MODE;
} else if (spi_ctrl & SPI_MEM_FREAD_QUAD) {
spi_mode = ESP_ROM_SPIFLASH_QOUT_MODE;
} else if (spi_ctrl & SPI_MEM_FREAD_DIO) {
spi_mode = ESP_ROM_SPIFLASH_DIO_MODE;
} else if (spi_ctrl & SPI_MEM_FREAD_DUAL) {
spi_mode = ESP_ROM_SPIFLASH_DOUT_MODE;
} else if (spi_ctrl & SPI_MEM_FASTRD_MODE) {
spi_mode = ESP_ROM_SPIFLASH_FASTRD_MODE;
} else {
spi_mode = ESP_ROM_SPIFLASH_SLOWRD_MODE;
}
#endif
return spi_mode;
}
@@ -308,19 +308,26 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
/* SPI mode could have been set to QIO during boot already,
so test the SPI registers not the flash header */
uint32_t spi_ctrl = REG_READ(SPI_CTRL_REG(0));
if (spi_ctrl & SPI_FREAD_QIO) {
esp_rom_spiflash_read_mode_t spi_mode = bootloader_flash_get_spi_mode();
switch (spi_mode) {
case ESP_ROM_SPIFLASH_QIO_MODE:
str = "QIO";
} else if (spi_ctrl & SPI_FREAD_QUAD) {
break;
case ESP_ROM_SPIFLASH_QOUT_MODE:
str = "QOUT";
} else if (spi_ctrl & SPI_FREAD_DIO) {
break;
case ESP_ROM_SPIFLASH_DIO_MODE:
str = "DIO";
} else if (spi_ctrl & SPI_FREAD_DUAL) {
break;
case ESP_ROM_SPIFLASH_DOUT_MODE:
str = "DOUT";
} else if (spi_ctrl & SPI_FASTRD_MODE) {
break;
case ESP_ROM_SPIFLASH_FASTRD_MODE:
str = "FAST READ";
} else {
break;
default:
str = "SLOW READ";
break;
}
ESP_EARLY_LOGI(TAG, "SPI Mode : %s", str);
@@ -163,19 +163,26 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
/* SPI mode could have been set to QIO during boot already,
so test the SPI registers not the flash header */
uint32_t spi_ctrl = REG_READ(SPI_MEM_CTRL_REG(0));
if (spi_ctrl & SPI_MEM_FREAD_QIO) {
esp_rom_spiflash_read_mode_t spi_mode = bootloader_flash_get_spi_mode();
switch (spi_mode) {
case ESP_ROM_SPIFLASH_QIO_MODE:
str = "QIO";
} else if (spi_ctrl & SPI_MEM_FREAD_QUAD) {
break;
case ESP_ROM_SPIFLASH_QOUT_MODE:
str = "QOUT";
} else if (spi_ctrl & SPI_MEM_FREAD_DIO) {
break;
case ESP_ROM_SPIFLASH_DIO_MODE:
str = "DIO";
} else if (spi_ctrl & SPI_MEM_FREAD_DUAL) {
break;
case ESP_ROM_SPIFLASH_DOUT_MODE:
str = "DOUT";
} else if (spi_ctrl & SPI_MEM_FASTRD_MODE) {
break;
case ESP_ROM_SPIFLASH_FASTRD_MODE:
str = "FAST READ";
} else {
break;
default:
str = "SLOW READ";
break;
}
ESP_EARLY_LOGI(TAG, "SPI Mode : %s", str);
@@ -174,19 +174,26 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
/* SPI mode could have been set to QIO during boot already,
so test the SPI registers not the flash header */
uint32_t spi_ctrl = REG_READ(SPI_MEM_CTRL_REG(0));
if (spi_ctrl & SPI_MEM_FREAD_QIO) {
esp_rom_spiflash_read_mode_t spi_mode = bootloader_flash_get_spi_mode();
switch (spi_mode) {
case ESP_ROM_SPIFLASH_QIO_MODE:
str = "QIO";
} else if (spi_ctrl & SPI_MEM_FREAD_QUAD) {
break;
case ESP_ROM_SPIFLASH_QOUT_MODE:
str = "QOUT";
} else if (spi_ctrl & SPI_MEM_FREAD_DIO) {
break;
case ESP_ROM_SPIFLASH_DIO_MODE:
str = "DIO";
} else if (spi_ctrl & SPI_MEM_FREAD_DUAL) {
break;
case ESP_ROM_SPIFLASH_DOUT_MODE:
str = "DOUT";
} else if (spi_ctrl & SPI_MEM_FASTRD_MODE) {
break;
case ESP_ROM_SPIFLASH_FASTRD_MODE:
str = "FAST READ";
} else {
break;
default:
str = "SLOW READ";
break;
}
ESP_EARLY_LOGI(TAG, "SPI Mode : %s", str);
@@ -139,19 +139,26 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
/* SPI mode could have been set to QIO during boot already,
so test the SPI registers not the flash header */
uint32_t spi_ctrl = REG_READ(SPI_MEM_CTRL_REG(0));
if (spi_ctrl & SPI_MEM_FREAD_QIO) {
esp_rom_spiflash_read_mode_t spi_mode = bootloader_flash_get_spi_mode();
switch (spi_mode) {
case ESP_ROM_SPIFLASH_QIO_MODE:
str = "QIO";
} else if (spi_ctrl & SPI_MEM_FREAD_QUAD) {
break;
case ESP_ROM_SPIFLASH_QOUT_MODE:
str = "QOUT";
} else if (spi_ctrl & SPI_MEM_FREAD_DIO) {
break;
case ESP_ROM_SPIFLASH_DIO_MODE:
str = "DIO";
} else if (spi_ctrl & SPI_MEM_FREAD_DUAL) {
break;
case ESP_ROM_SPIFLASH_DOUT_MODE:
str = "DOUT";
} else if (spi_ctrl & SPI_MEM_FASTRD_MODE) {
break;
case ESP_ROM_SPIFLASH_FASTRD_MODE:
str = "FAST READ";
} else {
break;
default:
str = "SLOW READ";
break;
}
ESP_EARLY_LOGI(TAG, "SPI Mode : %s", str);
@@ -146,19 +146,26 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
/* SPI mode could have been set to QIO during boot already,
so test the SPI registers not the flash header */
uint32_t spi_ctrl = REG_READ(SPI_MEM_CTRL_REG(0));
if (spi_ctrl & SPI_MEM_FREAD_QIO) {
esp_rom_spiflash_read_mode_t spi_mode = bootloader_flash_get_spi_mode();
switch (spi_mode) {
case ESP_ROM_SPIFLASH_QIO_MODE:
str = "QIO";
} else if (spi_ctrl & SPI_MEM_FREAD_QUAD) {
break;
case ESP_ROM_SPIFLASH_QOUT_MODE:
str = "QOUT";
} else if (spi_ctrl & SPI_MEM_FREAD_DIO) {
break;
case ESP_ROM_SPIFLASH_DIO_MODE:
str = "DIO";
} else if (spi_ctrl & SPI_MEM_FREAD_DUAL) {
break;
case ESP_ROM_SPIFLASH_DOUT_MODE:
str = "DOUT";
} else if (spi_ctrl & SPI_MEM_FASTRD_MODE) {
break;
case ESP_ROM_SPIFLASH_FASTRD_MODE:
str = "FAST READ";
} else {
break;
default:
str = "SLOW READ";
break;
}
ESP_EARLY_LOGI(TAG, "SPI Mode : %s", str);
@@ -173,19 +173,26 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
/* SPI mode could have been set to QIO during boot already,
so test the SPI registers not the flash header */
uint32_t spi_ctrl = REG_READ(SPI_MEM_CTRL_REG(0));
if (spi_ctrl & SPI_MEM_FREAD_QIO) {
esp_rom_spiflash_read_mode_t spi_mode = bootloader_flash_get_spi_mode();
switch (spi_mode) {
case ESP_ROM_SPIFLASH_QIO_MODE:
str = "QIO";
} else if (spi_ctrl & SPI_MEM_FREAD_QUAD) {
break;
case ESP_ROM_SPIFLASH_QOUT_MODE:
str = "QOUT";
} else if (spi_ctrl & SPI_MEM_FREAD_DIO) {
break;
case ESP_ROM_SPIFLASH_DIO_MODE:
str = "DIO";
} else if (spi_ctrl & SPI_MEM_FREAD_DUAL) {
break;
case ESP_ROM_SPIFLASH_DOUT_MODE:
str = "DOUT";
} else if (spi_ctrl & SPI_MEM_FASTRD_MODE) {
break;
case ESP_ROM_SPIFLASH_FASTRD_MODE:
str = "FAST READ";
} else {
break;
default:
str = "SLOW READ";
break;
}
ESP_EARLY_LOGI(TAG, "SPI Mode : %s", str);
@@ -188,19 +188,26 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
/* SPI mode could have been set to QIO during boot already,
so test the SPI registers not the flash header */
uint32_t spi_ctrl = REG_READ(SPI_MEM_CTRL_REG(0));
if (spi_ctrl & SPI_MEM_FREAD_QIO) {
esp_rom_spiflash_read_mode_t spi_mode = bootloader_flash_get_spi_mode();
switch (spi_mode) {
case ESP_ROM_SPIFLASH_QIO_MODE:
str = "QIO";
} else if (spi_ctrl & SPI_MEM_FREAD_QUAD) {
break;
case ESP_ROM_SPIFLASH_QOUT_MODE:
str = "QOUT";
} else if (spi_ctrl & SPI_MEM_FREAD_DIO) {
break;
case ESP_ROM_SPIFLASH_DIO_MODE:
str = "DIO";
} else if (spi_ctrl & SPI_MEM_FREAD_DUAL) {
break;
case ESP_ROM_SPIFLASH_DOUT_MODE:
str = "DOUT";
} else if (spi_ctrl & SPI_MEM_FASTRD_MODE) {
break;
case ESP_ROM_SPIFLASH_FASTRD_MODE:
str = "FAST READ";
} else {
break;
default:
str = "SLOW READ";
break;
}
ESP_EARLY_LOGI(TAG, "SPI Mode : %s", str);
@@ -195,19 +195,26 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
/* SPI mode could have been set to QIO during boot already,
so test the SPI registers not the flash header */
uint32_t spi_ctrl = REG_READ(SPI_MEM_CTRL_REG(0));
if (spi_ctrl & SPI_MEM_FREAD_QIO) {
esp_rom_spiflash_read_mode_t spi_mode = bootloader_flash_get_spi_mode();
switch (spi_mode) {
case ESP_ROM_SPIFLASH_QIO_MODE:
str = "QIO";
} else if (spi_ctrl & SPI_MEM_FREAD_QUAD) {
break;
case ESP_ROM_SPIFLASH_QOUT_MODE:
str = "QOUT";
} else if (spi_ctrl & SPI_MEM_FREAD_DIO) {
break;
case ESP_ROM_SPIFLASH_DIO_MODE:
str = "DIO";
} else if (spi_ctrl & SPI_MEM_FREAD_DUAL) {
break;
case ESP_ROM_SPIFLASH_DOUT_MODE:
str = "DOUT";
} else if (spi_ctrl & SPI_MEM_FASTRD_MODE) {
break;
case ESP_ROM_SPIFLASH_FASTRD_MODE:
str = "FAST READ";
} else {
break;
default:
str = "SLOW READ";
break;
}
ESP_EARLY_LOGI(TAG, "SPI Mode : %s", str);
@@ -272,7 +279,9 @@ esp_err_t bootloader_init_spi_flash(void)
bootloader_enable_qio_mode();
}
#endif
#if CONFIG_SPI_FLASH_32BIT_ADDR_ENABLE
bootloader_flash_32bits_address_map_enable(bootloader_flash_get_spi_mode());
#endif
print_flash_info(&bootloader_image_hdr);
update_flash_config(&bootloader_image_hdr);
//ensure the flash is write-protected