Skip to content

Commit 0a1a28b

Browse files
committed
pbio/drv/reset/reset_ev3: Implement software reset reason tracking
This helps determine whether the system was soft-rebooted, booted from cold, or reset due to a crash.
1 parent 2136b90 commit 0a1a28b

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

lib/pbio/drv/reset/reset_ev3.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#if PBDRV_CONFIG_RESET_EV3
99

10+
#include <stdbool.h>
11+
1012
#include <pbdrv/reset.h>
1113
#include <pbdrv/gpio.h>
1214

@@ -19,6 +21,11 @@
1921

2022
#define BOOTLOADER_UPDATE_MODE_VALUE 0x5555AAAA
2123

24+
// 'Pybr'
25+
#define RESET_REASON_FLAG_WDT 0x50796272
26+
// 'rboo'
27+
#define RESET_REASON_FLAG_SOFT_RESET 0x72626f6f
28+
2229
typedef struct {
2330
// 0xffff1ff0
2431
uint32_t _dummy0;
@@ -34,10 +41,20 @@ typedef struct {
3441
} persistent_data_t;
3542
extern volatile persistent_data_t ev3_persistent_data;
3643

44+
static bool second_init;
45+
static uint32_t saved_reset_reason_flag;
46+
3747
static const pbdrv_gpio_t poweroff_pin = PBDRV_GPIO_EV3_PIN(13, 19, 16, 6, 11);
3848

3949
void pbdrv_reset_init(void) {
4050
pbdrv_gpio_out_high(&poweroff_pin);
51+
if (!second_init) {
52+
saved_reset_reason_flag = ev3_persistent_data.reset_reason_flag;
53+
// The EV3 happens to call this init function multiple times,
54+
// but we only want to read this reset reason once.
55+
second_init = true;
56+
}
57+
ev3_persistent_data.reset_reason_flag = RESET_REASON_FLAG_WDT;
4158
}
4259

4360
void pbdrv_reset(pbdrv_reset_action_t action) {
@@ -52,6 +69,8 @@ void pbdrv_reset(pbdrv_reset_action_t action) {
5269
default:
5370
// PBDRV_RESET_ACTION_RESET
5471

72+
ev3_persistent_data.reset_reason_flag = RESET_REASON_FLAG_SOFT_RESET;
73+
5574
// Poke the watchdog timer with a bad value to immediately trigger it
5675
HWREG(SOC_TMR_1_REGS + TMR_WDTCR) = 0;
5776
break;
@@ -60,6 +79,12 @@ void pbdrv_reset(pbdrv_reset_action_t action) {
6079
}
6180

6281
pbdrv_reset_reason_t pbdrv_reset_get_reason(void) {
82+
if (saved_reset_reason_flag == RESET_REASON_FLAG_SOFT_RESET) {
83+
return PBDRV_RESET_REASON_SOFTWARE;
84+
}
85+
if (saved_reset_reason_flag == RESET_REASON_FLAG_WDT) {
86+
return PBDRV_RESET_REASON_WATCHDOG;
87+
}
6388
return PBDRV_RESET_REASON_NONE;
6489
}
6590

0 commit comments

Comments
 (0)