From 82b5b21f007f112ea96599ed031de63692aa6120 Mon Sep 17 00:00:00 2001
From: schneider <schneider@blinkenlichts.net>
Date: Sat, 27 Jul 2019 00:53:52 +0200
Subject: [PATCH] feat(bootloader): Reset when system says done

---
 bootloader/bootloader-usb.c |  6 ++++++
 bootloader/main.c           | 10 +---------
 bootloader/mscmem.c         |  5 ++++-
 lib/card10/card10.c         | 13 +++++++++++++
 lib/card10/card10.h         |  1 +
 5 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/bootloader/bootloader-usb.c b/bootloader/bootloader-usb.c
index 003d295a..04a921f6 100644
--- a/bootloader/bootloader-usb.c
+++ b/bootloader/bootloader-usb.c
@@ -114,11 +114,17 @@ void delay_us(unsigned int usec)
 	mxc_delay(usec);
 }
 
+void bootloader_stop(void)
+{
+	card10_reset();
+}
+
 void bootloader_dirty(void)
 {
 	Paint_DrawString_EN(0, 16 * 3, "Writing.", &Font16, 0x0000, 0xf000);
 	LCD_Update();
 }
+
 void bootloader_clean(void)
 {
 	Paint_DrawString_EN(0, 16 * 3, "Ready.  ", &Font16, 0x0000, 0xffff);
diff --git a/bootloader/main.c b/bootloader/main.c
index 187ebcc7..cf7916a4 100644
--- a/bootloader/main.c
+++ b/bootloader/main.c
@@ -210,15 +210,7 @@ static inline void boot(const void *vtable)
 static void pmic_button(bool falling)
 {
 	if (falling) {
-		printf("Resetting ...\n");
-		/*
-		 * Give the UART fifo time to clear.
-		 * TODO: Do this properly
-		 */
-		for (int i = 0; i < 0x1000000; i++) {
-			__asm volatile("nop");
-		}
-		MXC_GCR->rstr0 = MXC_F_GCR_RSTR0_SYSTEM;
+		card10_reset();
 	}
 }
 
diff --git a/bootloader/mscmem.c b/bootloader/mscmem.c
index 82d6ce88..f2da8d6b 100644
--- a/bootloader/mscmem.c
+++ b/bootloader/mscmem.c
@@ -3,6 +3,7 @@
 #include <stdio.h>
 #include "mx25lba.h"
 
+void bootloader_stop(void);
 void bootloader_dirty(void);
 void bootloader_clean(void);
 
@@ -50,7 +51,9 @@ int mscmem_start()
 int mscmem_stop()
 {
 	printf("%s\n", __func__);
-	return mx25_stop();
+	int ret = mx25_stop();
+	bootloader_stop();
+	return ret;
 }
 
 /******************************************************************************/
diff --git a/lib/card10/card10.c b/lib/card10/card10.c
index 2b3e3a31..92ddee1b 100644
--- a/lib/card10/card10.c
+++ b/lib/card10/card10.c
@@ -216,6 +216,19 @@ void card10_poll(void)
 	pmic_poll();
 }
 
+void card10_reset(void)
+{
+	printf("Resetting ...\n");
+	/*
+        * Give the UART fifo time to clear.
+        * TODO: Do this properly
+        */
+	for (int i = 0; i < 0x1000000; i++) {
+		__asm volatile("nop");
+	}
+	MXC_GCR->rstr0 = MXC_F_GCR_RSTR0_SYSTEM;
+}
+
 void GPIO0_IRQHandler(void)
 {
 	GPIO_Handler(PORT_0);
diff --git a/lib/card10/card10.h b/lib/card10/card10.h
index e06b8a3f..488575a1 100644
--- a/lib/card10/card10.h
+++ b/lib/card10/card10.h
@@ -13,4 +13,5 @@ void core1_start(void);
 void core1_stop(void);
 
 void card10_poll(void);
+void card10_reset(void);
 #endif
-- 
GitLab