/*
|
* Copyright (c) 2020-2021 Shanghai Panchip Microelectronics Co.,Ltd.
|
*
|
* SPDX-License-Identifier: Apache-2.0
|
*/
|
|
#include "signal_slot_manager.h"
|
#include "uart_dfu.h"
|
#include "usb_dfu.h"
|
#include "flash_manager.h"
|
#include "prf_ota.h"
|
#include "boot_config.c"
|
|
static void on_image_load_enter(void)
|
{
|
fm_image_move(FLASH_AREA_BACK_UP_START, FLASH_AREA_IMAGE_START);
|
}
|
|
void sys_clock_init(void)
|
{
|
/* Unlock protected registers */
|
SYS_UnlockReg();
|
|
ANA->LP_FSYN_LDO |= 0X1;
|
|
CLK_XthStartupConfig();
|
CLK->XTH_CTRL |= CLK_XTHCTL_XTH_EN_Msk;
|
CLK_WaitClockReady(CLK_SYS_SRCSEL_XTH);
|
|
CLK_HCLKConfig(0);
|
CLK_SYSCLKConfig(CLK_DPLL_REF_CLKSEL_XTH,CLK_DPLL_OUT_48M);
|
CLK_RefClkSrcConfig(CLK_SYS_SRCSEL_DPLL);
|
|
SYS_LockReg();
|
}
|
|
static void jump_to_app(void)
|
{
|
void (*app_main)();
|
|
uint32_t msp = *(volatile uint32_t*)(FLASH_AREA_IMAGE_START + sizeof(image_header_t));
|
uint32_t addr = *(uint32_t*)(FLASH_AREA_IMAGE_START + sizeof(image_header_t) + 4);
|
app_main = (void(*)())(uint32_t*)addr;
|
|
FLCTL->X_FL_REMAP_ADDR = FLASH_AREA_IMAGE_START + sizeof(image_header_t); /* fmc remap */
|
|
__set_MSP(msp);
|
|
app_main();
|
}
|
|
int main(void)
|
{
|
sys_clock_init();
|
|
/* when checking backup image is valid, the on_image_load_enter function will be handled */
|
ss_connect(0, sig_back_up_is_completed_image, on_image_load_enter);
|
|
#if BOOT_FROM_UART
|
/* when detecting key1 down, the on_uart_dfu_enter function will be handled */
|
ss_connect(1, sig_key1_push_down, on_uart_dfu_enter);
|
#endif
|
|
#if BOOT_FROM_USB
|
/* when dectecting key2 down, the on_usb_dfu_enter function will be handled */
|
ss_connect(2, sig_key2_push_down, on_usb_dfu_enter);
|
#endif
|
|
#if BOOT_FROM_PRF_OTA
|
/* when receive a ota start packet, the on_prf_ota_enter function will be handled */
|
ss_connect(3, sig_ota_start_received, on_prf_ota_enter);
|
#endif
|
|
/* handle all of events related signal fuction*/
|
ss_events_handle();
|
|
/* recovery gpio status that you used to trigger signal */
|
sig_hardware_recovery();
|
|
jump_to_app();
|
|
return 0;
|
}
|