ソースを参照

Merge branch 'bugfix/spi_flash_region' into 'master'

spi_flash_erase_range: Allow for 32KB blocks not 64KB blocks

SPI flash hardware sends 52h command, which is a 32KB erase.

There is a matching bug in the ROM SPIEraseArea code, unless
flashchip->block_size is modified first.

See merge request !249

Angus Gratton 9 年 前
コミット
9f9d92b2df

+ 8 - 1
components/esp32/include/rom/spi_flash.h

@@ -384,7 +384,8 @@ SpiFlashOpResult SPIParamCfg(uint32_t deviceId, uint32_t chip_size, uint32_t blo
 SpiFlashOpResult SPIEraseChip(void);
 
 /**
-  * @brief Erase a block of flash.
+  * @brief Erase a 32KB block of flash
+  *        Uses SPI flash command 52h.
   *        Please do not call this function in SDK.
   *
   * @param  uint32_t block_num : Which block to erase.
@@ -411,6 +412,12 @@ SpiFlashOpResult SPIEraseSector(uint32_t sector_num);
   * @brief Erase some sectors.
   *        Please do not call this function in SDK.
   *
+  * @note If calling this function, first set
+  *       g_rom_flashchip.block_size = 32768; or call SPIParamCfg()
+  *       with appropriate parameters. This is due to a ROM bug, the
+  *       block erase command in use is a 32KB erase but after reset
+  *       the block_size field is incorrectly set to 65536.
+  *
   * @param  uint32_t start_addr : Start addr to erase, should be sector aligned.
   *
   * @param  uint32_t area_len : Length to erase, should be sector aligned.

+ 4 - 1
components/spi_flash/flash_ops.c

@@ -31,6 +31,9 @@
 #include "esp_log.h"
 #include "cache_utils.h"
 
+/* bytes erased by SPIEraseBlock() ROM function */
+#define BLOCK_ERASE_SIZE 32768
+
 #if CONFIG_SPI_FLASH_ENABLE_COUNTERS
 static const char* TAG = "spi_flash";
 static spi_flash_counters_t s_flash_stats;
@@ -100,7 +103,7 @@ esp_err_t IRAM_ATTR spi_flash_erase_range(uint32_t start_addr, uint32_t size)
     }
     size_t start = start_addr / SPI_FLASH_SEC_SIZE;
     size_t end = start + size / SPI_FLASH_SEC_SIZE;
-    const size_t sectors_per_block = 16;
+    const size_t sectors_per_block = BLOCK_ERASE_SIZE / SPI_FLASH_SEC_SIZE;
     COUNTER_START();
     spi_flash_disable_interrupts_caches_and_other_cpu();
     SpiFlashOpResult rc;