Skip to content

Commit fc45b4f

Browse files
committed
Merge branch 'feat/32mbit_address_flash_on_c5' into 'master'
feat(spi_flash): Add 32M flash support on esp32c5 See merge request espressif/esp-idf!35665
2 parents 5a261da + d448c4e commit fc45b4f

File tree

9 files changed

+98
-10
lines changed

9 files changed

+98
-10
lines changed

components/bootloader_support/bootloader_flash/src/bootloader_flash.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ esp_err_t bootloader_flash_erase_range(uint32_t start_addr, uint32_t size)
128128
#include "esp32s3/rom/opi_flash.h"
129129
#elif CONFIG_IDF_TARGET_ESP32P4
130130
#include "esp32p4/rom/opi_flash.h"
131+
#elif CONFIG_IDF_TARGET_ESP32C5
132+
#include "esp32c5/rom/opi_flash.h"
131133
#endif
134+
#include "spi_flash/spi_flash_defs.h"
132135

133136
#if ESP_TEE_BUILD
134137
#include "esp_flash_partitions.h"
@@ -592,37 +595,37 @@ void bootloader_flash_32bits_address_map_enable(esp_rom_spiflash_read_mode_t fla
592595
switch (flash_mode) {
593596
case ESP_ROM_SPIFLASH_DOUT_MODE:
594597
cache_rd.addr_bit_len = 32;
595-
cache_rd.dummy_bit_len = 8;
598+
cache_rd.dummy_bit_len = SPI_FLASH_DOUT_DUMMY_BITLEN;
596599
cache_rd.cmd = CMD_FASTRD_DUAL_4B;
597600
cache_rd.cmd_bit_len = 8;
598601
break;
599602
case ESP_ROM_SPIFLASH_DIO_MODE:
600603
cache_rd.addr_bit_len = 32;
601-
cache_rd.dummy_bit_len = 4;
604+
cache_rd.dummy_bit_len = SPI_FLASH_DIO_DUMMY_BITLEN;
602605
cache_rd.cmd = CMD_FASTRD_DIO_4B;
603606
cache_rd.cmd_bit_len = 8;
604607
break;
605608
case ESP_ROM_SPIFLASH_QOUT_MODE:
606609
cache_rd.addr_bit_len = 32;
607-
cache_rd.dummy_bit_len = 8;
610+
cache_rd.dummy_bit_len = SPI_FLASH_QOUT_DUMMY_BITLEN;
608611
cache_rd.cmd = CMD_FASTRD_QUAD_4B;
609612
cache_rd.cmd_bit_len = 8;
610613
break;
611614
case ESP_ROM_SPIFLASH_QIO_MODE:
612615
cache_rd.addr_bit_len = 32;
613-
cache_rd.dummy_bit_len = 6;
616+
cache_rd.dummy_bit_len = SPI_FLASH_QIO_DUMMY_BITLEN;
614617
cache_rd.cmd = CMD_FASTRD_QIO_4B;
615618
cache_rd.cmd_bit_len = 8;
616619
break;
617620
case ESP_ROM_SPIFLASH_FASTRD_MODE:
618621
cache_rd.addr_bit_len = 32;
619-
cache_rd.dummy_bit_len = 8;
622+
cache_rd.dummy_bit_len = SPI_FLASH_FASTRD_DUMMY_BITLEN;
620623
cache_rd.cmd = CMD_FASTRD_4B;
621624
cache_rd.cmd_bit_len = 8;
622625
break;
623626
case ESP_ROM_SPIFLASH_SLOWRD_MODE:
624627
cache_rd.addr_bit_len = 32;
625-
cache_rd.dummy_bit_len = 0;
628+
cache_rd.dummy_bit_len = SPI_FLASH_SLOWRD_DUMMY_BITLEN;
626629
cache_rd.cmd = CMD_SLOWRD_4B;
627630
cache_rd.cmd_bit_len = 8;
628631
break;

components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c5.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "hal/cache_hal.h"
3030
#include "hal/cache_ll.h"
3131
#include "hal/mspi_timing_tuning_ll.h"
32+
#include "bootloader_flash_override.h"
3233

3334
void bootloader_flash_update_id()
3435
{
@@ -117,6 +118,9 @@ static void update_flash_config(const esp_image_header_t *bootloader_hdr)
117118
case ESP_IMAGE_FLASH_SIZE_16MB:
118119
size = 16;
119120
break;
121+
case ESP_IMAGE_FLASH_SIZE_32MB:
122+
size = 32;
123+
break;
120124
default:
121125
size = 2;
122126
}
@@ -193,6 +197,9 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
193197
case ESP_IMAGE_FLASH_SIZE_16MB:
194198
str = "16MB";
195199
break;
200+
case ESP_IMAGE_FLASH_SIZE_32MB:
201+
str = "32MB";
202+
break;
196203
default:
197204
str = "2MB";
198205
break;
@@ -227,6 +234,10 @@ esp_err_t bootloader_init_spi_flash(void)
227234
bootloader_enable_qio_mode();
228235
#endif
229236

237+
#if CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH
238+
bootloader_flash_32bits_address_map_enable(bootloader_flash_get_spi_mode());
239+
#endif
240+
230241
print_flash_info(&bootloader_image_hdr);
231242

232243
cache_hal_disable(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL);
@@ -295,6 +306,10 @@ void bootloader_flash_hardware_init(void)
295306
bootloader_spi_flash_resume();
296307
bootloader_flash_unlock();
297308

309+
#if CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH
310+
bootloader_flash_32bits_address_map_enable(bootloader_flash_get_spi_mode());
311+
#endif
312+
298313
cache_hal_disable(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL);
299314
update_flash_config(&hdr);
300315
cache_hal_enable(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_ALL);

components/esp_rom/patches/esp_rom_spiflash.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
#elif CONFIG_IDF_TARGET_ESP32P4
1818
#include "esp32p4/rom/spi_flash.h"
1919
#include "esp32p4/rom/opi_flash.h"
20+
#elif CONFIG_IDF_TARGET_ESP32C5
21+
#include "esp32c5/rom/spi_flash.h"
22+
#include "esp32c5/rom/opi_flash.h"
2023
#endif
2124

2225
#define SPI_IDX 1
@@ -756,7 +759,34 @@ void esp_rom_opiflash_cache_mode_config(esp_rom_spiflash_read_mode_t mode, const
756759
REG_SET_BIT(SPI_MEM_C_CTRL_REG, SPI_MEM_C_Q_POL);
757760
}
758761
}
762+
#elif CONFIG_IDF_TARGET_ESP32C5
763+
extern void esp_rom_spi_set_address_bit_len(int spi, int addr_bits);
764+
void esp_rom_opiflash_cache_mode_config(esp_rom_spiflash_read_mode_t mode, const esp_rom_opiflash_spi0rd_t *cache)
765+
{
766+
esp_rom_spi_set_op_mode(0, mode);
759767

768+
if (cache) {
769+
esp_rom_spi_set_address_bit_len(0, cache->addr_bit_len);
770+
// Patch for ROM function `esp_rom_opiflash_cache_mode_config`, because when dummy is 0,
771+
// `SPI_MEM_USR_DUMMY` should be 0. `esp_rom_opiflash_cache_mode_config` doesn't handle this
772+
// properly.
773+
if (cache->dummy_bit_len == 0) {
774+
REG_CLR_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_DUMMY);
775+
} else {
776+
REG_SET_BIT(SPI_MEM_USER_REG(0), SPI_MEM_USR_DUMMY);
777+
REG_SET_FIELD(SPI_MEM_USER1_REG(0), SPI_MEM_USR_DUMMY_CYCLELEN, cache->dummy_bit_len - 1 + rom_spiflash_legacy_data->dummy_len_plus[0]);
778+
}
779+
REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_VALUE, cache->cmd);
780+
REG_SET_FIELD(SPI_MEM_USER2_REG(0), SPI_MEM_USR_COMMAND_BITLEN, cache->cmd_bit_len - 1);
781+
REG_SET_FIELD(SPI_MEM_DDR_REG(0), SPI_FMEM_VAR_DUMMY, cache->var_dummy_en);
782+
}
783+
784+
if (mode == ESP_ROM_SPIFLASH_DIO_MODE || mode == ESP_ROM_SPIFLASH_QIO_MODE) {
785+
REG_SET_FIELD(SPI_MEM_RD_STATUS_REG(0), SPI_MEM_WB_MODE, 0x00);
786+
REG_SET_FIELD(SPI_MEM_RD_STATUS_REG(0), SPI_MEM_WB_MODE_BITLEN, 7);
787+
REG_SET_FIELD(SPI_MEM_RD_STATUS_REG(0), SPI_MEM_WB_MODE_EN, 1);
788+
}
789+
}
760790

761791
#endif // IDF_TARGET
762792

components/hal/esp32c5/include/hal/spi_flash_ll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ typedef union {
7070
#define spi_flash_ll_set_hold(dev, hold_n) gpspi_flash_ll_set_hold((spi_dev_t*)dev, hold_n)
7171
#define spi_flash_ll_set_cs_setup(dev, cs_setup_time) gpspi_flash_ll_set_cs_setup((spi_dev_t*)dev, cs_setup_time)
7272
#define spi_flash_ll_set_extra_address(dev, extra_addr) { /* Not supported on gpspi on ESP32-C5*/ }
73+
#define spi_flash_ll_wb_mode_enable(dev, wb_mode_enale) { /* Not supported on gpspi on ESP32-C5*/ }
7374
#else
7475
#define spi_flash_ll_reset(dev) spimem_flash_ll_reset((spi_mem_dev_t*)dev)
7576
#define spi_flash_ll_cmd_is_done(dev) spimem_flash_ll_cmd_is_done((spi_mem_dev_t*)dev)
@@ -101,6 +102,7 @@ typedef union {
101102
#define spi_flash_ll_sync_reset() spimem_flash_ll_sync_reset()
102103
#define spi_flash_ll_set_common_command_register_info(dev, ctrl_reg, user_reg, user1_reg, user2_reg) spimem_flash_ll_set_common_command_register_info((spi_mem_dev_t*)dev, ctrl_reg, user_reg, user1_reg, user2_reg)
103104
#define spi_flash_ll_get_common_command_register_info(dev, ctrl_reg, user_reg, user1_reg, user2_reg) spimem_flash_ll_get_common_command_register_info((spi_mem_dev_t*)dev, ctrl_reg, user_reg, user1_reg, user2_reg)
105+
#define spi_flash_ll_wb_mode_enable(dev, wb_mode_enale) spimem_flash_ll_wb_mode_enable((spi_mem_dev_t*)dev, wb_mode_enale)
104106

105107

106108
#endif

components/hal/esp32c5/include/hal/spimem_flash_ll.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,7 @@ static inline int spimem_flash_ll_get_addr_bitlen(spi_mem_dev_t *dev)
555555
__attribute__((always_inline))
556556
static inline void spimem_flash_ll_set_addr_bitlen(spi_mem_dev_t *dev, uint32_t bitlen)
557557
{
558+
dev->cache_fctrl.cache_usr_addr_4byte = (bitlen == 32) ? 1 : 0;
558559
dev->user1.usr_addr_bitlen = (bitlen - 1);
559560
dev->user.usr_addr = bitlen ? 1 : 0;
560561
}
@@ -567,8 +568,20 @@ static inline void spimem_flash_ll_set_addr_bitlen(spi_mem_dev_t *dev, uint32_t
567568
*/
568569
static inline void spimem_flash_ll_set_extra_address(spi_mem_dev_t *dev, uint32_t extra_addr)
569570
{
570-
dev->cache_fctrl.cache_usr_addr_4byte = 0;
571+
// Fixed wb mode to 0x00, the bit length fixed to 8
571572
HAL_FORCE_MODIFY_U32_REG_FIELD(dev->rd_status, wb_mode, extra_addr);
573+
dev->rd_status.wb_mode_bitlen = 7; // 8 - 1
574+
}
575+
576+
/**
577+
* Enable extra address for bits M0-M7 in DIO/QIO mode.
578+
*
579+
* @param dev Beginning address of the peripheral registers.
580+
* @param wb_mode_enable true for enabling wb_mode
581+
*/
582+
static inline void spimem_flash_ll_wb_mode_enable(spi_mem_dev_t *dev, bool wb_mode_enable)
583+
{
584+
dev->rd_status.wb_mode_en = wb_mode_enable;
572585
}
573586

574587
/**

components/hal/spi_flash_hal_common.inc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,15 @@ esp_err_t spi_flash_hal_configure_host_io_mode(
126126
* - DIO is similar.
127127
*/
128128
if (conf_required) {
129+
#if !SOC_SPI_MEM_SUPPORT_WB_MODE_INDEPENDENT_CONTROL
129130
int line_width = (io_mode == SPI_FLASH_DIO? 2: 4);
130131
dummy_cyclelen_base -= SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS / line_width;
131132
addr_bitlen += SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS;
133+
#endif
132134
spi_flash_ll_set_extra_address(dev, 0);
135+
#if SOC_SPI_MEM_SUPPORT_WB_MODE_INDEPENDENT_CONTROL
136+
spi_flash_ll_wb_mode_enable(dev, true);
137+
#endif
133138
}
134139
#endif
135140
#else
@@ -204,6 +209,9 @@ esp_err_t spi_flash_hal_common_command(spi_flash_host_inst_t *host, spi_flash_tr
204209
if (trans->miso_len > 0) {
205210
spi_flash_ll_get_buffer_data(dev, trans->miso_data, trans->miso_len);
206211
}
212+
#if SOC_SPI_MEM_SUPPORT_WB_MODE_INDEPENDENT_CONTROL
213+
spi_flash_ll_wb_mode_enable(dev, false);
214+
#endif
207215
return ESP_OK;
208216
}
209217

components/soc/esp32c5/include/soc/Kconfig.soc_caps.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,14 @@ config SOC_SPI_MEM_SUPPORT_WRAP
11431143
bool
11441144
default y
11451145

1146+
config SOC_SPI_MEM_SUPPORT_WB_MODE_INDEPENDENT_CONTROL
1147+
bool
1148+
default y
1149+
1150+
config SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP
1151+
bool
1152+
default y
1153+
11461154
config SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED
11471155
bool
11481156
default y

components/soc/esp32c5/include/soc/soc_caps.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,8 @@
462462
#define SOC_SPI_MEM_SUPPORT_SW_SUSPEND (1)
463463
#define SOC_SPI_MEM_SUPPORT_CHECK_SUS (1)
464464
#define SOC_SPI_MEM_SUPPORT_WRAP (1)
465+
#define SOC_SPI_MEM_SUPPORT_WB_MODE_INDEPENDENT_CONTROL (1)
466+
#define SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP (1)
465467

466468
#define SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED 1
467469
#define SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED 1

components/spi_flash/include/spi_flash/spi_flash_defs.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7+
#include "soc/soc_caps.h"
8+
79
#pragma once
810

911
/* SPI commands (actual on-wire commands not SPI controller bitmasks)
@@ -55,10 +57,15 @@
5557

5658
#define CMD_RDSFDP 0x5A /* Read the SFDP of the flash */
5759

58-
#define SPI_FLASH_DIO_ADDR_BITLEN 24
60+
#if !SOC_SPI_MEM_SUPPORT_WB_MODE_INDEPENDENT_CONTROL
5961
#define SPI_FLASH_DIO_DUMMY_BITLEN 4
60-
#define SPI_FLASH_QIO_ADDR_BITLEN 24
6162
#define SPI_FLASH_QIO_DUMMY_BITLEN 6
63+
#else
64+
#define SPI_FLASH_DIO_DUMMY_BITLEN 0
65+
#define SPI_FLASH_QIO_DUMMY_BITLEN 4
66+
#endif
67+
#define SPI_FLASH_DIO_ADDR_BITLEN 24
68+
#define SPI_FLASH_QIO_ADDR_BITLEN 24
6269
#define SPI_FLASH_QOUT_ADDR_BITLEN 24
6370
#define SPI_FLASH_QOUT_DUMMY_BITLEN 8
6471
#define SPI_FLASH_DOUT_ADDR_BITLEN 24

0 commit comments

Comments
 (0)