mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
spi_flash: bringup for esp32c6
This commit is contained in:
parent
bdefd7fb6b
commit
d9f01ed43c
@ -55,15 +55,3 @@ void IRAM_ATTR bootloader_flash_clock_config(const esp_image_header_t *pfhdr)
|
|||||||
}
|
}
|
||||||
esp_rom_spiflash_config_clk(spi_clk_div, 0);
|
esp_rom_spiflash_config_clk(spi_clk_div, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IRAM_ATTR bootloader_flash_set_dummy_out(void)
|
|
||||||
{
|
|
||||||
REG_SET_BIT(SPI_MEM_CTRL_REG(0), /*SPI_MEM_FDUMMY_OUT |*/ SPI_MEM_D_POL | SPI_MEM_Q_POL); // TODO: IDF-5631 ESP32C6 not have SPI_MEM_FDUMMY_OUT
|
|
||||||
REG_SET_BIT(SPI_MEM_CTRL_REG(1), /*SPI_MEM_FDUMMY_OUT |*/ SPI_MEM_D_POL | SPI_MEM_Q_POL); // TODO: idf-5631 ESP32C6 not have SPI_MEM_FDUMMY_OUT
|
|
||||||
}
|
|
||||||
|
|
||||||
void IRAM_ATTR bootloader_flash_dummy_config(const esp_image_header_t *pfhdr)
|
|
||||||
{
|
|
||||||
bootloader_configure_spi_pins(1);
|
|
||||||
bootloader_flash_set_dummy_out();
|
|
||||||
}
|
|
||||||
|
@ -102,18 +102,20 @@ void bootloader_enable_qio_mode(void)
|
|||||||
|
|
||||||
static void s_flash_set_qio_pins(void)
|
static void s_flash_set_qio_pins(void)
|
||||||
{
|
{
|
||||||
|
#if SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE
|
||||||
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info();
|
esp_rom_spiflash_select_qio_pins(bootloader_flash_get_wp_pin(), esp_rom_efuse_get_flash_gpio_info());
|
||||||
int wp_pin = bootloader_flash_get_wp_pin();
|
#else
|
||||||
esp_rom_spiflash_select_qio_pins(wp_pin, spiconfig);
|
esp_rom_spiflash_select_qio_pins(esp_rom_efuse_get_flash_wp_gpio(), esp_rom_efuse_get_flash_gpio_info());
|
||||||
#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6 // TODO: IDF-5649 Add a soc_caps
|
#endif // CONFIG_IDF_TARGET_ESP32
|
||||||
|
|
||||||
|
#else
|
||||||
// ESP32C2/ESP32C6 doesn't support configure mspi pins. So the second
|
// ESP32C2/ESP32C6 doesn't support configure mspi pins. So the second
|
||||||
// parameter is set to 0, means that chip uses default SPI pins
|
// parameter is set to 0, means that chip uses default SPI pins
|
||||||
// and wp_gpio_num parameter(the first parameter) is ignored.
|
// and wp_gpio_num parameter(the first parameter) is ignored.
|
||||||
esp_rom_spiflash_select_qio_pins(0, 0);
|
esp_rom_spiflash_select_qio_pins(0, 0);
|
||||||
#else
|
#endif // SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE
|
||||||
esp_rom_spiflash_select_qio_pins(esp_rom_efuse_get_flash_wp_gpio(), esp_rom_efuse_get_flash_gpio_info());
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,27 +46,18 @@ static const char *TAG = "boot.esp32c6";
|
|||||||
|
|
||||||
void IRAM_ATTR bootloader_configure_spi_pins(int drv)
|
void IRAM_ATTR bootloader_configure_spi_pins(int drv)
|
||||||
{
|
{
|
||||||
// TODO: IDF-5649
|
|
||||||
const uint32_t spiconfig = 0;
|
|
||||||
uint8_t clk_gpio_num = SPI_CLK_GPIO_NUM;
|
uint8_t clk_gpio_num = SPI_CLK_GPIO_NUM;
|
||||||
uint8_t q_gpio_num = SPI_Q_GPIO_NUM;
|
uint8_t q_gpio_num = SPI_Q_GPIO_NUM;
|
||||||
uint8_t d_gpio_num = SPI_D_GPIO_NUM;
|
uint8_t d_gpio_num = SPI_D_GPIO_NUM;
|
||||||
uint8_t cs0_gpio_num = SPI_CS0_GPIO_NUM;
|
uint8_t cs0_gpio_num = SPI_CS0_GPIO_NUM;
|
||||||
uint8_t hd_gpio_num = SPI_HD_GPIO_NUM;
|
uint8_t hd_gpio_num = SPI_HD_GPIO_NUM;
|
||||||
uint8_t wp_gpio_num = SPI_WP_GPIO_NUM;
|
uint8_t wp_gpio_num = SPI_WP_GPIO_NUM;
|
||||||
if (spiconfig == 0) {
|
|
||||||
|
|
||||||
}
|
|
||||||
esp_rom_gpio_pad_set_drv(clk_gpio_num, drv);
|
esp_rom_gpio_pad_set_drv(clk_gpio_num, drv);
|
||||||
esp_rom_gpio_pad_set_drv(q_gpio_num, drv);
|
esp_rom_gpio_pad_set_drv(q_gpio_num, drv);
|
||||||
esp_rom_gpio_pad_set_drv(d_gpio_num, drv);
|
esp_rom_gpio_pad_set_drv(d_gpio_num, drv);
|
||||||
esp_rom_gpio_pad_set_drv(cs0_gpio_num, drv);
|
esp_rom_gpio_pad_set_drv(cs0_gpio_num, drv);
|
||||||
if (hd_gpio_num <= MAX_PAD_GPIO_NUM) {
|
|
||||||
esp_rom_gpio_pad_set_drv(hd_gpio_num, drv);
|
esp_rom_gpio_pad_set_drv(hd_gpio_num, drv);
|
||||||
}
|
|
||||||
if (wp_gpio_num <= MAX_PAD_GPIO_NUM) {
|
|
||||||
esp_rom_gpio_pad_set_drv(wp_gpio_num, drv);
|
esp_rom_gpio_pad_set_drv(wp_gpio_num, drv);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_flash_config(const esp_image_header_t *bootloader_hdr)
|
static void update_flash_config(const esp_image_header_t *bootloader_hdr)
|
||||||
@ -168,7 +159,7 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr)
|
|||||||
|
|
||||||
static void IRAM_ATTR bootloader_init_flash_configure(void)
|
static void IRAM_ATTR bootloader_init_flash_configure(void)
|
||||||
{
|
{
|
||||||
bootloader_flash_dummy_config(&bootloader_image_hdr);
|
bootloader_configure_spi_pins(1);
|
||||||
bootloader_flash_cs_timing_config();
|
bootloader_flash_cs_timing_config();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,15 +172,6 @@ static void bootloader_spi_flash_resume(void)
|
|||||||
static esp_err_t bootloader_init_spi_flash(void)
|
static esp_err_t bootloader_init_spi_flash(void)
|
||||||
{
|
{
|
||||||
bootloader_init_flash_configure();
|
bootloader_init_flash_configure();
|
||||||
// TODO: IDF-5649
|
|
||||||
// #ifndef CONFIG_SPI_FLASH_ROM_DRIVER_PATCH
|
|
||||||
// const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info();
|
|
||||||
// if (spiconfig != ESP_ROM_EFUSE_FLASH_DEFAULT_SPI && spiconfig != ESP_ROM_EFUSE_FLASH_DEFAULT_HSPI) {
|
|
||||||
// ESP_LOGE(TAG, "SPI flash pins are overridden. Enable CONFIG_SPI_FLASH_ROM_DRIVER_PATCH in menuconfig");
|
|
||||||
// return ESP_FAIL;
|
|
||||||
// }
|
|
||||||
// #endif
|
|
||||||
|
|
||||||
bootloader_spi_flash_resume();
|
bootloader_spi_flash_resume();
|
||||||
bootloader_flash_unlock();
|
bootloader_flash_unlock();
|
||||||
|
|
||||||
|
@ -63,16 +63,6 @@ void IRAM_ATTR esp_restart_noos(void)
|
|||||||
// Disable cache
|
// Disable cache
|
||||||
Cache_Disable_ICache();
|
Cache_Disable_ICache();
|
||||||
|
|
||||||
// 2nd stage bootloader reconfigures SPI flash signals.
|
|
||||||
// Reset them to the defaults expected by ROM.
|
|
||||||
WRITE_PERI_REG(GPIO_FUNC0_IN_SEL_CFG_REG, 0x30);
|
|
||||||
// TODO: IDF-5659
|
|
||||||
// WRITE_PERI_REG(GPIO_FUNC1_IN_SEL_CFG_REG, 0x30);
|
|
||||||
// WRITE_PERI_REG(GPIO_FUNC2_IN_SEL_CFG_REG, 0x30);
|
|
||||||
// WRITE_PERI_REG(GPIO_FUNC3_IN_SEL_CFG_REG, 0x30);
|
|
||||||
// WRITE_PERI_REG(GPIO_FUNC4_IN_SEL_CFG_REG, 0x30);
|
|
||||||
// WRITE_PERI_REG(GPIO_FUNC5_IN_SEL_CFG_REG, 0x30);
|
|
||||||
|
|
||||||
// Reset wifi/bluetooth/ethernet/sdio (bb/mac)
|
// Reset wifi/bluetooth/ethernet/sdio (bb/mac)
|
||||||
// Moved to module internal
|
// Moved to module internal
|
||||||
// SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG,
|
// SET_PERI_REG_MASK(SYSTEM_CORE_RST_EN_REG,
|
||||||
|
@ -45,6 +45,9 @@ extern "C" {
|
|||||||
/// Empty function to be compatible with new version chips.
|
/// Empty function to be compatible with new version chips.
|
||||||
#define spi_flash_ll_set_dummy_out(dev, out_en, out_lev)
|
#define spi_flash_ll_set_dummy_out(dev, out_en, out_lev)
|
||||||
|
|
||||||
|
// On ESP32, we extent 4 bits to occupy `Continuous Read Mode` bits. (same to origin code.)
|
||||||
|
#define SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS (4)
|
||||||
|
|
||||||
/// type to store pre-calculated register value in above layers
|
/// type to store pre-calculated register value in above layers
|
||||||
typedef typeof(SPI1.clock.val) spi_flash_ll_clock_reg_t;
|
typedef typeof(SPI1.clock.val) spi_flash_ll_clock_reg_t;
|
||||||
|
|
||||||
@ -431,6 +434,17 @@ static inline uint32_t spi_flash_ll_calculate_clock_reg(uint8_t host_id, uint8_t
|
|||||||
return div_parameter;
|
return div_parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set extra address for bits M0-M7 in DIO/QIO mode.
|
||||||
|
*
|
||||||
|
* @param dev Beginning address of the peripheral registers.
|
||||||
|
* @param extra_addr extra address(M0-M7) to send.
|
||||||
|
*/
|
||||||
|
static inline void spi_flash_ll_set_extra_address(spi_dev_t *dev, uint32_t extra_addr)
|
||||||
|
{
|
||||||
|
// Not supported on ESP32.
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -353,20 +353,6 @@ static inline void gpspi_flash_ll_set_dummy(spi_dev_t *dev, uint32_t dummy_n)
|
|||||||
HAL_FORCE_MODIFY_U32_REG_FIELD(dev->user1, usr_dummy_cyclelen, dummy_n - 1);
|
HAL_FORCE_MODIFY_U32_REG_FIELD(dev->user1, usr_dummy_cyclelen, dummy_n - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Set D/Q output level during dummy phase
|
|
||||||
*
|
|
||||||
* @param dev Beginning address of the peripheral registers.
|
|
||||||
* @param out_en whether to enable IO output for dummy phase
|
|
||||||
* @param out_level dummy output level
|
|
||||||
*/
|
|
||||||
static inline void gpspi_flash_ll_set_dummy_out(spi_dev_t *dev, uint32_t out_en, uint32_t out_lev)
|
|
||||||
{
|
|
||||||
dev->ctrl.dummy_out = out_en;
|
|
||||||
dev->ctrl.q_pol = out_lev;
|
|
||||||
dev->ctrl.d_pol = out_lev;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set extra hold time of CS after the clocks.
|
* Set extra hold time of CS after the clocks.
|
||||||
*
|
*
|
||||||
|
@ -35,7 +35,8 @@ extern "C" {
|
|||||||
}\
|
}\
|
||||||
dev_id; \
|
dev_id; \
|
||||||
})
|
})
|
||||||
|
// Since ESP32-C6, WB_mode is available, we extend 8 bits to occupy `Continuous Read Mode` bits.
|
||||||
|
#define SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS (8)
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
gpspi_flash_ll_clock_reg_t gpspi;
|
gpspi_flash_ll_clock_reg_t gpspi;
|
||||||
@ -61,9 +62,9 @@ typedef union {
|
|||||||
#define spi_flash_ll_set_address(dev, addr) gpspi_flash_ll_set_address((spi_dev_t*)dev, addr)
|
#define spi_flash_ll_set_address(dev, addr) gpspi_flash_ll_set_address((spi_dev_t*)dev, addr)
|
||||||
#define spi_flash_ll_set_usr_address(dev, addr, bitlen) gpspi_flash_ll_set_usr_address((spi_dev_t*)dev, addr, bitlen)
|
#define spi_flash_ll_set_usr_address(dev, addr, bitlen) gpspi_flash_ll_set_usr_address((spi_dev_t*)dev, addr, bitlen)
|
||||||
#define spi_flash_ll_set_dummy(dev, dummy) gpspi_flash_ll_set_dummy((spi_dev_t*)dev, dummy)
|
#define spi_flash_ll_set_dummy(dev, dummy) gpspi_flash_ll_set_dummy((spi_dev_t*)dev, dummy)
|
||||||
#define spi_flash_ll_set_dummy_out(dev, en, lev) gpspi_flash_ll_set_dummy_out((spi_dev_t*)dev, en, lev)
|
|
||||||
#define spi_flash_ll_set_hold(dev, hold_n) gpspi_flash_ll_set_hold((spi_dev_t*)dev, hold_n)
|
#define spi_flash_ll_set_hold(dev, hold_n) gpspi_flash_ll_set_hold((spi_dev_t*)dev, hold_n)
|
||||||
#define spi_flash_ll_set_cs_setup(dev, cs_setup_time) gpspi_flash_ll_set_cs_setup((spi_dev_t*)dev, cs_setup_time)
|
#define spi_flash_ll_set_cs_setup(dev, cs_setup_time) gpspi_flash_ll_set_cs_setup((spi_dev_t*)dev, cs_setup_time)
|
||||||
|
#define spi_flash_ll_set_extra_address(dev, extra_addr) { /* Not supported on gpspi on ESP32-C6*/ }
|
||||||
#else
|
#else
|
||||||
#define spi_flash_ll_reset(dev) spimem_flash_ll_reset((spi_mem_dev_t*)dev)
|
#define spi_flash_ll_reset(dev) spimem_flash_ll_reset((spi_mem_dev_t*)dev)
|
||||||
#define spi_flash_ll_cmd_is_done(dev) spimem_flash_ll_cmd_is_done((spi_mem_dev_t*)dev)
|
#define spi_flash_ll_cmd_is_done(dev) spimem_flash_ll_cmd_is_done((spi_mem_dev_t*)dev)
|
||||||
@ -88,9 +89,9 @@ typedef union {
|
|||||||
#define spi_flash_ll_set_address(dev, addr) spimem_flash_ll_set_address((spi_mem_dev_t*)dev, addr)
|
#define spi_flash_ll_set_address(dev, addr) spimem_flash_ll_set_address((spi_mem_dev_t*)dev, addr)
|
||||||
#define spi_flash_ll_set_usr_address(dev, addr, bitlen) spimem_flash_ll_set_usr_address((spi_mem_dev_t*)dev, addr, bitlen)
|
#define spi_flash_ll_set_usr_address(dev, addr, bitlen) spimem_flash_ll_set_usr_address((spi_mem_dev_t*)dev, addr, bitlen)
|
||||||
#define spi_flash_ll_set_dummy(dev, dummy) spimem_flash_ll_set_dummy((spi_mem_dev_t*)dev, dummy)
|
#define spi_flash_ll_set_dummy(dev, dummy) spimem_flash_ll_set_dummy((spi_mem_dev_t*)dev, dummy)
|
||||||
#define spi_flash_ll_set_dummy_out(dev, en, lev) spimem_flash_ll_set_dummy_out((spi_mem_dev_t*)dev, en, lev)
|
|
||||||
#define spi_flash_ll_set_hold(dev, hold_n) spimem_flash_ll_set_hold((spi_mem_dev_t*)dev, hold_n)
|
#define spi_flash_ll_set_hold(dev, hold_n) spimem_flash_ll_set_hold((spi_mem_dev_t*)dev, hold_n)
|
||||||
#define spi_flash_ll_set_cs_setup(dev, cs_setup_time) spimem_flash_ll_set_cs_setup((spi_mem_dev_t*)dev, cs_setup_time)
|
#define spi_flash_ll_set_cs_setup(dev, cs_setup_time) spimem_flash_ll_set_cs_setup((spi_mem_dev_t*)dev, cs_setup_time)
|
||||||
|
#define spi_flash_ll_set_extra_address(dev, extra_addr) spimem_flash_ll_set_extra_address((spi_mem_dev_t*)dev, extra_addr)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "hal/assert.h"
|
#include "hal/assert.h"
|
||||||
#include "hal/spi_types.h"
|
#include "hal/spi_types.h"
|
||||||
#include "hal/spi_flash_types.h"
|
#include "hal/spi_flash_types.h"
|
||||||
|
#include "soc/pcr_struct.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -474,6 +475,18 @@ static inline void spimem_flash_ll_set_addr_bitlen(spi_mem_dev_t *dev, uint32_t
|
|||||||
dev->user.usr_addr = bitlen ? 1 : 0;
|
dev->user.usr_addr = bitlen ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set extra address for bits M0-M7 in DIO/QIO mode.
|
||||||
|
*
|
||||||
|
* @param dev Beginning address of the peripheral registers.
|
||||||
|
* @param extra_addr extra address(M0-M7) to send.
|
||||||
|
*/
|
||||||
|
static inline void spimem_flash_ll_set_extra_address(spi_mem_dev_t *dev, uint32_t extra_addr)
|
||||||
|
{
|
||||||
|
dev->cache_fctrl.usr_addr_4byte = 0;
|
||||||
|
dev->rd_status.wb_mode = extra_addr;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the address to send. Should be called before commands that requires the address e.g. erase sector, read, write...
|
* Set the address to send. Should be called before commands that requires the address e.g. erase sector, read, write...
|
||||||
*
|
*
|
||||||
@ -509,20 +522,6 @@ static inline void spimem_flash_ll_set_dummy(spi_mem_dev_t *dev, uint32_t dummy_
|
|||||||
dev->user1.usr_dummy_cyclelen = dummy_n - 1;
|
dev->user1.usr_dummy_cyclelen = dummy_n - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Set D/Q output level during dummy phase
|
|
||||||
*
|
|
||||||
* @param dev Beginning address of the peripheral registers.
|
|
||||||
* @param out_en whether to enable IO output for dummy phase
|
|
||||||
* @param out_level dummy output level
|
|
||||||
*/
|
|
||||||
static inline void spimem_flash_ll_set_dummy_out(spi_mem_dev_t *dev, uint32_t out_en, uint32_t out_lev)
|
|
||||||
{
|
|
||||||
// dev->ctrl.fdummy_out = out_en; // TODO: IDF-5333 removed
|
|
||||||
dev->ctrl.q_pol = out_lev;
|
|
||||||
dev->ctrl.d_pol = out_lev;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set CS hold time.
|
* Set CS hold time.
|
||||||
*
|
*
|
||||||
@ -551,25 +550,44 @@ static inline void spimem_flash_ll_set_cs_setup(spi_mem_dev_t *dev, uint32_t cs_
|
|||||||
*/
|
*/
|
||||||
static inline uint8_t spimem_flash_ll_get_source_freq_mhz(void)
|
static inline uint8_t spimem_flash_ll_get_source_freq_mhz(void)
|
||||||
{
|
{
|
||||||
// TODO: IDF-5333
|
// TODO: Default is PLL480M, this is hard-coded.
|
||||||
// // TODO: Default is PLL480M, this is hard-coded.
|
// In the future, we can get the CPU clock source by calling interface.
|
||||||
// // In the future, we can get the CPU clock source by calling interface.
|
uint8_t clock_val = 0;
|
||||||
// uint8_t clock_val = 0;
|
|
||||||
// switch (SPIMEM0.core_clk_sel.spi01_clk_sel) {
|
if (PCR.sysclk_conf.soc_clk_sel == 1) {
|
||||||
// case 0:
|
switch (PCR.mspi_clk_conf.mspi_fast_hs_div_num) {
|
||||||
// clock_val = 80;
|
case 3:
|
||||||
// break;
|
clock_val = 120;
|
||||||
// case 1:
|
break;
|
||||||
// clock_val = 120;
|
case 4:
|
||||||
// break;
|
clock_val = 96;
|
||||||
// case 2:
|
break;
|
||||||
// clock_val = 160;
|
case 5:
|
||||||
// break;
|
clock_val = 80;
|
||||||
// default:
|
break;
|
||||||
// abort();
|
default:
|
||||||
// }
|
HAL_ASSERT(false);
|
||||||
// return clock_val;
|
}
|
||||||
return 80;
|
} else {
|
||||||
|
// If the system clock source is XTAL/FOSC
|
||||||
|
switch (PCR.mspi_clk_conf.mspi_fast_ls_div_num) {
|
||||||
|
case 0:
|
||||||
|
clock_val = 40;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
clock_val = 20;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
clock_val = 10;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
HAL_ASSERT(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Hard-coded line, will be removed when pll is enabled.
|
||||||
|
clock_val = 80;
|
||||||
|
|
||||||
|
return clock_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,7 +23,7 @@ static const char *TAG = "flash_hal";
|
|||||||
static uint32_t get_flash_clock_divider(const spi_flash_hal_config_t *cfg)
|
static uint32_t get_flash_clock_divider(const spi_flash_hal_config_t *cfg)
|
||||||
{
|
{
|
||||||
int clk_source = cfg->clock_src_freq;
|
int clk_source = cfg->clock_src_freq;
|
||||||
// On ESP32, ESP32-S2, ESP32-C3, we allow specific frequency 26.666MHz, // TODO: IDF-5333 (check this)
|
// On ESP32, ESP32-S2, ESP32-C3, we allow specific frequency 26.666MHz
|
||||||
// If user passes freq_mhz like 26 or 27, it's allowed to use integer divider 3.
|
// If user passes freq_mhz like 26 or 27, it's allowed to use integer divider 3.
|
||||||
// However on other chips or on other frequency, we only allow user pass frequency which
|
// However on other chips or on other frequency, we only allow user pass frequency which
|
||||||
// can be integer divided. If no, the following strategy is round up the division and
|
// can be integer divided. If no, the following strategy is round up the division and
|
||||||
|
@ -105,12 +105,28 @@ esp_err_t spi_flash_hal_configure_host_io_mode(
|
|||||||
// The CONTROL_DUMMY_OUTPUT feature is used to control M7-M0 bits.
|
// The CONTROL_DUMMY_OUTPUT feature is used to control M7-M0 bits.
|
||||||
spi_flash_ll_set_dummy_out(dev, (conf_required? 1: 0), 1);
|
spi_flash_ll_set_dummy_out(dev, (conf_required? 1: 0), 1);
|
||||||
#else
|
#else
|
||||||
// On ESP32, dummy output is not supported. These dummy bits will be moved into the address
|
/**
|
||||||
// phase (and appended as ones).
|
* - On current chips, addr phase can support 32 bits at most.
|
||||||
|
* - Flash chip requires continuous mode bits
|
||||||
|
*
|
||||||
|
* We send continuous mode bits via the dummy output feature, so as to support
|
||||||
|
* 32-bit address.
|
||||||
|
*
|
||||||
|
* On chips without dummy output feature (ESP32, ESP32C6), we fallback to use
|
||||||
|
* addr phase to send the continuous mode bits:
|
||||||
|
* - On ESP32 (QIO), qio_dummy: 6 - 4 / 4 = 5, addr_bitlen: 24 + 4 = 28. (This
|
||||||
|
* setting exists for long time, we keep this on ESP32)
|
||||||
|
* - On ESP32C6 (QIO), qio_dummy: 6 - 8 / 4 = 4, addr_bitlen: 24 + 8 = 32
|
||||||
|
* - On future chips without dummy output feature, we follow the ESP32C6 (QIO)
|
||||||
|
* way.
|
||||||
|
* - Above two ways, the timings are same.
|
||||||
|
* - DIO is similar.
|
||||||
|
*/
|
||||||
if (conf_required) {
|
if (conf_required) {
|
||||||
int line_width = (io_mode == SPI_FLASH_DIO? 2: 4);
|
int line_width = (io_mode == SPI_FLASH_DIO? 2: 4);
|
||||||
dummy_cyclelen_base -= 4 / line_width;
|
dummy_cyclelen_base -= SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS / line_width;
|
||||||
addr_bitlen += 4; //extra 4 bits indicate the conf bits is included
|
addr_bitlen += SPI_FLASH_LL_CONTINUOUS_MODE_BIT_NUMS;
|
||||||
|
spi_flash_ll_set_extra_address(dev, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -635,10 +635,6 @@ config SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED
|
|||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED
|
|
||||||
bool
|
|
||||||
default y
|
|
||||||
|
|
||||||
config SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED
|
config SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
@ -317,7 +317,6 @@
|
|||||||
#define SOC_MEMSPI_IS_INDEPENDENT 1
|
#define SOC_MEMSPI_IS_INDEPENDENT 1
|
||||||
#define SOC_SPI_MAX_PRE_DIVIDER 16
|
#define SOC_SPI_MAX_PRE_DIVIDER 16
|
||||||
|
|
||||||
// TODO: IDF-5333 (Copy from esp32c3, need check)
|
|
||||||
/*-------------------------- SPI MEM CAPS ---------------------------------------*/
|
/*-------------------------- SPI MEM CAPS ---------------------------------------*/
|
||||||
#define SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE (1)
|
#define SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE (1)
|
||||||
#define SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND (1)
|
#define SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND (1)
|
||||||
@ -328,7 +327,6 @@
|
|||||||
|
|
||||||
#define SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED 1
|
#define SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED 1
|
||||||
#define SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED 1
|
#define SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED 1
|
||||||
#define SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED 1
|
|
||||||
#define SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED 1
|
#define SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED 1
|
||||||
|
|
||||||
// TODO: IDF-5323 (Copy from esp32c3, need check)
|
// TODO: IDF-5323 (Copy from esp32c3, need check)
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
Bunch of constants for every SPI peripheral: GPIO signals, irqs, hw addr of registers etc
|
Bunch of constants for every SPI peripheral: GPIO signals, irqs, hw addr of registers etc
|
||||||
*/
|
*/
|
||||||
const spi_signal_conn_t spi_periph_signal[SOC_SPI_PERIPH_NUM] = {
|
const spi_signal_conn_t spi_periph_signal[SOC_SPI_PERIPH_NUM] = {
|
||||||
{ // TODO: IDF-5333 Need check
|
{
|
||||||
.spiclk_in = 0,/* SPI clock is not an input signal*/
|
.spiclk_in = 0,/* SPI clock is not an input signal*/
|
||||||
.spics_in = 0,/* SPI cs is not an input signal*/
|
.spics_in = 0,/* SPI cs is not an input signal*/
|
||||||
.spiclk_iomux_pin = SPI_IOMUX_PIN_NUM_CLK,
|
.spiclk_iomux_pin = SPI_IOMUX_PIN_NUM_CLK,
|
||||||
|
@ -4,7 +4,7 @@ components/spi_flash/test_apps/esp_flash:
|
|||||||
disable:
|
disable:
|
||||||
- if: IDF_TARGET == "esp32c6"
|
- if: IDF_TARGET == "esp32c6"
|
||||||
temporary: true
|
temporary: true
|
||||||
reason: target esp32c6 is not supported yet
|
reason: target esp32c6 cannot pass atomic build
|
||||||
|
|
||||||
components/spi_flash/test_apps/flash_encryption:
|
components/spi_flash/test_apps/flash_encryption:
|
||||||
disable_test:
|
disable_test:
|
||||||
|
@ -29,7 +29,6 @@ esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
|||||||
SPIFLASH.user.fwrite_dual = 0;
|
SPIFLASH.user.fwrite_dual = 0;
|
||||||
SPIFLASH.user.fwrite_qio = 1;
|
SPIFLASH.user.fwrite_qio = 1;
|
||||||
SPIFLASH.user.fwrite_quad = 0;
|
SPIFLASH.user.fwrite_quad = 0;
|
||||||
// SPIFLASH.ctrl.fcmd_dual = 0; // TODO: IDF-5333
|
|
||||||
SPIFLASH.ctrl.fcmd_quad = 0;
|
SPIFLASH.ctrl.fcmd_quad = 0;
|
||||||
SPIFLASH.user.usr_dummy = 0;
|
SPIFLASH.user.usr_dummy = 0;
|
||||||
SPIFLASH.user.usr_addr = 1;
|
SPIFLASH.user.usr_addr = 1;
|
||||||
@ -53,7 +52,8 @@ esp_err_t spi_flash_wrap_set(spi_flash_wrap_mode_t mode)
|
|||||||
|
|
||||||
esp_err_t spi_flash_enable_wrap(uint32_t wrap_size)
|
esp_err_t spi_flash_enable_wrap(uint32_t wrap_size)
|
||||||
{
|
{
|
||||||
CLEAR_PERI_REG_MASK(SPI_MEM_CTRL2_REG(0), SPI_MEM_SPLIT_TRANS_EN_M); // TODO: IDF-5333 Newly added
|
// IDF-6198 TODO: support wrap on esp32-c6
|
||||||
|
CLEAR_PERI_REG_MASK(SPI_MEM_CTRL2_REG(0), SPI_MEM_SPLIT_TRANS_EN_M);
|
||||||
switch (wrap_size) {
|
switch (wrap_size) {
|
||||||
case 8:
|
case 8:
|
||||||
return spi_flash_wrap_set(FLASH_WRAP_MODE_8B);
|
return spi_flash_wrap_set(FLASH_WRAP_MODE_8B);
|
||||||
|
@ -80,6 +80,23 @@
|
|||||||
#define FSPI_PIN_NUM_WP 5
|
#define FSPI_PIN_NUM_WP 5
|
||||||
#define FSPI_PIN_NUM_CS 10
|
#define FSPI_PIN_NUM_CS 10
|
||||||
|
|
||||||
|
// Just use the same pins for HSPI
|
||||||
|
#define HSPI_PIN_NUM_MOSI FSPI_PIN_NUM_MOSI
|
||||||
|
#define HSPI_PIN_NUM_MISO FSPI_PIN_NUM_MISO
|
||||||
|
#define HSPI_PIN_NUM_CLK FSPI_PIN_NUM_CLK
|
||||||
|
#define HSPI_PIN_NUM_HD FSPI_PIN_NUM_HD
|
||||||
|
#define HSPI_PIN_NUM_WP FSPI_PIN_NUM_WP
|
||||||
|
#define HSPI_PIN_NUM_CS FSPI_PIN_NUM_CS
|
||||||
|
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C6
|
||||||
|
|
||||||
|
#define FSPI_PIN_NUM_MOSI 7
|
||||||
|
#define FSPI_PIN_NUM_MISO 2
|
||||||
|
#define FSPI_PIN_NUM_CLK 6
|
||||||
|
#define FSPI_PIN_NUM_HD 4
|
||||||
|
#define FSPI_PIN_NUM_WP 5
|
||||||
|
#define FSPI_PIN_NUM_CS 17
|
||||||
|
|
||||||
// Just use the same pins for HSPI
|
// Just use the same pins for HSPI
|
||||||
#define HSPI_PIN_NUM_MOSI FSPI_PIN_NUM_MOSI
|
#define HSPI_PIN_NUM_MOSI FSPI_PIN_NUM_MOSI
|
||||||
#define HSPI_PIN_NUM_MISO FSPI_PIN_NUM_MISO
|
#define HSPI_PIN_NUM_MISO FSPI_PIN_NUM_MISO
|
||||||
@ -115,7 +132,7 @@ typedef void (*flash_test_func_t)(const esp_partition_t *part);
|
|||||||
#define BYPASS_MULTIPLE_CHIP 1
|
#define BYPASS_MULTIPLE_CHIP 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3
|
#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6
|
||||||
//chips without PSRAM
|
//chips without PSRAM
|
||||||
#define TEST_CHIP_NUM 2
|
#define TEST_CHIP_NUM 2
|
||||||
#elif CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
#elif CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
|
||||||
@ -223,7 +240,7 @@ flashtest_config_t config_list[] = {
|
|||||||
.input_delay_ns = 0,
|
.input_delay_ns = 0,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2
|
#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6
|
||||||
flashtest_config_t config_list[] = {
|
flashtest_config_t config_list[] = {
|
||||||
/* No SPI1 CS1 flash on esp32c3 test */
|
/* No SPI1 CS1 flash on esp32c3 test */
|
||||||
{
|
{
|
||||||
|
@ -40,6 +40,8 @@
|
|||||||
#include "esp32h2/rom/cache.h"
|
#include "esp32h2/rom/cache.h"
|
||||||
#elif CONFIG_IDF_TARGET_ESP32C2
|
#elif CONFIG_IDF_TARGET_ESP32C2
|
||||||
#include "esp32c2/rom/cache.h"
|
#include "esp32c2/rom/cache.h"
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C6
|
||||||
|
#include "esp32c2/rom/cache.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define FUNC_SPI 1
|
#define FUNC_SPI 1
|
||||||
|
@ -165,7 +165,7 @@ TEST_CASE("Can mmap into data address space", "[spi_flash][mmap]")
|
|||||||
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
TEST_ASSERT_EQUAL_PTR(NULL, spi_flash_phys2cache(start, SPI_FLASH_MMAP_DATA));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !(CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2)
|
#if !(CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C6)
|
||||||
/* On S3/C3/C2 the cache is programmatically split between Icache and dcache and with the default setup we dont leave a lot pages
|
/* On S3/C3/C2 the cache is programmatically split between Icache and dcache and with the default setup we dont leave a lot pages
|
||||||
available for additional mmaps into instruction space. Disabling this test for now since any hypothetical use case for this
|
available for additional mmaps into instruction space. Disabling this test for now since any hypothetical use case for this
|
||||||
is no longer supported "out of the box"
|
is no longer supported "out of the box"
|
||||||
|
Loading…
Reference in New Issue
Block a user