Merge pull request #7462 from tannewt/fix_rp2_reset_reason

Tweak RP2040 reset reason
This commit is contained in:
Dan Halbert 2023-01-19 21:10:57 -05:00 committed by GitHub
commit 13338df9f1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 7 additions and 6 deletions

View File

@ -34,6 +34,7 @@
#include "src/rp2_common/hardware_adc/include/hardware/adc.h" #include "src/rp2_common/hardware_adc/include/hardware/adc.h"
#include "src/rp2_common/hardware_clocks/include/hardware/clocks.h" #include "src/rp2_common/hardware_clocks/include/hardware/clocks.h"
#include "src/rp2_common/hardware_watchdog/include/hardware/watchdog.h"
#include "src/rp2040/hardware_regs/include/hardware/regs/vreg_and_chip_reset.h" #include "src/rp2040/hardware_regs/include/hardware/regs/vreg_and_chip_reset.h"
#include "src/rp2040/hardware_regs/include/hardware/regs/watchdog.h" #include "src/rp2040/hardware_regs/include/hardware/regs/watchdog.h"
@ -68,7 +69,6 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) { mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
mcu_reset_reason_t reason = RESET_REASON_UNKNOWN; mcu_reset_reason_t reason = RESET_REASON_UNKNOWN;
uint32_t watchdog_reset_reg = watchdog_hw->reason;
uint32_t chip_reset_reg = vreg_and_chip_reset_hw->chip_reset; uint32_t chip_reset_reg = vreg_and_chip_reset_hw->chip_reset;
if (chip_reset_reg & VREG_AND_CHIP_RESET_CHIP_RESET_HAD_PSM_RESTART_BITS) { if (chip_reset_reg & VREG_AND_CHIP_RESET_CHIP_RESET_HAD_PSM_RESTART_BITS) {
@ -86,13 +86,14 @@ mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
// Check watchdog after chip reset since watchdog doesn't clear chip_reset, while chip_reset clears the watchdog // Check watchdog after chip reset since watchdog doesn't clear chip_reset, while chip_reset clears the watchdog
if (watchdog_reset_reg & WATCHDOG_REASON_TIMER_BITS) { // The watchdog is used for software reboots such as resetting after copying a UF2 via the bootloader.
// This bit can also be set during a software reset because the pico-sdk performs a software reset by setting an extremely low timeout on the watchdog, rather than triggering a watchdog reset manually if (watchdog_caused_reboot()) {
reason = RESET_REASON_WATCHDOG; reason = RESET_REASON_SOFTWARE;
} }
if (watchdog_reset_reg & WATCHDOG_REASON_FORCE_BITS) { // Actual watchdog usage will set a special value that this function detects.
reason = RESET_REASON_SOFTWARE; if (watchdog_enable_caused_reboot()) {
reason = RESET_REASON_WATCHDOG;
} }
return reason; return reason;