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);