diff options
Diffstat (limited to 'KSDK_1.2.0/platform/devices/startup.c')
-rwxr-xr-x | KSDK_1.2.0/platform/devices/startup.c | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/KSDK_1.2.0/platform/devices/startup.c b/KSDK_1.2.0/platform/devices/startup.c new file mode 100755 index 0000000..b89e7fc --- /dev/null +++ b/KSDK_1.2.0/platform/devices/startup.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * o Redistributions of source code must retain the above copyright notice, this list + * of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * o Neither the name of Freescale Semiconductor, Inc. nor the names of its + * contributors may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "startup.h" +#include "fsl_device_registers.h" + +#if (defined(__ICCARM__)) + #pragma section = ".data" + #pragma section = ".data_init" + #pragma section = ".bss" +#endif + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*FUNCTION********************************************************************** + * + * Function Name : init_data_bss + * Description : Make necessary initializations for RAM. + * - Copy initialized data from ROM to RAM. + * - Clear the zero-initialized data section. + * - Copy the vector table from ROM to RAM. This could be an option. + * + * Tool Chians: + * __GNUC__ : GCC + * __CC_ARM : KEIL + * __ICCARM__ : IAR + * + *END**************************************************************************/ +void init_data_bss(void) +{ + uint32_t n; + + /* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */ +#if defined(__CC_ARM) + extern uint32_t Image$$VECTOR_ROM$$Base[]; + extern uint32_t Image$$VECTOR_RAM$$Base[]; + extern uint32_t Image$$RW_m_data$$Base[]; + + #define __VECTOR_TABLE Image$$VECTOR_ROM$$Base + #define __VECTOR_RAM Image$$VECTOR_RAM$$Base + #define __RAM_VECTOR_TABLE_SIZE (((uint32_t)Image$$RW_m_data$$Base - (uint32_t)Image$$VECTOR_RAM$$Base)) +#elif defined(__ICCARM__) + extern uint32_t __RAM_VECTOR_TABLE_SIZE[]; + extern uint32_t __VECTOR_TABLE[]; + extern uint32_t __VECTOR_RAM[]; +#elif defined(__GNUC__) + extern uint32_t __VECTOR_TABLE[]; + extern uint32_t __VECTOR_RAM[]; + extern uint32_t __RAM_VECTOR_TABLE_SIZE_BYTES[]; + uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES); +#endif + + if (__VECTOR_RAM != __VECTOR_TABLE) + { + /* Copy the vector table from ROM to RAM */ + for (n = 0; n < ((uint32_t)__RAM_VECTOR_TABLE_SIZE)/sizeof(uint32_t); n++) + { + __VECTOR_RAM[n] = __VECTOR_TABLE[n]; + } + /* Point the VTOR to the position of vector table */ + SCB->VTOR = (uint32_t)__VECTOR_RAM; + } + else + { + /* Point the VTOR to the position of vector table */ + SCB->VTOR = (uint32_t)__VECTOR_TABLE; + } + +#if !defined(__CC_ARM) && !defined(__ICCARM__) + + /* Declare pointers for various data sections. These pointers + * are initialized using values pulled in from the linker file */ + uint8_t * data_ram, * data_rom, * data_rom_end; + uint8_t * bss_start, * bss_end; + + /* Get the addresses for the .data section (initialized data section) */ +#if defined(__GNUC__) + extern uint32_t __DATA_ROM[]; + extern uint32_t __DATA_RAM[]; + extern char __DATA_END[]; + data_ram = (uint8_t *)__DATA_RAM; + data_rom = (uint8_t *)__DATA_ROM; + data_rom_end = (uint8_t *)__DATA_END; + n = data_rom_end - data_rom; +#endif + + /* Copy initialized data from ROM to RAM */ + while (n--) + { + *data_ram++ = *data_rom++; + } + + /* Get the addresses for the .bss section (zero-initialized data) */ +#if defined(__GNUC__) + extern char __START_BSS[]; + extern char __END_BSS[]; + bss_start = (uint8_t *)__START_BSS; + bss_end = (uint8_t *)__END_BSS; +#endif + + /* Clear the zero-initialized data section */ + n = bss_end - bss_start; + while(n--) + { + *bss_start++ = 0; + } +#endif /* !__CC_ARM && !__ICCARM__*/ +} + +/******************************************************************************* + * EOF + ******************************************************************************/ + |