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
 | 
