118 lines
3.3 KiB
C
118 lines
3.3 KiB
C
/*******************************************************************************
|
|
*
|
|
* Copyright 2013 - 2016, Freescale Semiconductor, Inc.
|
|
* Copyright 2016-2019 NXP
|
|
*
|
|
* This software is owned or controlled by NXP and may only be used
|
|
* strictly in accordance with the applicable license terms. By expressly
|
|
* accepting such terms or by downloading, installing, activating and/or
|
|
* otherwise using the software, you are agreeing that you have read, and
|
|
* that you agree to comply with and are bound by, such license terms. If
|
|
* you do not agree to be bound by the applicable license terms, then you
|
|
* may not retain, install, activate or otherwise use the software.
|
|
*
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#include "safety_config.h"
|
|
|
|
#pragma section = ".data"
|
|
#pragma section = ".data_init"
|
|
#pragma section = ".safety_ram"
|
|
#pragma section = ".safety_ram_init"
|
|
#pragma section = ".bss"
|
|
|
|
/*******************************************************************************
|
|
* Prototypes
|
|
******************************************************************************/
|
|
void common_startup(void);
|
|
void write_vtor(int32_t);
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
/*!
|
|
* @brief Initialization of RAM sections.
|
|
*
|
|
* @param void
|
|
*
|
|
* @return None
|
|
*/
|
|
void common_startup(void)
|
|
{
|
|
/* Set the IVT address in SCB */
|
|
extern uint32_t __VECTOR_TABLE[];
|
|
write_vtor((uint32_t)__VECTOR_TABLE);
|
|
|
|
#if (__FPU_PRESENT)
|
|
SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access */
|
|
#endif
|
|
|
|
/* Declare a counter we'll use in all of the copy loops */
|
|
uint32_t SectionLen;
|
|
uint32_t *data_ram;
|
|
uint32_t *data_rom;
|
|
uint32_t *data_rom_end;
|
|
|
|
/* Get the addresses for the .data section (initialized data section) */
|
|
data_ram = __section_begin(".data");
|
|
data_rom = __section_begin(".data_init");
|
|
data_rom_end = __section_end(".data_init");
|
|
|
|
/* Copy initialized data from ROM to RAM */
|
|
SectionLen = data_rom_end - data_rom; /* This case in number of adress*/
|
|
while (SectionLen--)
|
|
{
|
|
*data_ram++ = *data_rom++;
|
|
#ifdef WATCHDOG_ON
|
|
Watchdog_refresh;
|
|
#endif
|
|
}
|
|
|
|
/* Get the addresses for the .safety_ram section (initialized safety_ram section) */
|
|
data_ram = __section_begin(".safety_ram");
|
|
data_rom = __section_begin(".safety_ram_init");
|
|
data_rom_end = __section_end(".safety_ram_init");
|
|
/* Copy initialized data from ROM to RAM */
|
|
SectionLen = data_rom_end - data_rom; /* This case in number of adress*/
|
|
while (SectionLen--)
|
|
{
|
|
*data_ram++ = *data_rom++;
|
|
#ifdef WATCHDOG_ON
|
|
Watchdog_refresh;
|
|
#endif
|
|
}
|
|
|
|
/* Get the addresses for the .bss section (zero-initialized data) */
|
|
uint32_t *bss_start, *bss_end;
|
|
|
|
bss_start = __section_begin(".bss");
|
|
bss_end = __section_end(".bss");
|
|
|
|
SectionLen = bss_end - bss_start;
|
|
while (SectionLen--)
|
|
{
|
|
*bss_start++ = 0;
|
|
#ifdef WATCHDOG_ON
|
|
Watchdog_refresh;
|
|
#endif
|
|
}
|
|
|
|
#ifdef WATCHDOG_ON
|
|
Watchdog_refresh;
|
|
#endif
|
|
}
|
|
|
|
/*!
|
|
* @brief write to VTOR register
|
|
*
|
|
* @param void
|
|
*
|
|
* @return None
|
|
*/
|
|
void write_vtor(int32_t vtor)
|
|
{
|
|
unsigned long *pVTOR = (unsigned long *)0xE000ED08;
|
|
*pVTOR = vtor;
|
|
}
|