cstartup_with_FreeRTOS_vectors.s 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /* ----------------------------------------------------------------------------
  2. * SAM Software Package License
  3. * ----------------------------------------------------------------------------
  4. * Copyright (c) 2014, Atmel Corporation
  5. *
  6. * All rights reserved.
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions are met:
  10. *
  11. * - Redistributions of source code must retain the above copyright notice,
  12. * this list of conditions and the disclaimer below.
  13. *
  14. * Atmel's name may not be used to endorse or promote products derived from
  15. * this software without specific prior written permission.
  16. *
  17. * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
  18. * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  19. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
  20. * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
  21. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
  23. * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  24. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  25. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  26. * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. * ----------------------------------------------------------------------------
  28. */
  29. /*
  30. IAR startup file for Arkmicro microcontrollers.
  31. */
  32. MODULE ?cstartup
  33. ;; Forward declaration of sections.
  34. SECTION IRQ_STACK:DATA:NOROOT(3)
  35. SECTION FIQ_STACK:DATA:NOROOT(3)
  36. SECTION UND_STACK:DATA:NOROOT(3)
  37. SECTION ABT_STACK:DATA:NOROOT(3)
  38. SECTION SVC_STACK:DATA:NOROOT(3)
  39. SECTION CSTACK:DATA:NOROOT(3)
  40. //------------------------------------------------------------------------------
  41. // Headers
  42. //------------------------------------------------------------------------------
  43. //------------------------------------------------------------------------------
  44. // Definitions
  45. //------------------------------------------------------------------------------
  46. #define AIC 0xFC06E000
  47. #define AIC_IVR 0x10
  48. #define AIC_EOICR 0x38
  49. #define REG_SFR_AICREDIR 0xF8028054
  50. #define REG_SFR_UID 0xF8028050
  51. #define AICREDIR_KEY 0x5F67B102
  52. MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR
  53. #define ARM_MODE_ABT 0x17
  54. #define ARM_MODE_FIQ 0x11
  55. #define ARM_MODE_IRQ 0x12
  56. #define ARM_MODE_SVC 0x13
  57. #define ARM_MODE_SYS 0x1F
  58. #define ARM_MODE_UND 0x1B
  59. #define I_BIT 0x80
  60. #define F_BIT 0x40
  61. //------------------------------------------------------------------------------
  62. // Startup routine
  63. //------------------------------------------------------------------------------
  64. /*
  65. Exception vectors
  66. */
  67. SECTION .intvec:CODE:NOROOT(2)
  68. PUBLIC resetVector
  69. EXTERN FreeRTOS_IRQ_Handler
  70. EXTERN Undefined_C_Handler
  71. EXTERN FreeRTOS_SWI_Handler
  72. EXTERN Prefetch_C_Handler
  73. EXTERN Abort_C_Handler
  74. PUBLIC FIQ_Handler
  75. ARM
  76. __iar_init$$done: ; The interrupt vector is not needed
  77. ; until after copy initialization is done
  78. resetVector:
  79. ; All default exception handlers (except reset) are
  80. ; defined as weak symbol definitions.
  81. ; If a handler is defined by the application it will take precedence.
  82. LDR pc, =resetHandler ; Reset
  83. LDR pc, Undefined_Addr ; Undefined instructions
  84. LDR pc, SWI_Addr ; Software interrupt (SWI/SYS)
  85. LDR pc, Prefetch_Addr ; Prefetch abort
  86. LDR pc, Abort_Addr ; Data abort
  87. B . ; RESERVED
  88. LDR PC,IRQ_Addr ; 0x18 IRQ
  89. LDR PC,FIQ_Addr ; 0x1c FIQ
  90. IRQ_Addr: DCD FreeRTOS_IRQ_Handler
  91. Undefined_Addr: DCD Undefined_C_Handler
  92. SWI_Addr: DCD FreeRTOS_SWI_Handler
  93. Abort_Addr: DCD Abort_C_Handler
  94. Prefetch_Addr: DCD Prefetch_C_Handler
  95. FIQ_Addr: DCD FIQ_Handler
  96. /*
  97. After a reset, execution starts here, the mode is ARM, supervisor
  98. with interrupts disabled.
  99. Initializes the chip and branches to the main() function.
  100. */
  101. SECTION .cstartup:CODE:NOROOT(2)
  102. PUBLIC resetHandler
  103. EXTERN LowLevelInit
  104. EXTERN ?main
  105. REQUIRE resetVector
  106. EXTERN CP15_InvalidateBTB
  107. EXTERN CP15_InvalidateTranslationTable
  108. EXTERN CP15_InvalidateIcache
  109. EXTERN CP15_InvalidateDcacheBySetWay
  110. ARM
  111. resetHandler:
  112. MSR CPSR_c, #(ARM_MODE_SVC | F_BIT | I_BIT)
  113. LDR sp, =SFE(SVC_STACK) ; End of SVC stack
  114. BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
  115. ;; Set up the normal interrupt stack pointer.
  116. MSR CPSR_c, #(ARM_MODE_IRQ | F_BIT | I_BIT)
  117. LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK
  118. BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
  119. ;; Set up the fast interrupt stack pointer.
  120. MSR CPSR_c, #(ARM_MODE_FIQ | F_BIT | I_BIT)
  121. LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK
  122. BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
  123. MSR CPSR_c, #(ARM_MODE_ABT | F_BIT | I_BIT)
  124. LDR sp, =SFE(ABT_STACK) ; End of ABT_STACK
  125. BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
  126. MSR CPSR_c, #(ARM_MODE_UND | F_BIT | I_BIT)
  127. LDR sp, =SFE(UND_STACK) ; End of UND_STACK
  128. BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
  129. MSR CPSR_c, #(ARM_MODE_SYS | F_BIT | I_BIT)
  130. LDR sp, =SFE(CSTACK) ; End of SYS stack
  131. BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
  132. MSR CPSR_c, #(ARM_MODE_SVC | F_BIT | I_BIT)
  133. CPSIE A
  134. /* Enable VFP */
  135. /* - Enable access to CP10 and CP11 in CP15.CACR */
  136. MRC p15, 0, r0, c1, c0, 2
  137. ORR r0, r0, #0xf00000
  138. MCR p15, 0, r0, c1, c0, 2
  139. /* - Enable access to CP10 and CP11 in CP15.NSACR */
  140. /* - Set FPEXC.EN (B30) */
  141. #ifdef __ARMVFP__
  142. MOV r3, #0x40000000
  143. VMSR FPEXC, r3
  144. #endif
  145. // Redirect FIQ to IRQ
  146. /* LDR r0, =AICREDIR_KEY
  147. LDR r1, = REG_SFR_UID
  148. LDR r2, = REG_SFR_AICREDIR
  149. LDR r3,[r1]
  150. EORS r0, r0, r3
  151. ORRS r0, r0, #0x01
  152. STR r0, [r2] */
  153. /* Perform low-level initialization of the chip using LowLevelInit() */
  154. LDR r0, =LowLevelInit
  155. BLX r0
  156. MRC p15, 0, r0, c1, c0, 0 ; Read CP15 Control Regsiter into r0
  157. TST r0, #0x1 ; Is the MMU enabled?
  158. BICNE r0, r0, #0x1 ; Clear bit 0
  159. TST r0, #0x4 ; Is the Dcache enabled?
  160. BICNE r0, r0, #0x4 ; Clear bit 2
  161. MCRNE p15, 0, r0, c1, c0, 0 ; Write value back
  162. DMB
  163. BL CP15_InvalidateTranslationTable
  164. BL CP15_InvalidateBTB
  165. BL CP15_InvalidateIcache
  166. BL CP15_InvalidateDcacheBySetWay
  167. DMB
  168. ISB
  169. /* Branch to main() */
  170. LDR r0, =?main
  171. BLX r0
  172. /* Loop indefinitely when program is finished */
  173. loop4:
  174. B loop4
  175. ;------------------------------------------------------------------------------
  176. ;- Function : FIQ_Handler
  177. ;- Treatments : FIQ Controller Interrupt Handler.
  178. ;- Called Functions : AIC_IVR[interrupt]
  179. ;------------------------------------------------------------------------------
  180. SAIC DEFINE 0xFC068400
  181. AIC_FVR DEFINE 0x14
  182. SECTION .text:CODE:NOROOT(2)
  183. ARM
  184. FIQ_Handler:
  185. /* Save interrupt context on the stack to allow nesting */
  186. SUB lr, lr, #4
  187. STMFD sp!, {lr}
  188. /* MRS lr, SPSR */
  189. STMFD sp!, {r0}
  190. /* Write in the IVR to support Protect Mode */
  191. LDR lr, =SAIC
  192. LDR r0, [r14, #AIC_IVR]
  193. STR lr, [r14, #AIC_IVR]
  194. /* Branch to interrupt handler in Supervisor mode */
  195. MSR CPSR_c, #ARM_MODE_SVC
  196. STMFD sp!, {r1-r3, r4, r12, lr}
  197. MOV r14, pc
  198. BX r0
  199. LDMIA sp!, {r1-r3, r4, r12, lr}
  200. MSR CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT
  201. /* Acknowledge interrupt */
  202. LDR lr, =SAIC
  203. STR lr, [r14, #AIC_EOICR]
  204. /* Restore interrupt context and branch back to calling code */
  205. LDMIA sp!, {r0}
  206. /* MSR SPSR_cxsf, lr */
  207. LDMIA sp!, {pc}^
  208. END