77
88#if PBDRV_CONFIG_RESET_EV3
99
10+ #include <stdbool.h>
11+
1012#include <pbdrv/reset.h>
1113#include <pbdrv/gpio.h>
1214
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+
2229typedef struct {
2330 // 0xffff1ff0
2431 uint32_t _dummy0 ;
@@ -34,10 +41,20 @@ typedef struct {
3441} persistent_data_t ;
3542extern volatile persistent_data_t ev3_persistent_data ;
3643
44+ static bool second_init ;
45+ static uint32_t saved_reset_reason_flag ;
46+
3747static const pbdrv_gpio_t poweroff_pin = PBDRV_GPIO_EV3_PIN (13 , 19 , 16 , 6 , 11 );
3848
3949void 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
4360void 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
6281pbdrv_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