mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-17 05:32:55 +08:00
8e143fc962
This adds source files that allow to run TinyUSB stack on DA1469x-dk-pro board. Source files .c .S and .ld are taken from Apache Mynewt repository. Those files were stripped to allow starting board without Mynewt os.
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
|