2019-07-23 16:07:06 -06:00
|
|
|
// Early bringup
|
2017-07-22 15:18:00 -06:00
|
|
|
#define ENTER_BOOTLOADER_MAGIC 0xdeadbeef
|
2017-07-24 16:16:22 -06:00
|
|
|
#define ENTER_SOFTLOADER_MAGIC 0xdeadc0de
|
2017-07-27 15:29:07 -06:00
|
|
|
#define BOOT_NORMAL 0xdeadb111
|
2017-07-22 15:18:00 -06:00
|
|
|
|
|
|
|
extern void *g_pfnVectors;
|
|
|
|
extern uint32_t enter_bootloader_mode;
|
|
|
|
|
2019-06-24 11:25:30 -06:00
|
|
|
void jump_to_bootloader(void) {
|
2017-07-22 15:18:00 -06:00
|
|
|
// do enter bootloader
|
2017-07-27 15:29:07 -06:00
|
|
|
enter_bootloader_mode = 0;
|
2017-07-22 15:18:00 -06:00
|
|
|
void (*bootloader)(void) = (void (*)(void)) (*((uint32_t *)0x1fff0004));
|
|
|
|
|
|
|
|
// jump to bootloader
|
2021-04-22 03:24:03 -06:00
|
|
|
enable_interrupts();
|
2017-07-22 15:18:00 -06:00
|
|
|
bootloader();
|
|
|
|
|
2017-07-27 15:29:07 -06:00
|
|
|
// reset on exit
|
|
|
|
enter_bootloader_mode = BOOT_NORMAL;
|
|
|
|
NVIC_SystemReset();
|
2017-07-22 15:18:00 -06:00
|
|
|
}
|
|
|
|
|
2019-06-24 11:25:30 -06:00
|
|
|
void early(void) {
|
2019-08-28 13:53:51 -06:00
|
|
|
// Reset global critical depth
|
2021-04-22 03:24:03 -06:00
|
|
|
disable_interrupts();
|
2019-08-28 13:53:51 -06:00
|
|
|
global_critical_depth = 0;
|
|
|
|
|
2019-12-05 15:19:29 -07:00
|
|
|
// Init register and interrupt tables
|
|
|
|
init_registers();
|
|
|
|
|
2017-07-22 15:18:00 -06:00
|
|
|
// after it's been in the bootloader, things are initted differently, so we reset
|
2019-06-26 17:16:35 -06:00
|
|
|
if ((enter_bootloader_mode != BOOT_NORMAL) &&
|
|
|
|
(enter_bootloader_mode != ENTER_BOOTLOADER_MAGIC) &&
|
|
|
|
(enter_bootloader_mode != ENTER_SOFTLOADER_MAGIC)) {
|
2017-07-27 15:29:07 -06:00
|
|
|
enter_bootloader_mode = BOOT_NORMAL;
|
2017-07-22 15:18:00 -06:00
|
|
|
NVIC_SystemReset();
|
|
|
|
}
|
|
|
|
|
|
|
|
// if wrong chip, reboot
|
|
|
|
volatile unsigned int id = DBGMCU->IDCODE;
|
|
|
|
#ifdef STM32F4
|
2019-07-04 02:04:58 -06:00
|
|
|
if ((id & 0xFFFU) != 0x463U) {
|
|
|
|
enter_bootloader_mode = ENTER_BOOTLOADER_MAGIC;
|
|
|
|
}
|
2017-07-22 15:18:00 -06:00
|
|
|
#else
|
2019-07-04 02:04:58 -06:00
|
|
|
if ((id & 0xFFFU) != 0x411U) {
|
|
|
|
enter_bootloader_mode = ENTER_BOOTLOADER_MAGIC;
|
|
|
|
}
|
2017-07-22 15:18:00 -06:00
|
|
|
#endif
|
|
|
|
|
|
|
|
// setup interrupt table
|
|
|
|
SCB->VTOR = (uint32_t)&g_pfnVectors;
|
|
|
|
|
|
|
|
// early GPIOs float everything
|
|
|
|
RCC->AHB1ENR = RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN;
|
2017-07-24 16:16:22 -06:00
|
|
|
|
2017-07-22 15:18:00 -06:00
|
|
|
GPIOA->MODER = 0; GPIOB->MODER = 0; GPIOC->MODER = 0;
|
|
|
|
GPIOA->ODR = 0; GPIOB->ODR = 0; GPIOC->ODR = 0;
|
|
|
|
GPIOA->PUPDR = 0; GPIOB->PUPDR = 0; GPIOC->PUPDR = 0;
|
|
|
|
|
2019-07-23 16:07:06 -06:00
|
|
|
detect_configuration();
|
|
|
|
detect_board_type();
|
2017-07-22 15:18:00 -06:00
|
|
|
|
|
|
|
if (enter_bootloader_mode == ENTER_BOOTLOADER_MAGIC) {
|
2018-02-27 21:14:27 -07:00
|
|
|
#ifdef PANDA
|
2020-08-26 16:37:50 -06:00
|
|
|
current_board->set_gps_mode(GPS_DISABLED);
|
2018-02-27 21:14:27 -07:00
|
|
|
#endif
|
2019-07-23 16:07:06 -06:00
|
|
|
current_board->set_led(LED_GREEN, 1);
|
2017-07-22 15:18:00 -06:00
|
|
|
jump_to_bootloader();
|
|
|
|
}
|
2020-08-26 16:37:50 -06:00
|
|
|
}
|