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 |