]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - tmk_core/common/chibios/bootloader.c
[Keyboard] fixed pins for numpad_5x4 layout (#6311)
[qmk_firmware.git] / tmk_core / common / chibios / bootloader.c
index fc17fca1b63b6fe6dfcf943931060d715a68c6ae..f9895237b9bc5c49c296547e7f19cbb93bf656cf 100644 (file)
@@ -6,32 +6,40 @@
 #ifdef STM32_BOOTLOADER_ADDRESS
 /* STM32 */
 
-#if defined(STM32F0XX)
 /* This code should be checked whether it runs correctly on platforms */
 #define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0))
 extern uint32_t __ram0_end__;
+#define BOOTLOADER_MAGIC 0xDEADBEEF
+#define MAGIC_ADDR (unsigned long*)(SYMVAL(__ram0_end__) - 4)
 
-void bootloader_jump(void) {
-  *((unsigned long *)(SYMVAL(__ram0_end__) - 4)) = 0xDEADBEEF; // set magic flag => reset handler will jump into boot loader
-   NVIC_SystemReset();
-}
 
-#elif defined(STM32F3XX)
-/* This code should be checked whether it runs correctly on platforms. 
- * It was added for clueboard60 BUT HAS NOT BEEN TESTED.
- * FIXME - Test this
+/** \brief Jump to the bootloader
+ *
+ * FIXME: needs doc
  */
-#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0))
-extern uint32_t __ram0_end__;
-
 void bootloader_jump(void) {
-  *((unsigned long *)(SYMVAL(__ram0_end__) - 4)) = 0xDEADBEEF; // set magic flag => reset handler will jump into boot loader
+  *MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader
    NVIC_SystemReset();
 }
 
-#else /* defined(STM32F0XX) */
-#error Check that the bootloader code works on your platform and add it to bootloader.c!
-#endif /* defined(STM32F0XX) */
+/** \brief Enter bootloader mode if requested
+ *
+ * FIXME: needs doc
+ */
+void enter_bootloader_mode_if_requested(void)  {
+  unsigned long* check = MAGIC_ADDR;
+  if(*check == BOOTLOADER_MAGIC)  {
+    *check = 0;
+    __set_CONTROL(0);
+    __set_MSP(*(__IO uint32_t*)STM32_BOOTLOADER_ADDRESS);
+    __enable_irq();
+
+    typedef void (*BootJump_t)(void);
+    BootJump_t boot_jump = *(BootJump_t*)(STM32_BOOTLOADER_ADDRESS + 4);
+    boot_jump();
+    while(1);
+  }
+ }
 
 #elif defined(KL2x) || defined(K20x) /* STM32_BOOTLOADER_ADDRESS */
 /* Kinetis */