mirror of
https://github.com/status-im/hardwallet-bootloader.git
synced 2025-02-21 11:18:14 +00:00
51 lines
1.1 KiB
C
51 lines
1.1 KiB
C
#include "main.h"
|
|
#include "flash.h"
|
|
|
|
int main(void) {
|
|
if (!check_firmware(UPGRADE_FW_START)) {
|
|
upgrade_firmware();
|
|
} else if (check_firmware(FIRMWARE_START)) {
|
|
factory_reset();
|
|
}
|
|
|
|
run_firmware();
|
|
}
|
|
|
|
int check_firmware(uintptr_t addr) {
|
|
if(*UINT32_PTR(addr) != FW_MAGIC) {
|
|
return 1;
|
|
}
|
|
|
|
//TODO: verify signature!!!
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
void _load_firmware(uintptr_t newfw, uint8_t newfw_bank, uint8_t newfw_page) {
|
|
flash_unlock();
|
|
|
|
do {
|
|
flash_erase(FLASH_BANK1, FIRMWARE_FIRST_PAGE, FIRMWARE_PAGE_COUNT);
|
|
flash_copy(UINT32_PTR(newfw), UINT32_PTR(FIRMWARE_START), UINT32_PTR(newfw)[1]);
|
|
} while(check_firmware(FIRMWARE_START) != 0);
|
|
|
|
flash_erase(newfw_bank, newfw_page, FIRMWARE_PAGE_COUNT);
|
|
flash_lock();
|
|
}
|
|
|
|
void upgrade_firmware() {
|
|
_load_firmware(UPGRADE_FW_START, FLASH_BANK2, UPGRADE_FW_FIRST_PAGE);
|
|
}
|
|
|
|
void run_firmware(void) {
|
|
uint32_t* fw_entry = UINT32_PTR(FIRMWARE_CODE_START);
|
|
SCB->VTOR = (uint32_t) fw_entry;
|
|
__set_MSP(fw_entry[0]);
|
|
((void (*)(void))fw_entry[1])();
|
|
}
|
|
|
|
void factory_reset(void) {
|
|
_load_firmware(RECOVERY_FW_START, FLASH_BANK1, RECOVERY_FW_FIRST_PAGE);
|
|
}
|