Files
mkrtos-real/mkrtos_bootstrap/bsp/STM32F2/stm32_start.c
2024-10-17 23:31:20 +08:00

116 lines
3.0 KiB
C

#include <mk_sys.h>
#include <util.h>
#include <boot_info.h>
//! 内核镜像的开始地址
#define KERNEL_IMG_START_ADDR (CONFIG_SYS_TEXT_ADDR + CONFIG_BOOTSTRAP_TEXT_SIZE + CONFIG_DTBO_TEXT_SIZE)
static boot_info_t boot_info = {
.flash_layer = {
/*flash布局*/
.flash_layer_list = {
{
.st_addr = CONFIG_SYS_TEXT_ADDR, /*bootstrap*/
.size = CONFIG_BOOTSTRAP_TEXT_SIZE,
.name = "bootstrap",
},
{
.st_addr = CONFIG_SYS_TEXT_ADDR + CONFIG_BOOTSTRAP_TEXT_SIZE, /*dtbo*/
.size = CONFIG_DTBO_TEXT_SIZE,
.name = "dtbo",
},
{
.st_addr = KERNEL_IMG_START_ADDR, /*kernel*/
.size = CONFIG_KNL_TEXT_SIZE,
.name = "kernel",
},
{
.st_addr = CONFIG_SYS_TEXT_ADDR + CONFIG_BOOTSTRAP_TEXT_SIZE + CONFIG_KNL_TEXT_SIZE + CONFIG_DTBO_TEXT_SIZE, /*bootfs*/
.size = CONFIG_SYS_TEXT_SIZE - (CONFIG_BOOTSTRAP_TEXT_SIZE + CONFIG_KNL_TEXT_SIZE + CONFIG_DTBO_TEXT_SIZE),
.name = "bootfs",
},
},
.flash_layer_num = 4,
}, /*flash布局*/
.flash = {
.flash_list = {
{
.addr = CONFIG_SYS_TEXT_ADDR,
.size = CONFIG_SYS_TEXT_SIZE,
.is_sys_mem = 1,
.speed = 0,
},
},
.flash_num = 1,
},
.mem = {
.mem_list = {
{
.addr = CONFIG_SYS_DATA_ADDR,
.size = CONFIG_SYS_DATA_SIZE,
.is_sys_mem = 1,
.speed = 0,
}
},
.mem_num = 2,
},
};
static void mem_init(void)
{
/*Nothing.*/
}
void jump2kernel(addr_t cpio_start, addr_t cpio_end)
{
uint32_t jump_addr;
mem_init();
//!< 检查栈顶地址是否合法,即检查此段Flash中是否已有APP程序
if (((*(__IO uint32_t *)KERNEL_IMG_START_ADDR) & 0x2FFE0000) == CONFIG_SYS_DATA_ADDR)
{
__set_PRIMASK(1);
/* disable UART */
// USART_Reset(USART1);
/* disable GPIO */
// GPIO_Reset(GPIOA);
/* disable RCC */
// RCC_Reset();
/* disable EXTI */
// EXTI_Reset();
/* disable and clean up all interrupts. */
{
int i;
for (i = 0; i < 8; i++)
{
/* disable interrupts. */
NVIC->ICER[i] = 0xFFFFFFFF;
/* clean up interrupts flags. */
NVIC->ICPR[i] = 0xFFFFFFFF;
}
}
/* reset register values */
__set_BASEPRI(0);
__set_FAULTMASK(0);
/* initialize main stack pointer */
// __set_MSP(*(__IO uint32_t *)KERNEL_IMG_START_ADDR);
__set_CONTROL(0);
__ISB();
__disable_irq();
/* Set new vector table pointer */
jump_addr = *(__IO uint32_t *)(KERNEL_IMG_START_ADDR + 4);
_main = (void *)jump_addr;
_main(&boot_info);
}
}