1# define LREG lw
2# define SREG sw
3# define REGBYTES 4
4
5// <<< Use Configuration Wizard in Context Menu >>>
6
7#define MSTATUS_PRV1 0x1880
8
9.global __initial_sp
10
11// <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:4>
12// <i> Config the stack size for the application
13#define		StackSize		0x400
14
15
16.section .app_stack,"aw",@nobits
17.align 2
18Stack_Mem:
19.space StackSize
20__initial_sp:
21
22
23// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
24// <i> Config the heap size for the application
25#define		HeapSize		0x200
26
27.global __heap_start
28.global __heap_end
29.section .bss,"aw",@nobits
30.align 2
31Heap_Mem:
32__heap_start:
33.space HeapSize
34__heap_end:
35
36
37.section .vectors, "aw", @progbits
38    .align  6
39    .globl  __Vectors
40    .type   __Vectors, @object
41__Vectors:	                                   //#totally 0~63 entries
42    .rept   3                                    //
43	.long   0                                  //
44	.endr                                      //
45	.long   SW_handler          //     ##3
46  .rept   3                                    //
47	.long   0                                  //
48	.endr                                      //
49	.long   CLINT_Handler                      //     ##7
50	.rept   3                                  //
51	.long   0                                  //
52	.endr                                      //
53	.long   MACHINE_MODE_EXTERNAL_Handler      //     ##11 no used
54	.rept   4                                  //     ##12~15 reserved
55	.long   0                                  //
56	.endr                                      //
57
58/* External interrupts */
59//##------------------------------------------------------------
60	.long   WWDT_Handler                       //     ##16 0
61	.long   IWDT_Handler                       //     ##17 1
62	.long   LVD_Handler                        //     ##18 2
63	.long   CSU_Handler                        //     ##19 3
64	.long   CMU_Handler                        //     ##20 4
65	.long   EXTI0_3_Handler                    //     ##21 5
66	.long   EXTI4_7_Handler                    //     ##22 6
67	.long   EXTI8_11_Handler                   //     ##23 7
68	.long   EXTI12_15_Handler                  //     ##24 8
69	.long   DMA_Handler                        //     ##25 9
70	.long   0                                  //     ##26 10
71	.long   USB_Handler                        //     ##27 11
72	.long   ADC_Handler                        //     ##28 12
73	.long   AD16C4T_UP_TRIG_COM_Handler        //     ##29 13
74	.long   AD16C4T_CC_Handler                 //     ##30 14
75	.long   BSTIM0_Handler                     //     ##31 15
76	.long   0                                  //     ##   16
77	.long   GPTIMB0_Handler                    //     ##33 17
78	.long   GPTIMB1_Handler                    //     ##34 18
79	.long   GPTIMB2_Handler                    //     ##35 19
80	.long   0                                  //     ##   20
81	.long   AD16C4T_Handler                    //     ##37 21
82	.long   0                                  //     ##   22
83	.long   I2C0_Handler                       //     ##39 23
84	.long   I2C1_Handler                       //     ##40 24
85	.long   SPI0_I2S0_Handler                  //     ##41 25
86	.long   SPI1_I2S1_Handler                  //     ##42 26
87	.long   EUART0_Handler                     //     ##43 27
88	.long   EUART1_Handler                     //     ##44 28
89	.long   CUART0_Handler                     //     ##45 29
90	.long   CUART1_Handler                     //     ##46 30
91	.long   CUART2_Handler                     //     ##47 31
92//##---------------------------------------------------
93
94/*
95 * For importing variable or functions from other c or assemble files.
96 */
97.global __main
98.global handle_trap
99
100  .section ".text.init"
101  .globl Reset_Handler
102  .type Reset_Handler, %function
103Reset_Handler:
104
105.option push
106.option norelax
107    la      gp, __global_pointer$
108.option pop
109
110    la      a0, Default_Handler
111    ori     a0, a0, 3
112    csrw    mtvec, a0
113
114    la      a0, __Vectors
115    csrw    mtvt, a0
116
117    la      sp, g_top_irqstack
118
119    /* Load data section */
120    la      a0, __erodata
121    la      a1, __data_start__
122    la      a2, __data_end__
123    bgeu    a1, a2, 2f
1241:
125    lw      t0, (a0)
126    sw      t0, (a1)
127    addi    a0, a0, 4
128    addi    a1, a1, 4
129    bltu    a1, a2, 1b
1302:
131
132    /* Clear bss section */
133    la      a0, __bss_start__
134    la      a1, __bss_end__
135    bgeu    a0, a1, 2f
1361:
137    sw      zero, (a0)
138    addi    a0, a0, 4
139    bltu    a0, a1, 1b
1402:
141    jal     entry
142
143    .size   Reset_Handler, . - Reset_Handler
144
145  .align  6
146  .weak   Default_Handler
147  .global Default_Handler
148  .type   Default_Handler, %function
149Default_Handler:
150  addi sp, sp, -272
151
152  SREG x1, 1*REGBYTES(sp)
153  SREG x2, 2*REGBYTES(sp)
154  SREG x3, 3*REGBYTES(sp)
155  SREG x4, 4*REGBYTES(sp)
156  SREG x5, 5*REGBYTES(sp)
157  SREG x6, 6*REGBYTES(sp)
158  SREG x7, 7*REGBYTES(sp)
159  SREG x8, 8*REGBYTES(sp)
160  SREG x9, 9*REGBYTES(sp)
161  SREG x10, 10*REGBYTES(sp)
162  SREG x11, 11*REGBYTES(sp)
163  SREG x12, 12*REGBYTES(sp)
164  SREG x13, 13*REGBYTES(sp)
165  SREG x14, 14*REGBYTES(sp)
166  SREG x15, 15*REGBYTES(sp)
167
168  csrr a0, mcause
169  csrr a1, mepc
170  mv a2, sp
171  jal handle_trap
172  csrw mepc, a0
173
174  # Remain in M-mode after eret
175  li t0, MSTATUS_PRV1
176  csrs mstatus, t0
177
178  LREG x1, 1*REGBYTES(sp)
179  LREG x2, 2*REGBYTES(sp)
180  LREG x3, 3*REGBYTES(sp)
181  LREG x4, 4*REGBYTES(sp)
182  LREG x5, 5*REGBYTES(sp)
183  LREG x6, 6*REGBYTES(sp)
184  LREG x7, 7*REGBYTES(sp)
185  LREG x8, 8*REGBYTES(sp)
186  LREG x9, 9*REGBYTES(sp)
187  LREG x10, 10*REGBYTES(sp)
188  LREG x11, 11*REGBYTES(sp)
189  LREG x12, 12*REGBYTES(sp)
190  LREG x13, 13*REGBYTES(sp)
191  LREG x14, 14*REGBYTES(sp)
192  LREG x15, 15*REGBYTES(sp)
193
194  addi sp, sp, 272
195  mret
196
197  .weak  SW_handler
198  .globl SW_handler
199  .type  SW_handler, %function
200SW_handler:
201
202  .weak  CLINT_Handler
203  .globl CLINT_Handler
204  .type  CLINT_Handler, %function
205CLINT_Handler:
206
207  .weak  MACHINE_MODE_EXTERNAL_Handler
208  .globl MACHINE_MODE_EXTERNAL_Handler
209  .type  MACHINE_MODE_EXTERNAL_Handler, %function
210MACHINE_MODE_EXTERNAL_Handler:
211
212  .weak  WWDT_Handler
213  .globl WWDT_Handler
214  .type  WWDT_Handler, %function
215WWDT_Handler:
216
217  .weak  IWDT_Handler
218  .globl IWDT_Handler
219  .type  IWDT_Handler, %function
220IWDT_Handler:
221
222  .weak  LVD_Handler
223  .globl LVD_Handler
224  .type  LVD_Handler, %function
225LVD_Handler:
226
227  .weak  CSU_Handler
228  .globl CSU_Handler
229  .type  CSU_Handler, %function
230CSU_Handler:
231
232  .weak  CMU_Handler
233  .globl CMU_Handler
234  .type  CMU_Handler, %function
235CMU_Handler:
236
237  .weak  EXTI0_3_Handler
238  .globl EXTI0_3_Handler
239  .type  EXTI0_3_Handler, %function
240EXTI0_3_Handler:
241
242  .weak  EXTI4_7_Handler
243  .globl EXTI4_7_Handler
244  .type  EXTI4_7_Handler, %function
245EXTI4_7_Handler:
246
247  .weak  EXTI8_11_Handler
248  .globl EXTI8_11_Handler
249  .type  EXTI8_11_Handler, %function
250EXTI8_11_Handler:
251
252  .weak  EXTI12_15_Handler
253  .globl EXTI12_15_Handler
254  .type  EXTI12_15_Handler, %function
255EXTI12_15_Handler:
256
257  .weak  DMA_Handler
258  .globl DMA_Handler
259  .type  DMA_Handler, %function
260DMA_Handler:
261
262  .weak  USB_Handler
263  .globl USB_Handler
264  .type  USB_Handler, %function
265USB_Handler:
266
267  .weak ADC_Handler
268  .globl ADC_Handler
269  .type  ADC_Handler, %function
270ADC_Handler:
271
272  .weak  AD16C4T_UP_TRIG_COM_Handler
273  .globl AD16C4T_UP_TRIG_COM_Handler
274  .type  AD16C4T_UP_TRIG_COM_Handler, %function
275AD16C4T_UP_TRIG_COM_Handler:
276
277  .weak  AD16C4T_CC_Handler
278  .globl AD16C4T_CC_Handler
279  .type  AD16C4T_CC_Handler, %function
280AD16C4T_CC_Handler:
281
282  .weak  BSTIM0_Handler
283  .globl BSTIM0_Handler
284  .type  BSTIM0_Handler, %function
285BSTIM0_Handler:
286
287  .weak  GPTIMB0_Handler
288  .globl GPTIMB0_Handler
289  .type  GPTIMB0_Handler, %function
290GPTIMB0_Handler:
291
292  .weak  GPTIMB1_Handler
293  .globl GPTIMB1_Handler
294  .type  GPTIMB1_Handler, %function
295GPTIMB1_Handler:
296
297  .weak  GPTIMB2_Handler
298  .globl GPTIMB2_Handler
299  .type  GPTIMB2_Handler, %function
300GPTIMB2_Handler:
301
302  .weak  AD16C4T_Handler
303  .globl AD16C4T_Handler
304  .type  AD16C4T_Handler, %function
305AD16C4T_Handler:
306
307  .weak  I2C0_Handler
308  .globl I2C0_Handler
309  .type  I2C0_Handler, %function
310I2C0_Handler:
311
312  .weak  I2C1_Handler
313  .globl I2C1_Handler
314  .type  I2C1_Handler, %function
315I2C1_Handler:
316
317  .weak  SPI0_I2S0_Handler
318  .globl SPI0_I2S0_Handler
319  .type  SPI0_I2S0_Handler, %function
320SPI0_I2S0_Handler:
321
322  .weak  SPI1_I2S1_Handler
323  .globl SPI1_I2S1_Handler
324  .type  SPI1_I2S1_Handler, %function
325SPI1_I2S1_Handler:
326
327  .weak  EUART0_Handler
328  .globl EUART0_Handler
329  .type  EUART0_Handler, %function
330EUART0_Handler:
331
332  .weak  EUART1_Handler
333  .globl EUART1_Handler
334  .type  EUART1_Handler, %function
335EUART1_Handler:
336
337  .weak  CUART0_Handler
338  .globl CUART0_Handler
339  .type  CUART0_Handler, %function
340CUART0_Handler:
341
342  .weak  CUART1_Handler
343  .globl CUART1_Handler
344  .type  CUART1_Handler, %function
345CUART1_Handler:
346
347  .weak  CUART2_Handler
348  .globl CUART2_Handler
349  .type  CUART2_Handler, %function
350CUART2_Handler:
351
352__exit:
353    j      __exit
354
355//##---------------------------------------------------
356.section .bss
357
358    .align  3
359    .global g_base_irqstack
360    .global g_top_irqstack
361g_base_irqstack:
362    .space  StackSize            //CONFIG_ARCH_INTERRUPTSTACK
363g_top_irqstack:
364