board_cstartup.S
上传用户:jnhtjd
上传日期:2022-07-16
资源大小:403k
文件大小:6k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /* ----------------------------------------------------------------------------
  2.  *         ATMEL Microcontroller Software Support 
  3.  * ----------------------------------------------------------------------------
  4.  * Copyright (c) 2008, 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. //         Headers
  31. //------------------------------------------------------------------------------
  32. #include "board.h"
  33. //------------------------------------------------------------------------------
  34. //         Definitions
  35. //------------------------------------------------------------------------------
  36. #define IRQ_STACK_SIZE   8*3*4
  37. #define ARM_MODE_ABT     0x17
  38. #define ARM_MODE_FIQ     0x11
  39. #define ARM_MODE_IRQ     0x12
  40. #define ARM_MODE_SVC     0x13
  41. #define I_BIT            0x80
  42. #define F_BIT            0x40
  43. //------------------------------------------------------------------------------
  44. //         Startup routine
  45. //------------------------------------------------------------------------------
  46.             .align      4
  47.             .arm
  48.         
  49. /* Exception vectors
  50.  *******************/
  51.             .section    .vectors, "a"
  52. resetVector:
  53.         ldr     pc, =resetHandler       /* Reset */
  54. undefVector:
  55.         b       undefVector             /* Undefined instruction */
  56. swiVector:
  57.         b       swiVector               /* Software interrupt */
  58. prefetchAbortVector:
  59.         b       prefetchAbortVector     /* Prefetch abort */
  60. dataAbortVector:
  61.         b       dataAbortVector         /* Data abort */
  62. reservedVector:
  63.         b       reservedVector          /* Reserved for future use */
  64. irqVector:
  65.         b       irqHandler              /* Interrupt */
  66. fiqVector:
  67.                                         /* Fast interrupt */
  68. //------------------------------------------------------------------------------
  69. /// Handles a fast interrupt request by branching to the address defined in the
  70. /// AIC.
  71. //------------------------------------------------------------------------------
  72. fiqHandler:
  73.         b       fiqHandler
  74. //------------------------------------------------------------------------------
  75. /// Handles incoming interrupt requests by branching to the corresponding
  76. /// handler, as defined in the AIC. Supports interrupt nesting.
  77. //------------------------------------------------------------------------------
  78. irqHandler:
  79. /* Save interrupt context on the stack to allow nesting */
  80.         sub     lr, lr, #4
  81.         stmfd   sp!, {lr}
  82.         mrs     lr, SPSR
  83.         stmfd   sp!, {r0, lr}
  84. /* Write in the IVR to support Protect Mode */
  85.         ldr     lr, =AT91C_BASE_AIC
  86.         ldr     r0, [r14, #AIC_IVR]
  87.         str     lr, [r14, #AIC_IVR]
  88. /* Branch to interrupt handler in Supervisor mode */
  89.         msr     CPSR_c, #ARM_MODE_SVC
  90.         stmfd   sp!, {r1-r3, r4, r12, lr}
  91.         mov     lr, pc
  92.         bx      r0
  93.         ldmia   sp!, {r1-r3, r4, r12, lr}
  94.         msr     CPSR_c, #ARM_MODE_IRQ | I_BIT
  95. /* Acknowledge interrupt */
  96.         ldr     lr, =AT91C_BASE_AIC
  97.         str     lr, [r14, #AIC_EOICR]
  98. /* Restore interrupt context and branch back to calling code */
  99.         ldmia   sp!, {r0, lr}
  100.         msr     SPSR_cxsf, lr
  101.         ldmia   sp!, {pc}^
  102. //------------------------------------------------------------------------------
  103. /// Initializes the chip and branches to the main() function.
  104. //------------------------------------------------------------------------------
  105.             .section    .text
  106.             .global     entry
  107. entry:
  108. resetHandler:
  109. /* Dummy access to the .vectors section so it does not get optimized */
  110.         ldr     r0, =resetVector
  111. /* Set pc to actual code location (i.e. not in remap zone) */
  112.     ldr     pc, =1f
  113. /* Perform low-level initialization of the chip using LowLevelInit() */
  114. 1:
  115.         ldr     r4, =_sstack
  116.         mov     sp, r4
  117.     ldr     r0, =LowLevelInit
  118.         mov     lr, pc
  119.         bx      r0
  120. /* Initialize the relocate segment */
  121.         ldr     r0, =_efixed
  122.         ldr     r1, =_srelocate
  123.         ldr     r2, =_erelocate
  124. 1:
  125.         cmp     r1, r2
  126.         ldrcc   r3, [r0], #4
  127.         strcc   r3, [r1], #4
  128.         bcc     1b
  129. /* Clear the zero segment */
  130.     ldr     r0, =_szero
  131.         ldr     r1, =_ezero
  132.         mov     r2, #0
  133. 1:
  134.         cmp     r0, r1
  135.         strcc   r2, [r0], #4
  136.         bcc     1b
  137. /* Setup stacks
  138.  **************/
  139. /* IRQ mode */
  140.         msr     CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
  141.         mov     sp, r4
  142.         sub     r4, r4, #IRQ_STACK_SIZE
  143. /* Supervisor mode (interrupts enabled) */
  144.         msr     CPSR_c, #ARM_MODE_SVC | F_BIT
  145.         mov     sp, r4
  146. /* Branch to main()
  147.  ******************/
  148.         ldr     r0, =main
  149.         mov     lr, pc
  150.         bx      r0
  151. /* Loop indefinitely when program is finished */
  152. 1:
  153.         b       1b