start_gcc.S 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /*
  2. * File : start.S
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://openlab.rt-thread.com/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2008-12-11 XuXinming first version
  13. */
  14. /**
  15. * @addtogroup LPC2478
  16. */
  17. /*@{*/
  18. #define WDMOD (0xE0000000 + 0x00)
  19. #define VICIntEnClr (0xFFFFF000 + 0x014)
  20. #define VICVectAddr (0xFFFFF000 + 0xF00)
  21. #define VICIntSelect (0xFFFFF000 + 0x00C)
  22. #define PLLCFG (0xE01FC000 + 0x084)
  23. #define PLLCON (0xE01FC000 + 0x080)
  24. #define PLLFEED (0xE01FC000 + 0x08C)
  25. #define PLLSTAT (0xE01FC000 + 0x088)
  26. #define CCLKCFG (0xE01FC000 + 0x104)
  27. #define MEMMAP (0xE01FC000 + 0x040)
  28. #define SCS (0xE01FC000 + 0x1A0)
  29. #define CLKSRCSEL (0xE01FC000 + 0x10C)
  30. #define MAMCR (0xE01FC000 + 0x000)
  31. #define MAMTIM (0xE01FC000 + 0x004)
  32. /*.section .init, "ax"*/
  33. .section .vectors
  34. .code 32
  35. .globl _start
  36. _start:
  37. b reset
  38. ldr pc, _vector_undef
  39. ldr pc, _vector_swi
  40. ldr pc, _vector_pabt
  41. ldr pc, _vector_dabt
  42. ldr pc, _vector_resv
  43. ldr pc, _vector_irq
  44. ldr pc, _vector_fiq
  45. _vector_undef: .word vector_undef
  46. _vector_swi: .word vector_swi
  47. _vector_pabt: .word vector_pabt
  48. _vector_dabt: .word vector_dabt
  49. _vector_resv: .word vector_resv
  50. _vector_irq: .word vector_irq
  51. _vector_fiq: .word vector_fiq
  52. .text
  53. .code 32
  54. /* the system entry */
  55. reset:
  56. /* enter svc mode */
  57. msr cpsr_c, #SVCMODE|NOINT
  58. /*watch dog disable */
  59. ldr r0,=WDMOD
  60. ldr r1,=0x0
  61. str r1,[r0]
  62. /* all interrupt disable */
  63. ldr r0,=VICIntEnClr
  64. ldr r1,=0xffffffff
  65. str r1,[r0]
  66. ldr r1, =VICVectAddr
  67. ldr r0, =0x00
  68. str r0, [r1]
  69. ldr r1, =VICIntSelect
  70. ldr r0, =0x00
  71. str r0, [r1]
  72. /* setup stack */
  73. bl stack_setup
  74. _rtthread_startup: .word rtthread_startup
  75. .equ USERMODE, 0x10
  76. .equ FIQMODE, 0x11
  77. .equ IRQMODE, 0x12
  78. .equ SVCMODE, 0x13
  79. .equ ABORTMODE, 0x17
  80. .equ UNDEFMODE, 0x1b
  81. .equ MODEMASK, 0x1f
  82. .equ NOINT, 0xc0
  83. /* exception handlers */
  84. vector_undef: bl rt_hw_trap_udef
  85. vector_swi: bl rt_hw_trap_swi
  86. vector_pabt: bl rt_hw_trap_pabt
  87. vector_dabt: bl rt_hw_trap_dabt
  88. vector_resv: bl rt_hw_trap_resv
  89. .globl rt_interrupt_enter
  90. .globl rt_interrupt_leave
  91. .globl rt_thread_switch_interrput_flag
  92. .globl rt_interrupt_from_thread
  93. .globl rt_interrupt_to_thread
  94. vector_irq:
  95. stmfd sp!, {r0-r12,lr}
  96. bl rt_interrupt_enter
  97. bl rt_hw_trap_irq
  98. bl rt_interrupt_leave
  99. /* if rt_thread_switch_interrput_flag set, jump to _interrupt_thread_switch and don't return */
  100. ldr r0, =rt_thread_switch_interrput_flag
  101. ldr r1, [r0]
  102. cmp r1, #1
  103. beq _interrupt_thread_switch
  104. ldmfd sp!, {r0-r12,lr}
  105. subs pc, lr, #4
  106. .align 5
  107. vector_fiq:
  108. stmfd sp!,{r0-r7,lr}
  109. bl rt_hw_trap_fiq
  110. ldmfd sp!,{r0-r7,lr}
  111. subs pc,lr,#4
  112. _interrupt_thread_switch:
  113. mov r1, #0 @ clear rt_thread_switch_interrput_flag
  114. str r1, [r0]
  115. ldmfd sp!, {r0-r12,lr} @ reload saved registers
  116. stmfd sp!, {r0-r3} @ save r0-r3
  117. mov r1, sp
  118. add sp, sp, #16 @ restore sp
  119. sub r2, lr, #4 @ save old task's pc to r2
  120. mrs r3, spsr @ disable interrupt
  121. orr r0, r3, #NOINT
  122. msr spsr_c, r0
  123. ldr r0, =.+8 @ switch to interrupted task's stack
  124. movs pc, r0
  125. stmfd sp!, {r2} @ push old task's pc
  126. stmfd sp!, {r4-r12,lr} @ push old task's lr,r12-r4
  127. mov r4, r1 @ Special optimised code below
  128. mov r5, r3
  129. ldmfd r4!, {r0-r3}
  130. stmfd sp!, {r0-r3} @ push old task's r3-r0
  131. stmfd sp!, {r5} @ push old task's psr
  132. mrs r4, spsr
  133. stmfd sp!, {r4} @ push old task's spsr
  134. ldr r4, =rt_interrupt_from_thread
  135. ldr r5, [r4]
  136. str sp, [r5] @ store sp in preempted tasks's TCB
  137. ldr r6, =rt_interrupt_to_thread
  138. ldr r6, [r6]
  139. ldr sp, [r6] @ get new task's stack pointer
  140. ldmfd sp!, {r4} @ pop new task's spsr
  141. msr SPSR_cxsf, r4
  142. ldmfd sp!, {r4} @ pop new task's psr
  143. msr CPSR_cxsf, r4
  144. ldmfd sp!, {r0-r12,lr,pc} @ pop new task's r0-r12,lr & pc
  145. /* each mode stack memory */
  146. stack_setup:
  147. mrs r0, cpsr
  148. bic r0, r0, #MODEMASK
  149. orr r1, r0, #UNDEFMODE|NOINT
  150. msr cpsr_cxsf, r1 @ undef mode
  151. ldr sp, =__UndStack_end
  152. mrs r0, cpsr
  153. bic r0, r0, #MODEMASK
  154. orr r1,r0,#ABORTMODE|NOINT
  155. msr cpsr_cxsf,r1 @ abort mode
  156. ldr sp,=__ABTStack_end
  157. mrs r0, cpsr
  158. bic r0, r0, #MODEMASK
  159. orr r1,r0,#IRQMODE|NOINT
  160. msr cpsr_cxsf,r1 @ IRQ mode
  161. ldr sp,=__IRQStack_end
  162. mrs r0, cpsr
  163. bic r0, r0, #MODEMASK
  164. orr r1,r0,#FIQMODE|NOINT
  165. msr cpsr_cxsf,r1 @ FIQ mode
  166. ldr sp,=__FIQStack_end
  167. mrs r0, cpsr
  168. bic r0, r0, #MODEMASK
  169. orr r1,r0,#SVCMODE|NOINT
  170. msr cpsr_cxsf,r1 @ SVC mode
  171. ldr sp,=__SVCStack_end
  172. /* USER mode is not initialized. */
  173. mrs r0, cpsr
  174. bic r0, r0, #MODEMASK|0x80 //IRQ enable and FIQ disable
  175. orr r1,r0,#USERMODE
  176. msr cpsr_cxsf,r1 @ usr mode
  177. ldr sp,=__USRStack_end
  178. ldr pc, _rtthread_startup