1010#include <pbdrv/reset.h>
1111#include <pbdrv/gpio.h>
1212
13+ #include <tiam1808/hw/hw_types.h>
14+ #include <tiam1808/hw/soc_AM1808.h>
15+ #include <tiam1808/timer.h>
16+
1317#include "../drv/gpio/gpio_ev3.h"
1418
1519#include <tiam1808/hw/hw_syscfg0_AM1808.h>
1620
21+ #define BOOTLOADER_UPDATE_MODE_ADDR 0xFFFF1FFC
22+ #define BOOTLOADER_UPDATE_MODE_VALUE 0x5555AAAA
23+
1724static const pbdrv_gpio_t poweroff_pin = PBDRV_GPIO_EV3_PIN (13 , 19 , 16 , 6 , 11 );
1825
1926void pbdrv_reset_init (void ) {
@@ -23,17 +30,31 @@ void pbdrv_reset_init(void) {
2330void pbdrv_reset (pbdrv_reset_action_t action ) {
2431 for (;;) {
2532 switch (action ) {
26- case PBDRV_RESET_ACTION_RESET_IN_UPDATE_MODE :
27- // TODO
33+ case PBDRV_RESET_ACTION_POWER_OFF :
34+ pbdrv_reset_power_off ();
2835 break ;
29- // TODO: implement case PBDRV_RESET_ACTION_RESET
36+ case PBDRV_RESET_ACTION_RESET_IN_UPDATE_MODE :
37+ * (volatile uint32_t * )BOOTLOADER_UPDATE_MODE_ADDR = BOOTLOADER_UPDATE_MODE_VALUE ;
38+ // Fall through
3039 default :
40+ // PBDRV_RESET_ACTION_RESET
41+
42+ // Configure watchdog timer
43+ TimerDisable (SOC_TMR_1_REGS , TMR_TIMER_BOTH );
44+ TimerConfigure (SOC_TMR_1_REGS , TMR_CFG_64BIT_WATCHDOG );
45+ TimerPeriodSet (SOC_TMR_1_REGS , TMR_TIMER12 , 0 );
46+ TimerPeriodSet (SOC_TMR_1_REGS , TMR_TIMER34 , 0 );
47+ TimerWatchdogActivate (SOC_TMR_1_REGS );
48+
49+ // Poke the watchdog timer with a bad value to immediately trigger it
50+ HWREG (SOC_TMR_1_REGS + TMR_WDTCR ) = 0 ;
3151 break ;
3252 }
3353 }
3454}
3555
3656pbdrv_reset_reason_t pbdrv_reset_get_reason (void ) {
57+ // There is no easy way to determine the reset reason on this platform
3758 return PBDRV_RESET_REASON_NONE ;
3859}
3960
0 commit comments