Merge branch 'fix/spi_flash_keep_program_erase_in_iram_v5.5' into 'release/v5.5'

fix(spi_flash): keep program and erase paths in IRAM (v5.5)

See merge request espressif/esp-idf!51893
This commit is contained in:
morris
2026-09-08 14:43:34 +08:00
12 changed files with 58 additions and 0 deletions

View File

@@ -66,6 +66,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -76,6 +77,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -87,6 +89,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -372,6 +375,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -553,6 +557,7 @@ static inline void spimem_flash_ll_set_addr_bitlen(spi_mem_dev_t *dev, uint32_t
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr = addr;

View File

@@ -68,6 +68,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -78,6 +79,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -89,6 +91,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -374,6 +377,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -555,6 +559,7 @@ static inline void spimem_flash_ll_set_addr_bitlen(spi_mem_dev_t *dev, uint32_t
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr = addr;

View File

@@ -73,6 +73,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -83,6 +84,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -94,6 +96,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -395,6 +398,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -601,6 +605,7 @@ static inline void spimem_flash_ll_wb_mode_enable(spi_mem_dev_t *dev, bool wb_mo
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr = addr;

View File

@@ -69,6 +69,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -79,6 +80,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -90,6 +92,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -375,6 +378,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -568,6 +572,7 @@ static inline void spimem_flash_ll_set_extra_address(spi_mem_dev_t *dev, uint32_
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr = addr;

View File

@@ -72,6 +72,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -82,6 +83,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -93,6 +95,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -365,6 +368,7 @@ static inline void spimem_flash_ll_get_buffer_data(spi_mem_dev_t *dev, void *buf
* @param buffer Buffer holding the data
* @param length Length of data in bytes.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
// Load data registers, word at a time
@@ -388,6 +392,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -593,6 +598,7 @@ static inline void spimem_flash_ll_wb_mode_enable(spi_mem_dev_t *dev, bool wb_mo
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr.usr_addr_value = addr;

View File

@@ -70,6 +70,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -80,6 +81,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -91,6 +93,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -376,6 +379,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -568,6 +572,7 @@ static inline void spimem_flash_ll_set_extra_address(spi_mem_dev_t *dev, uint32_
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr = addr;

View File

@@ -72,6 +72,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -82,6 +83,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -93,6 +95,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -376,6 +379,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -542,6 +546,7 @@ static inline int spimem_flash_ll_get_addr_bitlen(spi_mem_dev_t *dev)
* @param dev Beginning address of the peripheral registers.
* @param bitlen Length of the address, in bits
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_addr_bitlen(spi_mem_dev_t *dev, uint32_t bitlen)
{
dev->user1.usr_addr_bitlen = (bitlen - 1);
@@ -566,6 +571,7 @@ static inline void spimem_flash_ll_set_extra_address(spi_mem_dev_t *dev, uint32_
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr.usr_addr_value = addr;

View File

@@ -72,6 +72,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -82,6 +83,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -93,6 +95,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -376,6 +379,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -570,6 +574,7 @@ static inline void spimem_flash_ll_set_extra_address(spi_mem_dev_t *dev, uint32_
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr.usr_addr_value = addr;

View File

@@ -76,6 +76,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -86,6 +87,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -97,6 +99,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -401,6 +404,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -597,6 +601,7 @@ static inline void spimem_flash_ll_set_extra_address(spi_mem_dev_t *dev, uint32_
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr = addr;

View File

@@ -68,6 +68,7 @@ static inline bool spimem_flash_ll_cmd_is_done(const spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
{
dev->cmd.flash_ce = 1;
@@ -78,6 +79,7 @@ static inline void spimem_flash_ll_erase_chip(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
{
dev->ctrl.val = 0;
@@ -89,6 +91,7 @@ static inline void spimem_flash_ll_erase_sector(spi_mem_dev_t *dev)
*
* @param dev Beginning address of the peripheral registers.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_erase_block(spi_mem_dev_t *dev)
{
dev->cmd.flash_be = 1;
@@ -377,6 +380,7 @@ static inline void spimem_flash_ll_set_buffer_data(spi_mem_dev_t *dev, const voi
* @param buffer Buffer holding the data to program
* @param length Length to program.
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_program_page(spi_mem_dev_t *dev, const void *buffer, uint32_t length)
{
dev->user.usr_dummy = 0;
@@ -575,6 +579,7 @@ static inline void spimem_flash_ll_set_addr_bitlen(spi_mem_dev_t *dev, uint32_t
* @param dev Beginning address of the peripheral registers.
* @param addr Address to send
*/
__attribute__((always_inline))
static inline void spimem_flash_ll_set_address(spi_mem_dev_t *dev, uint32_t addr)
{
dev->addr = addr;

View File

@@ -24,6 +24,7 @@
#define ADDRESS_MASK_24BIT 0xFFFFFF
#define COMPUTE_DUMMY_CYCLELEN(host, base) ((base) + ((spi_flash_hal_context_t*)host)->extra_dummy)
__attribute__((always_inline))
static inline spi_dev_t *get_spi_dev(spi_flash_host_inst_t *host)
{
return ((spi_flash_hal_context_t*)host)->spi;

View File

@@ -87,3 +87,8 @@ entries:
if SOC_GPSPI_SUPPORTED = y && IDF_TARGET_ESP32 = n:
spi_flash_hal_gpspi (noflash)
if SPI_FLASH_ROM_IMPL = n && APP_BUILD_TYPE_PURE_RAM_APP = n:
spi_flash_hal_iram: spi_flash_hal_program_page (noflash)
spi_flash_hal_iram: spi_flash_hal_erase_chip (noflash)
spi_flash_hal_iram: spi_flash_hal_erase_sector (noflash)
spi_flash_hal_iram: spi_flash_hal_erase_block (noflash)