From c727cb192148018ebbad7d4cf6072ed8d441538c Mon Sep 17 00:00:00 2001 From: "Jean-Philippe (JP) Cornil" <jeanphilippe.cornil@gmail.com> Date: Mon, 8 Apr 2024 19:22:35 +0200 Subject: [PATCH] Expose MCUSR register to applications using GPIOR0 This allows application to handle reset reasons, e.g. watchdog, reset button, ... --- bootloaders/caterina/Caterina.c | 10 ++++++---- bootloaders/caterina/Caterina.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/bootloaders/caterina/Caterina.c b/bootloaders/caterina/Caterina.c index 9860b3a3f..55dd912c7 100644 --- a/bootloaders/caterina/Caterina.c +++ b/bootloaders/caterina/Caterina.c @@ -68,7 +68,7 @@ uint16_t Timeout = 0; uint16_t bootKey = 0x7777; volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0800; -void StartSketch(void) +void StartSketch(uint8_t mcusr_state) { cli(); @@ -86,6 +86,8 @@ void StartSketch(void) TX_LED_OFF(); RX_LED_OFF(); + GPIOR0 = mcusr_state; + /* jump to beginning of application space */ __asm__ volatile("jmp 0x0000"); } @@ -126,10 +128,10 @@ int main(void) } else if ((mcusr_state & (1<<PORF)) && (pgm_read_word(0) != 0xFFFF)) { // After a power-on reset skip the bootloader and jump straight to sketch // if one exists. - StartSketch(); + StartSketch(mcusr_state); } else if ((mcusr_state & (1<<WDRF)) && (bootKeyPtrVal != bootKey) && (pgm_read_word(0) != 0xFFFF)) { // If it looks like an "accidental" watchdog reset then start the sketch. - StartSketch(); + StartSketch(mcusr_state); } /* Setup hardware required for the bootloader */ @@ -155,7 +157,7 @@ int main(void) USB_Detach(); /* Jump to beginning of application space to run the sketch - do not reset */ - StartSketch(); + StartSketch(mcusr_state); } /** Configures all hardware required for the bootloader. */ diff --git a/bootloaders/caterina/Caterina.h b/bootloaders/caterina/Caterina.h index 5ce80fab6..5a5eb29b8 100644 --- a/bootloaders/caterina/Caterina.h +++ b/bootloaders/caterina/Caterina.h @@ -86,7 +86,7 @@ typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; /* Function Prototypes: */ - void StartSketch(void); + void StartSketch(uint8_t mcur_state); void LEDPulse(void); void CDC_Task(void);