mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-01-09 15:00:58 +00:00
feat(legacy): add supervisor call for reboot to bootloader
This commit is contained in:
parent
10edcb0d3a
commit
65aa3b49d9
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include "supervise.h"
|
#include "supervise.h"
|
||||||
#include <libopencm3/stm32/flash.h>
|
#include <libopencm3/stm32/flash.h>
|
||||||
|
#include <vendor/libopencm3/include/libopencmsis/core_cm3.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
|
||||||
@ -62,6 +63,11 @@ static uint32_t svhandler_flash_lock(void) {
|
|||||||
return FLASH_SR;
|
return FLASH_SR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __attribute__((noreturn)) svhandler_reboot_to_bootloader(void) {
|
||||||
|
__asm__ __volatile__("ldr r12, =0x55aa55aa");
|
||||||
|
scb_reset_system();
|
||||||
|
}
|
||||||
|
|
||||||
extern volatile uint32_t system_millis;
|
extern volatile uint32_t system_millis;
|
||||||
|
|
||||||
void svc_handler_main(uint32_t *stack) {
|
void svc_handler_main(uint32_t *stack) {
|
||||||
@ -82,6 +88,9 @@ void svc_handler_main(uint32_t *stack) {
|
|||||||
case SVC_TIMER_MS:
|
case SVC_TIMER_MS:
|
||||||
stack[0] = system_millis;
|
stack[0] = system_millis;
|
||||||
break;
|
break;
|
||||||
|
case SVC_REBOOT_TO_BOOTLOADER:
|
||||||
|
svhandler_reboot_to_bootloader();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
stack[0] = 0xffffffff;
|
stack[0] = 0xffffffff;
|
||||||
break;
|
break;
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#define SVC_FLASH_PROGRAM 2
|
#define SVC_FLASH_PROGRAM 2
|
||||||
#define SVC_FLASH_LOCK 3
|
#define SVC_FLASH_LOCK 3
|
||||||
#define SVC_TIMER_MS 4
|
#define SVC_TIMER_MS 4
|
||||||
|
#define SVC_REBOOT_TO_BOOTLOADER 5
|
||||||
|
|
||||||
/* Unlocks flash. This function needs to be called before programming
|
/* Unlocks flash. This function needs to be called before programming
|
||||||
* or erasing. Multiple calls of flash_program and flash_erase can
|
* or erasing. Multiple calls of flash_program and flash_erase can
|
||||||
@ -71,6 +72,14 @@ inline uint32_t svc_timer_ms(void) {
|
|||||||
return r0;
|
return r0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Reboot to bootloader.
|
||||||
|
* Sets a flag in register and reboots. When bootloader runs, it will recognize
|
||||||
|
* flag and won't run firmware, but enter bootloader mode.
|
||||||
|
*/
|
||||||
|
inline void svc_reboot_to_bootloader(void) {
|
||||||
|
__asm__ __volatile__("svc %0" ::"i"(SVC_REBOOT_TO_BOOTLOADER) : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
extern void svc_flash_unlock(void);
|
extern void svc_flash_unlock(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user