Skip to content

Commit 0ee0ed7

Browse files
authored
Merge pull request #5320 from rjp5th/main
Implement reset_reason for raspberrypi port
2 parents 4986742 + 65f8804 commit 0ee0ed7

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

ports/raspberrypi/common-hal/microcontroller/Processor.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
#include "src/rp2_common/hardware_adc/include/hardware/adc.h"
3535
#include "src/rp2_common/hardware_clocks/include/hardware/clocks.h"
3636

37+
#include "src/rp2040/hardware_regs/include/hardware/regs/vreg_and_chip_reset.h"
38+
#include "src/rp2040/hardware_regs/include/hardware/regs/watchdog.h"
39+
#include "src/rp2040/hardware_structs/include/hardware/structs/vreg_and_chip_reset.h"
40+
#include "src/rp2040/hardware_structs/include/hardware/structs/watchdog.h"
41+
3742
float common_hal_mcu_processor_get_temperature(void) {
3843
adc_init();
3944
adc_set_temp_sensor_enabled(true);
@@ -60,5 +65,34 @@ void common_hal_mcu_processor_get_uid(uint8_t raw_id[]) {
6065
}
6166

6267
mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
63-
return RESET_REASON_UNKNOWN;
68+
mcu_reset_reason_t reason = RESET_REASON_UNKNOWN;
69+
70+
uint32_t watchdog_reset_reg = watchdog_hw->reason;
71+
uint32_t chip_reset_reg = vreg_and_chip_reset_hw->chip_reset;
72+
73+
if (chip_reset_reg & VREG_AND_CHIP_RESET_CHIP_RESET_HAD_PSM_RESTART_BITS) {
74+
reason = RESET_REASON_RESCUE_DEBUG;
75+
}
76+
77+
if (chip_reset_reg & VREG_AND_CHIP_RESET_CHIP_RESET_HAD_RUN_BITS) {
78+
reason = RESET_REASON_RESET_PIN;
79+
}
80+
81+
if (chip_reset_reg & VREG_AND_CHIP_RESET_CHIP_RESET_HAD_POR_BITS) {
82+
// NOTE: This register is also used for brownout, but there is no way to differentiate between power on and brown out
83+
reason = RESET_REASON_POWER_ON;
84+
}
85+
86+
// Check watchdog after chip reset since watchdog doesn't clear chip_reset, while chip_reset clears the watchdog
87+
88+
if (watchdog_reset_reg & WATCHDOG_REASON_TIMER_BITS) {
89+
// 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
90+
reason = RESET_REASON_WATCHDOG;
91+
}
92+
93+
if (watchdog_reset_reg & WATCHDOG_REASON_FORCE_BITS) {
94+
reason = RESET_REASON_SOFTWARE;
95+
}
96+
97+
return reason;
6498
}

shared-bindings/microcontroller/ResetReason.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, DEEP_SLEEP_ALARM, RESET_REA
3636
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, RESET_PIN, RESET_REASON_RESET_PIN);
3737
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, WATCHDOG, RESET_REASON_WATCHDOG);
3838
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, UNKNOWN, RESET_REASON_UNKNOWN);
39+
MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, RESCUE_DEBUG, RESET_REASON_RESCUE_DEBUG);
3940

4041
//| class ResetReason:
4142
//| """The reason the microntroller was last reset"""
@@ -61,6 +62,9 @@ MAKE_ENUM_VALUE(mcu_reset_reason_type, reset_reason, UNKNOWN, RESET_REASON_UNKNO
6162
//| UNKNOWN: object
6263
//| """The microntroller restarted for an unknown reason."""
6364
//|
65+
//| RESCUE_DEBUG: object
66+
//| """The microntroller was reset by the rescue debug port."""
67+
//|
6468
MAKE_ENUM_MAP(mcu_reset_reason) {
6569
MAKE_ENUM_MAP_ENTRY(reset_reason, POWER_ON),
6670
MAKE_ENUM_MAP_ENTRY(reset_reason, BROWNOUT),
@@ -69,6 +73,7 @@ MAKE_ENUM_MAP(mcu_reset_reason) {
6973
MAKE_ENUM_MAP_ENTRY(reset_reason, RESET_PIN),
7074
MAKE_ENUM_MAP_ENTRY(reset_reason, WATCHDOG),
7175
MAKE_ENUM_MAP_ENTRY(reset_reason, UNKNOWN),
76+
MAKE_ENUM_MAP_ENTRY(reset_reason, RESCUE_DEBUG),
7277
};
7378
STATIC MP_DEFINE_CONST_DICT(mcu_reset_reason_locals_dict, mcu_reset_reason_locals_table);
7479

shared-bindings/microcontroller/ResetReason.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ typedef enum {
3838
RESET_REASON_RESET_PIN,
3939
RESET_REASON_WATCHDOG,
4040
RESET_REASON_UNKNOWN,
41+
RESET_REASON_RESCUE_DEBUG,
4142
} mcu_reset_reason_t;
4243

4344
extern const mp_obj_type_t mcu_reset_reason_type;

0 commit comments

Comments
 (0)