1298 lines
38 KiB
ArmAsm
1298 lines
38 KiB
ArmAsm
|
/*******************************************************************************
|
||
|
* (c) Copyright 2012-2015 Microsemi SoC Products Group. All rights reserved.
|
||
|
*
|
||
|
* @file startup_m2sxxx.S
|
||
|
* @author Microsemi SoC Products Group
|
||
|
* @brief SmartFusion2 vector table and startup code for CodeSourcery G++.
|
||
|
*
|
||
|
* SVN $Revision: 7424 $
|
||
|
* SVN $Date: 2015-05-19 21:16:09 +0530 (Tue, 19 May 2015) $
|
||
|
*/
|
||
|
|
||
|
.syntax unified
|
||
|
.cpu cortex-m3
|
||
|
.thumb
|
||
|
|
||
|
/* #define UNIT_TEST_FILL_MEMORY only uncommented if carring out unit test */
|
||
|
|
||
|
/*==============================================================================
|
||
|
* Vector table
|
||
|
*/
|
||
|
.global g_pfnVectors
|
||
|
.section .isr_vector,"ax",%progbits /* added "x" so appears in .lst file even though not executable code- to help in debug process */
|
||
|
.type g_pfnVectors, %object
|
||
|
.size g_pfnVectors, .-g_pfnVectors
|
||
|
|
||
|
g_pfnVectors:
|
||
|
.word _estack
|
||
|
.word Reset_Handler
|
||
|
.word NMI_Handler
|
||
|
.word HardFault_Handler
|
||
|
.word MemManage_Handler
|
||
|
.word BusFault_Handler
|
||
|
.word UsageFault_Handler
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word 0
|
||
|
.word SVC_Handler
|
||
|
.word DebugMon_Handler
|
||
|
.word 0
|
||
|
.word PendSV_Handler
|
||
|
.word SysTick_Handler
|
||
|
.word WdogWakeup_IRQHandler
|
||
|
.word RTC_Wakeup_IRQHandler
|
||
|
.word SPI0_IRQHandler
|
||
|
.word SPI1_IRQHandler
|
||
|
.word I2C0_IRQHandler
|
||
|
.word I2C0_SMBAlert_IRQHandler
|
||
|
.word I2C0_SMBus_IRQHandler
|
||
|
.word I2C1_IRQHandler
|
||
|
.word I2C1_SMBAlert_IRQHandler
|
||
|
.word I2C1_SMBus_IRQHandler
|
||
|
.word UART0_IRQHandler
|
||
|
.word UART1_IRQHandler
|
||
|
.word EthernetMAC_IRQHandler
|
||
|
.word DMA_IRQHandler
|
||
|
.word Timer1_IRQHandler
|
||
|
.word Timer2_IRQHandler
|
||
|
.word CAN_IRQHandler
|
||
|
.word ENVM0_IRQHandler
|
||
|
.word ENVM1_IRQHandler
|
||
|
.word ComBlk_IRQHandler
|
||
|
.word USB_IRQHandler
|
||
|
.word USB_DMA_IRQHandler
|
||
|
.word PLL_Lock_IRQHandler
|
||
|
.word PLL_LockLost_IRQHandler
|
||
|
.word CommSwitchError_IRQHandler
|
||
|
.word CacheError_IRQHandler
|
||
|
.word DDR_IRQHandler
|
||
|
.word HPDMA_Complete_IRQHandler
|
||
|
.word HPDMA_Error_IRQHandler
|
||
|
.word ECC_Error_IRQHandler
|
||
|
.word MDDR_IOCalib_IRQHandler
|
||
|
.word FAB_PLL_Lock_IRQHandler
|
||
|
.word FAB_PLL_LockLost_IRQHandler
|
||
|
.word FIC64_IRQHandler
|
||
|
.word FabricIrq0_IRQHandler
|
||
|
.word FabricIrq1_IRQHandler
|
||
|
.word FabricIrq2_IRQHandler
|
||
|
.word FabricIrq3_IRQHandler
|
||
|
.word FabricIrq4_IRQHandler
|
||
|
.word FabricIrq5_IRQHandler
|
||
|
.word FabricIrq6_IRQHandler
|
||
|
.word FabricIrq7_IRQHandler
|
||
|
.word FabricIrq8_IRQHandler
|
||
|
.word FabricIrq9_IRQHandler
|
||
|
.word FabricIrq10_IRQHandler
|
||
|
.word FabricIrq11_IRQHandler
|
||
|
.word FabricIrq12_IRQHandler
|
||
|
.word FabricIrq13_IRQHandler
|
||
|
.word FabricIrq14_IRQHandler
|
||
|
.word FabricIrq15_IRQHandler
|
||
|
.word GPIO0_IRQHandler
|
||
|
.word GPIO1_IRQHandler
|
||
|
.word GPIO2_IRQHandler
|
||
|
.word GPIO3_IRQHandler
|
||
|
.word GPIO4_IRQHandler
|
||
|
.word GPIO5_IRQHandler
|
||
|
.word GPIO6_IRQHandler
|
||
|
.word GPIO7_IRQHandler
|
||
|
.word GPIO8_IRQHandler
|
||
|
.word GPIO9_IRQHandler
|
||
|
.word GPIO10_IRQHandler
|
||
|
.word GPIO11_IRQHandler
|
||
|
.word GPIO12_IRQHandler
|
||
|
.word GPIO13_IRQHandler
|
||
|
.word GPIO14_IRQHandler
|
||
|
.word GPIO15_IRQHandler
|
||
|
.word GPIO16_IRQHandler
|
||
|
.word GPIO17_IRQHandler
|
||
|
.word GPIO18_IRQHandler
|
||
|
.word GPIO19_IRQHandler
|
||
|
.word GPIO20_IRQHandler
|
||
|
.word GPIO21_IRQHandler
|
||
|
.word GPIO22_IRQHandler
|
||
|
.word GPIO23_IRQHandler
|
||
|
.word GPIO24_IRQHandler
|
||
|
.word GPIO25_IRQHandler
|
||
|
.word GPIO26_IRQHandler
|
||
|
.word GPIO27_IRQHandler
|
||
|
.word GPIO28_IRQHandler
|
||
|
.word GPIO29_IRQHandler
|
||
|
.word GPIO30_IRQHandler
|
||
|
.word GPIO31_IRQHandler
|
||
|
.word 0
|
||
|
.word 0
|
||
|
|
||
|
/*==============================================================================
|
||
|
* Reset_Handler
|
||
|
* Register r11 is used to keep track of whether we need to initialize RAMs
|
||
|
* because ECC/ SECDED is enabled.
|
||
|
*/
|
||
|
.global Reset_Handler
|
||
|
.section .boot_code,"ax",%progbits
|
||
|
.type Reset_Handler, %function
|
||
|
Reset_Handler:
|
||
|
_start:
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Initialize stack RAM content to initialize the error detection and correction
|
||
|
* (EDAC). This is done if EDAC is enabled for the eSRAM blocks or the
|
||
|
* ECC/SECDED is enabled for the MDDR.
|
||
|
* Register r11 is used to keep track of the RAM intialization decision outcome
|
||
|
* for later use for heap RAM initialization at the end of the startup code.
|
||
|
* Please note that the stack has to be located in eSRAM at this point and
|
||
|
* cannot be located in MDDR since MDDR is not available at this point.
|
||
|
* The bits of the content of register r11 have the following meaning:
|
||
|
* reg11[0]: eSRAM EDAC enabled
|
||
|
* reg11[1]: MDDR ECC/SECDED enabled
|
||
|
*/
|
||
|
mov r11, #0
|
||
|
ldr r0, SF2_MDDR_MODE_CR
|
||
|
ldr r0, [r0]
|
||
|
ldr r1, SF2_EDAC_CR
|
||
|
ldr r1, [r1]
|
||
|
and r1, r1, #3
|
||
|
and r0, r0, #0x1C
|
||
|
cmp r0, #0x14
|
||
|
bne check_esram_edac
|
||
|
orr r11, r11, #2
|
||
|
check_esram_edac:
|
||
|
cmp r1, #0
|
||
|
beq check_stack_init
|
||
|
orr r11, r11, #1
|
||
|
check_stack_init:
|
||
|
cmp r11, #0
|
||
|
beq system_init
|
||
|
clear_stack:
|
||
|
ldr r0, = __stack_start__
|
||
|
ldr r1, =_estack
|
||
|
ldr r2, RAM_INIT_PATTERN
|
||
|
bl fill_memory /* ; fill_memory takes r0 - r2 as arguments uses r4, r5, r6, r7, r8, r9, and does not preserve contents */
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Call CMSIS system init function.
|
||
|
*/
|
||
|
system_init:
|
||
|
ldr r0, =SystemInit
|
||
|
blx r0
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Modify MDDR configuration if ECC/SECDED is enabled for MDDR.
|
||
|
* Enable write combining on MDDR bridge, disable non-bufferable regions.
|
||
|
*/
|
||
|
and r10, r11, 0x2
|
||
|
cmp r10, #0
|
||
|
beq remap_memory
|
||
|
ldr r0, SF2_DDRB_NB_SIZE
|
||
|
ldr r1, SF2_DDRB_CR
|
||
|
ldr r2, [r0]
|
||
|
ldr r3, [r1]
|
||
|
push {r0, r1, r2, r3}
|
||
|
mov r2, #0
|
||
|
mov r3, #0xFF
|
||
|
str r2, [r0]
|
||
|
str r3, [r1]
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Perform memory remapping based on the value of __smartfusion2_memory_remap
|
||
|
* set in the linker script.
|
||
|
*/
|
||
|
remap_memory:
|
||
|
ldr r0, =__smartfusion2_memory_remap
|
||
|
ldr r2, =0
|
||
|
ldr r3, =1
|
||
|
cmp r0, #2
|
||
|
bne check_esram_remap
|
||
|
/*
|
||
|
* Remap external RAM to address 0x00000000
|
||
|
*/
|
||
|
ldr r1, SF2_ESRAM_CR
|
||
|
str r2, [r1]
|
||
|
ldr r1, SF2_ENVM_REMAP_CR
|
||
|
str r2, [r1]
|
||
|
ldr r1, SF2_DDR_CR
|
||
|
str r3, [r1]
|
||
|
check_esram_remap:
|
||
|
cmp r0, #1
|
||
|
bne check_mirrored_nvm
|
||
|
/*
|
||
|
* Remap internal eSRAM to address 0x00000000
|
||
|
*/
|
||
|
ldr r1, SF2_DDR_CR
|
||
|
str r2, [r1]
|
||
|
ldr r1, SF2_ENVM_REMAP_CR
|
||
|
str r2, [r1]
|
||
|
ldr r1, SF2_ESRAM_CR
|
||
|
str r3, [r1]
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Check if the executable is built for NVM LMA mirrored to VMA address.
|
||
|
* This is done for debugging executables running out of eNVM with SoftConsole.
|
||
|
* The .text section should not be copied in this case since both the LMA and
|
||
|
* VMA point at the eNVM despite the LMA and VMa having different values.
|
||
|
*/
|
||
|
check_mirrored_nvm:
|
||
|
ldr r0, =__mirrored_nvm
|
||
|
cmp r0, #0
|
||
|
bne copy_data
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Copy vector table.
|
||
|
*/
|
||
|
ldr r0, =__vector_table_load
|
||
|
ldr r1, =__vector_table_start
|
||
|
ldr r2, =_evector_table
|
||
|
bl block_copy
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Copy code section.
|
||
|
*/
|
||
|
copy_text:
|
||
|
ldr r0, =__text_load
|
||
|
ldr r1, =__text_start
|
||
|
ldr r2, =_etext
|
||
|
bl block_copy
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Copy data section.
|
||
|
*/
|
||
|
|
||
|
copy_data:
|
||
|
ldr r0, =__data_load
|
||
|
ldr r1, =__data_start
|
||
|
ldr r2, =_edata
|
||
|
bl block_copy
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Clear .bss
|
||
|
*/
|
||
|
clear_bss:
|
||
|
ldr r0, =__bss_start__
|
||
|
ldr r1, =__bss_end__
|
||
|
ldr r2, RAM_INIT_PATTERN
|
||
|
bl fill_memory /* ; fill_memory takes r0 - r2 as arguments uses r4, r5, r6, r7, r8, r9, and does not preserve contents */
|
||
|
|
||
|
#ifdef UNIT_TEST_FILL_MEMORY
|
||
|
bl unit_test_fill_memory
|
||
|
#endif
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Initialize heap RAM content to initialize the error detection and correction
|
||
|
* (EDAC). We use the decision made earlier in the startup code of whether or
|
||
|
* not the stack RAM should be initialized. This decision is held in register
|
||
|
* r11. A non-zero value indicates that the RAM content should be initialized.
|
||
|
*/
|
||
|
clear_heap:
|
||
|
cmp r11, #0
|
||
|
beq call_glob_ctor
|
||
|
ldr r0, =__heap_start__
|
||
|
ldr r1, =_eheap
|
||
|
ldr r2, HEAP_INIT_PATTERN
|
||
|
bl fill_memory /* ; fill_memory takes r0 - r2 as arguments uses r4, r5, r6, r7, r8, r9, and does not preserve contents */
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Restore MDDR configuration.
|
||
|
*/
|
||
|
and r10, r11, 0x2
|
||
|
cmp r10, #0
|
||
|
beq call_glob_ctor
|
||
|
pop {r0, r1, r2, r3}
|
||
|
str r2, [r0]
|
||
|
str r3, [r1]
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* Call global constructors
|
||
|
*/
|
||
|
/*
|
||
|
* Align to word and use 32-bits LDR instruction to ensure the ADD instruction
|
||
|
* taking PC as argument is aligned on a word boundary.
|
||
|
*/
|
||
|
.align 4
|
||
|
call_glob_ctor:
|
||
|
ldr.w r0, =__libc_init_array
|
||
|
add lr, pc, #3
|
||
|
bx r0
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* branch to main.
|
||
|
*/
|
||
|
branch_to_main:
|
||
|
mov r0, #0 /* ; no arguments */
|
||
|
mov r1, #0 /* ; no argv either */
|
||
|
ldr pc, =main
|
||
|
|
||
|
ExitLoop:
|
||
|
B ExitLoop
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* block copy.
|
||
|
*
|
||
|
* r0: source address
|
||
|
* r1: target address
|
||
|
* r2: end target address
|
||
|
*
|
||
|
* note: Most efficient if memory aligned. Linker ALIGN(16) command
|
||
|
* should be used as per example linker scripts.
|
||
|
* Note 1: If the memory address in r0 or r1, byte copy routine is used
|
||
|
* Note 2: If r1 < r2, will loop indefinetley to highlight linker issue.
|
||
|
*/
|
||
|
block_copy:
|
||
|
push {r3, r4, r5, r6, r7, r8, lr}
|
||
|
cmp r0, r1
|
||
|
beq block_copy_exit /* ; Exit early if source and destination the same */
|
||
|
subs.w r2, r2, r1 /* ; Calculate number of bytes to move */
|
||
|
bpl block_copy_address_ok /* ; check (end target address) > (target address) => continue */
|
||
|
b . /* ; halt as critical error- memory map not OK- make it easy to catch in debugger */
|
||
|
block_copy_address_ok:
|
||
|
/* ; detect if source or target memory addresses unaligned. If so use byte copy routine */
|
||
|
orr.w r3, r0, r1
|
||
|
ands.w r3, r3, #3
|
||
|
beq block_copy_continue
|
||
|
block_copy_byte_copy:
|
||
|
bl block_copy_byte
|
||
|
b block_copy_exit
|
||
|
block_copy_continue:
|
||
|
mov r3, #0
|
||
|
mov r8,r2 /* ; Save copy of byte count */
|
||
|
asrs r2,r2, #4 /* ; Div by 16 to get number of chunks to move */
|
||
|
beq block_copy_byte_copy /* ; need to use byte copy if less than 16 bytes */
|
||
|
block_copy_loop:
|
||
|
cmp r2, r3
|
||
|
itt ne
|
||
|
ldmne r0!, {r4, r5, r6, r7}
|
||
|
stmne r1!, {r4, r5, r6, r7}
|
||
|
add.w r3, r3, #1 /* ; use Thumb2- make sure condition code reg. not updated */
|
||
|
bne block_copy_loop
|
||
|
/* ; copy spare bytes at the end if any */
|
||
|
and r8, #15 /* ; get spare bytes --check can you do an ands? */
|
||
|
cmp r8, #0 /* ; no spare bytes at end- end now */
|
||
|
beq block_copy_exit
|
||
|
copy_spare_bytes: /* ; From above, R0 contains source address, R1 contains destination address */
|
||
|
ldrb r4, [r0]
|
||
|
strb r4, [r1]
|
||
|
add r0, #1
|
||
|
add r1, #1
|
||
|
subs r8, r8, #1
|
||
|
bne copy_spare_bytes
|
||
|
block_copy_exit:
|
||
|
pop {r3, r4, r5, r6, r7, r8, pc}
|
||
|
|
||
|
/*
|
||
|
* block_copy_byte: used if memory not aligned
|
||
|
* r0: source address
|
||
|
* r1: target address
|
||
|
* r2: number of bytes
|
||
|
*/
|
||
|
block_copy_byte:
|
||
|
push {r3, lr}
|
||
|
mov r3, #0
|
||
|
block_copy_byte_loop: /* ; From above, R0 contains source address, R1 contains destination address */
|
||
|
ldrb r3, [r0]
|
||
|
strb r3, [r1]
|
||
|
add r0, #1
|
||
|
add r1, #1
|
||
|
subs r2, r2, #1
|
||
|
bne block_copy_byte_loop
|
||
|
pop {r3, pc}
|
||
|
|
||
|
/*;------------------------------------------------------------------------------
|
||
|
; * fill_memory.
|
||
|
; * @brief Fills memory with Pattern contained in r2
|
||
|
; * This routine uses the stmne instruction to copy 4 words at a time which is very efficient
|
||
|
; * The instruction can only write to word aligned memory, hence the code at the start and end of this routine
|
||
|
; * to handle possible unaligned bytes at start and end.
|
||
|
; *
|
||
|
; * @param param1 r0: start address
|
||
|
; * @param param2 r1: end address
|
||
|
; * @param param3 r2: FILL PATTETN
|
||
|
; *
|
||
|
; * @note note: Most efficient if memory aligned. Linker ALIGN(4) command
|
||
|
; * should be used as per example linker scripts
|
||
|
; * Stack is not used in this routine
|
||
|
; * register contents r4, r5, r6, r7, r8, r9, will are used and will be returned undefined
|
||
|
; * @return none - Used Registers are not preserved
|
||
|
; */
|
||
|
|
||
|
fill_memory:
|
||
|
/* ;push {r4, r5, r6, r7, r8, r9, lr} We will not use stack as may be not available */
|
||
|
cmp r0, r1
|
||
|
beq fill_memory_exit /* ; Exit early if source and destination the same */
|
||
|
/* ; copy non-aligned bytes at the start */
|
||
|
and.w r6, r0, #3 /* ; see if non-alaigned bytes at the start */
|
||
|
cmp r6, #0
|
||
|
beq fill_memory_end_start /* ; no spare bytes at start, continue */
|
||
|
mov r5, #4
|
||
|
sub.w r4, r5, r6 /* ; now have number of non-aligned bytes in r4 */
|
||
|
mov r7, #8
|
||
|
mul r8, r7, r6 /* ; calculate number of shifts required to initalise pattern for non-aligned bytes */
|
||
|
mov r9, r2 /* ; copy pattern */
|
||
|
ror r9, r9, r8 /* ; Rotate right to keep pattern consistent */
|
||
|
fill_memory_spare_bytes_start: /* ; From above, R0 contains source address, R1 contains destination address */
|
||
|
cmp r4, #0 /* ; no spare bytes at end- end now */
|
||
|
beq fill_memory_end_start
|
||
|
strb r9, [r0] /* ; fill byte */
|
||
|
ror.w r9, r9, r7 /* ; Rotate right by one byte for the next time, to keep pattern consistent */
|
||
|
add r0, r0, #1 /* ; add one to address */
|
||
|
subs r4, r4, #1 /* ; subtract one from byte count 1 */
|
||
|
b fill_memory_spare_bytes_start
|
||
|
fill_memory_end_start:
|
||
|
mov r6, #0
|
||
|
mov r7, r1 /* ; save end address */
|
||
|
subs r1, r1, r0 /* ; Calculate number of bytes to fill */
|
||
|
mov r8,r1 /* ; Save copy of byte count */
|
||
|
asrs r1,r1, #4 /* ; Div by 16 to get number of chunks to move */
|
||
|
mov r9, r2 /* ; copy pattern */
|
||
|
mov r4, r2 /* ; copy pattern */
|
||
|
mov r5, r2 /* ; copy pattern */
|
||
|
cmp r1, r6 /* ; compare to see if all chunks copied */
|
||
|
beq fill_memory_spare_bytes_end
|
||
|
fill_memory_loop:
|
||
|
it ne
|
||
|
stmne r0!, {r2, r4, r5, r9} /* ; copy pattern- note: stmne instruction must me word aligned (address in r0) */
|
||
|
add.w r6, r6, #1 /* ; use Thumb2- make sure condition code reg. not updated */
|
||
|
cmp r1, r6 /* ; compare to see if all chunks copied */
|
||
|
bne fill_memory_loop
|
||
|
fill_memory_spare_bytes_end: /* ; copy spare bytes at the end if any */
|
||
|
and.w r8, r8, #15 /* ; get spare bytes --check can you do an ands? */
|
||
|
fill_memory_spare_end_loop: /* ; From above, R0 contains source address, R1 contains destination address */
|
||
|
cmp r8, #0 /* ; no spare bytes at end- end now */
|
||
|
beq fill_memory_exit
|
||
|
strb r2, [r0]
|
||
|
ror.w r2, r2, #8 /* ; Rotate right by one byte for the next time, to keep pattern consistent */
|
||
|
add r0, r0, #1 /* ; add one to address */
|
||
|
subs r8, r8, #1 /* ; subtract one from byte count 1 */
|
||
|
b fill_memory_spare_end_loop
|
||
|
fill_memory_exit:
|
||
|
bx lr /*; We will not use pop as stack may be not available */
|
||
|
|
||
|
|
||
|
/*------------------------------------------------------------------------------
|
||
|
* unit_test_fill_memory
|
||
|
* calls fills_memory function with various paramaters
|
||
|
*
|
||
|
* r0: start address
|
||
|
* r1: end address
|
||
|
* r2: FILL PATTETN
|
||
|
*
|
||
|
* Debugger used to check filled memeory is as expected.
|
||
|
* Note: Last instruction in this routine deliberatly halts code to prevent accidentle enabeling in
|
||
|
* release code.
|
||
|
*/
|
||
|
#ifdef UNIT_TEST_FILL_MEMORY
|
||
|
MEM_TEST_PATTERN: .word 0x12345678
|
||
|
unit_test_fill_memory:
|
||
|
push {r0, r1, r2, lr}
|
||
|
ldr r0, = 0x20000100
|
||
|
ldr r1, = 0x20000200
|
||
|
ldr r2, MEM_TEST_PATTERN
|
||
|
bl fill_memory /* ; fill_memory takes r0 - r2 as arguments */
|
||
|
ldr r0, = 0x20000300 /* ; source address */
|
||
|
ldr r1, = 0x20000400 /* ; dest address */
|
||
|
ldr r2, = 0x200004FF /* ; end address */
|
||
|
bl block_copy /* ; copy above */
|
||
|
/* second test */
|
||
|
ldr r0, = 0x20003300
|
||
|
ldr r1, = 0x20003403
|
||
|
ldr r2, MEM_TEST_PATTERN
|
||
|
bl fill_memory
|
||
|
ldr r0, = 0x20003300
|
||
|
ldr r1, = 0x20003500
|
||
|
ldr r2, = 0x20003603
|
||
|
bl block_copy
|
||
|
/* third test */
|
||
|
ldr r0, = 0x20000702
|
||
|
ldr r1, = 0x20000803
|
||
|
ldr r2, MEM_TEST_PATTERN
|
||
|
bl fill_memory /* ; fill_memory takes r0 - r2 as arguments */
|
||
|
ldr r0, = 0x20000702
|
||
|
ldr r1, = 0x20000902
|
||
|
ldr r2, = 0x20000A03
|
||
|
bl block_copy
|
||
|
/* fourth test */
|
||
|
ldr r0, = 0x20000B01
|
||
|
ldr r1, = 0x20000C03
|
||
|
ldr r2, MEM_TEST_PATTERN
|
||
|
bl fill_memory /* ; fill_memory takes r0 - r2 as arguments */
|
||
|
ldr r0, = 0x20000B01
|
||
|
ldr r1, = 0x20000D01
|
||
|
ldr r2, = 0x20000E03
|
||
|
bl block_copy
|
||
|
/* fith test */
|
||
|
ldr r0, = 0x20002D01
|
||
|
ldr r1, = 0x20002E01
|
||
|
ldr r2, MEM_TEST_PATTERN
|
||
|
bl fill_memory /* ; fill_memory takes r0 - r2 as arguments */
|
||
|
ldr r0, = 0x20002D01
|
||
|
ldr r1, = 0x20002F01
|
||
|
ldr r2, = 0x20003001
|
||
|
bl block_copy
|
||
|
/* sixth test */
|
||
|
ldr r0, = 0x20001903
|
||
|
ldr r1, = 0x20001904
|
||
|
ldr r2, MEM_TEST_PATTERN
|
||
|
bl fill_memory /* ; fill_memory takes r0 - r2 as arguments */
|
||
|
ldr r0, = 0x20001903
|
||
|
ldr r1, = 0x20001A03
|
||
|
ldr r2, = 0x20001A04
|
||
|
bl block_copy
|
||
|
/* ; final test, note: This one will cause a halt in copy function- as designed */
|
||
|
ldr r0, = 0x20001903
|
||
|
ldr r1, = 0x20001A03
|
||
|
ldr r2, = 0x20000A04 /* ; end address < start address */
|
||
|
bl block_copy
|
||
|
unit_test_fill_memory_debug: /* ; delibrately wait here, this function only to be used when carrying out test */
|
||
|
b . /* ; stop debugger here and verify memory as expected in debugger */
|
||
|
pop {r0, r1, r2, pc}
|
||
|
#endif
|
||
|
/*==============================================================================
|
||
|
* NMI_Handler
|
||
|
*/
|
||
|
.weak NMI_Handler
|
||
|
.type NMI_Handler, %function
|
||
|
NMI_Handler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* HardFault_Handler
|
||
|
*/
|
||
|
.weak HardFault_Handler
|
||
|
.type HardFault_Handler, %function
|
||
|
HardFault_Handler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* MemManage_Handler
|
||
|
*/
|
||
|
.weak MemManage_Handler
|
||
|
.type MemManage_Handler, %function
|
||
|
MemManage_Handler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* BusFault_Handler
|
||
|
*/
|
||
|
.weak BusFault_Handler
|
||
|
.type BusFault_Handler, %function
|
||
|
BusFault_Handler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* UsageFault_Handler
|
||
|
*/
|
||
|
.weak UsageFault_Handler
|
||
|
.type UsageFault_Handler, %function
|
||
|
UsageFault_Handler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* SVC_Handler
|
||
|
*/
|
||
|
.weak SVC_Handler
|
||
|
.type SVC_Handler, %function
|
||
|
SVC_Handler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* DebugMon_Handler
|
||
|
*/
|
||
|
.weak DebugMon_Handler
|
||
|
.type DebugMon_Handler, %function
|
||
|
DebugMon_Handler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* PendSV_Handler
|
||
|
*/
|
||
|
.weak PendSV_Handler
|
||
|
.type PendSV_Handler, %function
|
||
|
PendSV_Handler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* SysTick_Handler
|
||
|
*/
|
||
|
.weak SysTick_Handler
|
||
|
.type SysTick_Handler, %function
|
||
|
SysTick_Handler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* WdogWakeup_IRQHandler
|
||
|
*/
|
||
|
.weak WdogWakeup_IRQHandler
|
||
|
.type WdogWakeup_IRQHandler, %function
|
||
|
WdogWakeup_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* RTC_Wakeup_IRQHandler
|
||
|
*/
|
||
|
.weak RTC_Wakeup_IRQHandler
|
||
|
.type RTC_Wakeup_IRQHandler, %function
|
||
|
RTC_Wakeup_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* SPI0_IRQHandler
|
||
|
*/
|
||
|
.weak SPI0_IRQHandler
|
||
|
.type SPI0_IRQHandler, %function
|
||
|
SPI0_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* SPI1_IRQHandler
|
||
|
*/
|
||
|
.weak SPI1_IRQHandler
|
||
|
.type SPI1_IRQHandler, %function
|
||
|
SPI1_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* I2C0_IRQHandler
|
||
|
*/
|
||
|
.weak I2C0_IRQHandler
|
||
|
.type I2C0_IRQHandler, %function
|
||
|
I2C0_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* I2C0_SMBAlert_IRQHandler
|
||
|
*/
|
||
|
.weak I2C0_SMBAlert_IRQHandler
|
||
|
.type I2C0_SMBAlert_IRQHandler, %function
|
||
|
I2C0_SMBAlert_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* I2C0_SMBus_IRQHandler
|
||
|
*/
|
||
|
.weak I2C0_SMBus_IRQHandler
|
||
|
.type I2C0_SMBus_IRQHandler, %function
|
||
|
I2C0_SMBus_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* I2C1_IRQHandler
|
||
|
*/
|
||
|
.weak I2C1_IRQHandler
|
||
|
.type I2C1_IRQHandler, %function
|
||
|
I2C1_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* I2C1_SMBAlert_IRQHandler
|
||
|
*/
|
||
|
.weak I2C1_SMBAlert_IRQHandler
|
||
|
.type I2C1_SMBAlert_IRQHandler, %function
|
||
|
I2C1_SMBAlert_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* I2C1_SMBus_IRQHandler
|
||
|
*/
|
||
|
.weak I2C1_SMBus_IRQHandler
|
||
|
.type I2C1_SMBus_IRQHandler, %function
|
||
|
I2C1_SMBus_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* UART0_IRQHandler
|
||
|
*/
|
||
|
.weak UART0_IRQHandler
|
||
|
.type UART0_IRQHandler, %function
|
||
|
UART0_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* UART1_IRQHandler
|
||
|
*/
|
||
|
.weak UART1_IRQHandler
|
||
|
.type UART1_IRQHandler, %function
|
||
|
UART1_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* EthernetMAC_IRQHandler
|
||
|
*/
|
||
|
.weak EthernetMAC_IRQHandler
|
||
|
.type EthernetMAC_IRQHandler, %function
|
||
|
EthernetMAC_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* DMA_IRQHandler
|
||
|
*/
|
||
|
.weak DMA_IRQHandler
|
||
|
.type DMA_IRQHandler, %function
|
||
|
DMA_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* Timer1_IRQHandler
|
||
|
*/
|
||
|
.weak Timer1_IRQHandler
|
||
|
.type Timer1_IRQHandler, %function
|
||
|
Timer1_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* Timer2_IRQHandler
|
||
|
*/
|
||
|
.weak Timer2_IRQHandler
|
||
|
.type Timer2_IRQHandler, %function
|
||
|
Timer2_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* CAN_IRQHandler
|
||
|
*/
|
||
|
.weak CAN_IRQHandler
|
||
|
.type CAN_IRQHandler, %function
|
||
|
CAN_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* ENVM0_IRQHandler
|
||
|
*/
|
||
|
.weak ENVM0_IRQHandler
|
||
|
.type ENVM0_IRQHandler, %function
|
||
|
ENVM0_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* ENVM1_IRQHandler
|
||
|
*/
|
||
|
.weak ENVM1_IRQHandler
|
||
|
.type ENVM1_IRQHandler, %function
|
||
|
ENVM1_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* ComBlk_IRQHandler
|
||
|
*/
|
||
|
.weak ComBlk_IRQHandler
|
||
|
.type ComBlk_IRQHandler, %function
|
||
|
ComBlk_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* USB_IRQHandler
|
||
|
*/
|
||
|
.weak USB_IRQHandler
|
||
|
.type USB_IRQHandler, %function
|
||
|
USB_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* USB_DMA_IRQHandler
|
||
|
*/
|
||
|
.weak USB_DMA_IRQHandler
|
||
|
.type USB_DMA_IRQHandler, %function
|
||
|
USB_DMA_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* PLL_Lock_IRQHandler
|
||
|
*/
|
||
|
.weak PLL_Lock_IRQHandler
|
||
|
.type PLL_Lock_IRQHandler, %function
|
||
|
PLL_Lock_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* PLL_LockLost_IRQHandler
|
||
|
*/
|
||
|
.weak PLL_LockLost_IRQHandler
|
||
|
.type PLL_LockLost_IRQHandler, %function
|
||
|
PLL_LockLost_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* CommSwitchError_IRQHandler
|
||
|
*/
|
||
|
.weak CommSwitchError_IRQHandler
|
||
|
.type CommSwitchError_IRQHandler, %function
|
||
|
CommSwitchError_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* CacheError_IRQHandler
|
||
|
*/
|
||
|
.weak CacheError_IRQHandler
|
||
|
.type CacheError_IRQHandler, %function
|
||
|
CacheError_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* DDR_IRQHandler
|
||
|
*/
|
||
|
.weak DDR_IRQHandler
|
||
|
.type DDR_IRQHandler, %function
|
||
|
DDR_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* HPDMA_Complete_IRQHandler
|
||
|
*/
|
||
|
.weak HPDMA_Complete_IRQHandler
|
||
|
.type HPDMA_Complete_IRQHandler, %function
|
||
|
HPDMA_Complete_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* HPDMA_Error_IRQHandler
|
||
|
*/
|
||
|
.weak HPDMA_Error_IRQHandler
|
||
|
.type HPDMA_Error_IRQHandler, %function
|
||
|
HPDMA_Error_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* ECC_Error_IRQHandler
|
||
|
*/
|
||
|
.weak ECC_Error_IRQHandler
|
||
|
.type ECC_Error_IRQHandler, %function
|
||
|
ECC_Error_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* MDDR_IOCalib_IRQHandler
|
||
|
*/
|
||
|
.weak MDDR_IOCalib_IRQHandler
|
||
|
.type MDDR_IOCalib_IRQHandler, %function
|
||
|
MDDR_IOCalib_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FAB_PLL_Lock_IRQHandler
|
||
|
*/
|
||
|
.weak FAB_PLL_Lock_IRQHandler
|
||
|
.type FAB_PLL_Lock_IRQHandler, %function
|
||
|
FAB_PLL_Lock_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FAB_PLL_LockLost_IRQHandler
|
||
|
*/
|
||
|
.weak FAB_PLL_LockLost_IRQHandler
|
||
|
.type FAB_PLL_LockLost_IRQHandler, %function
|
||
|
FAB_PLL_LockLost_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FIC64_IRQHandler
|
||
|
*/
|
||
|
.weak FIC64_IRQHandler
|
||
|
.type FIC64_IRQHandler, %function
|
||
|
FIC64_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq0_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq0_IRQHandler
|
||
|
.type FabricIrq0_IRQHandler, %function
|
||
|
FabricIrq0_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq1_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq1_IRQHandler
|
||
|
.type FabricIrq1_IRQHandler, %function
|
||
|
FabricIrq1_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq2_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq2_IRQHandler
|
||
|
.type FabricIrq2_IRQHandler, %function
|
||
|
FabricIrq2_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq3_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq3_IRQHandler
|
||
|
.type FabricIrq3_IRQHandler, %function
|
||
|
FabricIrq3_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq4_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq4_IRQHandler
|
||
|
.type FabricIrq4_IRQHandler, %function
|
||
|
FabricIrq4_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq5_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq5_IRQHandler
|
||
|
.type FabricIrq5_IRQHandler, %function
|
||
|
FabricIrq5_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq6_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq6_IRQHandler
|
||
|
.type FabricIrq6_IRQHandler, %function
|
||
|
FabricIrq6_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq7_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq7_IRQHandler
|
||
|
.type FabricIrq7_IRQHandler, %function
|
||
|
FabricIrq7_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq8_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq8_IRQHandler
|
||
|
.type FabricIrq8_IRQHandler, %function
|
||
|
FabricIrq8_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq9_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq9_IRQHandler
|
||
|
.type FabricIrq9_IRQHandler, %function
|
||
|
FabricIrq9_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq10_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq10_IRQHandler
|
||
|
.type FabricIrq10_IRQHandler, %function
|
||
|
FabricIrq10_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq11_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq11_IRQHandler
|
||
|
.type FabricIrq11_IRQHandler, %function
|
||
|
FabricIrq11_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq12_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq12_IRQHandler
|
||
|
.type FabricIrq12_IRQHandler, %function
|
||
|
FabricIrq12_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq13_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq13_IRQHandler
|
||
|
.type FabricIrq13_IRQHandler, %function
|
||
|
FabricIrq13_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq14_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq14_IRQHandler
|
||
|
.type FabricIrq14_IRQHandler, %function
|
||
|
FabricIrq14_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* FabricIrq15_IRQHandler
|
||
|
*/
|
||
|
.weak FabricIrq15_IRQHandler
|
||
|
.type FabricIrq15_IRQHandler, %function
|
||
|
FabricIrq15_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO0_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO0_IRQHandler
|
||
|
.type GPIO0_IRQHandler, %function
|
||
|
GPIO0_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO1_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO1_IRQHandler
|
||
|
.type GPIO1_IRQHandler, %function
|
||
|
GPIO1_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO2_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO2_IRQHandler
|
||
|
.type GPIO2_IRQHandler, %function
|
||
|
GPIO2_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO3_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO3_IRQHandler
|
||
|
.type GPIO3_IRQHandler, %function
|
||
|
GPIO3_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO4_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO4_IRQHandler
|
||
|
.type GPIO4_IRQHandler, %function
|
||
|
GPIO4_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO5_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO5_IRQHandler
|
||
|
.type GPIO5_IRQHandler, %function
|
||
|
GPIO5_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO6_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO6_IRQHandler
|
||
|
.type GPIO6_IRQHandler, %function
|
||
|
GPIO6_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO7_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO7_IRQHandler
|
||
|
.type GPIO7_IRQHandler, %function
|
||
|
GPIO7_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO8_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO8_IRQHandler
|
||
|
.type GPIO8_IRQHandler, %function
|
||
|
GPIO8_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO9_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO9_IRQHandler
|
||
|
.type GPIO9_IRQHandler, %function
|
||
|
GPIO9_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO10_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO10_IRQHandler
|
||
|
.type GPIO10_IRQHandler, %function
|
||
|
GPIO10_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO11_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO11_IRQHandler
|
||
|
.type GPIO11_IRQHandler, %function
|
||
|
GPIO11_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO12_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO12_IRQHandler
|
||
|
.type GPIO12_IRQHandler, %function
|
||
|
GPIO12_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO13_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO13_IRQHandler
|
||
|
.type GPIO13_IRQHandler, %function
|
||
|
GPIO13_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO14_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO14_IRQHandler
|
||
|
.type GPIO14_IRQHandler, %function
|
||
|
GPIO14_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO15_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO15_IRQHandler
|
||
|
.type GPIO15_IRQHandler, %function
|
||
|
GPIO15_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO16_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO16_IRQHandler
|
||
|
.type GPIO16_IRQHandler, %function
|
||
|
GPIO16_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO17_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO17_IRQHandler
|
||
|
.type GPIO17_IRQHandler, %function
|
||
|
GPIO17_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO18_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO18_IRQHandler
|
||
|
.type GPIO18_IRQHandler, %function
|
||
|
GPIO18_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO19_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO19_IRQHandler
|
||
|
.type GPIO19_IRQHandler, %function
|
||
|
GPIO19_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO20_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO20_IRQHandler
|
||
|
.type GPIO20_IRQHandler, %function
|
||
|
GPIO20_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO21_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO21_IRQHandler
|
||
|
.type GPIO21_IRQHandler, %function
|
||
|
GPIO21_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO22_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO22_IRQHandler
|
||
|
.type GPIO22_IRQHandler, %function
|
||
|
GPIO22_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO23_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO23_IRQHandler
|
||
|
.type GPIO23_IRQHandler, %function
|
||
|
GPIO23_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO24_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO24_IRQHandler
|
||
|
.type GPIO24_IRQHandler, %function
|
||
|
GPIO24_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO25_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO25_IRQHandler
|
||
|
.type GPIO25_IRQHandler, %function
|
||
|
GPIO25_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO26_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO26_IRQHandler
|
||
|
.type GPIO26_IRQHandler, %function
|
||
|
GPIO26_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO27_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO27_IRQHandler
|
||
|
.type GPIO27_IRQHandler, %function
|
||
|
GPIO27_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO28_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO28_IRQHandler
|
||
|
.type GPIO28_IRQHandler, %function
|
||
|
GPIO28_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO29_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO29_IRQHandler
|
||
|
.type GPIO29_IRQHandler, %function
|
||
|
GPIO29_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO30_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO30_IRQHandler
|
||
|
.type GPIO30_IRQHandler, %function
|
||
|
GPIO30_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* GPIO31_IRQHandler
|
||
|
*/
|
||
|
.weak GPIO31_IRQHandler
|
||
|
.type GPIO31_IRQHandler, %function
|
||
|
GPIO31_IRQHandler:
|
||
|
B .
|
||
|
|
||
|
/*==============================================================================
|
||
|
* mscc_post_hw_cfg_init
|
||
|
*/
|
||
|
.weak mscc_post_hw_cfg_init
|
||
|
.type mscc_post_hw_cfg_init, %function
|
||
|
mscc_post_hw_cfg_init:
|
||
|
BX LR
|
||
|
|
||
|
/*==============================================================================
|
||
|
* Constants:
|
||
|
*/
|
||
|
RAM_INIT_PATTERN: .word 0x00000000
|
||
|
HEAP_INIT_PATTERN: .word 0xA2A2A2A2
|
||
|
SF2_ESRAM_CR: .word 0x40038000
|
||
|
SF2_DDR_CR: .word 0x40038008
|
||
|
SF2_ENVM_REMAP_CR: .word 0x40038010
|
||
|
SF2_DDRB_NB_SIZE: .word 0x40038030
|
||
|
SF2_DDRB_CR: .word 0x40038034
|
||
|
SF2_EDAC_CR: .word 0x40038038
|
||
|
SF2_MDDR_MODE_CR: .word 0x40020818
|
||
|
|
||
|
.end
|