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 ;
@@ -39,10 +46,13 @@ typedef struct {
3946// This lives at the very end of the ARM local RAM.
4047extern volatile persistent_data_t ev3_persistent_data ;
4148
49+ static uint32_t saved_reset_reason_flag ;
50+
4251static const pbdrv_gpio_t poweroff_pin = PBDRV_GPIO_EV3_PIN (13 , 19 , 16 , 6 , 11 );
4352
4453void pbdrv_reset_init (void ) {
45- pbdrv_gpio_out_high (& poweroff_pin );
54+ saved_reset_reason_flag = ev3_persistent_data .reset_reason_flag ;
55+ ev3_persistent_data .reset_reason_flag = RESET_REASON_FLAG_WDT ;
4656}
4757
4858void pbdrv_reset (pbdrv_reset_action_t action ) {
@@ -57,6 +67,8 @@ void pbdrv_reset(pbdrv_reset_action_t action) {
5767 default :
5868 // PBDRV_RESET_ACTION_RESET
5969
70+ ev3_persistent_data .reset_reason_flag = RESET_REASON_FLAG_SOFT_RESET ;
71+
6072 // Poke the watchdog timer with a bad value to immediately trigger it
6173 HWREG (SOC_TMR_1_REGS + TMR_WDTCR ) = 0 ;
6274 break ;
@@ -65,9 +77,19 @@ void pbdrv_reset(pbdrv_reset_action_t action) {
6577}
6678
6779pbdrv_reset_reason_t pbdrv_reset_get_reason (void ) {
80+ if (saved_reset_reason_flag == RESET_REASON_FLAG_SOFT_RESET ) {
81+ return PBDRV_RESET_REASON_SOFTWARE ;
82+ }
83+ if (saved_reset_reason_flag == RESET_REASON_FLAG_WDT ) {
84+ return PBDRV_RESET_REASON_WATCHDOG ;
85+ }
6886 return PBDRV_RESET_REASON_NONE ;
6987}
7088
89+ void pbdrv_reset_ev3_early_init (void ) {
90+ pbdrv_gpio_out_high (& poweroff_pin );
91+ }
92+
7193void pbdrv_reset_power_off (void ) {
7294 pbdrv_gpio_out_low (& poweroff_pin );
7395}
0 commit comments