|
@@ -0,0 +1,1297 @@
|
|
|
+/*******************************************************************************
|
|
|
+ * (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
|