Added feature to reset into DFU from omv onboard software when receiving USBDB_BOOT

This commit is contained in:
shimniok@gmail.com 2014-09-26 22:55:01 -06:00
parent 9618f383ea
commit dbb2019b9a
2 changed files with 38 additions and 12 deletions

View File

@ -76,7 +76,20 @@ defined in linker script */
.section .text.Reset_Handler .section .text.Reset_Handler
.weak Reset_Handler .weak Reset_Handler
.type Reset_Handler, %function .type Reset_Handler, %function
Reset_Handler: Reset_Handler:
ldr r0,=0x20002000 /* load magic number location */
ldr r2,[r0, #0]
str r0,[r0, #0] /* invalidate */
ldr r1,=0xDEADBEEF /* if magic number found */
cmp r2,r1
bne EnableCCM /* run the bootloader, else... */
Reboot_Loader:
ldr r0,=0x1FFF0000
ldr sp,[r0, #0]
ldr r0,[r0, #4]
bx r0
EnableCCM: EnableCCM:
/* enable ccm clock */ /* enable ccm clock */
@ -122,6 +135,7 @@ LoopFillZerobss:
/* Call the application's entry point.*/ /* Call the application's entry point.*/
bl main bl main
bx lr bx lr
.size Reset_Handler, .-Reset_Handler .size Reset_Handler, .-Reset_Handler
/** /**

View File

@ -14,7 +14,7 @@
#include "py/py_file.h" #include "py/py_file.h"
#include "core_cm4.h" #include "core_cm4.h"
#include "usbdbg.h" #include "usbdbg.h"
#include "rcc_ctrl.h" #include "stm32f4xx_hal_rcc.h"
#define USB_TX_BUF_SIZE (64) #define USB_TX_BUF_SIZE (64)
static int xfer_bytes; static int xfer_bytes;
@ -192,26 +192,36 @@ void usbdbg_control(void *buffer, uint8_t request, uint16_t length)
break; break;
case USBDBG_BOOT: case USBDBG_BOOT:
/* http://goo.gl/VcKqst
* disable IRQ, reset USART1 and RCC before setting MSP/PC.
* Disable all peripheral clocks
* Disable used PLL
* Disable interrupts
* Clear pending interrupts
*/
/* /*
rcc_ctrl_hsi(); // run off the HSI clock, no PLL __set_PRIMASK(1); // disable interrupts
SysTick->CTRL = 0; // reset the SysTick timer HAL_RCC_DeInit(); // reset RCC
HAL_USART_DeInit( ); // reset USART1
SysTick->CTRL = 0; // reset the SysTick timer
SysTick->LOAD = 0; SysTick->LOAD = 0;
SysTick->VAL = 0; SysTick->VAL = 0;
__set_PRIMASK(1); // disable interrupts //__set_MSP(0x20001000); // set main SP to its default
__set_MSP(0x20001000); // set main SP to its default
*/
asm volatile( asm volatile(
"ldr r0, =0x40023844\n\t" // RCC_APB2ENR
"ldr r1, =0x00004000\n\t" // enable SYSCFG clock
"str r1, [r0, #0]\n\t"
"ldr r0, =0x40013800\n\t" // SYSCFG_MEMRMP "ldr r0, =0x40013800\n\t" // SYSCFG_MEMRMP
"ldr r1, =0x00000001\n\t" // remap ROM at zero "ldr r1, =0x00000001\n\t" // remap ROM at zero
"str r1, [r0, #0]\n\t" "str r1, [r0, #0]\n\t"
"ldr r0, =0x1fff000\n\t" // load ROM base "ldr r0, =0x1fff000\n\t" // load ROM base
"ldr sp,[r0, #0]\n\t" // assign main stack pointer "ldr sp,[r0, #0]\n\t" // assign main stack pointer
"ldr r0,[r0, #4]\n\t" // load bootloader address "ldr r0,[r0, #4]\n\t" // load bootloader address
"bx r0\n\t" "bx r0\n\t"
); );
// STM32F40xxx e.g., 405, 407 : 0x1FFF77DE
// STM32F429xx : 0x1FFF76DE
*/
// set magic flag => reset handler will jump into boot loader
*((uint32_t *)0x20002000) = 0xDEADBEEF;
NVIC_SystemReset();
while (1); while (1);
break; break;
@ -220,3 +230,5 @@ void usbdbg_control(void *buffer, uint8_t request, uint16_t length)
break; break;
} }
} }