startup_same70.c 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. /*
  2. * Copyright (c) 2017, Alex Taradov <alex@taradov.com>
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright notice,
  9. * this list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright
  11. * notice, this list of conditions and the following disclaimer in the
  12. * documentation and/or other materials provided with the distribution.
  13. * 3. The name of the author may not be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  17. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  18. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  19. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  20. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  21. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  22. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  23. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  24. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  25. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  26. * POSSIBILITY OF SUCH DAMAGE.
  27. */
  28. /*- Includes ----------------------------------------------------------------*/
  29. #include "same70.h"
  30. /*- Definitions -------------------------------------------------------------*/
  31. #define DUMMY __attribute__ ((weak, alias ("irq_handler_dummy")))
  32. /*- Prototypes --------------------------------------------------------------*/
  33. void irq_handler_reset(void);
  34. DUMMY void irq_handler_nmi(void);
  35. DUMMY void irq_handler_hard_fault(void);
  36. DUMMY void irq_handler_mm_fault(void);
  37. DUMMY void irq_handler_bus_fault(void);
  38. DUMMY void irq_handler_usage_fault(void);
  39. DUMMY void irq_handler_sv_call(void);
  40. DUMMY void irq_handler_debug_mon(void);
  41. DUMMY void irq_handler_pend_sv(void);
  42. DUMMY void irq_handler_sys_tick(void);
  43. DUMMY void irq_handler_supc(void);
  44. DUMMY void irq_handler_rstc(void);
  45. DUMMY void irq_handler_rtc(void);
  46. DUMMY void irq_handler_rtt(void);
  47. DUMMY void irq_handler_wdt(void);
  48. DUMMY void irq_handler_pmc(void);
  49. DUMMY void irq_handler_efc(void);
  50. DUMMY void irq_handler_uart0(void);
  51. DUMMY void irq_handler_uart1(void);
  52. DUMMY void irq_handler_pioa(void);
  53. DUMMY void irq_handler_piob(void);
  54. DUMMY void irq_handler_pioc(void);
  55. DUMMY void irq_handler_usart0(void);
  56. DUMMY void irq_handler_usart1(void);
  57. DUMMY void irq_handler_usart2(void);
  58. DUMMY void irq_handler_piod(void);
  59. DUMMY void irq_handler_pioe(void);
  60. DUMMY void irq_handler_hsmci(void);
  61. DUMMY void irq_handler_twihs0(void);
  62. DUMMY void irq_handler_twihs1(void);
  63. DUMMY void irq_handler_spi0(void);
  64. DUMMY void irq_handler_ssc(void);
  65. DUMMY void irq_handler_tc0(void);
  66. DUMMY void irq_handler_tc1(void);
  67. DUMMY void irq_handler_tc2(void);
  68. DUMMY void irq_handler_tc3(void);
  69. DUMMY void irq_handler_tc4(void);
  70. DUMMY void irq_handler_tc5(void);
  71. DUMMY void irq_handler_afec0(void);
  72. DUMMY void irq_handler_dacc(void);
  73. DUMMY void irq_handler_pwm0(void);
  74. DUMMY void irq_handler_icm(void);
  75. DUMMY void irq_handler_acc(void);
  76. DUMMY void irq_handler_usbhs(void);
  77. DUMMY void irq_handler_mcan0(void);
  78. DUMMY void irq_handler_mcan1(void);
  79. DUMMY void irq_handler_gmac(void);
  80. DUMMY void irq_handler_afec1(void);
  81. DUMMY void irq_handler_twihs2(void);
  82. DUMMY void irq_handler_spi1(void);
  83. DUMMY void irq_handler_qspi(void);
  84. DUMMY void irq_handler_uart2(void);
  85. DUMMY void irq_handler_uart3(void);
  86. DUMMY void irq_handler_uart4(void);
  87. DUMMY void irq_handler_tc6(void);
  88. DUMMY void irq_handler_tc7(void);
  89. DUMMY void irq_handler_tc8(void);
  90. DUMMY void irq_handler_tc9(void);
  91. DUMMY void irq_handler_tc10(void);
  92. DUMMY void irq_handler_tc11(void);
  93. DUMMY void irq_handler_aes(void);
  94. DUMMY void irq_handler_trng(void);
  95. DUMMY void irq_handler_xdmac(void);
  96. DUMMY void irq_handler_isi(void);
  97. DUMMY void irq_handler_pwm1(void);
  98. DUMMY void irq_handler_sdramc(void);
  99. DUMMY void irq_handler_rswdt(void);
  100. int main(void);
  101. extern void _stack_top(void);
  102. extern unsigned int _etext;
  103. extern unsigned int _data;
  104. extern unsigned int _edata;
  105. extern unsigned int _bss;
  106. extern unsigned int _ebss;
  107. /*- Variables ---------------------------------------------------------------*/
  108. //-----------------------------------------------------------------------------
  109. __attribute__ ((used, section(".vectors")))
  110. void (* const vectors[])(void) =
  111. {
  112. &_stack_top, // 0 - Initial Stack Pointer Value
  113. // Cortex-M7 handlers
  114. irq_handler_reset, // 1 - Reset
  115. irq_handler_nmi, // 2 - NMI
  116. irq_handler_hard_fault, // 3 - Hard Fault
  117. irq_handler_mm_fault, // 4 - MM Fault
  118. irq_handler_bus_fault, // 5 - Bus Fault
  119. irq_handler_usage_fault, // 6 - Usage Fault
  120. 0, // 7 - Reserved
  121. 0, // 8 - Reserved
  122. 0, // 9 - Reserved
  123. 0, // 10 - Reserved
  124. irq_handler_sv_call, // 11 - SVCall
  125. irq_handler_debug_mon, // 12 - Debug
  126. 0, // 13 - Reserved
  127. irq_handler_pend_sv, // 14 - PendSV
  128. irq_handler_sys_tick, // 15 - SysTick
  129. // Peripheral handlers
  130. irq_handler_supc, // 0 - Supply Controller
  131. irq_handler_rstc, // 1 - Reset Controller
  132. irq_handler_rtc, // 2 - Real Time Clock
  133. irq_handler_rtt, // 3 - Real Time Timer
  134. irq_handler_wdt, // 4 - Watchdog Timer
  135. irq_handler_pmc, // 5 - Power Management Controller
  136. irq_handler_efc, // 6 - Embedded Flash Controller
  137. irq_handler_uart0, // 7 - UART 0
  138. irq_handler_uart1, // 8 - UART 1
  139. 0, // 9 - Reserved
  140. irq_handler_pioa, // 10 - Parallel I/O Controller A
  141. irq_handler_piob, // 11 - Parallel I/O Controller B
  142. irq_handler_pioc, // 12 - Parallel I/O Controller C
  143. irq_handler_usart0, // 13 - USART 0
  144. irq_handler_usart1, // 14 - USART 1
  145. irq_handler_usart2, // 15 - USART 2
  146. irq_handler_piod, // 16 - Parallel I/O Controller D
  147. irq_handler_pioe, // 17 - Parallel I/O Controller E
  148. irq_handler_hsmci, // 18 - High Speed Multimedia Card Interface
  149. irq_handler_twihs0, // 19 - Two-wire Interface 0
  150. irq_handler_twihs1, // 20 - Two-wire Interface 1
  151. irq_handler_spi0, // 21 - Serial Peripheral Interface 0
  152. irq_handler_ssc, // 22 - Synchronous Serial Controller
  153. irq_handler_tc0, // 23 - Timer/Counter 0
  154. irq_handler_tc1, // 24 - Timer/Counter 1
  155. irq_handler_tc2, // 25 - Timer/Counter 2
  156. irq_handler_tc3, // 26 - Timer/Counter 3
  157. irq_handler_tc4, // 27 - Timer/Counter 4
  158. irq_handler_tc5, // 28 - Timer/Counter 5
  159. irq_handler_afec0, // 29 - Analog Front End 0
  160. irq_handler_dacc, // 30 - Digital To Analog Converter
  161. irq_handler_pwm0, // 31 - Pulse Width Modulation 0
  162. irq_handler_icm, // 32 - Integrity Check Monitor
  163. irq_handler_acc, // 33 - Analog Comparator
  164. irq_handler_usbhs, // 34 - USB Host / Device Controller
  165. irq_handler_mcan0, // 35 - Controller Area Network Controller 0
  166. 0, // 36 - Reserved
  167. irq_handler_mcan1, // 37 - Controller Area Network Controller 1
  168. 0, // 38 - Reserved
  169. irq_handler_gmac, // 39 - Ethernet MAC
  170. irq_handler_afec1, // 40 - Analog Front End 1
  171. irq_handler_twihs2, // 41 - Two-wire Interface 2
  172. irq_handler_spi1, // 42 - Serial Peripheral Interface 1
  173. irq_handler_qspi, // 43 - Quad I/O Serial Peripheral Interface
  174. irq_handler_uart2, // 44 - UART 2
  175. irq_handler_uart3, // 45 - UART 3
  176. irq_handler_uart4, // 46 - UART 4
  177. irq_handler_tc6, // 47 - Timer/Counter 6
  178. irq_handler_tc7, // 48 - Timer/Counter 7
  179. irq_handler_tc8, // 49 - Timer/Counter 8
  180. irq_handler_tc9, // 50 - Timer/Counter 9
  181. irq_handler_tc10, // 51 - Timer/Counter 10
  182. irq_handler_tc11, // 52 - Timer/Counter 11
  183. 0, // 53 - Reserved
  184. 0, // 54 - Reserved
  185. 0, // 55 - Reserved
  186. irq_handler_aes, // 56 - Advanced Encryption Standard (AES) Controller
  187. irq_handler_trng, // 57 - True Random Number Generator
  188. irq_handler_xdmac, // 58 - DMA Controller
  189. irq_handler_isi, // 59 - Image Sensor Interface Controller
  190. irq_handler_pwm1, // 60 - Pulse Width Modulation 1
  191. 0, // 61 - Reserved
  192. irq_handler_sdramc, // 62 - SDRAM Controller
  193. irq_handler_rswdt, // 63 - Reinforced Secure Watchdog Timer
  194. };
  195. /*- Implementations ---------------------------------------------------------*/
  196. //-----------------------------------------------------------------------------
  197. void irq_handler_reset(void)
  198. {
  199. unsigned int *src, *dst;
  200. src = &_etext;
  201. dst = &_data;
  202. while (dst < &_edata)
  203. *dst++ = *src++;
  204. dst = &_bss;
  205. while (dst < &_ebss)
  206. *dst++ = 0;
  207. // Enable FPU
  208. SCB->CPACR |= (0xf << 20);
  209. __DSB();
  210. __ISB();
  211. SCB->VTOR = (uint32_t)vectors;
  212. main();
  213. while (1);
  214. }
  215. //-----------------------------------------------------------------------------
  216. void irq_handler_dummy(void)
  217. {
  218. while (1);
  219. }