123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423 |
- /*
- * Copyright (c) 2006-2020, YICHIP Development Team
- * @file yc_startup_yc3122.s
- * @brief source file for setting startup_yc3122
- *
- * Change Logs:
- * Date Author Version Notes
- * 2020-11-06 wushengyan V1.0.0 the first version
- */
- #define REGBYTES (4)
- /* Enable interrupts when returning from the handler */
- #define MSTATUS_PRV1 0x1880
- #define MSTATUS_MIE 0x00000008
- #define MSTATUS_FS 0x00006000
- .equ __stack_size,0x9000
- .text
- .globl flash_start
- .globl delay
- .globl __stack_size
- .section .text.startup
- flash_start:
- la sp, _stack
- /* set exception and irq mtvec */
- la a0,trap
- ori a0,a0,1
- csrw mtvec,a0
- /* enable fs */
- li t0,MSTATUS_FS
- csrs mstatus,t0
- csrw fcsr,x0
- /* Load data section */
- la a0, _sidata
- la a1, _sdata
- la a2, _edata
- bgeu a1,a2,2f
- 1:
- lw t0, (a0)
- sw t0, (a1)
- addi a0,a0,4
- addi a1,a1,4
- bltu a1,a2,1b
- 2:
- /* clear bss section */
- la a0,_sbss
- la a1,_ebss
- bgeu a0,a1,2f
- 1:
- sw zero,(a0)
- addi a0,a0,4
- bltu a0,a1,1b
- 2:
- /*clear heap/statck*/
- la a0,_ebss
- la a1,_stack
- bgeu a0,a1,2f
- 1:
- sw zero,(a0)
- addi a0,a0,4
- bltu a0,a1,1b
- 2:
- #ifndef __NO_SYSTEM_INIT
- // jal systeminit
- #endif
- #ifndef __NO_BOARD_INIT
- // jal board_init
- #endif
- li t0, 0x00000800
- csrs 0x304,t0
- li t0, MSTATUS_MIE
- csrs mstatus, t0
- jal main
- /* never retch here*/
- __exit:
- j __exit
- .macro DISABLE_MIE
- csrc mstatus, MSTATUS_MIE
- .endm
- .macro ENABLE_MIE
- csrs mstatus, MSTATUS_MIE
- .endm
- .macro GET_IRQ_NUM
- li t1,0x000E4004
- lw t1,0(t1)
- li t3,0x01
- li t5,0x00
- get_irq_num_loop:
- and t4, t1, t3
- blt x0, t4, get_irq_num_end
- addi t5, t5, 1
- slli t3, t3, 1
- j get_irq_num_loop
- get_irq_num_end:
- mv t1, t5
- .endm
- .macro SAVE_CONTEXT
- addi sp,sp,-40*4
- sw x1 , 0 *REGBYTES(sp) /* ra */
- sw x4 , 1 *REGBYTES(sp) /* tp */
- sw x5 , 2 *REGBYTES(sp) /* t0 */
- sw x6 , 3 *REGBYTES(sp) /* t1 */
- sw x7 , 4 *REGBYTES(sp) /* t2 */
- sw x10, 5 *REGBYTES(sp) /* a0 */
- sw x11, 6 *REGBYTES(sp) /* a1 */
- sw x12, 7 *REGBYTES(sp) /* a2 */
- sw x13, 8 *REGBYTES(sp) /* a3 */
- sw x14, 9 *REGBYTES(sp) /* a4 */
- sw x15, 10*REGBYTES(sp) /* a5 */
- sw x16, 11*REGBYTES(sp) /* a6 */
- sw x17, 12*REGBYTES(sp) /* a7 */
- sw x28, 13*REGBYTES(sp) /* t3 */
- sw x29, 14*REGBYTES(sp) /* t4 */
- sw x30, 15*REGBYTES(sp) /* t5 */
- sw x31, 16*REGBYTES(sp) /* t6 */
- fsw f0, 17*REGBYTES(sp) /* ft0 */
- fsw f1, 18*REGBYTES(sp) /* ft1 */
- fsw f2, 19*REGBYTES(sp) /* ft2 */
- fsw f3, 20*REGBYTES(sp) /* ft3 */
- fsw f4, 21*REGBYTES(sp) /* ft4 */
- fsw f5, 22*REGBYTES(sp) /* ft5 */
- fsw f6, 23*REGBYTES(sp) /* ft6 */
- fsw f7, 24*REGBYTES(sp) /* ft7 */
- fsw f10,25*REGBYTES(sp) /* fa0 */
- fsw f11,26*REGBYTES(sp) /* fa1 */
- fsw f12,27*REGBYTES(sp) /* fa2 */
- fsw f13,28*REGBYTES(sp) /* fa3 */
- fsw f14,29*REGBYTES(sp) /* fa4 */
- fsw f15,30*REGBYTES(sp) /* fa5 */
- fsw f16,31*REGBYTES(sp) /* fa6 */
- fsw f17,32*REGBYTES(sp) /* fa7 */
- fsw f28,33*REGBYTES(sp) /* ft8 */
- fsw f29,34*REGBYTES(sp) /* ft9 */
- fsw f30,35*REGBYTES(sp) /* ft10*/
- fsw f31,36*REGBYTES(sp) /* ft11*/
- .endm
- .macro RESTORE_CONTEXT
- lw x1 , 0 *REGBYTES(sp) /* ra */
- lw x4 , 1 *REGBYTES(sp) /* tp */
- lw x5 , 2 *REGBYTES(sp) /* t0 */
- lw x6 , 3 *REGBYTES(sp) /* t1 */
- lw x7 , 4 *REGBYTES(sp) /* t2 */
- lw x10, 5 *REGBYTES(sp) /* a0 */
- lw x11, 6 *REGBYTES(sp) /* a1 */
- lw x12, 7 *REGBYTES(sp) /* a2 */
- lw x13, 8 *REGBYTES(sp) /* a3 */
- lw x14, 9 *REGBYTES(sp) /* a4 */
- lw x15, 10*REGBYTES(sp) /* a5 */
- lw x16, 11*REGBYTES(sp) /* a6 */
- lw x17, 12*REGBYTES(sp) /* a7 */
- lw x28, 13*REGBYTES(sp) /* t3 */
- lw x29, 14*REGBYTES(sp) /* t4 */
- lw x30, 15*REGBYTES(sp) /* t5 */
- lw x31, 16*REGBYTES(sp) /* t6 */
- flw f0, 17*REGBYTES(sp) /* ft0 */
- flw f1, 18*REGBYTES(sp) /* ft1 */
- flw f2, 19*REGBYTES(sp) /* ft2 */
- flw f3, 20*REGBYTES(sp) /* ft3 */
- flw f4, 21*REGBYTES(sp) /* ft4 */
- flw f5, 22*REGBYTES(sp) /* ft5 */
- flw f6, 23*REGBYTES(sp) /* ft6 */
- flw f7, 24*REGBYTES(sp) /* ft7 */
- flw f10,25*REGBYTES(sp) /* fa0 */
- flw f11,26*REGBYTES(sp) /* fa1 */
- flw f12,27*REGBYTES(sp) /* fa2 */
- flw f13,28*REGBYTES(sp) /* fa3 */
- flw f14,29*REGBYTES(sp) /* fa4 */
- flw f15,30*REGBYTES(sp) /* fa5 */
- flw f16,31*REGBYTES(sp) /* fa6 */
- flw f17,32*REGBYTES(sp) /* fa7 */
- flw f28,33*REGBYTES(sp) /* ft8 */
- flw f29,34*REGBYTES(sp) /* ft9 */
- flw f30,35*REGBYTES(sp) /* ft10*/
- flw f31,36*REGBYTES(sp) /* ft11*/
- addi sp, sp, 40*REGBYTES
- .endm
- .macro SAVE_CSR_CONTEXT
- csrr t0,mepc
- csrr t1,mcause
- sw t0,37*REGBYTES(sp) /* mepc */
- sw t1,38*REGBYTES(sp) /* mcause */
- .endm
- .macro RESTORE_CSR_CONTEXT
- lw t0,37*REGBYTES(sp) /* mepc */
- lw t1,38*REGBYTES(sp) /* mcause */
- csrw mcause, t1
- csrw mepc, t0
- .endm
- .align 2
- .global Default_IRQHandler
- .weak Default_IRQHandler
- .type Default_IRQHandler, %function
- Default_IRQHandler:
- SAVE_CONTEXT
- SAVE_CSR_CONTEXT
- /* get irq */
- la t0,isr_table
- // GET_IRQ_NUM /* t1: irq num */
- li t1,0x000E4004 /* t1: irq num */
- lw t1,0(t1)
- slli t2, t1, 2
- add t0, t0, t2
- lw t2, (t0)
- sw t1,39*REGBYTES(sp)
- ENABLE_MIE
- jalr t2 /* jump to irq */
- DISABLE_MIE
- /* clear pending mask*/
- lw t1,39*REGBYTES(sp)
- li t0,0x000E4004
- sw t1,(t0)
- /* enable pri mie*/
- li t0, MSTATUS_PRV1
- csrs mstatus, t0
- RESTORE_CSR_CONTEXT
- RESTORE_CONTEXT
- mret
- /* trap start*/
- .section .text.trap
- /* In CLIC mode, the exeception entry must be 64bytes aligned */
- .align 6
- .global trap
- .weak trap
- .type trap, %function
- trap:
- /* check for interrupt */
- addi sp,sp,-4
- sw t0,0x0(sp)
- csrr t0,mcause
- blt t0,x0, .Interrupt /* go to Interrupt*/
- addi sp,sp,4
- /* save regs */
- addi sp,sp,-22*4
- sw x1 , 0 *REGBYTES(sp)
- sw x2 , 1 *REGBYTES(sp)
- sw x3 , 2 *REGBYTES(sp)
- sw x4 , 3 *REGBYTES(sp)
- sw x5 , 4 *REGBYTES(sp)
- sw x6 , 5 *REGBYTES(sp)
- sw x7 , 6 *REGBYTES(sp)
- sw x8 , 7 *REGBYTES(sp)
- sw x9 , 8 *REGBYTES(sp)
- sw x10, 9 *REGBYTES(sp)
- sw x11, 10*REGBYTES(sp)
- sw x12, 11*REGBYTES(sp)
- sw x13, 12*REGBYTES(sp)
- sw x14, 13*REGBYTES(sp)
- sw x15, 14*REGBYTES(sp)
- sw x16, 15*REGBYTES(sp)
- sw x17, 16*REGBYTES(sp)
- sw x28, 17*REGBYTES(sp)
- sw x29, 18*REGBYTES(sp)
- sw x30, 19*REGBYTES(sp)
- sw x31, 20*REGBYTES(sp)
-
- csrr a0, mepc
- sw a0, 21*REGBYTES(sp)
- csrr a0, mstatus
- sw a0, 22*REGBYTES(sp)
- mv a0, sp
- jal trap_c
- /*never reatch here */
- j .
- .Interrupt:
- lw t0, 0x0(sp)
- addi sp, sp, 4
- j Default_IRQHandler
- /* trap end*/
- .global trap_c
- .weak trap_c
- .type trap_c,%function
- trap_c:
- j trap_c
- .align 6
- .weak Default_Handler
- .global Default_Handler
- .type Default_Handler, %function
- Default_Handler:
- j Default_Handler
- .size Default_Handler, . - Default_Handler
- /* Macro to define default handlers. Default handler
- * will be weak symbol and just dead loops. They can be
- * overwritten by other handlers */
- .macro def_irq_handler handler_name
- .weak \handler_name
- .globl \handler_name
- .set \handler_name, Default_Handler
- .endm
- def_irq_handler USB_IRQHandler
- def_irq_handler I2C0_IRQHandler
- def_irq_handler I2C1_IRQHandler
- def_irq_handler QSPI_IRQHandler
- def_irq_handler SPI0_IRQHandler
- def_irq_handler SPI1_IRQHandler
- def_irq_handler HSPI_IRQHandler
- def_irq_handler SEC_IRQHandler
- def_irq_handler UART0_IRQHandler
- def_irq_handler UART1_IRQHandler
- def_irq_handler UART2_IRQHandler
- def_irq_handler UART3_IRQHandler
- def_irq_handler MEMCP_IRQHandler
- def_irq_handler SCI0_IRQHandler
- def_irq_handler SCI1_IRQHandler
- def_irq_handler MSR_IRQHandler
- def_irq_handler GPIO_IRQHandler
- def_irq_handler TMRG0_IRQHandler
- def_irq_handler TMRG1_IRQHandler
- def_irq_handler SDIO_IRQHandler
- def_irq_handler PSARM_IRQHandler
- def_irq_handler RSA_IRQHandler
- def_irq_handler SM4_IRQHandler
- def_irq_handler TRNG_IRQHandler
- def_irq_handler WDT_IRQHandler
- def_irq_handler DCMI_IRQHandler
- def_irq_handler ADC_IRQHandler
- def_irq_handler RTC_IRQHandler
- def_irq_handler BIN_IRQHandler
- def_irq_handler POWER_IRQHandler
- def_irq_handler SOFTWARE_IRQHandler
- def_irq_handler IPC_IRQHandler
- def_irq_handler QR_IRQHandler
- def_irq_handler ONE_BIN_IRQHandler
- def_irq_handler SYSTICK_IRQHandler
- def_irq_handler VBAT_IRQHandler
- def_irq_handler EXTI0_IRQHandler
- def_irq_handler EXTI1_IRQHandler
- def_irq_handler EXTI2_IRQHandler
- def_irq_handler EXTI3_IRQHandler
- def_irq_handler EXTI4_IRQHandler
- .align 4
- isr_table:
- .long USB_IRQHandler
- .long I2C0_IRQHandler
- .long I2C1_IRQHandler
- .long QSPI_IRQHandler
- .long SPI0_IRQHandler
- .long SPI1_IRQHandler
- .long HSPI_IRQHandler
- .long SEC_IRQHandler
- .long UART0_IRQHandler
- .long UART1_IRQHandler
- .long UART2_IRQHandler
- .long UART3_IRQHandler
- .long MEMCP_IRQHandler
- .long SCI0_IRQHandler
- .long SCI1_IRQHandler
- .long MSR_IRQHandler
- .long GPIO_IRQHandler
- .long TMRG0_IRQHandler
- .long TMRG1_IRQHandler
- .long SDIO_IRQHandler
- .long PSARM_IRQHandler
- .long RSA_IRQHandler
- .long SM4_IRQHandler
- .long TRNG_IRQHandler
- .long WDT_IRQHandler
- .long DCMI_IRQHandler
- .long ADC_IRQHandler
- .long RTC_IRQHandler
- .long BIN_IRQHandler
- .long POWER_IRQHandler
- .long SOFTWARE_IRQHandler
- .long IPC_IRQHandler
- .long QR_IRQHandler
- .long ONE_BIN_IRQHandler
- .long SYSTICK_IRQHandler
|