123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- /* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA").
- * All rights reserved.
- *
- * This software is supplied "AS IS" without any warranties.
- * RDA assumes no responsibility or liability for the use of the software,
- * conveys no license or title under any patent, copyright, or mask work
- * right to the product. RDA reserves the right to make changes in the
- * software without notification. RDA also make no representation or
- * warranty that such application will be suitable for the specified use
- * without further testing or modification.
- */
- #include "boot_config.h"
- // Refer to halArmv8mRegs_t
- #define OFFSET_R4 (4 * 4)
- #define OFFSET_S0 (16 * 4)
- #define OFFSET_FPSCR (49 * 4)
- #define OFFSET_CURR_XPSR (50 * 4)
- #define OFFSET_EXC_RETURN (51 * 4)
- #define OFFSET_CONTROL (52 * 4)
- #define OFFSET_BASEPRI (53 * 4)
- #define OFFSET_PRIMASK (54 * 4)
- #define OFFSET_FAULTMASK (55 * 4)
- #define OFFSET_MSP (56 * 4)
- #define OFFSET_PSP (57 * 4)
- #define OFFSET_MSPLIM (58 * 4)
- #define OFFSET_PSPLIM (59 * 4)
- .syntax unified
- .section BOOT_ENTRY, "x"
- // ====================================================================
- // Macro for hander address
- // ====================================================================
- .macro HANDLER_ADDRESS num
- .long bootIrqHandler\num
- .endm
- // ====================================================================
- // Macro for irq handlers, call bootIrqHandler(irqn)
- // ====================================================================
- .macro HANDLER num
- .type bootIrqHandler\num, %function
- .thumb_func
- bootIrqHandler\num:
- MOVS r0, #\num
- B bootIrqHandler
- .size bootIrqHandler\num, .-bootIrqHandler\num
- .endm
- // ====================================================================
- // Vectors. Put at the beginning to make alignment easier.
- // ====================================================================
- .align 11
- .type vectors, %function
- vectors:
- .long __process_stack_end
- .long nvicBlueScreenHandler // reset
- .long nvicBlueScreenHandler // NMI
- .long nvicBlueScreenHandler // hard fault
- .long nvicBlueScreenHandler // mem manage
- .long nvicBlueScreenHandler // bus fault
- .long nvicBlueScreenHandler // usage fault
- .long nvicBlueScreenHandler // reserved
- .long nvicBlueScreenHandler // reserved
- .long nvicBlueScreenHandler // reserved
- .long nvicBlueScreenHandler // reserved
- .long nvicBlueScreenHandler // SVC
- .long nvicBlueScreenHandler // debug monitor
- .long nvicBlueScreenHandler // reserved
- .long nvicBlueScreenHandler // PendSV
- .long nvicBlueScreenHandler // sys tick
- // Macro to insert all handler address
- .altmacro
- .set i, 0
- .rept 86
- HANDLER_ADDRESS %i
- .set i, i+1
- .endr
- .size vectors, .-vectors
- // ====================================================================
- // Macro to generate all handlres
- // ====================================================================
- .altmacro
- .set i, 0
- .rept 86
- HANDLER %i
- .set i, i+1
- .endr
- // ====================================================================
- // Blue screen handler
- // ====================================================================
- .type nvicBlueScreenHandler, %function
- .thumb_func
- nvicBlueScreenHandler:
- LDR r0, =gBlueScreenRegs
- ADD r1, r0, #OFFSET_R4
- STM r1, {r4-r11}
- STR r14, [r0, #OFFSET_EXC_RETURN]
- MRS r2, psp
- MRS r3, msp
- STR r2, [r0, #OFFSET_PSP]
- STR r3, [r0, #OFFSET_MSP]
- MRS r2, psplim
- MRS r3, msplim
- STR r2, [r0, #OFFSET_PSPLIM]
- STR r3, [r0, #OFFSET_MSPLIM]
- MRS r2, primask
- MRS r3, basepri
- STR r2, [r0, #OFFSET_PRIMASK]
- STR r3, [r0, #OFFSET_BASEPRI]
- MRS r2, faultmask
- MRS r3, control
- STR r2, [r0, #OFFSET_FAULTMASK]
- STR r3, [r0, #OFFSET_CONTROL]
- MRS r2, xpsr
- VMRS r3, fpscr
- STR r2, [r0, #OFFSET_CURR_XPSR]
- STR r3, [r0, #OFFSET_FPSCR]
- ADD r1, r0, #OFFSET_S0
- VSTM r1, {s0-s31}
- BL bootBlueScreen
- .ltorg
- .size nvicBlueScreenHandler, .-nvicBlueScreenHandler
- // ====================================================================
- // Entry of bootloader or fdl
- // ====================================================================
- .global bootEntry
- .func bootEntry
- .thumb_func
- bootEntry:
- CPSID i
- DSB
- ISB
- LDR r3, =0xe000ed08 // SCB->VTOR
- LDR r2, =vectors
- STR r2, [r3]
- LDR r2, =__main_stack_end
- LDR r3, =__process_stack_end
- MSR msp, r2
- MSR psp, r3
- LDR r2, =__main_stack_start
- LDR r3, =__process_stack_start
- MSR msplim, r2
- MSR psplim, r3
- MOV r2, #2
- MSR CONTROL, r2
- ISB
- BL bootStart // never return
- .size bootEntry, .-bootEntry
- .endfunc
|