startup_rv32.s 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. /*
  2. * Copyright (c) 2006-2020, YICHIP Development Team
  3. * @file yc_startup_yc3122.s
  4. * @brief source file for setting startup_yc3122
  5. *
  6. * Change Logs:
  7. * Date Author Version Notes
  8. * 2020-11-06 wushengyan V1.0.0 the first version
  9. */
  10. #define REGBYTES (4)
  11. /* Enable interrupts when returning from the handler */
  12. #define MSTATUS_PRV1 0x1880
  13. #define MSTATUS_MIE 0x00000008
  14. #define MSTATUS_FS 0x00006000
  15. .equ __stack_size,0x9000
  16. .text
  17. .globl flash_start
  18. .globl delay
  19. .globl __stack_size
  20. .section .text.startup
  21. flash_start:
  22. la sp, _stack
  23. /* set exception and irq mtvec */
  24. la a0,trap
  25. ori a0,a0,1
  26. csrw mtvec,a0
  27. /* enable fs */
  28. li t0,MSTATUS_FS
  29. csrs mstatus,t0
  30. csrw fcsr,x0
  31. /* Load data section */
  32. la a0, _sidata
  33. la a1, _sdata
  34. la a2, _edata
  35. bgeu a1,a2,2f
  36. 1:
  37. lw t0, (a0)
  38. sw t0, (a1)
  39. addi a0,a0,4
  40. addi a1,a1,4
  41. bltu a1,a2,1b
  42. 2:
  43. /* clear bss section */
  44. la a0,_sbss
  45. la a1,_ebss
  46. bgeu a0,a1,2f
  47. 1:
  48. sw zero,(a0)
  49. addi a0,a0,4
  50. bltu a0,a1,1b
  51. 2:
  52. /*clear heap/statck*/
  53. la a0,_ebss
  54. la a1,_stack
  55. bgeu a0,a1,2f
  56. 1:
  57. sw zero,(a0)
  58. addi a0,a0,4
  59. bltu a0,a1,1b
  60. 2:
  61. #ifndef __NO_SYSTEM_INIT
  62. // jal systeminit
  63. #endif
  64. #ifndef __NO_BOARD_INIT
  65. // jal board_init
  66. #endif
  67. li t0, 0x00000800
  68. csrs 0x304,t0
  69. li t0, MSTATUS_MIE
  70. csrs mstatus, t0
  71. jal main
  72. /* never retch here*/
  73. __exit:
  74. j __exit
  75. .macro DISABLE_MIE
  76. csrc mstatus, MSTATUS_MIE
  77. .endm
  78. .macro ENABLE_MIE
  79. csrs mstatus, MSTATUS_MIE
  80. .endm
  81. .macro GET_IRQ_NUM
  82. li t1,0x000E4004
  83. lw t1,0(t1)
  84. li t3,0x01
  85. li t5,0x00
  86. get_irq_num_loop:
  87. and t4, t1, t3
  88. blt x0, t4, get_irq_num_end
  89. addi t5, t5, 1
  90. slli t3, t3, 1
  91. j get_irq_num_loop
  92. get_irq_num_end:
  93. mv t1, t5
  94. .endm
  95. .macro SAVE_CONTEXT
  96. addi sp,sp,-40*4
  97. sw x1 , 0 *REGBYTES(sp) /* ra */
  98. sw x4 , 1 *REGBYTES(sp) /* tp */
  99. sw x5 , 2 *REGBYTES(sp) /* t0 */
  100. sw x6 , 3 *REGBYTES(sp) /* t1 */
  101. sw x7 , 4 *REGBYTES(sp) /* t2 */
  102. sw x10, 5 *REGBYTES(sp) /* a0 */
  103. sw x11, 6 *REGBYTES(sp) /* a1 */
  104. sw x12, 7 *REGBYTES(sp) /* a2 */
  105. sw x13, 8 *REGBYTES(sp) /* a3 */
  106. sw x14, 9 *REGBYTES(sp) /* a4 */
  107. sw x15, 10*REGBYTES(sp) /* a5 */
  108. sw x16, 11*REGBYTES(sp) /* a6 */
  109. sw x17, 12*REGBYTES(sp) /* a7 */
  110. sw x28, 13*REGBYTES(sp) /* t3 */
  111. sw x29, 14*REGBYTES(sp) /* t4 */
  112. sw x30, 15*REGBYTES(sp) /* t5 */
  113. sw x31, 16*REGBYTES(sp) /* t6 */
  114. fsw f0, 17*REGBYTES(sp) /* ft0 */
  115. fsw f1, 18*REGBYTES(sp) /* ft1 */
  116. fsw f2, 19*REGBYTES(sp) /* ft2 */
  117. fsw f3, 20*REGBYTES(sp) /* ft3 */
  118. fsw f4, 21*REGBYTES(sp) /* ft4 */
  119. fsw f5, 22*REGBYTES(sp) /* ft5 */
  120. fsw f6, 23*REGBYTES(sp) /* ft6 */
  121. fsw f7, 24*REGBYTES(sp) /* ft7 */
  122. fsw f10,25*REGBYTES(sp) /* fa0 */
  123. fsw f11,26*REGBYTES(sp) /* fa1 */
  124. fsw f12,27*REGBYTES(sp) /* fa2 */
  125. fsw f13,28*REGBYTES(sp) /* fa3 */
  126. fsw f14,29*REGBYTES(sp) /* fa4 */
  127. fsw f15,30*REGBYTES(sp) /* fa5 */
  128. fsw f16,31*REGBYTES(sp) /* fa6 */
  129. fsw f17,32*REGBYTES(sp) /* fa7 */
  130. fsw f28,33*REGBYTES(sp) /* ft8 */
  131. fsw f29,34*REGBYTES(sp) /* ft9 */
  132. fsw f30,35*REGBYTES(sp) /* ft10*/
  133. fsw f31,36*REGBYTES(sp) /* ft11*/
  134. .endm
  135. .macro RESTORE_CONTEXT
  136. lw x1 , 0 *REGBYTES(sp) /* ra */
  137. lw x4 , 1 *REGBYTES(sp) /* tp */
  138. lw x5 , 2 *REGBYTES(sp) /* t0 */
  139. lw x6 , 3 *REGBYTES(sp) /* t1 */
  140. lw x7 , 4 *REGBYTES(sp) /* t2 */
  141. lw x10, 5 *REGBYTES(sp) /* a0 */
  142. lw x11, 6 *REGBYTES(sp) /* a1 */
  143. lw x12, 7 *REGBYTES(sp) /* a2 */
  144. lw x13, 8 *REGBYTES(sp) /* a3 */
  145. lw x14, 9 *REGBYTES(sp) /* a4 */
  146. lw x15, 10*REGBYTES(sp) /* a5 */
  147. lw x16, 11*REGBYTES(sp) /* a6 */
  148. lw x17, 12*REGBYTES(sp) /* a7 */
  149. lw x28, 13*REGBYTES(sp) /* t3 */
  150. lw x29, 14*REGBYTES(sp) /* t4 */
  151. lw x30, 15*REGBYTES(sp) /* t5 */
  152. lw x31, 16*REGBYTES(sp) /* t6 */
  153. flw f0, 17*REGBYTES(sp) /* ft0 */
  154. flw f1, 18*REGBYTES(sp) /* ft1 */
  155. flw f2, 19*REGBYTES(sp) /* ft2 */
  156. flw f3, 20*REGBYTES(sp) /* ft3 */
  157. flw f4, 21*REGBYTES(sp) /* ft4 */
  158. flw f5, 22*REGBYTES(sp) /* ft5 */
  159. flw f6, 23*REGBYTES(sp) /* ft6 */
  160. flw f7, 24*REGBYTES(sp) /* ft7 */
  161. flw f10,25*REGBYTES(sp) /* fa0 */
  162. flw f11,26*REGBYTES(sp) /* fa1 */
  163. flw f12,27*REGBYTES(sp) /* fa2 */
  164. flw f13,28*REGBYTES(sp) /* fa3 */
  165. flw f14,29*REGBYTES(sp) /* fa4 */
  166. flw f15,30*REGBYTES(sp) /* fa5 */
  167. flw f16,31*REGBYTES(sp) /* fa6 */
  168. flw f17,32*REGBYTES(sp) /* fa7 */
  169. flw f28,33*REGBYTES(sp) /* ft8 */
  170. flw f29,34*REGBYTES(sp) /* ft9 */
  171. flw f30,35*REGBYTES(sp) /* ft10*/
  172. flw f31,36*REGBYTES(sp) /* ft11*/
  173. addi sp, sp, 40*REGBYTES
  174. .endm
  175. .macro SAVE_CSR_CONTEXT
  176. csrr t0,mepc
  177. csrr t1,mcause
  178. sw t0,37*REGBYTES(sp) /* mepc */
  179. sw t1,38*REGBYTES(sp) /* mcause */
  180. .endm
  181. .macro RESTORE_CSR_CONTEXT
  182. lw t0,37*REGBYTES(sp) /* mepc */
  183. lw t1,38*REGBYTES(sp) /* mcause */
  184. csrw mcause, t1
  185. csrw mepc, t0
  186. .endm
  187. .align 2
  188. .global Default_IRQHandler
  189. .weak Default_IRQHandler
  190. .type Default_IRQHandler, %function
  191. Default_IRQHandler:
  192. SAVE_CONTEXT
  193. SAVE_CSR_CONTEXT
  194. /* get irq */
  195. la t0,isr_table
  196. // GET_IRQ_NUM /* t1: irq num */
  197. li t1,0x000E4004 /* t1: irq num */
  198. lw t1,0(t1)
  199. slli t2, t1, 2
  200. add t0, t0, t2
  201. lw t2, (t0)
  202. sw t1,39*REGBYTES(sp)
  203. ENABLE_MIE
  204. jalr t2 /* jump to irq */
  205. DISABLE_MIE
  206. /* clear pending mask*/
  207. lw t1,39*REGBYTES(sp)
  208. li t0,0x000E4004
  209. sw t1,(t0)
  210. /* enable pri mie*/
  211. li t0, MSTATUS_PRV1
  212. csrs mstatus, t0
  213. RESTORE_CSR_CONTEXT
  214. RESTORE_CONTEXT
  215. mret
  216. /* trap start*/
  217. .section .text.trap
  218. /* In CLIC mode, the exeception entry must be 64bytes aligned */
  219. .align 6
  220. .global trap
  221. .weak trap
  222. .type trap, %function
  223. trap:
  224. /* check for interrupt */
  225. addi sp,sp,-4
  226. sw t0,0x0(sp)
  227. csrr t0,mcause
  228. blt t0,x0, .Interrupt /* go to Interrupt*/
  229. addi sp,sp,4
  230. /* save regs */
  231. addi sp,sp,-22*4
  232. sw x1 , 0 *REGBYTES(sp)
  233. sw x2 , 1 *REGBYTES(sp)
  234. sw x3 , 2 *REGBYTES(sp)
  235. sw x4 , 3 *REGBYTES(sp)
  236. sw x5 , 4 *REGBYTES(sp)
  237. sw x6 , 5 *REGBYTES(sp)
  238. sw x7 , 6 *REGBYTES(sp)
  239. sw x8 , 7 *REGBYTES(sp)
  240. sw x9 , 8 *REGBYTES(sp)
  241. sw x10, 9 *REGBYTES(sp)
  242. sw x11, 10*REGBYTES(sp)
  243. sw x12, 11*REGBYTES(sp)
  244. sw x13, 12*REGBYTES(sp)
  245. sw x14, 13*REGBYTES(sp)
  246. sw x15, 14*REGBYTES(sp)
  247. sw x16, 15*REGBYTES(sp)
  248. sw x17, 16*REGBYTES(sp)
  249. sw x28, 17*REGBYTES(sp)
  250. sw x29, 18*REGBYTES(sp)
  251. sw x30, 19*REGBYTES(sp)
  252. sw x31, 20*REGBYTES(sp)
  253. csrr a0, mepc
  254. sw a0, 21*REGBYTES(sp)
  255. csrr a0, mstatus
  256. sw a0, 22*REGBYTES(sp)
  257. mv a0, sp
  258. jal trap_c
  259. /*never reatch here */
  260. j .
  261. .Interrupt:
  262. lw t0, 0x0(sp)
  263. addi sp, sp, 4
  264. j Default_IRQHandler
  265. /* trap end*/
  266. .global trap_c
  267. .weak trap_c
  268. .type trap_c,%function
  269. trap_c:
  270. j trap_c
  271. .align 6
  272. .weak Default_Handler
  273. .global Default_Handler
  274. .type Default_Handler, %function
  275. Default_Handler:
  276. j Default_Handler
  277. .size Default_Handler, . - Default_Handler
  278. /* Macro to define default handlers. Default handler
  279. * will be weak symbol and just dead loops. They can be
  280. * overwritten by other handlers */
  281. .macro def_irq_handler handler_name
  282. .weak \handler_name
  283. .globl \handler_name
  284. .set \handler_name, Default_Handler
  285. .endm
  286. def_irq_handler USB_IRQHandler
  287. def_irq_handler I2C0_IRQHandler
  288. def_irq_handler I2C1_IRQHandler
  289. def_irq_handler QSPI_IRQHandler
  290. def_irq_handler SPI0_IRQHandler
  291. def_irq_handler SPI1_IRQHandler
  292. def_irq_handler HSPI_IRQHandler
  293. def_irq_handler SEC_IRQHandler
  294. def_irq_handler UART0_IRQHandler
  295. def_irq_handler UART1_IRQHandler
  296. def_irq_handler UART2_IRQHandler
  297. def_irq_handler UART3_IRQHandler
  298. def_irq_handler MEMCP_IRQHandler
  299. def_irq_handler SCI0_IRQHandler
  300. def_irq_handler SCI1_IRQHandler
  301. def_irq_handler MSR_IRQHandler
  302. def_irq_handler GPIO_IRQHandler
  303. def_irq_handler TMRG0_IRQHandler
  304. def_irq_handler TMRG1_IRQHandler
  305. def_irq_handler SDIO_IRQHandler
  306. def_irq_handler PSARM_IRQHandler
  307. def_irq_handler RSA_IRQHandler
  308. def_irq_handler SM4_IRQHandler
  309. def_irq_handler TRNG_IRQHandler
  310. def_irq_handler WDT_IRQHandler
  311. def_irq_handler DCMI_IRQHandler
  312. def_irq_handler ADC_IRQHandler
  313. def_irq_handler RTC_IRQHandler
  314. def_irq_handler BIN_IRQHandler
  315. def_irq_handler POWER_IRQHandler
  316. def_irq_handler SOFTWARE_IRQHandler
  317. def_irq_handler IPC_IRQHandler
  318. def_irq_handler QR_IRQHandler
  319. def_irq_handler ONE_BIN_IRQHandler
  320. def_irq_handler SYSTICK_IRQHandler
  321. def_irq_handler VBAT_IRQHandler
  322. def_irq_handler EXTI0_IRQHandler
  323. def_irq_handler EXTI1_IRQHandler
  324. def_irq_handler EXTI2_IRQHandler
  325. def_irq_handler EXTI3_IRQHandler
  326. def_irq_handler EXTI4_IRQHandler
  327. .align 4
  328. isr_table:
  329. .long USB_IRQHandler
  330. .long I2C0_IRQHandler
  331. .long I2C1_IRQHandler
  332. .long QSPI_IRQHandler
  333. .long SPI0_IRQHandler
  334. .long SPI1_IRQHandler
  335. .long HSPI_IRQHandler
  336. .long SEC_IRQHandler
  337. .long UART0_IRQHandler
  338. .long UART1_IRQHandler
  339. .long UART2_IRQHandler
  340. .long UART3_IRQHandler
  341. .long MEMCP_IRQHandler
  342. .long SCI0_IRQHandler
  343. .long SCI1_IRQHandler
  344. .long MSR_IRQHandler
  345. .long GPIO_IRQHandler
  346. .long TMRG0_IRQHandler
  347. .long TMRG1_IRQHandler
  348. .long SDIO_IRQHandler
  349. .long PSARM_IRQHandler
  350. .long RSA_IRQHandler
  351. .long SM4_IRQHandler
  352. .long TRNG_IRQHandler
  353. .long WDT_IRQHandler
  354. .long DCMI_IRQHandler
  355. .long ADC_IRQHandler
  356. .long RTC_IRQHandler
  357. .long BIN_IRQHandler
  358. .long POWER_IRQHandler
  359. .long SOFTWARE_IRQHandler
  360. .long IPC_IRQHandler
  361. .long QR_IRQHandler
  362. .long ONE_BIN_IRQHandler
  363. .long SYSTICK_IRQHandler