diff --git a/components/bootloader_support/bootloader_flash/include/bootloader_flash_config.h b/components/bootloader_support/bootloader_flash/include/bootloader_flash_config.h index 8b80221132..6fbb6d4fc8 100644 --- a/components/bootloader_support/bootloader_flash/include/bootloader_flash_config.h +++ b/components/bootloader_support/bootloader_flash/include/bootloader_flash_config.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2018-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ diff --git a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32.c b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32.c index 64b24600bb..a6df703485 100644 --- a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32.c +++ b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2018-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2018-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -46,16 +46,16 @@ void IRAM_ATTR bootloader_flash_clock_config(const esp_image_header_t* pfhdr) { uint32_t spi_clk_div = 0; switch (pfhdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: spi_clk_div = 1; break; - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: spi_clk_div = 2; break; - case ESP_IMAGE_SPI_SPEED_26M: + case ESP_IMAGE_SPI_SPEED_DIV_3: spi_clk_div = 3; break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_4: spi_clk_div = 4; break; default: @@ -68,7 +68,7 @@ void IRAM_ATTR bootloader_flash_clock_config(const esp_image_header_t* pfhdr) void IRAM_ATTR bootloader_flash_gpio_config(const esp_image_header_t* pfhdr) { uint32_t drv = 2; - if (pfhdr->spi_speed == ESP_IMAGE_SPI_SPEED_80M) { + if (pfhdr->spi_speed == ESP_IMAGE_SPI_SPEED_DIV_1) { drv = 3; } @@ -135,16 +135,16 @@ void IRAM_ATTR bootloader_flash_dummy_config(const esp_image_header_t* pfhdr) } switch (pfhdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: g_rom_spiflash_dummy_len_plus[0] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_80M; g_rom_spiflash_dummy_len_plus[1] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_80M; break; - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: g_rom_spiflash_dummy_len_plus[0] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_40M; g_rom_spiflash_dummy_len_plus[1] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_40M; break; - case ESP_IMAGE_SPI_SPEED_26M: - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_3: + case ESP_IMAGE_SPI_SPEED_DIV_4: g_rom_spiflash_dummy_len_plus[0] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_20M; g_rom_spiflash_dummy_len_plus[1] = ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_20M; break; diff --git a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c2.c b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c2.c index 6913af566e..809ab48e09 100644 --- a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c2.c +++ b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c2.c @@ -41,17 +41,16 @@ void IRAM_ATTR bootloader_flash_clock_config(const esp_image_header_t *pfhdr) { uint32_t spi_clk_div = 0; switch (pfhdr->spi_speed) { - // TODO: change MSPI freq, IDF-3831 - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: spi_clk_div = 1; break; - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: spi_clk_div = 2; break; - case ESP_IMAGE_SPI_SPEED_26M: + case ESP_IMAGE_SPI_SPEED_DIV_3: spi_clk_div = 3; break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_4: spi_clk_div = 4; break; default: diff --git a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c3.c b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c3.c index 61ec2de7cc..52aecec883 100644 --- a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c3.c +++ b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32c3.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -44,16 +44,16 @@ void IRAM_ATTR bootloader_flash_clock_config(const esp_image_header_t *pfhdr) { uint32_t spi_clk_div = 0; switch (pfhdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: spi_clk_div = 1; break; - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: spi_clk_div = 2; break; - case ESP_IMAGE_SPI_SPEED_26M: + case ESP_IMAGE_SPI_SPEED_DIV_3: spi_clk_div = 3; break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_4: spi_clk_div = 4; break; default: diff --git a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32h2.c b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32h2.c index 547e86767f..ddbdc5c8a0 100644 --- a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32h2.c +++ b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32h2.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -44,16 +44,16 @@ void IRAM_ATTR bootloader_flash_clock_config(const esp_image_header_t *pfhdr) { uint32_t spi_clk_div = 0; switch (pfhdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: spi_clk_div = 1; break; - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: spi_clk_div = 2; break; - case ESP_IMAGE_SPI_SPEED_26M: + case ESP_IMAGE_SPI_SPEED_DIV_3: spi_clk_div = 3; break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_4: spi_clk_div = 4; break; default: diff --git a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32s2.c b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32s2.c index 1959b1b38e..da0c4b1684 100644 --- a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32s2.c +++ b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32s2.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -47,20 +47,20 @@ void IRAM_ATTR bootloader_flash_clock_config(const esp_image_header_t* pfhdr) { uint32_t spi_clk_div = 0; switch (pfhdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_80M: - spi_clk_div = 1; - break; - case ESP_IMAGE_SPI_SPEED_40M: - spi_clk_div = 2; - break; - case ESP_IMAGE_SPI_SPEED_26M: - spi_clk_div = 3; - break; - case ESP_IMAGE_SPI_SPEED_20M: - spi_clk_div = 4; - break; - default: - break; + case ESP_IMAGE_SPI_SPEED_DIV_1: + spi_clk_div = 1; + break; + case ESP_IMAGE_SPI_SPEED_DIV_2: + spi_clk_div = 2; + break; + case ESP_IMAGE_SPI_SPEED_DIV_3: + spi_clk_div = 3; + break; + case ESP_IMAGE_SPI_SPEED_DIV_4: + spi_clk_div = 4; + break; + default: + break; } esp_rom_spiflash_config_clk(spi_clk_div, 0); esp_rom_spiflash_config_clk(spi_clk_div, 1); diff --git a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32s3.c b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32s3.c index 357de775a5..33ebf6b687 100644 --- a/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32s3.c +++ b/components/bootloader_support/bootloader_flash/src/bootloader_flash_config_esp32s3.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -51,16 +51,16 @@ void IRAM_ATTR bootloader_flash_clock_config(const esp_image_header_t *pfhdr) { uint32_t spi_clk_div = 0; switch (pfhdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: spi_clk_div = 1; break; - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: spi_clk_div = 2; break; - case ESP_IMAGE_SPI_SPEED_26M: + case ESP_IMAGE_SPI_SPEED_DIV_3: spi_clk_div = 3; break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_4: spi_clk_div = 4; break; default: diff --git a/components/bootloader_support/bootloader_flash/src/flash_qio_mode.c b/components/bootloader_support/bootloader_flash/src/flash_qio_mode.c index fb94b0d39d..982bd2ddf1 100644 --- a/components/bootloader_support/bootloader_flash/src/flash_qio_mode.c +++ b/components/bootloader_support/bootloader_flash/src/flash_qio_mode.c @@ -11,8 +11,8 @@ #include "bootloader_flash_priv.h" #include "esp_log.h" #include "esp_err.h" -#include "esp_rom_efuse.h" #include "esp_rom_spiflash.h" +#include "esp_rom_efuse.h" #include "flash_qio_mode.h" #include "soc/efuse_periph.h" #include "soc/io_mux_reg.h" @@ -99,6 +99,23 @@ void bootloader_enable_qio_mode(void) #endif } +static void s_flash_set_qio_pins(void) +{ +#if CONFIG_IDF_TARGET_ESP32 + const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info(); + int wp_pin = bootloader_flash_get_wp_pin(); + esp_rom_spiflash_select_qio_pins(wp_pin, spiconfig); +#elif CONFIG_IDF_TARGET_ESP32C2 + // ESP32C2 doesn't support configure mspi pins. So the second + // parameter is set to 0, means that chip uses default SPI pins + // and wp_gpio_num parameter(the first parameter) is ignored. + esp_rom_spiflash_select_qio_pins(0, 0); +#else + esp_rom_spiflash_select_qio_pins(esp_rom_efuse_get_flash_wp_gpio(), esp_rom_efuse_get_flash_gpio_info()); +#endif +} + + static esp_err_t enable_qio_mode(bootloader_flash_read_status_fn_t read_status_fn, bootloader_flash_write_status_fn_t write_status_fn, uint8_t status_qio_bit) @@ -138,20 +155,7 @@ static esp_err_t enable_qio_mode(bootloader_flash_read_status_fn_t read_status_f esp_rom_spiflash_config_readmode(mode); -#if !CONFIG_IDF_TARGET_ESP32C2 - //IDF-3914 - const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info(); -#endif - -#if CONFIG_IDF_TARGET_ESP32 - int wp_pin = bootloader_flash_get_wp_pin(); - esp_rom_spiflash_select_qio_pins(wp_pin, spiconfig); -#elif CONFIG_IDF_TARGET_ESP32C2 - //IDF-3914 - esp_rom_spiflash_select_qio_pins(0, 0); -#else - esp_rom_spiflash_select_qio_pins(esp_rom_efuse_get_flash_wp_gpio(), spiconfig); -#endif + s_flash_set_qio_pins(); return ESP_OK; } diff --git a/components/bootloader_support/include/esp_app_format.h b/components/bootloader_support/include/esp_app_format.h index 225b7bef2b..a6c4d9b283 100644 --- a/components/bootloader_support/include/esp_app_format.h +++ b/components/bootloader_support/include/esp_app_format.h @@ -42,13 +42,13 @@ typedef enum { } esp_image_spi_mode_t; /** - * @brief SPI flash clock frequency + * @brief SPI flash clock division factor. */ typedef enum { - ESP_IMAGE_SPI_SPEED_40M, /*!< SPI clock frequency 40 MHz */ - ESP_IMAGE_SPI_SPEED_26M, /*!< SPI clock frequency 26 MHz */ - ESP_IMAGE_SPI_SPEED_20M, /*!< SPI clock frequency 20 MHz */ - ESP_IMAGE_SPI_SPEED_80M = 0xF /*!< SPI clock frequency 80 MHz */ + ESP_IMAGE_SPI_SPEED_DIV_2, /*!< The SPI flash clock frequency is divided by 2 of the clock source */ + ESP_IMAGE_SPI_SPEED_DIV_3, /*!< The SPI flash clock frequency is divided by 3 of the clock source */ + ESP_IMAGE_SPI_SPEED_DIV_4, /*!< The SPI flash clock frequency is divided by 4 of the clock source */ + ESP_IMAGE_SPI_SPEED_DIV_1 = 0xF /*!< The SPI flash clock frequency equals to the clock source */ } esp_image_spi_freq_t; /** diff --git a/components/bootloader_support/src/esp32/bootloader_esp32.c b/components/bootloader_support/src/esp32/bootloader_esp32.c index 422b8c30cc..26a72b2909 100644 --- a/components/bootloader_support/src/esp32/bootloader_esp32.c +++ b/components/bootloader_support/src/esp32/bootloader_esp32.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -175,16 +175,16 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr) const char *str; switch (bootloader_hdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: str = "40MHz"; break; - case ESP_IMAGE_SPI_SPEED_26M: + case ESP_IMAGE_SPI_SPEED_DIV_3: str = "26.7MHz"; break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_4: str = "20MHz"; break; - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: str = "80MHz"; break; default: diff --git a/components/bootloader_support/src/esp32c2/bootloader_esp32c2.c b/components/bootloader_support/src/esp32c2/bootloader_esp32c2.c index fb3406fee1..24161bc226 100644 --- a/components/bootloader_support/src/esp32c2/bootloader_esp32c2.c +++ b/components/bootloader_support/src/esp32c2/bootloader_esp32c2.c @@ -104,17 +104,20 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr) const char *str; switch (bootloader_hdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_40M: - str = "40MHz"; + case ESP_IMAGE_SPI_SPEED_DIV_2: + str = "30MHz"; break; - case ESP_IMAGE_SPI_SPEED_26M: - str = "26.7MHz"; - break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_3: str = "20MHz"; break; + case ESP_IMAGE_SPI_SPEED_DIV_4: + str = "15MHz"; + break; + case ESP_IMAGE_SPI_SPEED_DIV_1: + str = "60MHz"; + break; default: - str = "20MHz"; + str = "15MHz"; break; } ESP_LOGI(TAG, "SPI Speed : %s", str); @@ -184,13 +187,6 @@ static void bootloader_spi_flash_resume(void) static esp_err_t bootloader_init_spi_flash(void) { bootloader_init_flash_configure(); -#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_flash_unlock(); diff --git a/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c b/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c index 01b277a826..6c6e98877e 100644 --- a/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c +++ b/components/bootloader_support/src/esp32c3/bootloader_esp32c3.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -113,16 +113,16 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr) const char *str; switch (bootloader_hdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: str = "40MHz"; break; - case ESP_IMAGE_SPI_SPEED_26M: + case ESP_IMAGE_SPI_SPEED_DIV_3: str = "26.7MHz"; break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_4: str = "20MHz"; break; - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: str = "80MHz"; break; default: diff --git a/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c b/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c index dba3f9349b..0ad530582f 100644 --- a/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c +++ b/components/bootloader_support/src/esp32h2/bootloader_esp32h2.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -109,20 +109,20 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr) const char *str; switch (bootloader_hdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_40M: - str = "40MHz"; + case ESP_IMAGE_SPI_SPEED_DIV_2: + str = "24MHz"; break; - case ESP_IMAGE_SPI_SPEED_26M: - str = "26.7MHz"; + case ESP_IMAGE_SPI_SPEED_DIV_3: + str = "16MHz"; break; - case ESP_IMAGE_SPI_SPEED_20M: - str = "20MHz"; + case ESP_IMAGE_SPI_SPEED_DIV_4: + str = "12MHz"; break; - case ESP_IMAGE_SPI_SPEED_80M: - str = "80MHz"; + case ESP_IMAGE_SPI_SPEED_DIV_1: + str = "48MHz"; break; default: - str = "20MHz"; + str = "12MHz"; break; } ESP_LOGI(TAG, "SPI Speed : %s", str); diff --git a/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c b/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c index a95ee615d3..957074f62f 100644 --- a/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c +++ b/components/bootloader_support/src/esp32s2/bootloader_esp32s2.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -120,16 +120,16 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr) const char *str; switch (bootloader_hdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: str = "40MHz"; break; - case ESP_IMAGE_SPI_SPEED_26M: + case ESP_IMAGE_SPI_SPEED_DIV_3: str = "26.7MHz"; break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_4: str = "20MHz"; break; - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: str = "80MHz"; break; default: diff --git a/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c b/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c index edf12f28d7..980acba028 100644 --- a/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c +++ b/components/bootloader_support/src/esp32s3/bootloader_esp32s3.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -123,16 +123,16 @@ static void print_flash_info(const esp_image_header_t *bootloader_hdr) const char *str; switch (bootloader_hdr->spi_speed) { - case ESP_IMAGE_SPI_SPEED_40M: + case ESP_IMAGE_SPI_SPEED_DIV_2: str = "40MHz"; break; - case ESP_IMAGE_SPI_SPEED_26M: + case ESP_IMAGE_SPI_SPEED_DIV_3: str = "26.7MHz"; break; - case ESP_IMAGE_SPI_SPEED_20M: + case ESP_IMAGE_SPI_SPEED_DIV_4: str = "20MHz"; break; - case ESP_IMAGE_SPI_SPEED_80M: + case ESP_IMAGE_SPI_SPEED_DIV_1: str = "80MHz"; break; default: diff --git a/components/driver/test/test_spi_bus_lock.c b/components/driver/test/test_spi_bus_lock.c index 04a2a4eb34..42bd53a7d0 100644 --- a/components/driver/test/test_spi_bus_lock.c +++ b/components/driver/test/test_spi_bus_lock.c @@ -32,6 +32,8 @@ #endif +// H2 and C2 will not support external flash. +#define TEST_FLASH_FREQ_MHZ 5 typedef struct { union { @@ -235,7 +237,7 @@ static void test_bus_lock(bool test_flash) .cs_id = 2, .cs_io_num = TEST_BUS_PIN_NUM_CS, .io_mode = SPI_FLASH_DIO, - .speed = ESP_FLASH_5MHZ, + .freq_mhz = TEST_FLASH_FREQ_MHZ, .input_delay_ns = 0, }; diff --git a/components/esp_system/port/cpu_start.c b/components/esp_system/port/cpu_start.c index 0f9d58741e..cfd8fceccc 100644 --- a/components/esp_system/port/cpu_start.c +++ b/components/esp_system/port/cpu_start.c @@ -599,7 +599,7 @@ void IRAM_ATTR call_start_cpu0(void) __attribute__((unused)) esp_image_header_t fhdr = {0}; #ifdef CONFIG_APP_BUILD_TYPE_ELF_RAM fhdr.spi_mode = ESP_IMAGE_SPI_MODE_DIO; - fhdr.spi_speed = ESP_IMAGE_SPI_SPEED_40M; + fhdr.spi_speed = ESP_IMAGE_SPI_SPEED_DIV_2; fhdr.spi_size = ESP_IMAGE_FLASH_SIZE_4MB; extern void esp_rom_spiflash_attach(uint32_t, bool); diff --git a/components/esptool_py/Kconfig.projbuild b/components/esptool_py/Kconfig.projbuild index 99793b6961..1709369b5a 100644 --- a/components/esptool_py/Kconfig.projbuild +++ b/components/esptool_py/Kconfig.projbuild @@ -68,41 +68,56 @@ menu "Serial flasher config" choice ESPTOOLPY_FLASHFREQ prompt "Flash SPI speed" - default ESPTOOLPY_FLASHFREQ_40M if IDF_TARGET_ESP32 || IDF_TARGET_ESP32H2 || IDF_TARGET_ESP32C2 - default ESPTOOLPY_FLASHFREQ_80M - help - The SPI flash frequency to be used. - + default ESPTOOLPY_FLASHFREQ_40M if IDF_TARGET_ESP32 + default ESPTOOLPY_FLASHFREQ_80M if IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32S3 || IDF_TARGET_ESP32C3 + default ESPTOOLPY_FLASHFREQ_60M if IDF_TARGET_ESP32C2 + default ESPTOOLPY_FLASHFREQ_48M if IDF_TARGET_ESP32H2 config ESPTOOLPY_FLASHFREQ_120M - depends on IDF_TARGET_ESP32S3 && ESPTOOLPY_FLASH_SAMPLE_MODE_STR bool "120 MHz" + depends on SOC_MEMSPI_SRC_FREQ_120M && ESPTOOLPY_FLASH_SAMPLE_MODE_STR config ESPTOOLPY_FLASHFREQ_80M bool "80 MHz" + depends on SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED + config ESPTOOLPY_FLASHFREQ_60M + bool "60 MHz" + depends on SOC_MEMSPI_SRC_FREQ_60M_SUPPORTED + config ESPTOOLPY_FLASHFREQ_48M + bool "48 MHz" + depends on SOC_MEMSPI_SRC_FREQ_48M_SUPPORTED config ESPTOOLPY_FLASHFREQ_40M bool "40 MHz" + depends on SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED + config ESPTOOLPY_FLASHFREQ_30M + bool "30 MHz" + depends on SOC_MEMSPI_SRC_FREQ_30M_SUPPORTED config ESPTOOLPY_FLASHFREQ_26M bool "26 MHz" - depends on IDF_TARGET_ESP32 || IDF_TARGET_ESP32S2 || IDF_TARGET_ESP32C3 + depends on SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED + config ESPTOOLPY_FLASHFREQ_24M + bool "24 MHz" + depends on SOC_MEMSPI_SRC_FREQ_24M_SUPPORTED config ESPTOOLPY_FLASHFREQ_20M bool "20 MHz" + depends on SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED + config ESPTOOLPY_FLASHFREQ_15M + bool "15 MHz" + depends on SOC_MEMSPI_SRC_FREQ_15M_SUPPORTED endchoice config ESPTOOLPY_FLASHFREQ string # On some of the ESP chips, max boot frequency would be equal to (or even lower than) 80m. # We currently define this to `80m`. - default "80m" if ESPTOOLPY_FLASHFREQ_120M - # Temporarily support c2 and h2, because not consistent with esptool, will be cleaned up in IDF-4474 - default "80m" if ESPTOOLPY_FLASHFREQ_80M && !IDF_TARGET_ESP32C2 && !IDF_TARGET_ESP32H2 - default "40m" if ESPTOOLPY_FLASHFREQ_40M && !IDF_TARGET_ESP32C2 && !IDF_TARGET_ESP32H2 - default "26m" if ESPTOOLPY_FLASHFREQ_26M && !IDF_TARGET_ESP32C2 && !IDF_TARGET_ESP32H2 - default "20m" if ESPTOOLPY_FLASHFREQ_20M && !IDF_TARGET_ESP32C2 && !IDF_TARGET_ESP32H2 - default "60m" if ESPTOOLPY_FLASHFREQ_80M && IDF_TARGET_ESP32C2 - default "30m" if ESPTOOLPY_FLASHFREQ_40M && IDF_TARGET_ESP32C2 - default "15m" if ESPTOOLPY_FLASHFREQ_20M && IDF_TARGET_ESP32C2 - default "48m" if ESPTOOLPY_FLASHFREQ_80M && IDF_TARGET_ESP32H2 - default "24m" if ESPTOOLPY_FLASHFREQ_40M && IDF_TARGET_ESP32H2 - default "12m" if ESPTOOLPY_FLASHFREQ_20M && IDF_TARGET_ESP32H2 + default '80m' if ESPTOOLPY_FLASHFREQ_120M + default '80m' if ESPTOOLPY_FLASHFREQ_80M + default '60m' if ESPTOOLPY_FLASHFREQ_60M + default '48m' if ESPTOOLPY_FLASHFREQ_48M + default '30m' if ESPTOOLPY_FLASHFREQ_30M + default '24m' if ESPTOOLPY_FLASHFREQ_24M + default '40m' if ESPTOOLPY_FLASHFREQ_40M + default '26m' if ESPTOOLPY_FLASHFREQ_26M + default '20m' if ESPTOOLPY_FLASHFREQ_20M + default '20m' # if no clock can match in bin headers, go with minimal. choice ESPTOOLPY_FLASHSIZE diff --git a/components/hal/esp32/include/hal/spi_flash_ll.h b/components/hal/esp32/include/hal/spi_flash_ll.h index e3f02d3d07..3132be9017 100644 --- a/components/hal/esp32/include/hal/spi_flash_ll.h +++ b/components/hal/esp32/include/hal/spi_flash_ll.h @@ -28,13 +28,7 @@ extern "C" { #endif -//Supported clock register values -#define SPI_FLASH_LL_CLKREG_VAL_5MHZ ((spi_flash_ll_clock_reg_t){.val=0x0000F1CF}) ///< Clock set to 5 MHz -#define SPI_FLASH_LL_CLKREG_VAL_10MHZ ((spi_flash_ll_clock_reg_t){.val=0x000070C7}) ///< Clock set to 10 MHz -#define SPI_FLASH_LL_CLKREG_VAL_20MHZ ((spi_flash_ll_clock_reg_t){.val=0x00003043}) ///< Clock set to 20 MHz -#define SPI_FLASH_LL_CLKREG_VAL_26MHZ ((spi_flash_ll_clock_reg_t){.val=0x00002002}) ///< Clock set to 26 MHz -#define SPI_FLASH_LL_CLKREG_VAL_40MHZ ((spi_flash_ll_clock_reg_t){.val=0x00001001}) ///< Clock set to 40 MHz -#define SPI_FLASH_LL_CLKREG_VAL_80MHZ ((spi_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +#define SPI_FLASH_LL_CLOCK_FREQUENCY_MHZ (80) /// Get the start address of SPI peripheral registers by the host ID #define spi_flash_ll_get_hw(host_id) ( ((host_id)==SPI1_HOST) ? &SPI1 :(\ @@ -52,7 +46,7 @@ extern "C" { #define spi_flash_ll_set_dummy_out(dev, out_en, out_lev) /// type to store pre-calculated register value in above layers -typedef typeof(SPI1.clock) spi_flash_ll_clock_reg_t; +typedef typeof(SPI1.clock.val) spi_flash_ll_clock_reg_t; /*------------------------------------------------------------------------------ * Control @@ -281,7 +275,7 @@ static inline void spi_flash_ll_set_read_mode(spi_dev_t *dev, esp_flash_io_mode_ */ static inline void spi_flash_ll_set_clock(spi_dev_t *dev, spi_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -402,6 +396,41 @@ static inline void spi_flash_ll_set_cs_setup(spi_dev_t *dev, uint32_t cs_setup_t dev->ctrl2.setup_time = cs_setup_time - 1; } +/** + * Get the spi flash source clock frequency. Used for calculating + * the divider parameters. + * + * @param host_id SPI host id. Not used in this function, but to keep + * compatibility with other targets. + * + * @return the frequency of spi flash clock source.(MHz) + */ +static inline uint32_t spi_flash_ll_get_source_clock_freq_mhz(uint8_t host_id) +{ + return SPI_FLASH_LL_CLOCK_FREQUENCY_MHZ; +} + +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param host_id SPI host id. Not used in this function, but to keep + * compatibility with other targets. + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t spi_flash_ll_calculate_clock_reg(uint8_t host_id, uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv/2 - 1) & 0xff) << 6 ) | (((clkdiv - 1) & 0xff) << 12)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c2/include/hal/gpspi_flash_ll.h b/components/hal/esp32c2/include/hal/gpspi_flash_ll.h index 82c45bb9f1..3887e7acdf 100644 --- a/components/hal/esp32c2/include/hal/gpspi_flash_ll.h +++ b/components/hal/esp32c2/include/hal/gpspi_flash_ll.h @@ -31,14 +31,7 @@ extern "C" { #define gpspi_flash_ll_hw_get_id(dev) ( ((dev) == (void*)&GPSPI2) ? SPI2_HOST : -1 ) typedef typeof(GPSPI2.clock) gpspi_flash_ll_clock_reg_t; - -//Supported clock register values -#define GPSPI_FLASH_LL_CLKREG_VAL_5MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x0000F1CF}) ///< Clock set to 5 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_10MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x000070C7}) ///< Clock set to 10 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_20MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00003043}) ///< Clock set to 20 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_26MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00002002}) ///< Clock set to 26 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_40MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00001001}) ///< Clock set to 40 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_80MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +#define GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ (40) /*------------------------------------------------------------------------------ * Control @@ -391,6 +384,25 @@ static inline void gpspi_flash_ll_set_cs_setup(spi_dev_t *dev, uint32_t cs_setup dev->user1.cs_setup_time = cs_setup_time - 1; } +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t gpspi_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv/2 - 1) & 0xff) << 6 ) | (((clkdiv - 1) & 0xff) << 12)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c2/include/hal/spi_flash_ll.h b/components/hal/esp32c2/include/hal/spi_flash_ll.h index 7351232cf9..fea625a6fb 100644 --- a/components/hal/esp32c2/include/hal/spi_flash_ll.h +++ b/components/hal/esp32c2/include/hal/spi_flash_ll.h @@ -21,14 +21,10 @@ extern "C" { #endif -// For esp32s2, spimem is equivalent to traditional spi peripherals found -// in esp32. Let the spi flash clock reg definitions reflect this. -#define SPI_FLASH_LL_CLKREG_VAL_5MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_10MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_20MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_26MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_40MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_80MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ} +#define spi_flash_ll_calculate_clock_reg(host_id, clock_div) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_calculate_clock_reg(clock_div) \ + : gpspi_flash_ll_calculate_clock_reg(clock_div)) + +#define spi_flash_ll_get_source_clock_freq_mhz(host_id) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_get_source_freq_mhz() : GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ) #define spi_flash_ll_get_hw(host_id) (((host_id)<=SPI1_HOST ? (spi_dev_t*) spimem_flash_ll_get_hw(host_id) \ : gpspi_flash_ll_get_hw(host_id))) diff --git a/components/hal/esp32c2/include/hal/spimem_flash_ll.h b/components/hal/esp32c2/include/hal/spimem_flash_ll.h index 8f1cf7ad37..d97c41258d 100644 --- a/components/hal/esp32c2/include/hal/spimem_flash_ll.h +++ b/components/hal/esp32c2/include/hal/spimem_flash_ll.h @@ -30,15 +30,9 @@ extern "C" { #define spimem_flash_ll_get_hw(host_id) (((host_id)==SPI1_HOST ? &SPIMEM1 : NULL )) #define spimem_flash_ll_hw_get_id(dev) ((dev) == (void*)&SPIMEM1? SPI1_HOST: -1) -typedef typeof(SPIMEM1.clock) spimem_flash_ll_clock_reg_t; +#define SPIMEM_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ (60) -//Supported clock register values -#define SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ ((spimem_flash_ll_clock_reg_t){.val=0x000F070F}) ///< Clock set to 5 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00070307}) ///< Clock set to 10 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00030103}) ///< Clock set to 20 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00020002}) ///< Clock set to 26 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00010001}) ///< Clock set to 40 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ ((spimem_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +typedef typeof(SPIMEM1.clock.val) spimem_flash_ll_clock_reg_t; /*------------------------------------------------------------------------------ * Control @@ -412,7 +406,7 @@ static inline void spimem_flash_ll_set_read_mode(spi_mem_dev_t *dev, esp_flash_i */ static inline void spimem_flash_ll_set_clock(spi_mem_dev_t *dev, spimem_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -547,6 +541,41 @@ static inline void spimem_flash_ll_set_cs_setup(spi_mem_dev_t *dev, uint32_t cs_ dev->ctrl2.cs_setup_time = cs_setup_time - 1; } +/** + * Get the spi flash source clock frequency. Used for calculating + * the divider parameters. + * + * @param None + * + * @return the frequency of spi flash clock source.(MHz) + */ +static inline uint8_t spimem_flash_ll_get_source_freq_mhz(void) +{ + // Default is PLL120M, this is hard-coded. + // In the future, we can get the CPU clock source by calling interface. + // When PLL120M is selected, mspi clock is 60MHz. + return SPIMEM_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ; +} + +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t spimem_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_mem_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv - 1) / 2 & 0xff) << 8 ) | (((clkdiv - 1) & 0xff) << 16)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c3/include/hal/gpspi_flash_ll.h b/components/hal/esp32c3/include/hal/gpspi_flash_ll.h index 212e03a06d..ae81a85e33 100644 --- a/components/hal/esp32c3/include/hal/gpspi_flash_ll.h +++ b/components/hal/esp32c3/include/hal/gpspi_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -40,15 +32,8 @@ extern "C" { #define gpspi_flash_ll_get_hw(host_id) ( ((host_id)==SPI2_HOST) ? &GPSPI2 : ({abort();(spi_dev_t*)0;}) ) #define gpspi_flash_ll_hw_get_id(dev) ( ((dev) == (void*)&GPSPI2) ? SPI2_HOST : -1 ) -typedef typeof(GPSPI2.clock) gpspi_flash_ll_clock_reg_t; - -//Supported clock register values -#define GPSPI_FLASH_LL_CLKREG_VAL_5MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x0000F1CF}) ///< Clock set to 5 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_10MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x000070C7}) ///< Clock set to 10 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_20MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00003043}) ///< Clock set to 20 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_26MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00002002}) ///< Clock set to 26 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_40MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00001001}) ///< Clock set to 40 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_80MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +typedef typeof(GPSPI2.clock.val) gpspi_flash_ll_clock_reg_t; +#define GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ (80) /*------------------------------------------------------------------------------ * Control @@ -260,7 +245,7 @@ static inline void gpspi_flash_ll_set_read_mode(spi_dev_t *dev, esp_flash_io_mod */ static inline void gpspi_flash_ll_set_clock(spi_dev_t *dev, gpspi_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -400,6 +385,25 @@ static inline void gpspi_flash_ll_set_cs_setup(spi_dev_t *dev, uint32_t cs_setup dev->user1.cs_setup_time = cs_setup_time - 1; } +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t gpspi_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv/2 - 1) & 0xff) << 6 ) | (((clkdiv - 1) & 0xff) << 12)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32c3/include/hal/spi_flash_ll.h b/components/hal/esp32c3/include/hal/spi_flash_ll.h index 5508d161e0..fea625a6fb 100644 --- a/components/hal/esp32c3/include/hal/spi_flash_ll.h +++ b/components/hal/esp32c3/include/hal/spi_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -29,14 +21,10 @@ extern "C" { #endif -// For esp32s2, spimem is equivalent to traditional spi peripherals found -// in esp32. Let the spi flash clock reg definitions reflect this. -#define SPI_FLASH_LL_CLKREG_VAL_5MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_10MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_20MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_26MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_40MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_80MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ} +#define spi_flash_ll_calculate_clock_reg(host_id, clock_div) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_calculate_clock_reg(clock_div) \ + : gpspi_flash_ll_calculate_clock_reg(clock_div)) + +#define spi_flash_ll_get_source_clock_freq_mhz(host_id) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_get_source_freq_mhz() : GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ) #define spi_flash_ll_get_hw(host_id) (((host_id)<=SPI1_HOST ? (spi_dev_t*) spimem_flash_ll_get_hw(host_id) \ : gpspi_flash_ll_get_hw(host_id))) diff --git a/components/hal/esp32c3/include/hal/spimem_flash_ll.h b/components/hal/esp32c3/include/hal/spimem_flash_ll.h index 92c8748dd4..76e6369b4f 100644 --- a/components/hal/esp32c3/include/hal/spimem_flash_ll.h +++ b/components/hal/esp32c3/include/hal/spimem_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -29,6 +21,7 @@ #include "soc/spi_periph.h" #include "soc/spi_mem_struct.h" +#include "hal/assert.h" #include "hal/spi_types.h" #include "hal/spi_flash_types.h" @@ -39,15 +32,7 @@ extern "C" { #define spimem_flash_ll_get_hw(host_id) (((host_id)==SPI1_HOST ? &SPIMEM1 : NULL )) #define spimem_flash_ll_hw_get_id(dev) ((dev) == (void*)&SPIMEM1? SPI1_HOST: -1) -typedef typeof(SPIMEM1.clock) spimem_flash_ll_clock_reg_t; - -//Supported clock register values -#define SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ ((spimem_flash_ll_clock_reg_t){.val=0x000F070F}) ///< Clock set to 5 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00070307}) ///< Clock set to 10 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00030103}) ///< Clock set to 20 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00020002}) ///< Clock set to 26 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00010001}) ///< Clock set to 40 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ ((spimem_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +typedef typeof(SPIMEM1.clock.val) spimem_flash_ll_clock_reg_t; /*------------------------------------------------------------------------------ * Control @@ -421,7 +406,7 @@ static inline void spimem_flash_ll_set_read_mode(spi_mem_dev_t *dev, esp_flash_i */ static inline void spimem_flash_ll_set_clock(spi_mem_dev_t *dev, spimem_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -556,6 +541,54 @@ static inline void spimem_flash_ll_set_cs_setup(spi_mem_dev_t *dev, uint32_t cs_ dev->ctrl2.cs_setup_time = cs_setup_time - 1; } +/** + * Get the spi flash source clock frequency. Used for calculating + * the divider parameters. + * + * @param None + * + * @return the frequency of spi flash clock source.(MHz) + */ +static inline uint8_t spimem_flash_ll_get_source_freq_mhz(void) +{ + // TODO: Default is PLL480M, this is hard-coded. + // In the future, we can get the CPU clock source by calling interface. + uint8_t clock_val = 0; + switch (SPIMEM0.core_clk_sel.spi01_clk_sel) { + case 0: + clock_val = 80; + break; + case 1: + clock_val = 120; + break; + case 2: + clock_val = 160; + break; + default: + abort(); + } + return clock_val; +} + +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t spimem_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_mem_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv - 1) / 2 & 0xff) << 8 ) | (((clkdiv - 1) & 0xff) << 16)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32h2/include/hal/gpspi_flash_ll.h b/components/hal/esp32h2/include/hal/gpspi_flash_ll.h index d6b227e6f6..d6178eb6ce 100644 --- a/components/hal/esp32h2/include/hal/gpspi_flash_ll.h +++ b/components/hal/esp32h2/include/hal/gpspi_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -40,16 +32,9 @@ extern "C" { #define gpspi_flash_ll_get_hw(host_id) ( ((host_id)==SPI2_HOST) ? &GPSPI2 : ({abort();(spi_dev_t*)0;}) ) #define gpspi_flash_ll_hw_get_id(dev) ( ((dev) == (void*)&GPSPI2) ? SPI2_HOST : -1 ) -typedef typeof(GPSPI2.clock) gpspi_flash_ll_clock_reg_t; - -//Supported clock register values -#define GPSPI_FLASH_LL_CLKREG_VAL_5MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x0000F1CF}) ///< Clock set to 5 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_10MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x000070C7}) ///< Clock set to 10 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_20MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00003043}) ///< Clock set to 20 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_26MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00002002}) ///< Clock set to 26 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_40MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00001001}) ///< Clock set to 40 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_80MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +typedef typeof(GPSPI2.clock.val) gpspi_flash_ll_clock_reg_t; +#define GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ (48) /*------------------------------------------------------------------------------ * Control *----------------------------------------------------------------------------*/ @@ -260,7 +245,7 @@ static inline void gpspi_flash_ll_set_read_mode(spi_dev_t *dev, esp_flash_io_mod */ static inline void gpspi_flash_ll_set_clock(spi_dev_t *dev, gpspi_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -400,6 +385,25 @@ static inline void gpspi_flash_ll_set_cs_setup(spi_dev_t *dev, uint32_t cs_setup dev->user1.cs_setup_time = cs_setup_time - 1; } +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t gpspi_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv/2 - 1) & 0xff) << 6 ) | (((clkdiv - 1) & 0xff) << 12)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32h2/include/hal/spi_flash_ll.h b/components/hal/esp32h2/include/hal/spi_flash_ll.h index 5508d161e0..fea625a6fb 100644 --- a/components/hal/esp32h2/include/hal/spi_flash_ll.h +++ b/components/hal/esp32h2/include/hal/spi_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -29,14 +21,10 @@ extern "C" { #endif -// For esp32s2, spimem is equivalent to traditional spi peripherals found -// in esp32. Let the spi flash clock reg definitions reflect this. -#define SPI_FLASH_LL_CLKREG_VAL_5MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_10MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_20MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_26MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_40MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_80MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ} +#define spi_flash_ll_calculate_clock_reg(host_id, clock_div) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_calculate_clock_reg(clock_div) \ + : gpspi_flash_ll_calculate_clock_reg(clock_div)) + +#define spi_flash_ll_get_source_clock_freq_mhz(host_id) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_get_source_freq_mhz() : GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ) #define spi_flash_ll_get_hw(host_id) (((host_id)<=SPI1_HOST ? (spi_dev_t*) spimem_flash_ll_get_hw(host_id) \ : gpspi_flash_ll_get_hw(host_id))) diff --git a/components/hal/esp32h2/include/hal/spimem_flash_ll.h b/components/hal/esp32h2/include/hal/spimem_flash_ll.h index 0c464a20b2..484d2344cc 100644 --- a/components/hal/esp32h2/include/hal/spimem_flash_ll.h +++ b/components/hal/esp32h2/include/hal/spimem_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -29,6 +21,7 @@ #include "soc/spi_periph.h" #include "soc/spi_mem_struct.h" +#include "hal/assert.h" #include "hal/spi_types.h" #include "hal/spi_flash_types.h" @@ -39,15 +32,7 @@ extern "C" { #define spimem_flash_ll_get_hw(host_id) (((host_id)==SPI1_HOST ? &SPIMEM1 : NULL )) #define spimem_flash_ll_hw_get_id(dev) ((dev) == (void*)&SPIMEM1? SPI1_HOST: -1) -typedef typeof(SPIMEM1.clock) spimem_flash_ll_clock_reg_t; - -//Supported clock register values -#define SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ ((spimem_flash_ll_clock_reg_t){.val=0x000F070F}) ///< Clock set to 5 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00070307}) ///< Clock set to 10 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00030103}) ///< Clock set to 20 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00020002}) ///< Clock set to 26 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00010001}) ///< Clock set to 40 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ ((spimem_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +typedef typeof(SPIMEM1.clock.val) spimem_flash_ll_clock_reg_t; /*------------------------------------------------------------------------------ * Control @@ -421,7 +406,7 @@ static inline void spimem_flash_ll_set_read_mode(spi_mem_dev_t *dev, esp_flash_i */ static inline void spimem_flash_ll_set_clock(spi_mem_dev_t *dev, spimem_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -556,6 +541,48 @@ static inline void spimem_flash_ll_set_cs_setup(spi_mem_dev_t *dev, uint32_t cs_ dev->ctrl2.cs_setup_time = cs_setup_time - 1; } +/** + * Get the spi flash source clock frequency. Used for calculating + * the divider parameters. + * + * @param None + * + * @return the frequency of spi flash clock source.(MHz) + */ +static inline uint8_t spimem_flash_ll_get_source_freq_mhz(void) +{ + // TODO: Default is PLL480M, this is hard-coded. + // In the future, we can get the CPU clock source by calling interface. + uint8_t clock_val = 0; + switch (SPIMEM0.core_clk_sel.spi01_clk_sel) { + case 0: + clock_val = 48; + break; + default: + abort(); + } + return clock_val; +} + +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t spimem_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_mem_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv - 1) / 2 & 0xff) << 8 ) | (((clkdiv - 1) & 0xff) << 16)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32s2/include/hal/gpspi_flash_ll.h b/components/hal/esp32s2/include/hal/gpspi_flash_ll.h index 79fc727bdd..4a0d1c086b 100644 --- a/components/hal/esp32s2/include/hal/gpspi_flash_ll.h +++ b/components/hal/esp32s2/include/hal/gpspi_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -45,15 +37,8 @@ extern "C" { -1 \ )) ) -typedef typeof(GPSPI2.clock) gpspi_flash_ll_clock_reg_t; - -//Supported clock register values -#define GPSPI_FLASH_LL_CLKREG_VAL_5MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x0000F1CF}) ///< Clock set to 5 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_10MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x000070C7}) ///< Clock set to 10 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_20MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00003043}) ///< Clock set to 20 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_26MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00002002}) ///< Clock set to 26 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_40MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00001001}) ///< Clock set to 40 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_80MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +typedef typeof(GPSPI2.clock.val) gpspi_flash_ll_clock_reg_t; +#define GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ 80 /*------------------------------------------------------------------------------ * Control @@ -258,7 +243,7 @@ static inline void gpspi_flash_ll_set_read_mode(spi_dev_t *dev, esp_flash_io_mod */ static inline void gpspi_flash_ll_set_clock(spi_dev_t *dev, gpspi_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -388,6 +373,25 @@ static inline void gpspi_flash_ll_set_cs_setup(spi_dev_t *dev, uint32_t cs_setup dev->ctrl2.cs_setup_time = cs_setup_time - 1; } +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t gpspi_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv/2 - 1) & 0xff) << 6 ) | (((clkdiv - 1) & 0xff) << 12)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32s2/include/hal/spi_flash_ll.h b/components/hal/esp32s2/include/hal/spi_flash_ll.h index 000a2fcc0d..1aa9d800b5 100644 --- a/components/hal/esp32s2/include/hal/spi_flash_ll.h +++ b/components/hal/esp32s2/include/hal/spi_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -29,14 +21,11 @@ extern "C" { #endif -// For esp32s2, spimem is equivalent to traditional spi peripherals found -// in esp32. Let the spi flash clock reg definitions reflect this. -#define SPI_FLASH_LL_CLKREG_VAL_5MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_10MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_20MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_26MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_40MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_80MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ} + +#define spi_flash_ll_calculate_clock_reg(host_id, clock_div) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_calculate_clock_reg(clock_div) \ + : gpspi_flash_ll_calculate_clock_reg(clock_div)) + +#define spi_flash_ll_get_source_clock_freq_mhz(host_id) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_get_source_freq_mhz() : GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ) #define spi_flash_ll_get_hw(host_id) (((host_id)<=SPI1_HOST ? (spi_dev_t*) spimem_flash_ll_get_hw(host_id) \ : gpspi_flash_ll_get_hw(host_id))) diff --git a/components/hal/esp32s2/include/hal/spimem_flash_ll.h b/components/hal/esp32s2/include/hal/spimem_flash_ll.h index 2bbd6e90ff..f4bf54f3f0 100644 --- a/components/hal/esp32s2/include/hal/spimem_flash_ll.h +++ b/components/hal/esp32s2/include/hal/spimem_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -29,6 +21,7 @@ #include "soc/spi_periph.h" #include "soc/spi_mem_struct.h" +#include "hal/assert.h" #include "hal/spi_types.h" #include "hal/spi_flash_types.h" @@ -39,15 +32,7 @@ extern "C" { #define spimem_flash_ll_get_hw(host_id) (((host_id)==SPI1_HOST ? &SPIMEM1 : NULL )) #define spimem_flash_ll_hw_get_id(dev) ((dev) == (void*)&SPIMEM1? SPI1_HOST: -1) -typedef typeof(SPIMEM1.clock) spimem_flash_ll_clock_reg_t; - -//Supported clock register values -#define SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ ((spimem_flash_ll_clock_reg_t){.val=0x000F070F}) ///< Clock set to 5 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00070307}) ///< Clock set to 10 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00030103}) ///< Clock set to 20 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00020002}) ///< Clock set to 26 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00010001}) ///< Clock set to 40 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ ((spimem_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +typedef typeof(SPIMEM1.clock.val) spimem_flash_ll_clock_reg_t; /*------------------------------------------------------------------------------ * Control @@ -417,7 +402,7 @@ static inline void spimem_flash_ll_set_read_mode(spi_mem_dev_t *dev, esp_flash_i */ static inline void spimem_flash_ll_set_clock(spi_mem_dev_t *dev, spimem_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -546,6 +531,54 @@ static inline void spimem_flash_ll_set_cs_setup(spi_mem_dev_t *dev, uint32_t cs_ dev->ctrl2.cs_setup_time = cs_setup_time - 1; } +/** + * Get the spi flash source clock frequency. Used for calculating + * the divider parameters. + * + * @param None + * + * @return the frequency of spi flash clock source.(MHz) + */ +static inline uint8_t spimem_flash_ll_get_source_freq_mhz(void) +{ + // Default is PLL480M, this is hard-coded. + // In the future, we can get the CPU clock source by calling interface. + uint8_t clock_val = 0; + switch (SPIMEM0.spi_core_clk_sel.spi01_clk_sel) { + case 0: + clock_val = 80; + break; + case 1: + clock_val = 120; + break; + case 2: + clock_val = 160; + break; + default: + abort(); + } + return clock_val; +} + +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t spimem_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_mem_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv - 1) / 2 & 0xff) << 8 ) | (((clkdiv - 1) & 0xff) << 16)); + } + return div_parameter; +} + #ifdef __cplusplus } diff --git a/components/hal/esp32s3/include/hal/gpspi_flash_ll.h b/components/hal/esp32s3/include/hal/gpspi_flash_ll.h index 47f11e637a..aab2e4d4ec 100644 --- a/components/hal/esp32s3/include/hal/gpspi_flash_ll.h +++ b/components/hal/esp32s3/include/hal/gpspi_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -45,15 +37,8 @@ extern "C" { -1 \ )) ) -typedef typeof(GPSPI2.clock) gpspi_flash_ll_clock_reg_t; - -//Supported clock register values -#define GPSPI_FLASH_LL_CLKREG_VAL_5MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x0000F1CF}) ///< Clock set to 5 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_10MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x000070C7}) ///< Clock set to 10 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_20MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00003043}) ///< Clock set to 20 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_26MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00002002}) ///< Clock set to 26 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_40MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x00001001}) ///< Clock set to 40 MHz -#define GPSPI_FLASH_LL_CLKREG_VAL_80MHZ ((gpspi_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +typedef typeof(GPSPI2.clock.val) gpspi_flash_ll_clock_reg_t; +#define GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ 80 /*------------------------------------------------------------------------------ * Control @@ -265,7 +250,7 @@ static inline void gpspi_flash_ll_set_read_mode(spi_dev_t *dev, esp_flash_io_mod */ static inline void gpspi_flash_ll_set_clock(spi_dev_t *dev, gpspi_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -406,6 +391,25 @@ static inline void gpspi_flash_ll_set_cs_setup(spi_dev_t *dev, uint32_t cs_setup dev->user1.cs_setup_time = cs_setup_time - 1; } +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t gpspi_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv/2 - 1) & 0xff) << 6 ) | (((clkdiv - 1) & 0xff) << 12)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/esp32s3/include/hal/spi_flash_ll.h b/components/hal/esp32s3/include/hal/spi_flash_ll.h index 1c755de980..f9d2ecadf6 100644 --- a/components/hal/esp32s3/include/hal/spi_flash_ll.h +++ b/components/hal/esp32s3/include/hal/spi_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -29,14 +21,10 @@ extern "C" { #endif -// For esp32s2, spimem is equivalent to traditional spi peripherals found -// in esp32. Let the spi flash clock reg definitions reflect this. -#define SPI_FLASH_LL_CLKREG_VAL_5MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_10MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_20MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_26MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_40MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ} -#define SPI_FLASH_LL_CLKREG_VAL_80MHZ {.spimem=SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ} +#define spi_flash_ll_calculate_clock_reg(host_id, clock_div) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_calculate_clock_reg(clock_div) \ + : gpspi_flash_ll_calculate_clock_reg(clock_div)) + +#define spi_flash_ll_get_source_clock_freq_mhz(host_id) (((host_id)<=SPI1_HOST) ? spimem_flash_ll_get_source_freq_mhz() : GPSPI_FLASH_LL_PERIPHERAL_FREQUENCY_MHZ) #define spi_flash_ll_get_hw(host_id) (((host_id)<=SPI1_HOST ? (spi_dev_t*) spimem_flash_ll_get_hw(host_id) \ : gpspi_flash_ll_get_hw(host_id))) diff --git a/components/hal/esp32s3/include/hal/spimem_flash_ll.h b/components/hal/esp32s3/include/hal/spimem_flash_ll.h index ea394d2f47..b42055bcb5 100644 --- a/components/hal/esp32s3/include/hal/spimem_flash_ll.h +++ b/components/hal/esp32s3/include/hal/spimem_flash_ll.h @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ /******************************************************************************* * NOTICE @@ -28,6 +20,7 @@ #include #include "soc/spi_periph.h" +#include "hal/assert.h" #include "soc/spi_mem_struct.h" #include "hal/spi_types.h" #include "hal/spi_flash_types.h" @@ -39,15 +32,7 @@ extern "C" { #define spimem_flash_ll_get_hw(host_id) (((host_id)==SPI1_HOST ? &SPIMEM1 : NULL )) #define spimem_flash_ll_hw_get_id(dev) ((dev) == (void*)&SPIMEM1? SPI1_HOST: -1) -typedef typeof(SPIMEM1.clock) spimem_flash_ll_clock_reg_t; - -//Supported clock register values -#define SPIMEM_FLASH_LL_CLKREG_VAL_5MHZ ((spimem_flash_ll_clock_reg_t){.val=0x000F070F}) ///< Clock set to 5 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_10MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00070307}) ///< Clock set to 10 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_20MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00030103}) ///< Clock set to 20 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_26MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00020002}) ///< Clock set to 26 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_40MHZ ((spimem_flash_ll_clock_reg_t){.val=0x00010001}) ///< Clock set to 40 MHz -#define SPIMEM_FLASH_LL_CLKREG_VAL_80MHZ ((spimem_flash_ll_clock_reg_t){.val=0x80000000}) ///< Clock set to 80 MHz +typedef typeof(SPIMEM1.clock.val) spimem_flash_ll_clock_reg_t; /*------------------------------------------------------------------------------ * Control @@ -431,7 +416,7 @@ static inline void spimem_flash_ll_set_read_mode(spi_mem_dev_t *dev, esp_flash_i */ static inline void spimem_flash_ll_set_clock(spi_mem_dev_t *dev, spimem_flash_ll_clock_reg_t *clock_val) { - dev->clock = *clock_val; + dev->clock.val = *clock_val; } /** @@ -565,6 +550,54 @@ static inline void spimem_flash_ll_set_extra_dummy(spi_mem_dev_t *dev, uint32_t dev->timing_cali.extra_dummy_cyclelen = extra_dummy; } +/** + * Get the spi flash source clock frequency. Used for calculating + * the divider parameters. + * + * @param None + * + * @return the frequency of spi flash clock source.(MHz) + */ +static inline uint8_t spimem_flash_ll_get_source_freq_mhz(void) +{ + // Default is PLL480M, this is hard-coded. + // In the future, we can get the CPU clock source by calling interface. + uint8_t clock_val = 0; + switch (SPIMEM0.core_clk_sel.core_clk_sel) { + case 0: + clock_val = 80; + break; + case 1: + clock_val = 120; + break; + case 2: + clock_val = 160; + break; + default: + abort(); + } + return clock_val; +} + +/** + * Calculate spi_flash clock frequency division parameters for register. + * + * @param clkdiv frequency division factor + * + * @return Register setting for the given clock division factor. + */ +static inline uint32_t spimem_flash_ll_calculate_clock_reg(uint8_t clkdiv) +{ + uint32_t div_parameter; + // See comments of `clock` in `spi_mem_struct.h` + if (clkdiv == 1) { + div_parameter = (1 << 31); + } else { + div_parameter = ((clkdiv - 1) | (((clkdiv - 1) / 2 & 0xff) << 8 ) | (((clkdiv - 1) & 0xff) << 16)); + } + return div_parameter; +} + #ifdef __cplusplus } #endif diff --git a/components/hal/include/hal/spi_flash_hal.h b/components/hal/include/hal/spi_flash_hal.h index c36d5fa541..f6c3c168c3 100644 --- a/components/hal/include/hal/spi_flash_hal.h +++ b/components/hal/include/hal/spi_flash_hal.h @@ -70,13 +70,15 @@ typedef struct { }; bool iomux; ///< Whether the IOMUX is used, used for timing compensation. int input_delay_ns; ///< Input delay on the MISO pin after the launch clock, used for timing compensation. - esp_flash_speed_t speed;///< SPI flash clock speed to work at. + enum esp_flash_speed_s speed __attribute__((deprecated)); ///< SPI flash clock speed to work at. Replaced by freq_mhz spi_host_device_t host_id; ///< SPI peripheral ID. int cs_num; ///< Which cs pin is used, 0-(SOC_SPI_PERIPH_CS_NUM-1). bool auto_sus_en; ///< Auto suspend feature enable bit 1: enable, 0: disable. bool octal_mode_en; ///< Octal spi flash mode enable bit 1: enable, 0: disable. bool using_timing_tuning; ///< System exist SPI0/1 timing tuning, using value from system directely if set to 1. esp_flash_io_mode_t default_io_mode; ///< Default flash io mode. + int freq_mhz; ///< SPI flash clock speed (MHZ). + int clock_src_freq; ///< SPI flash clock source (MHZ). } spi_flash_hal_config_t; /** diff --git a/components/hal/include/hal/spi_flash_types.h b/components/hal/include/hal/spi_flash_types.h index 98426a2de8..53d22d9e26 100644 --- a/components/hal/include/hal/spi_flash_types.h +++ b/components/hal/include/hal/spi_flash_types.h @@ -40,19 +40,16 @@ typedef struct { * ``ESP_FLSH_SPEED_MAX-1`` or highest frequency supported by your flash, and * decrease the speed until the probing success. */ -typedef enum { - ESP_FLASH_5MHZ = 0, ///< The flash runs under 5MHz - ESP_FLASH_10MHZ, ///< The flash runs under 10MHz - ESP_FLASH_20MHZ, ///< The flash runs under 20MHz - ESP_FLASH_26MHZ, ///< The flash runs under 26MHz - ESP_FLASH_40MHZ, ///< The flash runs under 40MHz - ESP_FLASH_80MHZ, ///< The flash runs under 80MHz - ESP_FLASH_120MHZ, ///< The flash runs under 120MHz, 120MHZ can only be used by main flash after timing tuning in system. Do not use this directely in any API. +typedef enum esp_flash_speed_s { + ESP_FLASH_5MHZ = 5, ///< The flash runs under 5MHz + ESP_FLASH_10MHZ = 10, ///< The flash runs under 10MHz + ESP_FLASH_20MHZ = 20, ///< The flash runs under 20MHz + ESP_FLASH_26MHZ = 26, ///< The flash runs under 26MHz + ESP_FLASH_40MHZ = 40, ///< The flash runs under 40MHz + ESP_FLASH_80MHZ = 80, ///< The flash runs under 80MHz + ESP_FLASH_120MHZ = 120, ///< The flash runs under 120MHz, 120MHZ can only be used by main flash after timing tuning in system. Do not use this directely in any API. ESP_FLASH_SPEED_MAX, ///< The maximum frequency supported by the host is ``ESP_FLASH_SPEED_MAX-1``. -} esp_flash_speed_t; - -///Lowest speed supported by the driver, currently 5 MHz -#define ESP_FLASH_SPEED_MIN ESP_FLASH_5MHZ +} esp_flash_speed_t __attribute__((deprecated)); // These bits are not quite like "IO mode", but are able to be appended into the io mode and used by the HAL. #define SPI_FLASH_CONFIG_CONF_BITS BIT(31) ///< OR the io_mode with this mask, to enable the dummy output feature or replace the first several dummy bits into address to meet the requirements of conf bits. (Used in DIO/QIO/OIO mode) diff --git a/components/hal/spi_flash_hal.c b/components/hal/spi_flash_hal.c index 3518b81caf..2fe7909540 100644 --- a/components/hal/spi_flash_hal.c +++ b/components/hal/spi_flash_hal.c @@ -9,41 +9,50 @@ #include #include +#include #include "soc/soc_caps.h" #include "hal/spi_flash_hal.h" +#include "hal/assert.h" +#include "hal/log.h" +#include "hal/spi_flash_types.h" #define APB_CYCLE_NS (1000*1000*1000LL/APB_CLK_FREQ) +static const char *TAG = "flash_hal"; -typedef struct { - int div; - spi_flash_ll_clock_reg_t clock_reg_val; -} spi_flash_hal_clock_config_t; - - - - -static const spi_flash_hal_clock_config_t spi_flash_clk_cfg_reg[ESP_FLASH_SPEED_MAX] = { - {16, SPI_FLASH_LL_CLKREG_VAL_5MHZ}, - {8, SPI_FLASH_LL_CLKREG_VAL_10MHZ}, - {4, SPI_FLASH_LL_CLKREG_VAL_20MHZ}, - {3, SPI_FLASH_LL_CLKREG_VAL_26MHZ}, - {2, SPI_FLASH_LL_CLKREG_VAL_40MHZ}, - {1, SPI_FLASH_LL_CLKREG_VAL_80MHZ}, -}; - -#if !CONFIG_IDF_TARGET_ESP32 -static const spi_flash_hal_clock_config_t spi_flash_gpspi_clk_cfg_reg[ESP_FLASH_SPEED_MAX] = { - {16, {.gpspi=GPSPI_FLASH_LL_CLKREG_VAL_5MHZ}}, - {8, {.gpspi=GPSPI_FLASH_LL_CLKREG_VAL_10MHZ}}, - {4, {.gpspi=GPSPI_FLASH_LL_CLKREG_VAL_20MHZ}}, - {3, {.gpspi=GPSPI_FLASH_LL_CLKREG_VAL_26MHZ}}, - {2, {.gpspi=GPSPI_FLASH_LL_CLKREG_VAL_40MHZ}}, - {1, {.gpspi=GPSPI_FLASH_LL_CLKREG_VAL_80MHZ}}, -}; -#else -#define spi_flash_gpspi_clk_cfg_reg spi_flash_clk_cfg_reg +static uint32_t get_flash_clock_divider(const spi_flash_hal_config_t *cfg) +{ + int clk_source = cfg->clock_src_freq; + // 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. + // 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 + // round down flash frequency to keep it safe. + int best_div = 0; + if (clk_source < cfg->freq_mhz) { + ESP_LOGE(TAG, "Target frequency %dMHz higher than supported.", cfg->freq_mhz); + abort(); + } +#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32C3 + if (cfg->freq_mhz == 26 || cfg->freq_mhz == 27) { + best_div = 3; + } else #endif + { + best_div = (int)ceil((double)clk_source / (double)cfg->freq_mhz); + if ((cfg->clock_src_freq % cfg->freq_mhz) != 0) { + HAL_LOGW(TAG, "Flash clock frequency round down to %d", (int)floor((double)clk_source / (double)best_div)); + } + } + + return best_div; +} + +static uint32_t spi_flash_cal_clock(const spi_flash_hal_config_t *cfg) +{ + uint32_t div_parameter = spi_flash_ll_calculate_clock_reg(cfg->host_id, get_flash_clock_divider(cfg)); + return div_parameter; +} static inline int get_dummy_n(bool gpio_is_used, int input_delay_ns, int eff_clk) { @@ -87,9 +96,6 @@ esp_err_t spi_flash_hal_init(spi_flash_hal_context_t *data_out, const spi_flash_ return ESP_ERR_INVALID_ARG; } - bool gpspi = (cfg->host_id > SPI1_HOST); - const spi_flash_hal_clock_config_t *clock_cfg = gpspi? &spi_flash_gpspi_clk_cfg_reg[cfg->speed]: &spi_flash_clk_cfg_reg[cfg->speed]; - *data_out = (spi_flash_hal_context_t) { .inst = data_out->inst, // Keeps the function pointer table .spi = spi_flash_ll_get_hw(cfg->host_id), @@ -105,8 +111,8 @@ esp_err_t spi_flash_hal_init(spi_flash_hal_context_t *data_out, const spi_flash_ } else #endif // SOC_SPI_MEM_SUPPORT_TIME_TUNING { - data_out->extra_dummy = get_dummy_n(!cfg->iomux, cfg->input_delay_ns, APB_CLK_FREQ/clock_cfg->div); - data_out->clock_conf = clock_cfg->clock_reg_val; + data_out->extra_dummy = get_dummy_n(!cfg->iomux, cfg->input_delay_ns, APB_CLK_FREQ/get_flash_clock_divider(cfg)); + data_out->clock_conf = (spi_flash_ll_clock_reg_t)spi_flash_cal_clock(cfg); } diff --git a/components/soc/esp32/include/soc/Kconfig.soc_caps.in b/components/soc/esp32/include/soc/Kconfig.soc_caps.in index 8392fe9a57..3051657cb6 100644 --- a/components/soc/esp32/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32/include/soc/Kconfig.soc_caps.in @@ -487,6 +487,22 @@ config SOC_SPI_MAX_PRE_DIVIDER int default 8192 +config SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED + bool + default y + config SOC_TIMER_GROUPS int default 2 diff --git a/components/soc/esp32/include/soc/soc_caps.h b/components/soc/esp32/include/soc/soc_caps.h index d73c88010b..b990bd6bfa 100644 --- a/components/soc/esp32/include/soc/soc_caps.h +++ b/components/soc/esp32/include/soc/soc_caps.h @@ -262,6 +262,11 @@ #define SOC_SPI_MAXIMUM_BUFFER_SIZE 64 #define SOC_SPI_MAX_PRE_DIVIDER 8192 +// Although ESP32 doesn't has memspi, but keep consistent with following chips.(This means SPI0/1) +#define SOC_MEMSPI_SRC_FREQ_80M_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 // Peripheral supports DIO, DOUT, QIO, or QOUT diff --git a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in index 7c12234a92..87350f552e 100644 --- a/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c2/include/soc/Kconfig.soc_caps.in @@ -375,6 +375,22 @@ config SOC_SPI_MEM_SUPPORT_CHECK_SUS bool default y +config SOC_MEMSPI_SRC_FREQ_60M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_30M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_15M_SUPPORTED + bool + default y + config SOC_SYSTIMER_COUNTER_NUM int default 2 diff --git a/components/soc/esp32c2/include/soc/soc_caps.h b/components/soc/esp32c2/include/soc/soc_caps.h index aad3031e53..9d644c92bf 100644 --- a/components/soc/esp32c2/include/soc/soc_caps.h +++ b/components/soc/esp32c2/include/soc/soc_caps.h @@ -204,6 +204,10 @@ #define SOC_SPI_MEM_SUPPORT_SW_SUSPEND (1) #define SOC_SPI_MEM_SUPPORT_CHECK_SUS (1) +#define SOC_MEMSPI_SRC_FREQ_60M_SUPPORTED 1 +#define SOC_MEMSPI_SRC_FREQ_30M_SUPPORTED 1 +#define SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED 1 +#define SOC_MEMSPI_SRC_FREQ_15M_SUPPORTED 1 /*-------------------------- SYSTIMER CAPS ----------------------------------*/ #define SOC_SYSTIMER_COUNTER_NUM (2) // Number of counter units diff --git a/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in index 9d1ffc10bf..4305b5cb4a 100644 --- a/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c3/include/soc/Kconfig.soc_caps.in @@ -547,6 +547,22 @@ config SOC_SPI_MEM_SUPPORT_CHECK_SUS bool default y +config SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED + bool + default y + config SOC_SYSTIMER_COUNTER_NUM int default 2 diff --git a/components/soc/esp32c3/include/soc/soc_caps.h b/components/soc/esp32c3/include/soc/soc_caps.h index d17bb59beb..cf72b8ef60 100644 --- a/components/soc/esp32c3/include/soc/soc_caps.h +++ b/components/soc/esp32c3/include/soc/soc_caps.h @@ -270,6 +270,10 @@ #define SOC_SPI_MEM_SUPPORT_SW_SUSPEND (1) #define SOC_SPI_MEM_SUPPORT_CHECK_SUS (1) +#define SOC_MEMSPI_SRC_FREQ_80M_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 /*-------------------------- SYSTIMER CAPS ----------------------------------*/ #define SOC_SYSTIMER_COUNTER_NUM (2) // Number of counter units diff --git a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in index 12e6cafbd5..cdc218cb03 100644 --- a/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32h2/include/soc/Kconfig.soc_caps.in @@ -539,6 +539,22 @@ config SOC_SPI_MEM_SUPPORT_CHECK_SUS bool default y +config SOC_MEMSPI_SRC_FREQ_48M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_24M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_16M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_12M_SUPPORTED + bool + default y + config SOC_SYSTIMER_COUNTER_NUM int default 2 diff --git a/components/soc/esp32h2/include/soc/soc_caps.h b/components/soc/esp32h2/include/soc/soc_caps.h index 18b33eefac..d2a705471d 100644 --- a/components/soc/esp32h2/include/soc/soc_caps.h +++ b/components/soc/esp32h2/include/soc/soc_caps.h @@ -281,6 +281,10 @@ #define SOC_SPI_MEM_SUPPORT_SW_SUSPEND (1) #define SOC_SPI_MEM_SUPPORT_CHECK_SUS (1) +#define SOC_MEMSPI_SRC_FREQ_48M_SUPPORTED 1 +#define SOC_MEMSPI_SRC_FREQ_24M_SUPPORTED 1 +#define SOC_MEMSPI_SRC_FREQ_16M_SUPPORTED 1 +#define SOC_MEMSPI_SRC_FREQ_12M_SUPPORTED 1 /*-------------------------- SYSTIMER CAPS ----------------------------------*/ #define SOC_SYSTIMER_COUNTER_NUM (2) // Number of counter units diff --git a/components/soc/esp32s2/include/soc/Kconfig.soc_caps.in b/components/soc/esp32s2/include/soc/Kconfig.soc_caps.in index a9dbc9204c..24bd84157e 100644 --- a/components/soc/esp32s2/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32s2/include/soc/Kconfig.soc_caps.in @@ -547,6 +547,22 @@ config SOC_SPI_SUPPORT_OCT bool default y +config SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED + bool + default y + config SOC_SYSTIMER_COUNTER_NUM bool default y diff --git a/components/soc/esp32s2/include/soc/soc_caps.h b/components/soc/esp32s2/include/soc/soc_caps.h index 9990b9d137..aa5bf0be76 100644 --- a/components/soc/esp32s2/include/soc/soc_caps.h +++ b/components/soc/esp32s2/include/soc/soc_caps.h @@ -257,6 +257,11 @@ #define SOC_MEMSPI_IS_INDEPENDENT 1 #define SOC_SPI_SUPPORT_OCT 1 +#define SOC_MEMSPI_SRC_FREQ_80M_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 + /*-------------------------- SYSTIMER CAPS ----------------------------------*/ #define SOC_SYSTIMER_COUNTER_NUM (1) // Number of counter units #define SOC_SYSTIMER_ALARM_NUM (3) // Number of alarm units diff --git a/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in b/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in index 629da0fc1f..01078f8bd8 100644 --- a/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32s3/include/soc/Kconfig.soc_caps.in @@ -631,6 +631,22 @@ config SOC_SPI_SUPPORT_OCT bool default y +config SOC_MEMSPI_SRC_FREQ_120M + bool + default y + +config SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED + bool + default y + +config SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED + bool + default y + config SOC_SPIRAM_SUPPORTED bool default y diff --git a/components/soc/esp32s3/include/soc/soc_caps.h b/components/soc/esp32s3/include/soc/soc_caps.h index 6f7e4c11fc..c1f40c899d 100644 --- a/components/soc/esp32s3/include/soc/soc_caps.h +++ b/components/soc/esp32s3/include/soc/soc_caps.h @@ -262,6 +262,11 @@ #define SOC_SPI_MAX_PRE_DIVIDER 16 #define SOC_SPI_SUPPORT_OCT 1 +#define SOC_MEMSPI_SRC_FREQ_120M 1 +#define SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED 1 +#define SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED 1 +#define SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED 1 + /*-------------------------- SPIRAM CAPS ----------------------------------------*/ #define SOC_SPIRAM_SUPPORTED 1 diff --git a/components/spi_flash/esp_flash_spi_init.c b/components/spi_flash/esp_flash_spi_init.c index a8b650d18a..773150e495 100644 --- a/components/spi_flash/esp_flash_spi_init.c +++ b/components/spi_flash/esp_flash_spi_init.c @@ -31,16 +31,30 @@ esp_flash_t *esp_flash_default_chip = NULL; #ifndef CONFIG_SPI_FLASH_USE_LEGACY_IMPL -#ifdef CONFIG_ESPTOOLPY_FLASHFREQ_80M -#define DEFAULT_FLASH_SPEED ESP_FLASH_80MHZ +#if defined CONFIG_ESPTOOLPY_FLASHFREQ_120M +#define DEFAULT_FLASH_SPEED 120 +#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_80M +#define DEFAULT_FLASH_SPEED 80 +#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_60M +#define DEFAULT_FLASH_SPEED 60 +#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_48M +#define DEFAULT_FLASH_SPEED 48 #elif defined CONFIG_ESPTOOLPY_FLASHFREQ_40M -#define DEFAULT_FLASH_SPEED ESP_FLASH_40MHZ +#define DEFAULT_FLASH_SPEED 40 +#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_30M +#define DEFAULT_FLASH_SPEED 30 #elif defined CONFIG_ESPTOOLPY_FLASHFREQ_26M -#define DEFAULT_FLASH_SPEED ESP_FLASH_26MHZ +#define DEFAULT_FLASH_SPEED 26 +#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_24M +#define DEFAULT_FLASH_SPEED 24 #elif defined CONFIG_ESPTOOLPY_FLASHFREQ_20M -#define DEFAULT_FLASH_SPEED ESP_FLASH_20MHZ -#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_120M -#define DEFAULT_FLASH_SPEED ESP_FLASH_120MHZ +#define DEFAULT_FLASH_SPEED 20 +#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_16M +#define DEFAULT_FLASH_SPEED 16 +#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_15M +#define DEFAULT_FLASH_SPEED 15 +#elif defined CONFIG_ESPTOOLPY_FLASHFREQ_12M +#define DEFAULT_FLASH_SPEED 12 #else #error Flash frequency not defined! Check the ``CONFIG_ESPTOOLPY_FLASHFREQ_*`` options. #endif @@ -65,7 +79,7 @@ esp_flash_t *esp_flash_default_chip = NULL; #if CONFIG_IDF_TARGET_ESP32 #define ESP_FLASH_HOST_CONFIG_DEFAULT() (memspi_host_config_t){ \ .host_id = SPI1_HOST,\ - .speed = DEFAULT_FLASH_SPEED, \ + .freq_mhz = DEFAULT_FLASH_SPEED, \ .cs_num = 0, \ .iomux = false, \ .input_delay_ns = 0,\ @@ -74,7 +88,7 @@ esp_flash_t *esp_flash_default_chip = NULL; #elif CONFIG_IDF_TARGET_ESP32S2 #define ESP_FLASH_HOST_CONFIG_DEFAULT() (memspi_host_config_t){ \ .host_id = SPI1_HOST,\ - .speed = DEFAULT_FLASH_SPEED, \ + .freq_mhz = DEFAULT_FLASH_SPEED, \ .cs_num = 0, \ .iomux = true, \ .input_delay_ns = 0,\ @@ -84,7 +98,7 @@ esp_flash_t *esp_flash_default_chip = NULL; #include "esp32s3/rom/efuse.h" #define ESP_FLASH_HOST_CONFIG_DEFAULT() (memspi_host_config_t){ \ .host_id = SPI1_HOST,\ - .speed = DEFAULT_FLASH_SPEED, \ + .freq_mhz = DEFAULT_FLASH_SPEED, \ .cs_num = 0, \ .iomux = true, \ .input_delay_ns = 0,\ @@ -94,7 +108,7 @@ esp_flash_t *esp_flash_default_chip = NULL; #if !CONFIG_SPI_FLASH_AUTO_SUSPEND #define ESP_FLASH_HOST_CONFIG_DEFAULT() (memspi_host_config_t){ \ .host_id = SPI1_HOST,\ - .speed = DEFAULT_FLASH_SPEED, \ + .freq_mhz = DEFAULT_FLASH_SPEED, \ .cs_num = 0, \ .iomux = true, \ .input_delay_ns = 0,\ @@ -103,7 +117,7 @@ esp_flash_t *esp_flash_default_chip = NULL; #else #define ESP_FLASH_HOST_CONFIG_DEFAULT() (memspi_host_config_t){ \ .host_id = SPI1_HOST,\ - .speed = DEFAULT_FLASH_SPEED, \ + .freq_mhz = DEFAULT_FLASH_SPEED, \ .cs_num = 0, \ .iomux = true, \ .input_delay_ns = 0,\ @@ -116,7 +130,7 @@ esp_flash_t *esp_flash_default_chip = NULL; #if !CONFIG_SPI_FLASH_AUTO_SUSPEND #define ESP_FLASH_HOST_CONFIG_DEFAULT() (memspi_host_config_t){ \ .host_id = SPI1_HOST,\ - .speed = DEFAULT_FLASH_SPEED, \ + .freq_mhz = DEFAULT_FLASH_SPEED, \ .cs_num = 0, \ .iomux = true, \ .input_delay_ns = 0,\ @@ -124,7 +138,7 @@ esp_flash_t *esp_flash_default_chip = NULL; #else #define ESP_FLASH_HOST_CONFIG_DEFAULT() (memspi_host_config_t){ \ .host_id = SPI1_HOST,\ - .speed = DEFAULT_FLASH_SPEED, \ + .freq_mhz = DEFAULT_FLASH_SPEED, \ .cs_num = 0, \ .iomux = true, \ .input_delay_ns = 0,\ @@ -133,7 +147,6 @@ esp_flash_t *esp_flash_default_chip = NULL; #endif //!CONFIG_SPI_FLASH_AUTO_SUSPEND #endif - static IRAM_ATTR NOINLINE_ATTR void cs_initialize(esp_flash_t *chip, const esp_flash_spi_device_config_t *config, bool use_iomux, int cs_id) { //Not using spicommon_cs_initialize since we don't want to put the whole @@ -265,8 +278,11 @@ esp_err_t spi_bus_add_flash_device(esp_flash_t **out_chip, const esp_flash_spi_d .cs_num = dev_id, .iomux = use_iomux, .input_delay_ns = config->input_delay_ns, - .speed = config->speed, + .freq_mhz = config->freq_mhz, }; + + host_cfg.clock_src_freq = spi_flash_ll_get_source_clock_freq_mhz(host_cfg.host_id); + err = memspi_host_init_pointers(host, &host_cfg); if (err != ESP_OK) { ret = err; @@ -285,7 +301,7 @@ fail: esp_err_t spi_bus_remove_flash_device(esp_flash_t *chip) { - if (chip==NULL) { + if (chip == NULL) { return ESP_ERR_INVALID_ARG; } @@ -334,6 +350,8 @@ esp_err_t esp_flash_init_default_chip(void) } #endif // SOC_SPI_MEM_SUPPORT_TIME_TUNING + cfg.clock_src_freq = spi_flash_ll_get_source_clock_freq_mhz(cfg.host_id); + //the host is already initialized, only do init for the data and load it to the host esp_err_t err = memspi_host_init_pointers(&esp_flash_default_host, &cfg); if (err != ESP_OK) { diff --git a/components/spi_flash/include/esp_flash_spi_init.h b/components/spi_flash/include/esp_flash_spi_init.h index 85334d3ea5..493bd937eb 100644 --- a/components/spi_flash/include/esp_flash_spi_init.h +++ b/components/spi_flash/include/esp_flash_spi_init.h @@ -1,16 +1,8 @@ -// Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +/* + * SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ #pragma once @@ -26,7 +18,7 @@ typedef struct { spi_host_device_t host_id; ///< Bus to use int cs_io_num; ///< GPIO pin to output the CS signal esp_flash_io_mode_t io_mode; ///< IO mode to read from the Flash - esp_flash_speed_t speed; ///< Speed of the Flash clock + enum esp_flash_speed_s speed __attribute__((deprecated)); ///< Speed of the Flash clock. Replaced by freq_mhz int input_delay_ns; ///< Input delay of the data pins, in ns. Set to 0 if unknown. /** * CS line ID, ignored when not `host_id` is not SPI1_HOST, or @@ -34,6 +26,7 @@ typedef struct { * automatically assigned by the SPI bus lock. */ int cs_id; + int freq_mhz; ///< The frequency of flash chip(MHZ) } esp_flash_spi_device_config_t; /** diff --git a/components/spi_flash/spi_flash_timing_tuning.c b/components/spi_flash/spi_flash_timing_tuning.c index 8b2efd1450..277024c969 100644 --- a/components/spi_flash/spi_flash_timing_tuning.c +++ b/components/spi_flash/spi_flash_timing_tuning.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2019-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -493,7 +493,7 @@ bool spi_timing_is_tuned(void) void spi_timing_get_flash_timing_param(spi_flash_hal_timing_config_t *out_timing_config) { // Get clock configuration directly from system. - out_timing_config->clock_config.spimem.val = spi_timing_config_get_flash_clock_reg(); + out_timing_config->clock_config.spimem = spi_timing_config_get_flash_clock_reg(); // Get extra dummy length here. Therefore, no matter what freq, or mode. // If it needs tuning, it will return correct extra dummy len. If no tuning, it will return 0. diff --git a/components/spi_flash/test/test_esp_flash.c b/components/spi_flash/test/test_esp_flash.c index 7307def051..08544fe3ad 100644 --- a/components/spi_flash/test/test_esp_flash.c +++ b/components/spi_flash/test/test_esp_flash.c @@ -36,15 +36,12 @@ #include "esp32c2/rom/cache.h" #endif -#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) -// TODO: SPI_FLASH IDF-4025 - #define FUNC_SPI 1 static uint8_t sector_buf[4096]; #define MAX_ADDR_24BIT 0x1000000 -#define TEST_SPI_SPEED ESP_FLASH_10MHZ +#define TEST_SPI_SPEED 10 #define TEST_SPI_READ_MODE SPI_FLASH_FASTRD // #define FORCE_GPIO_MATRIX @@ -106,7 +103,7 @@ static uint8_t sector_buf[4096]; #define HSPI_PIN_NUM_WP FSPI_PIN_NUM_WP #define HSPI_PIN_NUM_CS FSPI_PIN_NUM_CS -#elif CONFIG_IDF_TARGET_ESP32C3 +#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 #define SPI1_CS_IO 26 //the pin which is usually used by the PSRAM cs #define SPI1_HD_IO 27 //the pin which is usually used by the PSRAM hd #define SPI1_WP_IO 28 //the pin which is usually used by the PSRAM wp @@ -178,7 +175,7 @@ static const char TAG[] = "test_esp_flash"; , \ { \ .io_mode = TEST_SPI_READ_MODE,\ - .speed = TEST_SPI_SPEED, \ + .freq_mhz = TEST_SPI_SPEED, \ .host_id = SPI1_HOST, \ .cs_id = 1, \ /* the pin which is usually used by the PSRAM */ \ @@ -192,7 +189,7 @@ flashtest_config_t config_list[] = { /* current runner doesn't have a flash on HSPI */ // { // .io_mode = TEST_SPI_READ_MODE, - // .speed = TEST_SPI_SPEED, + // .freq_mhz = TEST_SPI_SPEED, // .host_id = HSPI_HOST, // .cs_id = 0, // // uses GPIO matrix on esp32s2 regardless if FORCE_GPIO_MATRIX @@ -201,7 +198,7 @@ flashtest_config_t config_list[] = { // }, { .io_mode = TEST_SPI_READ_MODE, - .speed = TEST_SPI_SPEED, + .freq_mhz = TEST_SPI_SPEED, .host_id = VSPI_HOST, .cs_id = 0, .cs_io_num = VSPI_PIN_NUM_CS, @@ -213,7 +210,7 @@ flashtest_config_t config_list[] = { FLASHTEST_CONFIG_COMMON, { .io_mode = TEST_SPI_READ_MODE, - .speed = TEST_SPI_SPEED, + .freq_mhz = TEST_SPI_SPEED, .host_id = FSPI_HOST, .cs_id = 0, .cs_io_num = FSPI_PIN_NUM_CS, @@ -221,7 +218,7 @@ flashtest_config_t config_list[] = { }, { .io_mode = TEST_SPI_READ_MODE, - .speed = TEST_SPI_SPEED, + .freq_mhz = TEST_SPI_SPEED, .host_id = HSPI_HOST, .cs_id = 0, // uses GPIO matrix on esp32s2 regardless of FORCE_GPIO_MATRIX @@ -238,14 +235,14 @@ flashtest_config_t config_list[] = { }, { .io_mode = TEST_SPI_READ_MODE, - .speed = TEST_SPI_SPEED, + .freq_mhz = TEST_SPI_SPEED, .host_id = SPI2_HOST, .cs_id = 0, .cs_io_num = FSPI_PIN_NUM_CS, .input_delay_ns = 0, }, }; -#elif CONFIG_IDF_TARGET_ESP32C3 +#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 flashtest_config_t config_list[] = { /* No SPI1 CS1 flash on esp32c3 test */ { @@ -254,7 +251,7 @@ flashtest_config_t config_list[] = { }, { .io_mode = TEST_SPI_READ_MODE, - .speed = TEST_SPI_SPEED, + .freq_mhz = TEST_SPI_SPEED, .host_id = SPI2_HOST, .cs_id = 0, .cs_io_num = FSPI_PIN_NUM_CS, @@ -391,7 +388,7 @@ static void setup_new_chip(const flashtest_config_t* test_cfg, esp_flash_t** out esp_flash_spi_device_config_t dev_cfg = { .host_id = test_cfg->host_id, .io_mode = test_cfg->io_mode, - .speed = test_cfg->speed, + .freq_mhz = test_cfg->freq_mhz, .cs_id = test_cfg->cs_id, .cs_io_num = test_cfg->cs_io_num, .input_delay_ns = test_cfg->input_delay_ns, @@ -806,11 +803,15 @@ FLASH_TEST_CASE_IGNORE("Test esp_flash_write can toggle QE bit", test_toggle_qe) FLASH_TEST_CASE_3_IGNORE("Test esp_flash_write can toggle QE bit", test_toggle_qe); #endif //CONFIG_ESPTOOLPY_OCT_FLASH +// This table could be chip specific in the future. +uint8_t flash_frequency_table[6] = {5, 10, 20, 26, 40, 80}; +#define TEST_FLASH_SPEED_MIN 5 void test_permutations_part(const flashtest_config_t* config, esp_partition_t* part, void* source_buf, size_t length) { + int clock_index = 0; if (config->host_id != -1) { - esp_flash_speed_t speed = ESP_FLASH_SPEED_MIN; - while (speed != ESP_FLASH_120MHZ) { + while (clock_index < sizeof(flash_frequency_table)/sizeof(uint8_t)) { + uint8_t speed = flash_frequency_table[clock_index]; //test io_mode in the inner loop to test QE set/clear function, since //the io mode will switch frequently. esp_flash_io_mode_t io_mode = SPI_FLASH_READ_MODE_MIN; @@ -824,7 +825,7 @@ void test_permutations_part(const flashtest_config_t* config, esp_partition_t* p esp_flash_t* chip; flashtest_config_t temp_config = *config; temp_config.io_mode = io_mode; - temp_config.speed = speed; + temp_config.freq_mhz = flash_frequency_table[clock_index]; setup_new_chip(&temp_config, &chip); ESP_LOGI(TAG, "test flash io mode: %d, speed: %d", io_mode, speed); @@ -834,7 +835,7 @@ void test_permutations_part(const flashtest_config_t* config, esp_partition_t* p io_mode++; } - speed++; + clock_index++; } } else { //test main flash @@ -850,7 +851,7 @@ void test_permutations_chip(const flashtest_config_t* config) flashtest_config_t temp_config = *config; // Use the lowest speed to read configs, data and write data to make sure success temp_config.io_mode = SPI_FLASH_READ_MODE_MIN; - temp_config.speed = ESP_FLASH_SPEED_MIN; + temp_config.freq_mhz = TEST_FLASH_SPEED_MIN; setup_new_chip(&temp_config, &chip); //Get size to determine whether to test one extra partition @@ -1232,5 +1233,3 @@ FLASH_TEST_CASE("esp_flash_read large PSRAM buffer low memory", test_flash_read_ #endif - -#endif //#if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32C2) diff --git a/docs/en/migration-guides/peripherals.rst b/docs/en/migration-guides/peripherals.rst index b91439be93..12ab72a558 100644 --- a/docs/en/migration-guides/peripherals.rst +++ b/docs/en/migration-guides/peripherals.rst @@ -17,6 +17,16 @@ Therefore, the common APIs are extracted to ``esp_rom_spiflash.h``. Although it' To make the API clearer, we renamed the function ``esp_rom_spiflash_lock`` to ``esp_rom_spiflash_set_bp``. We renamed ``esp_rom_spiflash_unlock`` to ``esp_rom_spiflash_clear_bp``. +ENUM type ``esp_flash_speed_t`` has been deprecated. From now on, you can directly parse the real clock frequency value to the flash initialization structure. For example, if you want the flash frequency is 80M, you can write the code like: + +.. code:: c + + esp_flash_spi_device_config_t dev_cfg = { + // Other members + .freq_mhz = 80, + // Other members + }; + ADC --- diff --git a/docs/en/migration-guides/system.rst b/docs/en/migration-guides/system.rst index 0a4cf47886..cf8ce31965 100644 --- a/docs/en/migration-guides/system.rst +++ b/docs/en/migration-guides/system.rst @@ -77,3 +77,12 @@ ESP Timer --------- Removed the FRC2 based legacy implementation of esp_timer available on ESP32. The simpler and more efficient implementation based on the LAC timer is now the only option. + +ESP image +--------- + +Rename the image SPI speed enum definition. +- Enum ``ESP_IMAGE_SPI_SPEED_80M`` has been renamed to ``ESP_IMAGE_SPI_SPEED_DIV_1``. +- Enum ``ESP_IMAGE_SPI_SPEED_40M`` has been renamed to ``ESP_IMAGE_SPI_SPEED_DIV_2``. +- Enum ``ESP_IMAGE_SPI_SPEED_26M`` has been renamed to ``ESP_IMAGE_SPI_SPEED_DIV_3``. +- Enum ``ESP_IMAGE_SPI_SPEED_20M`` has been renamed to ``ESP_IMAGE_SPI_SPEED_DIV_4``. diff --git a/examples/storage/ext_flash_fatfs/main/ext_flash_fatfs_example_main.c b/examples/storage/ext_flash_fatfs/main/ext_flash_fatfs_example_main.c index f7995626d4..9a87d453bf 100644 --- a/examples/storage/ext_flash_fatfs/main/ext_flash_fatfs_example_main.c +++ b/examples/storage/ext_flash_fatfs/main/ext_flash_fatfs_example_main.c @@ -21,6 +21,9 @@ #include "esp_system.h" #include "soc/spi_pins.h" +// h2 and c2 will not support external flash +#define EXAMPLE_FLASH_FREQ_MHZ 40 + static const char *TAG = "example"; // Handle of the wear levelling library instance @@ -104,7 +107,7 @@ static esp_flash_t* example_init_ext_flash(void) .cs_id = 0, .cs_io_num = VSPI_IOMUX_PIN_NUM_CS, .io_mode = SPI_FLASH_DIO, - .speed = ESP_FLASH_40MHZ, + .freq_mhz = EXAMPLE_FLASH_FREQ_MHZ, }; ESP_LOGI(TAG, "Initializing external SPI Flash"); diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index de55228d38..9b73b0846a 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -808,7 +808,6 @@ components/hal/esp32/interrupt_descriptor_table.c components/hal/esp32c3/hmac_hal.c components/hal/esp32c3/include/hal/aes_ll.h components/hal/esp32c3/include/hal/ds_ll.h -components/hal/esp32c3/include/hal/gpspi_flash_ll.h components/hal/esp32c3/include/hal/hmac_hal.h components/hal/esp32c3/include/hal/hmac_ll.h components/hal/esp32c3/include/hal/i2c_ll.h @@ -819,8 +818,6 @@ components/hal/esp32c3/include/hal/sha_ll.h components/hal/esp32c3/include/hal/sigmadelta_ll.h components/hal/esp32c3/include/hal/soc_ll.h components/hal/esp32c3/include/hal/spi_flash_encrypted_ll.h -components/hal/esp32c3/include/hal/spi_flash_ll.h -components/hal/esp32c3/include/hal/spimem_flash_ll.h components/hal/esp32c3/include/hal/systimer_ll.h components/hal/esp32c3/include/hal/uhci_ll.h components/hal/esp32c3/include/hal/usb_serial_jtag_ll.h @@ -828,7 +825,6 @@ components/hal/esp32c3/rtc_cntl_hal.c components/hal/esp32h2/hmac_hal.c components/hal/esp32h2/include/hal/aes_ll.h components/hal/esp32h2/include/hal/ds_ll.h -components/hal/esp32h2/include/hal/gpspi_flash_ll.h components/hal/esp32h2/include/hal/hmac_hal.h components/hal/esp32h2/include/hal/hmac_ll.h components/hal/esp32h2/include/hal/interrupt_controller_ll.h @@ -838,8 +834,6 @@ components/hal/esp32h2/include/hal/sha_ll.h components/hal/esp32h2/include/hal/sigmadelta_ll.h components/hal/esp32h2/include/hal/soc_ll.h components/hal/esp32h2/include/hal/spi_flash_encrypted_ll.h -components/hal/esp32h2/include/hal/spi_flash_ll.h -components/hal/esp32h2/include/hal/spimem_flash_ll.h components/hal/esp32h2/include/hal/uhci_ll.h components/hal/esp32h2/include/hal/uhci_types.h components/hal/esp32h2/include/hal/usb_serial_jtag_ll.h @@ -851,7 +845,6 @@ components/hal/esp32s2/include/hal/crypto_dma_ll.h components/hal/esp32s2/include/hal/dac_hal.h components/hal/esp32s2/include/hal/dac_ll.h components/hal/esp32s2/include/hal/dedic_gpio_ll.h -components/hal/esp32s2/include/hal/gpspi_flash_ll.h components/hal/esp32s2/include/hal/i2c_ll.h components/hal/esp32s2/include/hal/interrupt_controller_ll.h components/hal/esp32s2/include/hal/memprot_ll.h @@ -863,8 +856,6 @@ components/hal/esp32s2/include/hal/sha_ll.h components/hal/esp32s2/include/hal/sigmadelta_ll.h components/hal/esp32s2/include/hal/soc_ll.h components/hal/esp32s2/include/hal/spi_flash_encrypted_ll.h -components/hal/esp32s2/include/hal/spi_flash_ll.h -components/hal/esp32s2/include/hal/spimem_flash_ll.h components/hal/esp32s2/include/hal/systimer_ll.h components/hal/esp32s2/include/hal/touch_sensor_hal.h components/hal/esp32s2/include/hal/touch_sensor_ll.h @@ -873,7 +864,6 @@ components/hal/esp32s2/include/hal/usb_ll.h components/hal/esp32s2/interrupt_descriptor_table.c components/hal/esp32s2/touch_sensor_hal.c components/hal/esp32s3/include/hal/aes_ll.h -components/hal/esp32s3/include/hal/gpspi_flash_ll.h components/hal/esp32s3/include/hal/i2c_ll.h components/hal/esp32s3/include/hal/interrupt_controller_ll.h components/hal/esp32s3/include/hal/memprot_ll.h @@ -884,8 +874,6 @@ components/hal/esp32s3/include/hal/sha_ll.h components/hal/esp32s3/include/hal/sigmadelta_ll.h components/hal/esp32s3/include/hal/soc_ll.h components/hal/esp32s3/include/hal/spi_flash_encrypted_ll.h -components/hal/esp32s3/include/hal/spi_flash_ll.h -components/hal/esp32s3/include/hal/spimem_flash_ll.h components/hal/esp32s3/include/hal/systimer_ll.h components/hal/esp32s3/include/hal/uhci_ll.h components/hal/esp32s3/include/hal/usb_ll.h @@ -1595,7 +1583,6 @@ components/soc/lldesc.c components/soc/soc_include_legacy_warn.c components/spi_flash/cache_utils.h components/spi_flash/include/esp_flash.h -components/spi_flash/include/esp_flash_spi_init.h components/spi_flash/include/esp_spi_flash.h components/spi_flash/include/esp_spi_flash_counters.h components/spi_flash/include/memspi_host_driver.h