mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'feature/efuse_rst_is_treated_as_poweron_rst' into 'master'
reset_reasons: EFUSE_RST is treated as POWERON_RST + checks errors of eFuse BLOCK0 Closes IDF-3702 See merge request espressif/esp-idf!14742
This commit is contained in:
commit
7d942e0a5d
@ -256,7 +256,11 @@ esp_err_t bootloader_load_image(const esp_partition_pos_t *part, esp_image_metad
|
||||
#if CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS
|
||||
mode = ESP_IMAGE_LOAD_NO_VALIDATE;
|
||||
#elif CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON
|
||||
if (esp_rom_get_reset_reason(0) == RESET_REASON_CHIP_POWER_ON) {
|
||||
if (esp_rom_get_reset_reason(0) == RESET_REASON_CHIP_POWER_ON
|
||||
#if SOC_EFUSE_HAS_EFUSE_RST_BUG
|
||||
|| esp_rom_get_reset_reason(0) == RESET_REASON_CORE_EFUSE_CRC
|
||||
#endif
|
||||
) {
|
||||
mode = ESP_IMAGE_LOAD_NO_VALIDATE;
|
||||
}
|
||||
#endif // CONFIG_BOOTLOADER_SKIP_...
|
||||
|
@ -63,6 +63,11 @@ void esp_efuse_utility_clear_program_registers(void)
|
||||
efuse_hal_clear_program_registers();
|
||||
}
|
||||
|
||||
esp_err_t esp_efuse_utility_check_errors(void)
|
||||
{
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
// Burn values written to the efuse write registers
|
||||
esp_err_t esp_efuse_utility_burn_chip(void)
|
||||
{
|
||||
|
@ -54,6 +54,11 @@ void esp_efuse_utility_clear_program_registers(void)
|
||||
ets_efuse_clear_program_registers();
|
||||
}
|
||||
|
||||
esp_err_t esp_efuse_utility_check_errors(void)
|
||||
{
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
// Burn values written to the efuse write registers
|
||||
esp_err_t esp_efuse_utility_burn_chip(void)
|
||||
{
|
||||
|
@ -68,6 +68,26 @@ void esp_efuse_utility_clear_program_registers(void)
|
||||
efuse_hal_clear_program_registers();
|
||||
}
|
||||
|
||||
esp_err_t esp_efuse_utility_check_errors(void)
|
||||
{
|
||||
if (efuse_ll_get_err_rst_enable()) {
|
||||
for (unsigned i = 0; i < 5; i++) {
|
||||
uint32_t error_reg = REG_READ(EFUSE_RD_REPEAT_ERR0_REG + i * 4);
|
||||
if (error_reg) {
|
||||
uint32_t data_reg = REG_READ(EFUSE_RD_REPEAT_DATA0_REG + i * 4);
|
||||
if (error_reg & data_reg) {
|
||||
// For 0001 situation (4x coding scheme):
|
||||
// an error bit points that data bit is wrong in case the data bit equals 1. (need to reboot in this case).
|
||||
ESP_EARLY_LOGE(TAG, "Error in EFUSE_RD_REPEAT_DATA%d_REG of BLOCK0 (error_reg=0x%08x, data_reg=0x%08x). Need to reboot", i, error_reg, data_reg);
|
||||
efuse_hal_read();
|
||||
return ESP_FAIL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
// Burn values written to the efuse write registers
|
||||
esp_err_t esp_efuse_utility_burn_chip(void)
|
||||
{
|
||||
|
@ -68,6 +68,11 @@ void esp_efuse_utility_clear_program_registers(void)
|
||||
efuse_hal_clear_program_registers();
|
||||
}
|
||||
|
||||
esp_err_t esp_efuse_utility_check_errors(void)
|
||||
{
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
// Burn values written to the efuse write registers
|
||||
esp_err_t esp_efuse_utility_burn_chip(void)
|
||||
{
|
||||
|
@ -68,6 +68,11 @@ void esp_efuse_utility_clear_program_registers(void)
|
||||
efuse_hal_clear_program_registers();
|
||||
}
|
||||
|
||||
esp_err_t esp_efuse_utility_check_errors(void)
|
||||
{
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
// Burn values written to the efuse write registers
|
||||
esp_err_t esp_efuse_utility_burn_chip(void)
|
||||
{
|
||||
|
@ -68,6 +68,11 @@ void esp_efuse_utility_clear_program_registers(void)
|
||||
efuse_hal_clear_program_registers();
|
||||
}
|
||||
|
||||
esp_err_t esp_efuse_utility_check_errors(void)
|
||||
{
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
// Burn values written to the efuse write registers
|
||||
esp_err_t esp_efuse_utility_burn_chip(void)
|
||||
{
|
||||
|
@ -765,6 +765,20 @@ esp_err_t esp_efuse_write_keys(const esp_efuse_purpose_t purposes[], uint8_t key
|
||||
esp_err_t esp_secure_boot_read_key_digests(ets_secure_boot_key_digests_t *trusted_keys);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Checks eFuse errors in BLOCK0.
|
||||
*
|
||||
* @note Refers to ESP32-C3 only.
|
||||
*
|
||||
* It does a BLOCK0 check if eFuse EFUSE_ERR_RST_ENABLE is set.
|
||||
* If BLOCK0 has an error, it prints the error and returns ESP_FAIL, which should be treated as esp_restart.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: No errors in BLOCK0.
|
||||
* - ESP_FAIL: Error in BLOCK0 requiring reboot.
|
||||
*/
|
||||
esp_err_t esp_efuse_check_errors(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -160,6 +160,20 @@ void esp_efuse_utility_erase_virt_blocks(void);
|
||||
*/
|
||||
esp_err_t esp_efuse_utility_apply_new_coding_scheme(void);
|
||||
|
||||
/**
|
||||
* @brief Checks eFuse errors in BLOCK0.
|
||||
*
|
||||
* @note Refers to ESP32-C3 only.
|
||||
*
|
||||
* It does a BLOCK0 check if eFuse EFUSE_ERR_RST_ENABLE is set.
|
||||
* If BLOCK0 has an error, it prints the error and returns ESP_FAIL, which should be treated as esp_restart.
|
||||
*
|
||||
* @return
|
||||
* - ESP_OK: No errors in BLOCK0.
|
||||
* - ESP_FAIL: Error in BLOCK0 requiring reboot.
|
||||
*/
|
||||
esp_err_t esp_efuse_utility_check_errors(void);
|
||||
|
||||
/**
|
||||
* @brief Efuse read operation: copies data from physical efuses to efuse read registers.
|
||||
*/
|
||||
|
@ -287,3 +287,8 @@ esp_err_t esp_efuse_batch_write_commit(void)
|
||||
}
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
esp_err_t esp_efuse_check_errors(void)
|
||||
{
|
||||
return esp_efuse_utility_check_errors();
|
||||
}
|
||||
|
@ -89,6 +89,7 @@ typedef enum {
|
||||
TG1WDT_CPU_RESET = 17, /**<17, Time Group1 reset CPU*/
|
||||
SUPER_WDT_RESET = 18, /**<18, super watchdog reset digital core and rtc module*/
|
||||
GLITCH_RTC_RESET = 19, /**<19, glitch reset digital core and rtc module*/
|
||||
EFUSE_RESET = 20, /**<20, efuse reset digital core*/
|
||||
} RESET_REASON;
|
||||
|
||||
// Check if the reset reason defined in ROM is compatible with soc/reset_reasons.h
|
||||
@ -106,6 +107,7 @@ _Static_assert((soc_reset_reason_t)RTCWDT_RTC_RESET == RESET_REASON_SYS_RTC_WDT,
|
||||
_Static_assert((soc_reset_reason_t)TG1WDT_CPU_RESET == RESET_REASON_CPU0_MWDT1, "TG1WDT_CPU_RESET != RESET_REASON_CPU0_MWDT1");
|
||||
_Static_assert((soc_reset_reason_t)SUPER_WDT_RESET == RESET_REASON_SYS_SUPER_WDT, "SUPER_WDT_RESET != RESET_REASON_SYS_SUPER_WDT");
|
||||
_Static_assert((soc_reset_reason_t)GLITCH_RTC_RESET == RESET_REASON_SYS_CLK_GLITCH, "GLITCH_RTC_RESET != RESET_REASON_SYS_CLK_GLITCH");
|
||||
_Static_assert((soc_reset_reason_t)EFUSE_RESET == RESET_REASON_CORE_EFUSE_CRC, "EFUSE_RESET != RESET_REASON_CORE_EFUSE_CRC");
|
||||
|
||||
typedef enum {
|
||||
NO_SLEEP = 0,
|
||||
|
@ -343,6 +343,10 @@ void IRAM_ATTR call_start_cpu0(void)
|
||||
Cache_Resume_DCache(0);
|
||||
#endif // CONFIG_IDF_TARGET_ESP32S3
|
||||
|
||||
if (esp_efuse_check_errors() != ESP_OK) {
|
||||
esp_restart();
|
||||
}
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || CONFIG_IDF_TARGET_ESP32C2
|
||||
/* Configure the Cache MMU size for instruction and rodata in flash. */
|
||||
extern uint32_t Cache_Set_IDROM_MMU_Size(uint32_t irom_size, uint32_t drom_size);
|
||||
|
@ -68,7 +68,11 @@ static const char *TAG = "clk";
|
||||
rtc_config_t cfg = RTC_CONFIG_DEFAULT();
|
||||
soc_reset_reason_t rst_reas;
|
||||
rst_reas = esp_rom_get_reset_reason(0);
|
||||
if (rst_reas == RESET_REASON_CHIP_POWER_ON) {
|
||||
if (rst_reas == RESET_REASON_CHIP_POWER_ON
|
||||
#if SOC_EFUSE_HAS_EFUSE_RST_BUG
|
||||
|| rst_reas == RESET_REASON_CORE_EFUSE_CRC
|
||||
#endif
|
||||
) {
|
||||
cfg.cali_ocode = 1;
|
||||
}
|
||||
rtc_init(cfg);
|
||||
|
@ -1,16 +1,8 @@
|
||||
// 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.
|
||||
/*
|
||||
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include "esp_system.h"
|
||||
#include "esp_rom_sys.h"
|
||||
@ -26,6 +18,9 @@ static esp_reset_reason_t get_reset_reason(soc_reset_reason_t rtc_reset_reason,
|
||||
{
|
||||
switch (rtc_reset_reason) {
|
||||
case RESET_REASON_CHIP_POWER_ON:
|
||||
#if SOC_EFUSE_HAS_EFUSE_RST_BUG
|
||||
case RESET_REASON_CORE_EFUSE_CRC:
|
||||
#endif
|
||||
return ESP_RST_POWERON;
|
||||
|
||||
case RESET_REASON_CPU0_SW:
|
||||
|
@ -55,6 +55,10 @@ config SOC_EFUSE_KEY_PURPOSE_FIELD
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_EFUSE_HAS_EFUSE_RST_BUG
|
||||
bool
|
||||
default y
|
||||
|
||||
config SOC_RTC_FAST_MEM_SUPPORTED
|
||||
bool
|
||||
default y
|
||||
|
@ -38,6 +38,7 @@
|
||||
#define SOC_WIFI_SUPPORTED 1
|
||||
#define SOC_SUPPORTS_SECURE_DL_MODE 1
|
||||
#define SOC_EFUSE_KEY_PURPOSE_FIELD 1
|
||||
#define SOC_EFUSE_HAS_EFUSE_RST_BUG 1
|
||||
#define SOC_RTC_FAST_MEM_SUPPORTED 1
|
||||
#define SOC_I2S_SUPPORTED 1
|
||||
#define SOC_RMT_SUPPORTED 1
|
||||
|
@ -1,16 +1,8 @@
|
||||
// Copyright 2021 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
|
||||
|
||||
@ -51,6 +43,7 @@ typedef enum {
|
||||
RESET_REASON_CPU0_MWDT1 = 0x11, // Main watch dog 1 resets CPU 0
|
||||
RESET_REASON_SYS_SUPER_WDT = 0x12, // Super watch dog resets the digital core and rtc module
|
||||
RESET_REASON_SYS_CLK_GLITCH = 0x13, // Glitch on clock resets the digital core and rtc module
|
||||
RESET_REASON_CORE_EFUSE_CRC = 0x14, // eFuse CRC error resets the digital core
|
||||
} soc_reset_reason_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -678,7 +678,6 @@ components/esp_system/port/soc/esp32/intr.c
|
||||
components/esp_system/port/soc/esp32/reset_reason.c
|
||||
components/esp_system/port/soc/esp32c3/apb_backup_dma.c
|
||||
components/esp_system/port/soc/esp32c3/cache_err_int.h
|
||||
components/esp_system/port/soc/esp32c3/reset_reason.c
|
||||
components/esp_system/port/soc/esp32h2/apb_backup_dma.c
|
||||
components/esp_system/port/soc/esp32h2/cache_err_int.h
|
||||
components/esp_system/port/soc/esp32h2/reset_reason.c
|
||||
@ -1349,7 +1348,6 @@ components/soc/esp32s2/include/soc/ledc_reg.h
|
||||
components/soc/esp32s2/include/soc/ledc_struct.h
|
||||
components/soc/esp32s2/include/soc/memprot_defs.h
|
||||
components/soc/esp32s2/include/soc/nrx_reg.h
|
||||
components/soc/esp32s2/include/soc/reset_reasons.h
|
||||
components/soc/esp32s2/include/soc/rtc_cntl_reg.h
|
||||
components/soc/esp32s2/include/soc/rtc_cntl_struct.h
|
||||
components/soc/esp32s2/include/soc/rtc_i2c_reg.h
|
||||
|
Loading…
x
Reference in New Issue
Block a user