| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- // Copyright (C) 2016 Michael McMaster <michael@codesrc.com>
- //
- // This file is part of SCSI2SD.
- //
- // SCSI2SD is free software: you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // SCSI2SD is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License
- // along with SCSI2SD. If not, see <http://www.gnu.org/licenses/>.
- #include "bootloader.h"
- #ifdef STM32F2xx
- #include "stm32f2xx_hal.h"
- #endif
- #ifdef STM32F4xx
- #include "stm32f4xx_hal.h"
- #endif
- #define MAGIC 0xDEADBEEF
- // "System Memory" address of the bootloader. Specific to stm32f2xxxx
- #define SYSMEM_RESET_VECTOR 0x1fff0000
- extern void OrigSystemInit(void);
- // This symbol is in a section of ram that isn't initialised by the
- // Reset_Handler that calls SystemInit.
- static uint32_t resetMagic __attribute__ ((section("bootloaderMagic")));
- // Override STM32CubeMX supplied SystemInit method.
- void SystemInit(void)
- {
- if (resetMagic == MAGIC)
- {
- void (*bootloader)(void) = (void (*)(void)) (*(uint32_t*)(SYSMEM_RESET_VECTOR + 4));
- resetMagic = 0;
- __set_MSP(* ((uint32_t*)SYSMEM_RESET_VECTOR));
- bootloader();
- while (1) {}
- }
- else
- {
- OrigSystemInit();
- }
- }
- void s2s_enterBootloader()
- {
- resetMagic = MAGIC;
- NVIC_SystemReset();
- }
|