mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
bugfix(flash): add flash config in app startup
We fixed some flash bugs in bootloader, but for the users used the old vrsion bootloader, they can not fix these bugs via OTA, the solution is add these updates in app startup. These updates include: 1. SPI flash gpio matrix and drive strength configuration 2. SPI flash clock configuration 3. SPI flash read dummy configuration 4. SPI flash cs timing configuration 5. Update flash id of g_rom_flashchip
This commit is contained in:
parent
7648859a27
commit
7904cae9c1
@ -1,6 +1,7 @@
|
|||||||
set(COMPONENT_SRCS "src/bootloader_clock.c"
|
set(COMPONENT_SRCS "src/bootloader_clock.c"
|
||||||
"src/bootloader_common.c"
|
"src/bootloader_common.c"
|
||||||
"src/bootloader_flash.c"
|
"src/bootloader_flash.c"
|
||||||
|
"src/bootloader_flash_config.c"
|
||||||
"src/bootloader_random.c"
|
"src/bootloader_random.c"
|
||||||
"src/bootloader_sha.c"
|
"src/bootloader_sha.c"
|
||||||
"src/bootloader_utility.c"
|
"src/bootloader_utility.c"
|
||||||
|
@ -68,11 +68,3 @@ bool bootloader_common_erase_part_type_data(const char *list_erase, bool ota_dat
|
|||||||
* @return Returns true if the list contains the label, false otherwise.
|
* @return Returns true if the list contains the label, false otherwise.
|
||||||
*/
|
*/
|
||||||
bool bootloader_common_label_search(const char *list, char *label);
|
bool bootloader_common_label_search(const char *list, char *label);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set the flash CS setup and hold time.
|
|
||||||
*
|
|
||||||
* CS setup time is recomemded to be 1.5T, and CS hold time is recommended to be 2.5T.
|
|
||||||
* cs_setup = 1, cs_setup_time = 0; cs_hold = 1, cs_hold_time = 1
|
|
||||||
*/
|
|
||||||
void bootloader_common_set_flash_cs_timing();
|
|
||||||
|
@ -0,0 +1,71 @@
|
|||||||
|
// Copyright 2018 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.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "esp_image_format.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Update the flash id in g_rom_flashchip(global esp_rom_spiflash_chip_t structure).
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*/
|
||||||
|
void bootloader_flash_update_id();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set the flash CS setup and hold time.
|
||||||
|
*
|
||||||
|
* @note CS setup time is recomemded to be 1.5T, and CS hold time is recommended to be 2.5T.
|
||||||
|
* cs_setup = 1, cs_setup_time = 0; cs_hold = 1, cs_hold_time = 1.
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*/
|
||||||
|
void bootloader_flash_cs_timing_config();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configure SPI flash clock.
|
||||||
|
*
|
||||||
|
* @note This function only set clock frequency for SPI0.
|
||||||
|
*
|
||||||
|
* @param pfhdr Pointer to App image header, from where to fetch flash settings.
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*/
|
||||||
|
void bootloader_flash_clock_config(const esp_image_header_t* pfhdr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configure SPI flash gpio, include the IO matrix and drive strength configuration.
|
||||||
|
*
|
||||||
|
* @param pfhdr Pointer to App image header, from where to fetch flash settings.
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*/
|
||||||
|
void bootloader_flash_gpio_config(const esp_image_header_t* pfhdr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Configure SPI flash read dummy based on different mode and frequency.
|
||||||
|
*
|
||||||
|
* @param pfhdr Pointer to App image header, from where to fetch flash settings.
|
||||||
|
*
|
||||||
|
* @return None
|
||||||
|
*/
|
||||||
|
void bootloader_flash_dummy_config(const esp_image_header_t* pfhdr);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
@ -146,13 +146,3 @@ bool bootloader_common_erase_part_type_data(const char *list_erase, bool ota_dat
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bootloader_common_set_flash_cs_timing()
|
|
||||||
{
|
|
||||||
SET_PERI_REG_MASK(SPI_USER_REG(0), SPI_CS_HOLD_M | SPI_CS_SETUP_M);
|
|
||||||
SET_PERI_REG_BITS(SPI_CTRL2_REG(0), SPI_HOLD_TIME_V, 1, SPI_HOLD_TIME_S);
|
|
||||||
SET_PERI_REG_BITS(SPI_CTRL2_REG(0), SPI_SETUP_TIME_V, 0, SPI_SETUP_TIME_S);
|
|
||||||
SET_PERI_REG_MASK(SPI_USER_REG(1), SPI_CS_HOLD_M | SPI_CS_SETUP_M);
|
|
||||||
SET_PERI_REG_BITS(SPI_CTRL2_REG(1), SPI_HOLD_TIME_V, 1, SPI_HOLD_TIME_S);
|
|
||||||
SET_PERI_REG_BITS(SPI_CTRL2_REG(1), SPI_SETUP_TIME_V, 0, SPI_SETUP_TIME_S);
|
|
||||||
}
|
|
||||||
|
165
components/bootloader_support/src/bootloader_flash_config.c
Normal file
165
components/bootloader_support/src/bootloader_flash_config.c
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
// Copyright 2018 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.
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include "string.h"
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#include "esp_err.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "rom/gpio.h"
|
||||||
|
#include "rom/spi_flash.h"
|
||||||
|
#include "rom/efuse.h"
|
||||||
|
#include "soc/gpio_periph.h"
|
||||||
|
#include "soc/efuse_reg.h"
|
||||||
|
#include "soc/spi_reg.h"
|
||||||
|
#include "soc/spi_pins.h"
|
||||||
|
#include "flash_qio_mode.h"
|
||||||
|
#include "bootloader_flash_config.h"
|
||||||
|
|
||||||
|
void bootloader_flash_update_id()
|
||||||
|
{
|
||||||
|
g_rom_flashchip.device_id = bootloader_read_flash_id();
|
||||||
|
}
|
||||||
|
|
||||||
|
void IRAM_ATTR bootloader_flash_cs_timing_config()
|
||||||
|
{
|
||||||
|
SET_PERI_REG_MASK(SPI_USER_REG(0), SPI_CS_HOLD_M | SPI_CS_SETUP_M);
|
||||||
|
SET_PERI_REG_BITS(SPI_CTRL2_REG(0), SPI_HOLD_TIME_V, 1, SPI_HOLD_TIME_S);
|
||||||
|
SET_PERI_REG_BITS(SPI_CTRL2_REG(0), SPI_SETUP_TIME_V, 0, SPI_SETUP_TIME_S);
|
||||||
|
SET_PERI_REG_MASK(SPI_USER_REG(1), SPI_CS_HOLD_M | SPI_CS_SETUP_M);
|
||||||
|
SET_PERI_REG_BITS(SPI_CTRL2_REG(1), SPI_HOLD_TIME_V, 1, SPI_HOLD_TIME_S);
|
||||||
|
SET_PERI_REG_BITS(SPI_CTRL2_REG(1), SPI_SETUP_TIME_V, 0, SPI_SETUP_TIME_S);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
esp_rom_spiflash_config_clk(spi_clk_div, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
drv = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t chip_ver = REG_GET_FIELD(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_PKG);
|
||||||
|
uint32_t pkg_ver = chip_ver & 0x7;
|
||||||
|
|
||||||
|
if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5) {
|
||||||
|
// For ESP32D2WD the SPI pins are already configured
|
||||||
|
// flash clock signal should come from IO MUX.
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
|
||||||
|
} else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2) {
|
||||||
|
// For ESP32PICOD2 the SPI pins are already configured
|
||||||
|
// flash clock signal should come from IO MUX.
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
|
||||||
|
} else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4) {
|
||||||
|
// For ESP32PICOD4 the SPI pins are already configured
|
||||||
|
// flash clock signal should come from IO MUX.
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
|
||||||
|
} else {
|
||||||
|
const uint32_t spiconfig = ets_efuse_get_spiconfig();
|
||||||
|
if (spiconfig == EFUSE_SPICONFIG_SPI_DEFAULTS) {
|
||||||
|
gpio_matrix_out(SPI_IOMUX_PIN_NUM_CS, SPICS0_OUT_IDX, 0, 0);
|
||||||
|
gpio_matrix_out(SPI_IOMUX_PIN_NUM_MISO, SPIQ_OUT_IDX, 0, 0);
|
||||||
|
gpio_matrix_in(SPI_IOMUX_PIN_NUM_MISO, SPIQ_IN_IDX, 0);
|
||||||
|
gpio_matrix_out(SPI_IOMUX_PIN_NUM_MOSI, SPID_OUT_IDX, 0, 0);
|
||||||
|
gpio_matrix_in(SPI_IOMUX_PIN_NUM_MOSI, SPID_IN_IDX, 0);
|
||||||
|
gpio_matrix_out(SPI_IOMUX_PIN_NUM_WP, SPIWP_OUT_IDX, 0, 0);
|
||||||
|
gpio_matrix_in(SPI_IOMUX_PIN_NUM_WP, SPIWP_IN_IDX, 0);
|
||||||
|
gpio_matrix_out(SPI_IOMUX_PIN_NUM_HD, SPIHD_OUT_IDX, 0, 0);
|
||||||
|
gpio_matrix_in(SPI_IOMUX_PIN_NUM_HD, SPIHD_IN_IDX, 0);
|
||||||
|
//select pin function gpio
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, PIN_FUNC_GPIO);
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, PIN_FUNC_GPIO);
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA2_U, PIN_FUNC_GPIO);
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA3_U, PIN_FUNC_GPIO);
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, PIN_FUNC_GPIO);
|
||||||
|
// flash clock signal should come from IO MUX.
|
||||||
|
// set drive ability for clock
|
||||||
|
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
|
||||||
|
|
||||||
|
uint32_t flash_id = g_rom_flashchip.device_id;
|
||||||
|
if (flash_id == FLASH_ID_GD25LQ32C) {
|
||||||
|
// Set drive ability for 1.8v flash in 80Mhz.
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA0_U, FUN_DRV, 3, FUN_DRV_S);
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA1_U, FUN_DRV, 3, FUN_DRV_S);
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA2_U, FUN_DRV, 3, FUN_DRV_S);
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA3_U, FUN_DRV, 3, FUN_DRV_S);
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CMD_U, FUN_DRV, 3, FUN_DRV_S);
|
||||||
|
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, 3, FUN_DRV_S);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IRAM_ATTR bootloader_flash_dummy_config(const esp_image_header_t* pfhdr)
|
||||||
|
{
|
||||||
|
int spi_cache_dummy = 0;
|
||||||
|
uint32_t modebit = READ_PERI_REG(SPI_CTRL_REG(0));
|
||||||
|
if (modebit & SPI_FASTRD_MODE) {
|
||||||
|
if (modebit & SPI_FREAD_QIO) { //SPI mode is QIO
|
||||||
|
spi_cache_dummy = SPI0_R_QIO_DUMMY_CYCLELEN;
|
||||||
|
} else if (modebit & SPI_FREAD_DIO) { //SPI mode is DIO
|
||||||
|
spi_cache_dummy = SPI0_R_DIO_DUMMY_CYCLELEN;
|
||||||
|
SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN_V, SPI0_R_DIO_ADDR_BITSLEN, SPI_USR_ADDR_BITLEN_S);
|
||||||
|
} else if(modebit & (SPI_FREAD_QUAD | SPI_FREAD_DUAL)) { //SPI mode is QOUT or DIO
|
||||||
|
spi_cache_dummy = SPI0_R_FAST_DUMMY_CYCLELEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern uint8_t g_rom_spiflash_dummy_len_plus[];
|
||||||
|
switch (pfhdr->spi_speed) {
|
||||||
|
case ESP_IMAGE_SPI_SPEED_80M:
|
||||||
|
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:
|
||||||
|
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:
|
||||||
|
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;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN_V, spi_cache_dummy + g_rom_spiflash_dummy_len_plus[0],
|
||||||
|
SPI_USR_DUMMY_CYCLELEN_S);
|
||||||
|
}
|
@ -48,6 +48,7 @@
|
|||||||
#include "bootloader_config.h"
|
#include "bootloader_config.h"
|
||||||
#include "bootloader_clock.h"
|
#include "bootloader_clock.h"
|
||||||
#include "bootloader_common.h"
|
#include "bootloader_common.h"
|
||||||
|
#include "bootloader_flash_config.h"
|
||||||
|
|
||||||
#include "flash_qio_mode.h"
|
#include "flash_qio_mode.h"
|
||||||
|
|
||||||
@ -62,7 +63,7 @@ static esp_err_t bootloader_main();
|
|||||||
static void print_flash_info(const esp_image_header_t* pfhdr);
|
static void print_flash_info(const esp_image_header_t* pfhdr);
|
||||||
static void update_flash_config(const esp_image_header_t* pfhdr);
|
static void update_flash_config(const esp_image_header_t* pfhdr);
|
||||||
static void vddsdio_configure();
|
static void vddsdio_configure();
|
||||||
static void flash_gpio_configure(const esp_image_header_t* pfhdr);
|
static void bootloader_init_flash_configure(const esp_image_header_t* pfhdr);
|
||||||
static void uart_console_configure(void);
|
static void uart_console_configure(void);
|
||||||
static void wdt_reset_check(void);
|
static void wdt_reset_check(void);
|
||||||
|
|
||||||
@ -125,7 +126,7 @@ static esp_err_t bootloader_main()
|
|||||||
ESP_LOGE(TAG, "failed to load bootloader header!");
|
ESP_LOGE(TAG, "failed to load bootloader header!");
|
||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
}
|
}
|
||||||
flash_gpio_configure(&fhdr);
|
bootloader_init_flash_configure(&fhdr);
|
||||||
#if (CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ == 240)
|
#if (CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ == 240)
|
||||||
//Check if ESP32 is rated for a CPU frequency of 160MHz only
|
//Check if ESP32 is rated for a CPU frequency of 160MHz only
|
||||||
if (REG_GET_BIT(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_CPU_FREQ_RATED) &&
|
if (REG_GET_BIT(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_CPU_FREQ_RATED) &&
|
||||||
@ -287,121 +288,15 @@ static void vddsdio_configure()
|
|||||||
#endif // CONFIG_BOOTLOADER_VDDSDIO_BOOST
|
#endif // CONFIG_BOOTLOADER_VDDSDIO_BOOST
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FLASH_CLK_IO 6
|
|
||||||
#define FLASH_CS_IO 11
|
|
||||||
#define FLASH_SPIQ_IO 7
|
|
||||||
#define FLASH_SPID_IO 8
|
|
||||||
#define FLASH_SPIWP_IO 10
|
|
||||||
#define FLASH_SPIHD_IO 9
|
|
||||||
#define FLASH_IO_MATRIX_DUMMY_40M 1
|
|
||||||
#define FLASH_IO_MATRIX_DUMMY_80M 2
|
|
||||||
#define FLASH_IO_DRIVE_GD_WITH_1V8PSRAM 3
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bootloader reads SPI configuration from bin header, so that
|
* Bootloader reads SPI configuration from bin header, so that
|
||||||
* the burning configuration can be different with compiling configuration.
|
* the burning configuration can be different with compiling configuration.
|
||||||
*/
|
*/
|
||||||
static void IRAM_ATTR flash_gpio_configure(const esp_image_header_t* pfhdr)
|
static void IRAM_ATTR bootloader_init_flash_configure(const esp_image_header_t* pfhdr)
|
||||||
{
|
{
|
||||||
int spi_cache_dummy = 0;
|
bootloader_flash_gpio_config(pfhdr);
|
||||||
int drv = 2;
|
bootloader_flash_dummy_config(pfhdr);
|
||||||
switch (pfhdr->spi_mode) {
|
bootloader_flash_cs_timing_config();
|
||||||
case ESP_IMAGE_SPI_MODE_QIO:
|
|
||||||
spi_cache_dummy = SPI0_R_QIO_DUMMY_CYCLELEN;
|
|
||||||
break;
|
|
||||||
case ESP_IMAGE_SPI_MODE_DIO:
|
|
||||||
spi_cache_dummy = SPI0_R_DIO_DUMMY_CYCLELEN;
|
|
||||||
SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_ADDR_BITLEN_V, SPI0_R_DIO_ADDR_BITSLEN, SPI_USR_ADDR_BITLEN_S);
|
|
||||||
break;
|
|
||||||
case ESP_IMAGE_SPI_MODE_QOUT:
|
|
||||||
case ESP_IMAGE_SPI_MODE_DOUT:
|
|
||||||
default:
|
|
||||||
spi_cache_dummy = SPI0_R_FAST_DUMMY_CYCLELEN;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* dummy_len_plus values defined in ROM for SPI flash configuration */
|
|
||||||
extern uint8_t g_rom_spiflash_dummy_len_plus[];
|
|
||||||
switch (pfhdr->spi_speed) {
|
|
||||||
case ESP_IMAGE_SPI_SPEED_80M:
|
|
||||||
g_rom_spiflash_dummy_len_plus[0] = FLASH_IO_MATRIX_DUMMY_80M;
|
|
||||||
g_rom_spiflash_dummy_len_plus[1] = FLASH_IO_MATRIX_DUMMY_80M;
|
|
||||||
SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN_V, spi_cache_dummy + FLASH_IO_MATRIX_DUMMY_80M,
|
|
||||||
SPI_USR_DUMMY_CYCLELEN_S); //DUMMY
|
|
||||||
drv = 3;
|
|
||||||
break;
|
|
||||||
case ESP_IMAGE_SPI_SPEED_40M:
|
|
||||||
g_rom_spiflash_dummy_len_plus[0] = FLASH_IO_MATRIX_DUMMY_40M;
|
|
||||||
g_rom_spiflash_dummy_len_plus[1] = FLASH_IO_MATRIX_DUMMY_40M;
|
|
||||||
SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN_V, spi_cache_dummy + FLASH_IO_MATRIX_DUMMY_40M,
|
|
||||||
SPI_USR_DUMMY_CYCLELEN_S); //DUMMY
|
|
||||||
break;
|
|
||||||
case ESP_IMAGE_SPI_SPEED_26M:
|
|
||||||
case ESP_IMAGE_SPI_SPEED_20M:
|
|
||||||
SET_PERI_REG_BITS(SPI_USER1_REG(0), SPI_USR_DUMMY_CYCLELEN_V, spi_cache_dummy, SPI_USR_DUMMY_CYCLELEN_S); //DUMMY
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t chip_ver = REG_GET_FIELD(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_PKG);
|
|
||||||
uint32_t pkg_ver = chip_ver & 0x7;
|
|
||||||
|
|
||||||
if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5) {
|
|
||||||
// For ESP32D2WD the SPI pins are already configured
|
|
||||||
// flash clock signal should come from IO MUX.
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
|
|
||||||
} else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2) {
|
|
||||||
// For ESP32PICOD2 the SPI pins are already configured
|
|
||||||
// flash clock signal should come from IO MUX.
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
|
|
||||||
} else if (pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4) {
|
|
||||||
// For ESP32PICOD4 the SPI pins are already configured
|
|
||||||
// flash clock signal should come from IO MUX.
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
|
|
||||||
} else {
|
|
||||||
const uint32_t spiconfig = ets_efuse_get_spiconfig();
|
|
||||||
if (spiconfig == EFUSE_SPICONFIG_SPI_DEFAULTS) {
|
|
||||||
gpio_matrix_out(FLASH_CS_IO, SPICS0_OUT_IDX, 0, 0);
|
|
||||||
gpio_matrix_out(FLASH_SPIQ_IO, SPIQ_OUT_IDX, 0, 0);
|
|
||||||
gpio_matrix_in(FLASH_SPIQ_IO, SPIQ_IN_IDX, 0);
|
|
||||||
gpio_matrix_out(FLASH_SPID_IO, SPID_OUT_IDX, 0, 0);
|
|
||||||
gpio_matrix_in(FLASH_SPID_IO, SPID_IN_IDX, 0);
|
|
||||||
gpio_matrix_out(FLASH_SPIWP_IO, SPIWP_OUT_IDX, 0, 0);
|
|
||||||
gpio_matrix_in(FLASH_SPIWP_IO, SPIWP_IN_IDX, 0);
|
|
||||||
gpio_matrix_out(FLASH_SPIHD_IO, SPIHD_OUT_IDX, 0, 0);
|
|
||||||
gpio_matrix_in(FLASH_SPIHD_IO, SPIHD_IN_IDX, 0);
|
|
||||||
//select pin function gpio
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA0_U, PIN_FUNC_GPIO);
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA1_U, PIN_FUNC_GPIO);
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA2_U, PIN_FUNC_GPIO);
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_DATA3_U, PIN_FUNC_GPIO);
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CMD_U, PIN_FUNC_GPIO);
|
|
||||||
// flash clock signal should come from IO MUX.
|
|
||||||
// set drive ability for clock
|
|
||||||
PIN_FUNC_SELECT(PERIPHS_IO_MUX_SD_CLK_U, FUNC_SD_CLK_SPICLK);
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, drv, FUN_DRV_S);
|
|
||||||
|
|
||||||
#if CONFIG_SPIRAM_TYPE_ESPPSRAM32
|
|
||||||
uint32_t flash_id = g_rom_flashchip.device_id;
|
|
||||||
if (flash_id == FLASH_ID_GD25LQ32C) {
|
|
||||||
// Set drive ability for 1.8v flash in 80Mhz.
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA0_U, FUN_DRV, 3, FUN_DRV_S);
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA1_U, FUN_DRV, 3, FUN_DRV_S);
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA2_U, FUN_DRV, 3, FUN_DRV_S);
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_DATA3_U, FUN_DRV, 3, FUN_DRV_S);
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CMD_U, FUN_DRV, 3, FUN_DRV_S);
|
|
||||||
SET_PERI_REG_BITS(PERIPHS_IO_MUX_SD_CLK_U, FUN_DRV, 3, FUN_DRV_S);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// improve the flash cs timing.
|
|
||||||
bootloader_common_set_flash_cs_timing();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void uart_console_configure(void)
|
static void uart_console_configure(void)
|
||||||
|
@ -63,7 +63,7 @@ else()
|
|||||||
# driver is a public requirement because esp_sleep.h uses gpio_num_t & touch_pad_t
|
# driver is a public requirement because esp_sleep.h uses gpio_num_t & touch_pad_t
|
||||||
# tcpip_adapter is a public requirement because esp_event.h uses tcpip_adapter types
|
# tcpip_adapter is a public requirement because esp_event.h uses tcpip_adapter types
|
||||||
set(COMPONENT_PRIV_REQUIRES
|
set(COMPONENT_PRIV_REQUIRES
|
||||||
app_trace bootloader_support ethernet log mbedtls nvs_flash
|
app_trace app_update bootloader_support ethernet log mbedtls nvs_flash
|
||||||
pthread smartconfig_ack spi_flash vfs wpa_supplicant xtensa-debug-module)
|
pthread smartconfig_ack spi_flash vfs wpa_supplicant xtensa-debug-module)
|
||||||
|
|
||||||
register_component()
|
register_component()
|
||||||
|
@ -71,7 +71,8 @@
|
|||||||
#include "esp_flash_encrypt.h"
|
#include "esp_flash_encrypt.h"
|
||||||
#include "pm_impl.h"
|
#include "pm_impl.h"
|
||||||
#include "trax.h"
|
#include "trax.h"
|
||||||
#include "bootloader_common.h"
|
#include "esp_ota_ops.h"
|
||||||
|
#include "bootloader_flash_config.h"
|
||||||
|
|
||||||
#define STRINGIFY(s) STRINGIFY2(s)
|
#define STRINGIFY(s) STRINGIFY2(s)
|
||||||
#define STRINGIFY2(s) #s
|
#define STRINGIFY2(s) #s
|
||||||
@ -162,8 +163,6 @@ void IRAM_ATTR call_start_cpu0()
|
|||||||
abort();
|
abort();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
# else // If psram is uninitialized, we need to improve the flash cs timing.
|
|
||||||
bootloader_common_set_flash_cs_timing();
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ESP_EARLY_LOGI(TAG, "Pro cpu up.");
|
ESP_EARLY_LOGI(TAG, "Pro cpu up.");
|
||||||
@ -389,6 +388,17 @@ void start_cpu0_default(void)
|
|||||||
esp_core_dump_init();
|
esp_core_dump_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bootloader_flash_update_id();
|
||||||
|
#if !CONFIG_SPIRAM_BOOT_INIT // If psram is uninitialized, we need to improve some flash configuration.
|
||||||
|
esp_image_header_t fhdr;
|
||||||
|
const esp_partition_t *partition = esp_ota_get_running_partition();
|
||||||
|
spi_flash_read(partition->address, &fhdr, sizeof(esp_image_header_t));
|
||||||
|
bootloader_flash_clock_config(&fhdr);
|
||||||
|
bootloader_flash_gpio_config(&fhdr);
|
||||||
|
bootloader_flash_dummy_config(&fhdr);
|
||||||
|
bootloader_flash_cs_timing_config();
|
||||||
|
#endif
|
||||||
|
|
||||||
portBASE_TYPE res = xTaskCreatePinnedToCore(&main_task, "main",
|
portBASE_TYPE res = xTaskCreatePinnedToCore(&main_task, "main",
|
||||||
ESP_TASK_MAIN_STACK, NULL,
|
ESP_TASK_MAIN_STACK, NULL,
|
||||||
ESP_TASK_MAIN_PRIO, NULL, 0);
|
ESP_TASK_MAIN_PRIO, NULL, 0);
|
||||||
|
@ -118,6 +118,11 @@ extern "C" {
|
|||||||
#define ESP_ROM_SPIFLASH_WR_PROTECT (ESP_ROM_SPIFLASH_BP0|ESP_ROM_SPIFLASH_BP1|ESP_ROM_SPIFLASH_BP2)
|
#define ESP_ROM_SPIFLASH_WR_PROTECT (ESP_ROM_SPIFLASH_BP0|ESP_ROM_SPIFLASH_BP1|ESP_ROM_SPIFLASH_BP2)
|
||||||
#define ESP_ROM_SPIFLASH_QE BIT9
|
#define ESP_ROM_SPIFLASH_QE BIT9
|
||||||
|
|
||||||
|
//Extra dummy for flash read
|
||||||
|
#define ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_20M 0
|
||||||
|
#define ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_40M 1
|
||||||
|
#define ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_80M 2
|
||||||
|
|
||||||
#define FLASH_ID_GD25LQ32C 0xC86016
|
#define FLASH_ID_GD25LQ32C 0xC86016
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -90,8 +90,8 @@ typedef enum {
|
|||||||
|
|
||||||
#define PSRAM_INTERNAL_IO_28 28
|
#define PSRAM_INTERNAL_IO_28 28
|
||||||
#define PSRAM_INTERNAL_IO_29 29
|
#define PSRAM_INTERNAL_IO_29 29
|
||||||
#define PSRAM_IO_MATRIX_DUMMY_40M 1
|
#define PSRAM_IO_MATRIX_DUMMY_40M ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_40M
|
||||||
#define PSRAM_IO_MATRIX_DUMMY_80M 2
|
#define PSRAM_IO_MATRIX_DUMMY_80M ESP_ROM_SPIFLASH_DUMMY_LEN_PLUS_80M
|
||||||
|
|
||||||
#define _SPI_CACHE_PORT 0
|
#define _SPI_CACHE_PORT 0
|
||||||
#define _SPI_FLASH_PORT 1
|
#define _SPI_FLASH_PORT 1
|
||||||
|
Loading…
Reference in New Issue
Block a user