mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-17 05:32:55 +08:00
302 lines
8.4 KiB
ArmAsm
302 lines
8.4 KiB
ArmAsm
/*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
#include "syscfg/syscfg.h"
|
|
|
|
.syntax unified
|
|
.arch armv7-m
|
|
|
|
.section .stack
|
|
.align 3
|
|
#ifdef __STACK_SIZE
|
|
.equ Stack_Size, __STACK_SIZE
|
|
#else
|
|
.equ Stack_Size, 0xC00
|
|
#endif
|
|
.equ SYS_CTRL_REG, 0x50000024
|
|
.equ CACHE_FLASH_REG, 0x100C0040
|
|
.equ RESET_STAT_REG, 0x500000BC
|
|
|
|
.globl __StackTop
|
|
.globl __StackLimit
|
|
__StackLimit:
|
|
.space Stack_Size
|
|
.size __StackLimit, . - __StackLimit
|
|
__StackTop:
|
|
.size __StackTop, . - __StackTop
|
|
|
|
.section .heap
|
|
.align 3
|
|
#ifdef __HEAP_SIZE
|
|
.equ Heap_Size, __HEAP_SIZE
|
|
#else
|
|
.equ Heap_Size, 0
|
|
#endif
|
|
.globl __HeapBase
|
|
.globl __HeapLimit
|
|
__HeapBase:
|
|
.if Heap_Size
|
|
.space Heap_Size
|
|
.endif
|
|
.size __HeapBase, . - __HeapBase
|
|
__HeapLimit:
|
|
.size __HeapLimit, . - __HeapLimit
|
|
|
|
.section .isr_vector
|
|
.align 2
|
|
.globl __isr_vector
|
|
__isr_vector:
|
|
.long __StackTop
|
|
.long Reset_Handler
|
|
/* Cortex-M33 interrupts */
|
|
.long NMI_Handler
|
|
.long HardFault_Handler
|
|
.long MemoryManagement_Handler
|
|
.long BusFault_Handler
|
|
.long UsageFault_Handler
|
|
.long SecureFault_Handler
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long SVC_Handler
|
|
.long DebugMonitor_Handler
|
|
.long 0 /* Reserved */
|
|
.long PendSV_Handler
|
|
.long SysTick_Handler
|
|
/* DA1469x interrupts */
|
|
.long SENSOR_NODE_IRQHandler
|
|
.long DMA_IRQHandler
|
|
.long CHARGER_STATE_IRQHandler
|
|
.long CHARGER_ERROR_IRQHandler
|
|
.long CMAC2SYS_IRQHandler
|
|
.long UART_IRQHandler
|
|
.long UART2_IRQHandler
|
|
.long UART3_IRQHandler
|
|
.long I2C_IRQHandler
|
|
.long I2C2_IRQHandler
|
|
.long SPI_IRQHandler
|
|
.long SPI2_IRQHandler
|
|
.long PCM_IRQHandler
|
|
.long SRC_IN_IRQHandler
|
|
.long SRC_OUT_IRQHandler
|
|
.long USB_IRQHandler
|
|
.long TIMER_IRQHandler
|
|
.long TIMER2_IRQHandler
|
|
.long RTC_IRQHandler
|
|
.long KEY_WKUP_GPIO_IRQHandler
|
|
.long PDC_IRQHandler
|
|
.long VBUS_IRQHandler
|
|
.long MRM_IRQHandler
|
|
.long MOTOR_CONTROLLER_IRQHandler
|
|
.long TRNG_IRQHandler
|
|
.long DCDC_IRQHandler
|
|
.long XTAL32M_RDY_IRQHandler
|
|
.long ADC_IRQHandler
|
|
.long ADC2_IRQHandler
|
|
.long CRYPTO_IRQHandler
|
|
.long CAPTIMER1_IRQHandler
|
|
.long RFDIAG_IRQHandler
|
|
.long LCD_CONTROLLER_IRQHandler
|
|
.long PLL_LOCK_IRQHandler
|
|
.long TIMER3_IRQHandler
|
|
.long TIMER4_IRQHandler
|
|
.long LRA_IRQHandler
|
|
.long RTC_EVENT_IRQHandler
|
|
.long GPIO_P0_IRQHandler
|
|
.long GPIO_P1_IRQHandler
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.long 0 /* Reserved */
|
|
.size __isr_vector, . - __isr_vector
|
|
|
|
.text
|
|
.thumb
|
|
.thumb_func
|
|
.align 2
|
|
.globl Reset_Handler
|
|
.type Reset_Handler, %function
|
|
Reset_Handler:
|
|
/* Make sure interrupt vector is remapped at 0x0 */
|
|
ldr r1, =SYS_CTRL_REG
|
|
ldrh r2, [r1, #0]
|
|
orrs r2, r2, #8
|
|
strh r2, [r1, #0]
|
|
|
|
#if !MYNEWT_VAL(RAM_RESIDENT)
|
|
/*
|
|
* Flash is remapped at 0x0 with an offset, i.e. 0x0 does not correspond to
|
|
* 0x16000000 but to start of an image on flash. This is calculated from product
|
|
* header by 1st state bootloader and configured in CACHE_FLASH_REG. We need to
|
|
* retrieve proper offset value for calculations later.
|
|
*/
|
|
ldr r1, =CACHE_FLASH_REG
|
|
ldr r4, [r1, #0]
|
|
mov r2, r4
|
|
mov r3, #0xFFFF
|
|
bic r4, r4, r3 /* CACHE_FLASH_REG[FLASH_REGION_BASE] */
|
|
mov r3, #0xFFF0
|
|
and r2, r2, r3 /* CACHE_FLASH_REG[FLASH_REGION_OFFSET] */
|
|
lsr r2, r2, #2
|
|
orr r4, r4, r2
|
|
|
|
/* Copy ISR vector from flash to RAM */
|
|
ldr r1, =__isr_vector_start /* src ptr */
|
|
ldr r2, =__isr_vector_end /* src end */
|
|
ldr r3, =__intvect_start__ /* dst ptr */
|
|
/* Make sure we copy from QSPIC address range, not from remapped range */
|
|
cmp r1, r4
|
|
itt lt
|
|
addlt r1, r1, r4
|
|
addlt r2, r2, r4
|
|
.loop_isr_copy:
|
|
cmp r1, r2
|
|
ittt lt
|
|
ldrlt r0, [r1], #4
|
|
strlt r0, [r3], #4
|
|
blt .loop_isr_copy
|
|
|
|
/* Copy QSPI code from flash to RAM */
|
|
ldr r1, =__text_ram_addr /* src ptr */
|
|
ldr r2, =__text_ram_start__ /* ptr */
|
|
ldr r3, =__text_ram_end__ /* dst end */
|
|
.loop_code_text_ram_copy:
|
|
cmp r2, r3
|
|
ittt lt
|
|
ldrlt r0, [r1], #4
|
|
strlt r0, [r2], #4
|
|
blt .loop_code_text_ram_copy
|
|
|
|
/* Copy data from flash to RAM */
|
|
ldr r1, =__etext /* src ptr */
|
|
ldr r2, =__data_start__ /* dst ptr */
|
|
ldr r3, =__data_end__ /* dst end */
|
|
.loop_data_copy:
|
|
cmp r2, r3
|
|
ittt lt
|
|
ldrlt r0, [r1], #4
|
|
strlt r0, [r2], #4
|
|
blt .loop_data_copy
|
|
#endif
|
|
|
|
/* Clear BSS */
|
|
movs r0, 0
|
|
ldr r1, =__bss_start__
|
|
ldr r2, =__bss_end__
|
|
.loop_bss_clear:
|
|
cmp r1, r2
|
|
itt lt
|
|
strlt r0, [r1], #4
|
|
blt .loop_bss_clear
|
|
|
|
ldr r0, =__HeapBase
|
|
ldr r1, =__HeapLimit
|
|
/* Call static constructors */
|
|
bl __libc_init_array
|
|
|
|
bl SystemInit
|
|
bl main
|
|
|
|
.pool
|
|
.size Reset_Handler, . - Reset_Handler
|
|
|
|
/* Default interrupt handler */
|
|
.type Default_Handler, %function
|
|
Default_Handler:
|
|
ldr r1, =SYS_CTRL_REG
|
|
ldrh r2, [r1, #0]
|
|
orrs r2, r2, #0x80 /* DEBUGGER_ENABLE */
|
|
strh r2, [r1, #0]
|
|
b .
|
|
|
|
.size Default_Handler, . - Default_Handler
|
|
|
|
/* Default handlers for all interrupts */
|
|
.macro IRQ handler
|
|
.weak \handler
|
|
.set \handler, Default_Handler
|
|
.endm
|
|
|
|
/* Cortex-M33 interrupts */
|
|
IRQ NMI_Handler
|
|
IRQ HardFault_Handler
|
|
IRQ MemoryManagement_Handler
|
|
IRQ BusFault_Handler
|
|
IRQ UsageFault_Handler
|
|
IRQ SecureFault_Handler
|
|
IRQ SVC_Handler
|
|
IRQ DebugMonitor_Handler
|
|
IRQ PendSV_Handler
|
|
IRQ SysTick_Handler
|
|
/* DA1469x interrupts */
|
|
IRQ SENSOR_NODE_IRQHandler
|
|
IRQ DMA_IRQHandler
|
|
IRQ CHARGER_STATE_IRQHandler
|
|
IRQ CHARGER_ERROR_IRQHandler
|
|
IRQ CMAC2SYS_IRQHandler
|
|
IRQ UART_IRQHandler
|
|
IRQ UART2_IRQHandler
|
|
IRQ UART3_IRQHandler
|
|
IRQ I2C_IRQHandler
|
|
IRQ I2C2_IRQHandler
|
|
IRQ SPI_IRQHandler
|
|
IRQ SPI2_IRQHandler
|
|
IRQ PCM_IRQHandler
|
|
IRQ SRC_IN_IRQHandler
|
|
IRQ SRC_OUT_IRQHandler
|
|
IRQ USB_IRQHandler
|
|
IRQ TIMER_IRQHandler
|
|
IRQ TIMER2_IRQHandler
|
|
IRQ RTC_IRQHandler
|
|
IRQ KEY_WKUP_GPIO_IRQHandler
|
|
IRQ PDC_IRQHandler
|
|
IRQ VBUS_IRQHandler
|
|
IRQ MRM_IRQHandler
|
|
IRQ MOTOR_CONTROLLER_IRQHandler
|
|
IRQ TRNG_IRQHandler
|
|
IRQ DCDC_IRQHandler
|
|
IRQ XTAL32M_RDY_IRQHandler
|
|
IRQ ADC_IRQHandler
|
|
IRQ ADC2_IRQHandler
|
|
IRQ CRYPTO_IRQHandler
|
|
IRQ CAPTIMER1_IRQHandler
|
|
IRQ RFDIAG_IRQHandler
|
|
IRQ LCD_CONTROLLER_IRQHandler
|
|
IRQ PLL_LOCK_IRQHandler
|
|
IRQ TIMER3_IRQHandler
|
|
IRQ TIMER4_IRQHandler
|
|
IRQ LRA_IRQHandler
|
|
IRQ RTC_EVENT_IRQHandler
|
|
IRQ GPIO_P0_IRQHandler
|
|
IRQ GPIO_P1_IRQHandler
|
|
IRQ RESERVED40_IRQHandler
|
|
IRQ RESERVED41_IRQHandler
|
|
IRQ RESERVED42_IRQHandler
|
|
IRQ RESERVED43_IRQHandler
|
|
IRQ RESERVED44_IRQHandler
|
|
IRQ RESERVED45_IRQHandler
|
|
IRQ RESERVED46_IRQHandler
|
|
IRQ RESERVED47_IRQHandler
|
|
|
|
.end
|