startup_gcc.S 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2017-01-01 Urey first version
  9. */
  10. #undef VIC_TSPR
  11. #define VIC_TSPR 0xE000EC10
  12. #ifndef CONFIG_SEPARATE_IRQ_SP
  13. #define CONFIG_SEPARATE_IRQ_SP 1
  14. #endif
  15. #ifndef CONFIG_ARCH_INTERRUPTSTACK
  16. #define CONFIG_ARCH_INTERRUPTSTACK 1024
  17. #endif
  18. .import SysTick_Handler
  19. .import PendSV_Handler
  20. .section .vectors
  21. .align 10
  22. .globl __Vectors
  23. .type __Vectors, @object
  24. __Vectors:
  25. .long Reset_Handler /* 0: Reset Handler */
  26. .rept 15
  27. .long Default_Handler /* 60 0x40 */
  28. .endr /* 64 0x40 */
  29. .long Default_Handler /* 64 0x44 */
  30. .rept 5
  31. .long Default_Handler /* 88 0x58 */
  32. .endr /* 92 0x5C */
  33. .long PendSV_Handler /* 92 0x5C */
  34. .rept 9
  35. .long Default_Handler /* 128 0x80 */
  36. .endr
  37. /* External interrupts */
  38. .long GPIOA_IRQHandler /* 32# 0: GPIOA */ /*128 0x80 */
  39. .long SysTick_Handler /* 1: System Tick */
  40. .long TIMA0_IRQHandler /* 2: TimerA0 */
  41. .long TIMA1_IRQHandler /* 3: TimerA1 */
  42. .long Default_Handler
  43. .long WDT_IRQHandler /* 5: WDT */
  44. .long USART0_IRQHandler /* 6: UART0 */
  45. .long USART1_IRQHandler /* 0x27 39 7: UART1 */
  46. .long USART2_IRQHandler /* 8: UART2 */
  47. .long I2C0_IRQHandler /* 9: I2C0 */
  48. .long I2C1_IRQHandler /* 10: I2C1 */
  49. .long SPI1_IRQHandler /* 11: SPI1 */
  50. .long SPI0_IRQHandler /* 12: SPI0 */
  51. .long RTC_IRQHandler /* 13: RTC */
  52. .long Default_Handler
  53. .long Default_Handler
  54. .long Default_Handler
  55. .long DMAC_IRQHandler /* 17: DMAC */
  56. .long Default_Handler
  57. .long PWM_IRQHandler /* 19: PWM */
  58. .long Default_Handler
  59. .long USART3_IRQHandler /* 21: UART3 */
  60. .long Default_Handler
  61. .long TIMB0_IRQHandler /* 23: TimerB0 */
  62. .long TIMB1_IRQHandler /* 24: TimerB1 */
  63. .long Default_Handler
  64. .long AES_IRQHandler /* 26: AES */
  65. .long GPIOB_IRQHandler /* 27: GPIOB */
  66. .long Default_Handler
  67. .long SHA_IRQHandler /* 29: SHA */
  68. .size __Vectors, . - __Vectors
  69. .text
  70. .align 1
  71. _start:
  72. .text
  73. .align 1
  74. .globl Reset_Handler
  75. .type Reset_Handler, %function
  76. Reset_Handler:
  77. /* under normal circumstances, it should not be opened */
  78. #ifndef CONFIG_SYSTEM_SECURE
  79. lrw r0, 0x80000000
  80. mtcr r0, psr
  81. #endif
  82. /* Initialize the normal stack pointer from the linker definition. */
  83. lrw a1, __StackTop
  84. mov sp, a1
  85. /*
  86. * The ranges of copy from/to are specified by following symbols
  87. * __etext: LMA of start of the section to copy from. Usually end of text
  88. * __data_start__: VMA of start of the section to copy to
  89. * __data_end__: VMA of end of the section to copy to
  90. *
  91. * All addresses must be aligned to 4 bytes boundary.
  92. */
  93. lrw r1, __erodata
  94. lrw r2, __data_start__
  95. lrw r3, __data_end__
  96. subu r3, r2
  97. cmpnei r3, 0
  98. bf .L_loop0_done
  99. .L_loop0:
  100. ldw r0, (r1, 0)
  101. stw r0, (r2, 0)
  102. addi r1, 4
  103. addi r2, 4
  104. subi r3, 4
  105. cmpnei r3, 0
  106. bt .L_loop0
  107. .L_loop0_done:
  108. /*
  109. * The BSS section is specified by following symbols
  110. * __bss_start__: start of the BSS section.
  111. * __bss_end__: end of the BSS section.
  112. *
  113. * Both addresses must be aligned to 4 bytes boundary.
  114. */
  115. lrw r1, __bss_start__
  116. lrw r2, __bss_end__
  117. movi r0, 0
  118. subu r2, r1
  119. cmpnei r2, 0
  120. bf .L_loop1_done
  121. .L_loop1:
  122. stw r0, (r1, 0)
  123. addi r1, 4
  124. subi r2, 4
  125. cmpnei r2, 0
  126. bt .L_loop1
  127. .L_loop1_done:
  128. #ifdef CONFIG_SEPARATE_IRQ_SP
  129. lrw r0, g_top_irqstack
  130. mtcr r0, cr<15, 1>
  131. mfcr r0, cr<31, 0>
  132. bseti r0, 14
  133. mtcr r0, cr<31, 0>
  134. #endif
  135. #ifndef __NO_SYSTEM_INIT
  136. bsr SystemInit
  137. #endif
  138. //#ifndef __NO_BOARD_INIT
  139. // bsr board_init
  140. //#endif
  141. //VIC init...
  142. lrw r0, VIC_TSPR
  143. movi r1, 0xb00
  144. stw r1, (r0)
  145. bsr entry
  146. __exit:
  147. bkpt
  148. .size Reset_Handler, . - Reset_Handler
  149. .align 1
  150. .weak Default_Handler
  151. .type Default_Handler, %function
  152. Default_Handler:
  153. br Default_Handler
  154. .size Default_Handler, . - Default_Handler
  155. .section .bss
  156. .align 2
  157. .globl g_intstackalloc
  158. .global g_intstackbase
  159. .global g_top_irqstack
  160. g_intstackalloc:
  161. g_intstackbase:
  162. .space CONFIG_ARCH_INTERRUPTSTACK
  163. g_top_irqstack:
  164. /* Macro to define default handlers. Default handler
  165. * will be weak symbol and just dead loops. They can be
  166. * overwritten by other handlers */
  167. .macro def_irq_handler handler_name
  168. .weak \handler_name
  169. .set \handler_name, Default_Handler
  170. .endm
  171. def_irq_handler CORET_IRQHandler
  172. def_irq_handler TIMA0_IRQHandler
  173. def_irq_handler TIMA1_IRQHandler
  174. def_irq_handler TIMB0_IRQHandler
  175. def_irq_handler TIMB1_IRQHandler
  176. def_irq_handler USART0_IRQHandler
  177. def_irq_handler USART1_IRQHandler
  178. def_irq_handler USART2_IRQHandler
  179. def_irq_handler USART3_IRQHandler
  180. def_irq_handler GPIOA_IRQHandler
  181. def_irq_handler GPIOB_IRQHandler
  182. def_irq_handler I2C0_IRQHandler
  183. def_irq_handler I2C1_IRQHandler
  184. def_irq_handler SPI0_IRQHandler
  185. def_irq_handler SPI1_IRQHandler
  186. def_irq_handler RTC_IRQHandler
  187. def_irq_handler WDT_IRQHandler
  188. def_irq_handler PWM_IRQHandler
  189. def_irq_handler DMAC_IRQHandler
  190. def_irq_handler AES_IRQHandler
  191. def_irq_handler SHA_IRQHandler
  192. .end