free-dap/platform/same70/startup_same70.c
2020-02-23 14:50:09 -08:00

240 lines
9.8 KiB
C

/*
* Copyright (c) 2017, Alex Taradov <alex@taradov.com>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. 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.
* 3. The name of the author may not 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.
*/
/*- Includes ----------------------------------------------------------------*/
#include "same70.h"
/*- Definitions -------------------------------------------------------------*/
#define DUMMY __attribute__ ((weak, alias ("irq_handler_dummy")))
/*- Prototypes --------------------------------------------------------------*/
void irq_handler_reset(void);
DUMMY void irq_handler_nmi(void);
DUMMY void irq_handler_hard_fault(void);
DUMMY void irq_handler_mm_fault(void);
DUMMY void irq_handler_bus_fault(void);
DUMMY void irq_handler_usage_fault(void);
DUMMY void irq_handler_sv_call(void);
DUMMY void irq_handler_debug_mon(void);
DUMMY void irq_handler_pend_sv(void);
DUMMY void irq_handler_sys_tick(void);
DUMMY void irq_handler_supc(void);
DUMMY void irq_handler_rstc(void);
DUMMY void irq_handler_rtc(void);
DUMMY void irq_handler_rtt(void);
DUMMY void irq_handler_wdt(void);
DUMMY void irq_handler_pmc(void);
DUMMY void irq_handler_efc(void);
DUMMY void irq_handler_uart0(void);
DUMMY void irq_handler_uart1(void);
DUMMY void irq_handler_pioa(void);
DUMMY void irq_handler_piob(void);
DUMMY void irq_handler_pioc(void);
DUMMY void irq_handler_usart0(void);
DUMMY void irq_handler_usart1(void);
DUMMY void irq_handler_usart2(void);
DUMMY void irq_handler_piod(void);
DUMMY void irq_handler_pioe(void);
DUMMY void irq_handler_hsmci(void);
DUMMY void irq_handler_twihs0(void);
DUMMY void irq_handler_twihs1(void);
DUMMY void irq_handler_spi0(void);
DUMMY void irq_handler_ssc(void);
DUMMY void irq_handler_tc0(void);
DUMMY void irq_handler_tc1(void);
DUMMY void irq_handler_tc2(void);
DUMMY void irq_handler_tc3(void);
DUMMY void irq_handler_tc4(void);
DUMMY void irq_handler_tc5(void);
DUMMY void irq_handler_afec0(void);
DUMMY void irq_handler_dacc(void);
DUMMY void irq_handler_pwm0(void);
DUMMY void irq_handler_icm(void);
DUMMY void irq_handler_acc(void);
DUMMY void irq_handler_usbhs(void);
DUMMY void irq_handler_mcan0(void);
DUMMY void irq_handler_mcan1(void);
DUMMY void irq_handler_gmac(void);
DUMMY void irq_handler_afec1(void);
DUMMY void irq_handler_twihs2(void);
DUMMY void irq_handler_spi1(void);
DUMMY void irq_handler_qspi(void);
DUMMY void irq_handler_uart2(void);
DUMMY void irq_handler_uart3(void);
DUMMY void irq_handler_uart4(void);
DUMMY void irq_handler_tc6(void);
DUMMY void irq_handler_tc7(void);
DUMMY void irq_handler_tc8(void);
DUMMY void irq_handler_tc9(void);
DUMMY void irq_handler_tc10(void);
DUMMY void irq_handler_tc11(void);
DUMMY void irq_handler_aes(void);
DUMMY void irq_handler_trng(void);
DUMMY void irq_handler_xdmac(void);
DUMMY void irq_handler_isi(void);
DUMMY void irq_handler_pwm1(void);
DUMMY void irq_handler_sdramc(void);
DUMMY void irq_handler_rswdt(void);
int main(void);
extern void _stack_top(void);
extern unsigned int _etext;
extern unsigned int _data;
extern unsigned int _edata;
extern unsigned int _bss;
extern unsigned int _ebss;
/*- Variables ---------------------------------------------------------------*/
//-----------------------------------------------------------------------------
__attribute__ ((used, section(".vectors")))
void (* const vectors[])(void) =
{
&_stack_top, // 0 - Initial Stack Pointer Value
// Cortex-M7 handlers
irq_handler_reset, // 1 - Reset
irq_handler_nmi, // 2 - NMI
irq_handler_hard_fault, // 3 - Hard Fault
irq_handler_mm_fault, // 4 - MM Fault
irq_handler_bus_fault, // 5 - Bus Fault
irq_handler_usage_fault, // 6 - Usage Fault
0, // 7 - Reserved
0, // 8 - Reserved
0, // 9 - Reserved
0, // 10 - Reserved
irq_handler_sv_call, // 11 - SVCall
irq_handler_debug_mon, // 12 - Debug
0, // 13 - Reserved
irq_handler_pend_sv, // 14 - PendSV
irq_handler_sys_tick, // 15 - SysTick
// Peripheral handlers
irq_handler_supc, // 0 - Supply Controller
irq_handler_rstc, // 1 - Reset Controller
irq_handler_rtc, // 2 - Real Time Clock
irq_handler_rtt, // 3 - Real Time Timer
irq_handler_wdt, // 4 - Watchdog Timer
irq_handler_pmc, // 5 - Power Management Controller
irq_handler_efc, // 6 - Embedded Flash Controller
irq_handler_uart0, // 7 - UART 0
irq_handler_uart1, // 8 - UART 1
0, // 9 - Reserved
irq_handler_pioa, // 10 - Parallel I/O Controller A
irq_handler_piob, // 11 - Parallel I/O Controller B
irq_handler_pioc, // 12 - Parallel I/O Controller C
irq_handler_usart0, // 13 - USART 0
irq_handler_usart1, // 14 - USART 1
irq_handler_usart2, // 15 - USART 2
irq_handler_piod, // 16 - Parallel I/O Controller D
irq_handler_pioe, // 17 - Parallel I/O Controller E
irq_handler_hsmci, // 18 - High Speed Multimedia Card Interface
irq_handler_twihs0, // 19 - Two-wire Interface 0
irq_handler_twihs1, // 20 - Two-wire Interface 1
irq_handler_spi0, // 21 - Serial Peripheral Interface 0
irq_handler_ssc, // 22 - Synchronous Serial Controller
irq_handler_tc0, // 23 - Timer/Counter 0
irq_handler_tc1, // 24 - Timer/Counter 1
irq_handler_tc2, // 25 - Timer/Counter 2
irq_handler_tc3, // 26 - Timer/Counter 3
irq_handler_tc4, // 27 - Timer/Counter 4
irq_handler_tc5, // 28 - Timer/Counter 5
irq_handler_afec0, // 29 - Analog Front End 0
irq_handler_dacc, // 30 - Digital To Analog Converter
irq_handler_pwm0, // 31 - Pulse Width Modulation 0
irq_handler_icm, // 32 - Integrity Check Monitor
irq_handler_acc, // 33 - Analog Comparator
irq_handler_usbhs, // 34 - USB Host / Device Controller
irq_handler_mcan0, // 35 - Controller Area Network Controller 0
0, // 36 - Reserved
irq_handler_mcan1, // 37 - Controller Area Network Controller 1
0, // 38 - Reserved
irq_handler_gmac, // 39 - Ethernet MAC
irq_handler_afec1, // 40 - Analog Front End 1
irq_handler_twihs2, // 41 - Two-wire Interface 2
irq_handler_spi1, // 42 - Serial Peripheral Interface 1
irq_handler_qspi, // 43 - Quad I/O Serial Peripheral Interface
irq_handler_uart2, // 44 - UART 2
irq_handler_uart3, // 45 - UART 3
irq_handler_uart4, // 46 - UART 4
irq_handler_tc6, // 47 - Timer/Counter 6
irq_handler_tc7, // 48 - Timer/Counter 7
irq_handler_tc8, // 49 - Timer/Counter 8
irq_handler_tc9, // 50 - Timer/Counter 9
irq_handler_tc10, // 51 - Timer/Counter 10
irq_handler_tc11, // 52 - Timer/Counter 11
0, // 53 - Reserved
0, // 54 - Reserved
0, // 55 - Reserved
irq_handler_aes, // 56 - Advanced Encryption Standard (AES) Controller
irq_handler_trng, // 57 - True Random Number Generator
irq_handler_xdmac, // 58 - DMA Controller
irq_handler_isi, // 59 - Image Sensor Interface Controller
irq_handler_pwm1, // 60 - Pulse Width Modulation 1
0, // 61 - Reserved
irq_handler_sdramc, // 62 - SDRAM Controller
irq_handler_rswdt, // 63 - Reinforced Secure Watchdog Timer
};
/*- Implementations ---------------------------------------------------------*/
//-----------------------------------------------------------------------------
void irq_handler_reset(void)
{
unsigned int *src, *dst;
src = &_etext;
dst = &_data;
while (dst < &_edata)
*dst++ = *src++;
dst = &_bss;
while (dst < &_ebss)
*dst++ = 0;
// Enable FPU
SCB->CPACR |= (0xf << 20);
__DSB();
__ISB();
SCB->VTOR = (uint32_t)vectors;
main();
while (1);
}
//-----------------------------------------------------------------------------
void irq_handler_dummy(void)
{
while (1);
}