startup_gcc.S 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : startup_gcc.s
  3. * Author : WCH
  4. * Version : V1.0
  5. * Date : 2020/07/31
  6. * Description : CH56x vector table for eclipse toolchain.
  7. *******************************************************************************/
  8. .section .init,"ax",@progbits
  9. .global _start
  10. .align 1
  11. _start:
  12. j handle_reset
  13. .section .vector,"ax",@progbits
  14. .align 1
  15. _vector_base:
  16. .option norvc;
  17. .word 0
  18. .word 0
  19. j nmi_handler
  20. j hardfault_handler
  21. .word 0
  22. .word 0
  23. .word 0
  24. .word 0
  25. .word 0
  26. .word 0
  27. .word 0
  28. .word 0
  29. j systick_handler
  30. .word 0
  31. j swi_handler
  32. .word 0
  33. /* External Interrupts */
  34. j wdog_irq_handler
  35. j tmr0_irq_handler
  36. j gpio_irq_handler
  37. j spi0_irq_handler
  38. j usbss_irq_handler
  39. j link_irq_handler
  40. j tmr1_irq_handler
  41. j tmr2_irq_handler
  42. j uart0_irq_handler
  43. j usbhs_irq_handler
  44. j emmc_irq_handler
  45. j dvp_irq_handler
  46. j hspi_irq_handler
  47. j spi1_irq_handler
  48. j uart1_irq_handler
  49. j uart2_irq_handler
  50. j uart3_irq_handler
  51. j serdes_irq_handler
  52. j eth_irq_handler
  53. j pmt_irq_handler
  54. j ecdc_irq_handler
  55. .option rvc;
  56. .section .text.vector_handler,"ax", @prsocogbits
  57. .weak nmi_handler
  58. .weak hardfault_handler
  59. .weak systick_handler
  60. .weak swi_handler
  61. .weak wdog_irq_handler
  62. .weak tmr0_irq_handler
  63. .weak gpio_irq_handler
  64. .weak spi0_irq_handler
  65. .weak usbss_irq_handler
  66. .weak link_irq_handler
  67. .weak tmr1_irq_handler
  68. .weak tmr2_irq_handler
  69. .weak uart0_irq_handler
  70. .weak usbhs_irq_handler
  71. .weak emmc_irq_handler
  72. .weak dvp_irq_handler
  73. .weak hspi_irq_handler
  74. .weak spi1_irq_handler
  75. .weak uart1_irq_handler
  76. .weak uart2_irq_handler
  77. .weak uart3_irq_handler
  78. .weak serdes_irq_handler
  79. .weak eth_irq_handler
  80. .weak pmt_irq_handler
  81. .weak ecdc_irq_handler
  82. nmi_handler: j .L_rip
  83. hardfault_handler: j .L_rip
  84. systick_handler: j .L_rip
  85. swi_handler: j .L_rip
  86. wdog_irq_handler: j .L_rip
  87. tmr0_irq_handler: j .L_rip
  88. gpio_irq_handler: j .L_rip
  89. spi0_irq_handler: j .L_rip
  90. usbss_irq_handler: j .L_rip
  91. link_irq_handler: j .L_rip
  92. tmr1_irq_handler: j .L_rip
  93. tmr2_irq_handler: j .L_rip
  94. uart0_irq_handler: j .L_rip
  95. usbhs_irq_handler: j .L_rip
  96. emmc_irq_handler: j .L_rip
  97. dvp_irq_handler: j .L_rip
  98. hspi_irq_handler: j .L_rip
  99. spi1_irq_handler: j .L_rip
  100. uart1_irq_handler: j .L_rip
  101. uart2_irq_handler: j .L_rip
  102. uart3_irq_handler: j .L_rip
  103. serdes_irq_handler: j .L_rip
  104. eth_irq_handler: j .L_rip
  105. pmt_irq_handler: j .L_rip
  106. ecdc_irq_handler: j .L_rip
  107. .L_rip:
  108. csrr t0, mepc
  109. csrr t1, mstatus
  110. csrr t2, mcause
  111. csrr t3, mtval
  112. csrr t4, mscratch
  113. 1: j 1b
  114. .section .text.handle_reset,"ax",@progbits
  115. .weak handle_reset
  116. .align 1
  117. handle_reset:
  118. .option push
  119. .option norelax
  120. la gp, __global_pointer$
  121. .option pop
  122. 1:
  123. la sp, _eusrstack
  124. /* Load data section from flash to RAM */
  125. 2:
  126. la a0, _data_lma
  127. la a1, _data_vma
  128. la a2, _edata
  129. bgeu a1, a2, 2f
  130. 1:
  131. lw t0, (a0)
  132. sw t0, (a1)
  133. addi a0, a0, 4
  134. addi a1, a1, 4
  135. bltu a1, a2, 1b
  136. /* clear bss section */
  137. 2:
  138. la a0, _sbss
  139. la a1, _ebss
  140. bgeu a0, a1, 2f
  141. 1:
  142. sw zero, (a0)
  143. addi a0, a0, 4
  144. bltu a0, a1, 1b
  145. /* clear dmadata section */
  146. 2:
  147. la a0, _dmadata_start
  148. la a1, _dmadata_end
  149. bgeu a0, a1, 2f
  150. 1:
  151. sw zero, (a0)
  152. addi a0, a0, 4
  153. bltu a0, a1, 1b
  154. 2:
  155. /* leave all interrupt disabled */
  156. li t0, 0x1800
  157. csrs mstatus, t0
  158. la t0, _vector_base
  159. ori t0, t0, 1
  160. csrw mtvec, t0
  161. la t0, entry
  162. csrw mepc, t0
  163. mret