build: Add infrastructure for the bootloader program and libcommon.
[gps-watch.git] / src / common / startup.c
diff --git a/src/common/startup.c b/src/common/startup.c
new file mode 100644 (file)
index 0000000..daa8906
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 2019 Tilman Sauerbeck (tilman at code-monkey de)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <stdint.h>
+
+void Reset_Handler (void);
+void NMI_Handler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void HardFault_Handler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void SVC_Handler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void PendSV_Handler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void SysTick_Handler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+
+void DMA0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void DMA1_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void DMA2_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void DMA3_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void FTFA_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void PMC_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void LLWU_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void I2C0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void I2C1_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void SPI0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void SPI1_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void UART0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void UART1_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void UART2_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void ADC0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void CMP0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void TPM0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void TPM1_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void TPM2_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void RTC_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void RTC_Seconds_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void PIT_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void I2S0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void USB0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void DAC0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void TSI0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void MCG_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void LPTMR0_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void PORTA_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+void PORTC_PORTD_IRQHandler (void) __attribute__ ((weak, alias("Dummy_Handler")));
+
+extern void _start (void) __attribute__((noreturn));
+
+extern uint32_t __etext;
+extern uint32_t __data_start__;
+extern uint32_t __data_end__;
+extern uint32_t __bss_start__;
+extern uint32_t __bss_end__;
+extern uint32_t __StackTop;
+
+__attribute__ ((section(".vectors")))
+const void * __Vectors[48] =
+{
+       &__StackTop, /* Initial stack pointer */
+
+       (void *) Reset_Handler,
+       (void *) NMI_Handler,
+       (void *) HardFault_Handler,
+       (void *) (0UL), /* Reserved */
+       (void *) (0UL), /* Reserved */
+       (void *) (0UL), /* Reserved */
+       (void *) (0UL), /* Reserved */
+       (void *) (0UL), /* Reserved */
+       (void *) (0UL), /* Reserved */
+       (void *) (0UL), /* Reserved */
+       (void *) SVC_Handler,
+       (void *) (0UL), /* Reserved */
+       (void *) (0UL), /* Reserved */
+       (void *) PendSV_Handler,
+       (void *) SysTick_Handler,
+
+       (void *) DMA0_IRQHandler,
+       (void *) DMA1_IRQHandler,
+       (void *) DMA2_IRQHandler,
+       (void *) DMA3_IRQHandler,
+       (void *) (0UL), /* Reserved */
+       (void *) FTFA_IRQHandler,
+       (void *) PMC_IRQHandler,
+       (void *) LLWU_IRQHandler,
+       (void *) I2C0_IRQHandler,
+       (void *) I2C1_IRQHandler,
+       (void *) SPI0_IRQHandler,
+       (void *) SPI1_IRQHandler,
+       (void *) UART0_IRQHandler,
+       (void *) UART1_IRQHandler,
+       (void *) UART2_IRQHandler,
+       (void *) ADC0_IRQHandler,
+       (void *) CMP0_IRQHandler,
+       (void *) TPM0_IRQHandler,
+       (void *) TPM1_IRQHandler,
+       (void *) TPM2_IRQHandler,
+       (void *) RTC_IRQHandler,
+       (void *) RTC_Seconds_IRQHandler,
+       (void *) PIT_IRQHandler,
+       (void *) I2S0_IRQHandler,
+       (void *) USB0_IRQHandler,
+       (void *) DAC0_IRQHandler,
+       (void *) TSI0_IRQHandler,
+       (void *) MCG_IRQHandler,
+       (void *) LPTMR0_IRQHandler,
+       (void *) (0UL), /* Reserved */
+       (void *) PORTA_IRQHandler,
+       (void *) PORTC_PORTD_IRQHandler,
+};
+
+void
+Reset_Handler (void)
+{
+       uint32_t *src, *dst;
+
+       src = &__etext;
+       dst = &__data_start__;
+
+       /* Initialize data. */
+       while (dst < &__data_end__)
+               *dst++ = *src++;
+
+       /* Clear bss. */
+       for (dst = &__bss_start__; dst < &__bss_end__; dst++)
+               *dst = 0;
+
+       _start();
+}
+
+void
+Dummy_Handler (void)
+{
+       for (;;) {
+       }
+}