From 0f728b64de03182f01b5fecb28c5b9148b3fb266 Mon Sep 17 00:00:00 2001 From: Dong Heng Date: Fri, 7 Dec 2018 11:02:32 +0800 Subject: [PATCH] feat(esp8266): Add reset reason function The function can be disable. --- components/esp8266/Kconfig | 6 + .../esp8266/include/esp8266/rtc_register.h | 29 ++++ components/esp8266/include/esp_system.h | 24 +++ .../include/internal/esp_system_internal.h | 53 +++++++ components/esp8266/ld/esp8266.peripherals.ld | 4 +- components/esp8266/lib/VERSION | 2 +- components/esp8266/lib/libcore.a | Bin 77680 -> 76336 bytes components/esp8266/source/reset_reason.c | 145 ++++++++++++++++++ components/esp8266/source/startup.c | 5 + 9 files changed, 266 insertions(+), 2 deletions(-) create mode 100644 components/esp8266/include/esp8266/rtc_register.h create mode 100644 components/esp8266/include/internal/esp_system_internal.h create mode 100644 components/esp8266/source/reset_reason.c diff --git a/components/esp8266/Kconfig b/components/esp8266/Kconfig index 674dc357..d4a366f3 100644 --- a/components/esp8266/Kconfig +++ b/components/esp8266/Kconfig @@ -154,6 +154,12 @@ config TASK_WDT_TIMEOUT_S default 14 if TASK_WDT_TIMEOUT_14N default 15 if TASK_WDT_TIMEOUT_15N +config RESET_REASON + bool "Enable reset reason" + default y + help + Enable this option, the reset reason function can be used, or compiler will show function linking error. + config WIFI_PPT_TASKSTACK_SIZE int "ppT task stack size" default 2048 diff --git a/components/esp8266/include/esp8266/rtc_register.h b/components/esp8266/include/esp8266/rtc_register.h new file mode 100644 index 00000000..46e468d6 --- /dev/null +++ b/components/esp8266/include/esp8266/rtc_register.h @@ -0,0 +1,29 @@ +// Copyright 2018-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. + +#pragma once + +typedef enum { + NO_MEAN = 0, + POWERON_RESET = 1, /**<1, Vbat power on reset*/ + EXT_RESET = 2, /**<2, external system reset*/ + SW_RESET = 3, /**<3, Software reset digital core*/ + OWDT_RESET = 4, /**<4, Legacy watch dog reset digital core*/ + DEEPSLEEP_RESET = 5, /**<5, Deep Sleep reset digital core*/ + SDIO_RESET = 6, /**<6, Reset by SLC module, reset digital core*/ +} RESET_REASON; + +#define RTC_STORE0 (REG_RTC_BASE + 0x30) +#define RTC_STATE1 (REG_RTC_BASE + 0x14) +#define RTC_STATE2 (REG_RTC_BASE + 0x18) diff --git a/components/esp8266/include/esp_system.h b/components/esp8266/include/esp_system.h index 45ccb23a..986d1561 100644 --- a/components/esp8266/include/esp_system.h +++ b/components/esp8266/include/esp_system.h @@ -28,6 +28,24 @@ typedef enum { ESP_MAC_WIFI_SOFTAP, } esp_mac_type_t; + +/** + * @brief Reset reasons + */ +typedef enum { + ESP_RST_UNKNOWN = 0, //!< Reset reason can not be determined + ESP_RST_POWERON, //!< Reset due to power-on event + ESP_RST_EXT, //!< Reset by external pin (not applicable for ESP8266) + ESP_RST_SW, //!< Software reset via esp_restart + ESP_RST_PANIC, //!< Software reset due to exception/panic + ESP_RST_INT_WDT, //!< Reset (software or hardware) due to interrupt watchdog + ESP_RST_TASK_WDT, //!< Reset due to task watchdog + ESP_RST_WDT, //!< Reset due to other watchdogs + ESP_RST_DEEPSLEEP, //!< Reset after exiting deep sleep mode + ESP_RST_BROWNOUT, //!< Brownout reset (software or hardware) + ESP_RST_SDIO, //!< Reset over SDIO +} esp_reset_reason_t; + /** * @brief Set base MAC address with the MAC address which is stored in EFUSE or * external storage e.g. flash and EEPROM. @@ -123,6 +141,12 @@ void system_restore(void) __attribute__ ((noreturn)); */ void esp_restart(void) __attribute__ ((noreturn)); +/** + * @brief Get reason of last reset + * @return See description of esp_reset_reason_t for explanation of each value. + */ +esp_reset_reason_t esp_reset_reason(void); + /** * @brief Get the size of available heap. * diff --git a/components/esp8266/include/internal/esp_system_internal.h b/components/esp8266/include/internal/esp_system_internal.h new file mode 100644 index 00000000..89bacd71 --- /dev/null +++ b/components/esp8266/include/internal/esp_system_internal.h @@ -0,0 +1,53 @@ +// Copyright 2018-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. + +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define RTC_SYS_RAM_SIZE 256 + +/** + * The size of structure must not be larger than 256 bytes and all member varible must be uint32_t type + */ +struct _rtc_sys_info { + uint32_t hint; // software reset reason +}; + +extern struct _rtc_sys_info rtc_sys_info; + +/** + * @brief Internal function to get SoC reset reason at system initialization + */ +void esp_reset_reason_init(void); + +/** + * @brief Internal function to set reset reason hint + * + * The hint is used do distinguish different reset reasons when software reset + * is performed. + * + * The hint is stored in RTC store register, RTC_RESET_CAUSE_REG. + * + * @param hint Desired esp_reset_reason_t value for the real reset reason + */ +void esp_reset_reason_set_hint(esp_reset_reason_t hint); + +#ifdef __cplusplus +} +#endif diff --git a/components/esp8266/ld/esp8266.peripherals.ld b/components/esp8266/ld/esp8266.peripherals.ld index b466b3ac..1cad1737 100644 --- a/components/esp8266/ld/esp8266.peripherals.ld +++ b/components/esp8266/ld/esp8266.peripherals.ld @@ -3,4 +3,6 @@ PROVIDE ( GPIO = 0x60000300); PROVIDE ( uart0 = 0x60000000 ); PROVIDE ( uart1 = 0x60000f00 ); -PROVIDE ( frc1 = 0x60000600 ); \ No newline at end of file +PROVIDE ( frc1 = 0x60000600 ); + +PROVIDE ( rtc_sys_info = 0x60001100 ); \ No newline at end of file diff --git a/components/esp8266/lib/VERSION b/components/esp8266/lib/VERSION index 79297a53..e73370f1 100644 --- a/components/esp8266/lib/VERSION +++ b/components/esp8266/lib/VERSION @@ -1,5 +1,5 @@ gwen: - core: 676f3f3 + core: 5ce569c net80211: 2e4e807 pp: b1c35c2 wpa: 4e2372f diff --git a/components/esp8266/lib/libcore.a b/components/esp8266/lib/libcore.a index 4dd361d795d7e4369c7ff542a37d4419775a9b8b..db3faeb344074e2625cc1fc8419b6df64de2be3a 100644 GIT binary patch delta 21654 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 tE*e$Rar{WnYtWc+vNB7iR@^N58f3{{ZR{l;r>b diff --git a/components/esp8266/source/reset_reason.c b/components/esp8266/source/reset_reason.c new file mode 100644 index 00000000..1cd2b8bf --- /dev/null +++ b/components/esp8266/source/reset_reason.c @@ -0,0 +1,145 @@ +// Copyright 2018-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. + +#include "sdkconfig.h" +#include +#include "esp_system.h" +#include "internal/esp_system_internal.h" +#include "esp8266/rtc_register.h" +#include "esp8266/rom_functions.h" +#include "esp_log.h" +#include "esp_libc.h" + +#if CONFIG_RESET_REASON + +#define RTC_RESET_SW_CAUSE_REG RTC_STORE0 +#define RTC_RESET_HW_CAUSE_REG RTC_STATE1 +#define RTC_WAKEUP_HW_CAUSE_REG RTC_STATE2 + +#define RTC_RESET_HW_CAUSE_LSB 0 +#define RTC_RESET_HW_CAUSE_MSB 3 + +#define RTC_WAKEUP_HW_CAUSE_LSB 8 +#define RTC_WAKEUP_HW_CAUSE_MSB 13 + +static const char *TAG = "reset_reason"; +static uint32_t s_reset_reason; + +static inline void esp_reset_reason_clear_hint() +{ + rtc_sys_info.hint = 0; +} + +static inline uint32_t esp_reset_reason_get_hint(uint32_t hw_reset) +{ + if (hw_reset == POWERON_RESET && rtc_sys_info.hint != ESP_RST_SW) { + uint32_t *p = (uint32_t *)&rtc_sys_info; + + for (int i = 0; i < RTC_SYS_RAM_SIZE / sizeof(uint32_t); i++) + *p++ = 0; + } + + return rtc_sys_info.hint; +} + +static inline uint32_t esp_rtc_get_reset_reason(void) +{ + return GET_PERI_REG_BITS(RTC_RESET_HW_CAUSE_REG, RTC_RESET_HW_CAUSE_MSB, RTC_RESET_HW_CAUSE_LSB); +} + +#if CONFIG_RESET_REASON_CHECK_WAKEUP +static inline uint32_t esp_rtc_get_wakeup_reason(void) +{ + return GET_PERI_REG_BITS(RTC_WAKEUP_HW_CAUSE_REG, RTC_WAKEUP_HW_CAUSE_MSB, RTC_WAKEUP_HW_CAUSE_LSB); +} +#endif + +static inline uint32_t get_reset_reason(uint32_t rtc_reset_reason, uint32_t reset_reason_hint) +{ + switch (rtc_reset_reason) { + case POWERON_RESET: + if (reset_reason_hint == ESP_RST_SW) + return reset_reason_hint; + return ESP_RST_POWERON; + case EXT_RESET: + if (reset_reason_hint == ESP_RST_DEEPSLEEP) { + return reset_reason_hint; + } + return ESP_RST_EXT; + case SW_RESET: + if (reset_reason_hint == ESP_RST_PANIC || + reset_reason_hint == ESP_RST_BROWNOUT || + reset_reason_hint == ESP_RST_TASK_WDT) { + return reset_reason_hint; + } + return ESP_RST_SW; + case DEEPSLEEP_RESET: + return ESP_RST_DEEPSLEEP; + case OWDT_RESET: + return ESP_RST_WDT; + case SDIO_RESET: + return ESP_RST_SDIO; + default: + return ESP_RST_UNKNOWN; + } +} + +/** + * @brief Internal function to get SoC reset reason at system initialization + */ +void esp_reset_reason_init(void) +{ + const uint32_t hw_reset = esp_rtc_get_reset_reason(); +#if CONFIG_RESET_REASON_CHECK_WAKEUP + const uint32_t hw_wakeup = esp_rtc_get_wakeup_reason(); +#else + const uint32_t hw_wakeup = 0; +#endif + const uint32_t hint = esp_reset_reason_get_hint(hw_reset); + + s_reset_reason = get_reset_reason(hw_reset, hint); + if (hint != ESP_RST_UNKNOWN) { + esp_reset_reason_clear_hint(); + } + + ESP_EARLY_LOGI(TAG, "RTC reset %u wakeup %u store %u, reason is %u", hw_reset, hw_wakeup, hint, s_reset_reason); +} + +/** + * @brief Internal function to set reset reason hint + */ +void esp_reset_reason_set_hint(esp_reset_reason_t hint) +{ + rtc_sys_info.hint = hint; +} + +/** + * @brief Get reason of last reset + */ +esp_reset_reason_t esp_reset_reason(void) +{ + return (esp_reset_reason_t)s_reset_reason; +} + +#else /* CONFIG_RESET_REASON */ + +/** + * null function for pass compiling + */ +void esp_reset_reason_set_hint(esp_reset_reason_t hint) +{ + +} + +#endif /* CONFIG_RESET_REASON */ diff --git a/components/esp8266/source/startup.c b/components/esp8266/source/startup.c index 994393cb..683bd6e8 100644 --- a/components/esp8266/source/startup.c +++ b/components/esp8266/source/startup.c @@ -29,6 +29,7 @@ #include "esp_heap_caps_init.h" #include "esp_task_wdt.h" #include "internal/esp_wifi_internal.h" +#include "internal/esp_system_internal.h" #define FLASH_MAP_ADDR 0x40200000 #define FLASH_MAP_SIZE 0x00100000 @@ -68,6 +69,10 @@ static void user_init_entry(void *param) esp_wifi_set_rx_pbuf_mem_type(WIFI_RX_PBUF_DRAM); +#if CONFIG_RESET_REASON + esp_reset_reason_init(); +#endif + #ifdef CONFIG_TASK_WDT esp_task_wdt_init(); #endif