2410init.s
Upload User: yzchenlin
Upload Date: 2022-03-09
Package Size: 712k
Code Size: 7k
Development Platform:

C/C++

  1. ;=========================================
  2. ; NAME: 2410INIT.S
  3. ; DESC: C start up codes
  4. ;=========================================
  5. ;Pre-defined constants
  6. USERMODE     EQU  0x10
  7. FIQMODE      EQU  0x11
  8. IRQMODE      EQU  0x12
  9. SVCMODE      EQU  0x13
  10. ABORTMODE    EQU  0x17
  11. UNDEFMODE    EQU  0x1b
  12. MODEMASK     EQU  0x1f
  13. NOINT        EQU  0xc0
  14. ;Start address of each stacks,
  15. _STACK_BASEADDRESS EQU  0x33ff8000  
  16. _MMUTT_STARTADDRESS EQU  0x33ff8000  
  17. _ISR_STARTADDRESS EQU  0x33ffff00
  18. ;The location of stacks
  19. UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ 
  20. SVCStack         EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
  21. UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
  22. AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
  23. IRQStack         EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
  24. FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~ 
  25.      MACRO
  26. $HandlerLabel  HANDLER $HandleLabel
  27. $HandlerLabel
  28. sub sp,sp,#4         ;decrement sp(to store jump address)
  29. stmfd sp!,{r0}         ;PUSH the work register to stack(lr does't push because it return to original address)
  30. ldr     r0,=$HandleLabel ;load the address of HandleXXX to r0
  31. ldr     r0,[r0]          ;load the contents(service routine start address) of HandleXXX
  32. str     r0,[sp,#4]       ;store the contents(ISR) of HandleXXX to stack
  33. ldmfd   sp!,{r0,pc}      ;POP the work register and pc(jump to ISR)
  34. MEND
  35. IMPORT  |Image$$RO$$Limit|  ; End of ROM code (=start of ROM data)
  36. IMPORT  |Image$$RW$$Base|   ; Base of RAM to initialise
  37. IMPORT  |Image$$ZI$$Base|   ; Base and limit of area
  38. IMPORT  |Image$$ZI$$Limit|  ; to zero initialise
  39. IMPORT  Main     ; The main entry of mon program 
  40. AREA    Init,CODE,READONLY
  41. ENTRY 
  42. b ResetHandler  
  43. b HandlerUndef ;handler for Undefined mode
  44. b HandlerSWI ;handler for SWI interrupt
  45. b HandlerPabort ;handler for PAbort
  46. b HandlerDabort ;handler for DAbort
  47. b . ;reserved
  48. b HandlerIRQ ;handler for IRQ interrupt 
  49. b HandlerFIQ ;handler for FIQ interrupt
  50. LTORG   
  51. HandlerFIQ      HANDLER  HandleFIQ
  52. HandlerIRQ      HANDLER  HandleIRQ
  53. HandlerUndef    HANDLER  HandleUndef
  54. HandlerSWI      HANDLER  HandleSWI
  55. HandlerDabort   HANDLER  HandleDabort
  56. HandlerPabort   HANDLER  HandlePabort
  57. IsrIRQ  
  58. sub sp,sp,#4        ;reserved for PC
  59. stmfd sp!,{r8-r9}   
  60. ldr r9,=0x4a000014 ;INTOFFSET
  61. ldr r9,[r9]
  62. ldr r8,=HandleEINT0
  63. add r8,r8,r9,lsl #2
  64. ldr r8,[r8]
  65. str r8,[sp,#8]
  66. ldmfd sp!,{r8-r9,pc}
  67. ;=======
  68. ; ENTRY  
  69. ;=======
  70. ResetHandler
  71. ldr r0,=0x53000000 ;WTCON,watch dog disable 
  72. ldr r1,=0x0         
  73. str r1,[r0]
  74. ldr r0,=0x4a000008 ;INTMSK
  75. ldr r1,=0xffffffff   ;all interrupt disable
  76. str r1,[r0]
  77. ldr r0,=0x4a00001c ;INTSUBMSK
  78. ldr r1,=0x7ff ;all sub interrupt disable
  79. str r1,[r0]
  80. ;To reduce PLL lock time   
  81. ldr r0,=0x4c000000 ;LOCKTIME
  82. ldr r1,=0xffffff
  83. str r1,[r0]
  84.         
  85. ;Configure MPLL,Fin=12MHz,Fout=50MHz,M_MDIV=0x5c,M_PDIV=0x4,M_SDIV=0x2
  86. ldr r0,=0x4c000004;MPLLCON          
  87. ldr r1,=((0x5c<<12)+(0x4<<4)+0x2)
  88. str r1,[r0]
  89. ;Set memory control registers
  90.     ldr r0,=SMRDATA
  91. ldr r1,=0x48000000  ;BWSCON
  92. add r2, r0, #52 ;End address of SMRDATA
  93. 0       
  94. ldr r3, [r0], #4    
  95. str r3, [r1], #4    
  96. cmp r2, r0
  97. bne %B0
  98.      ;Initialize stacks
  99. bl InitStacks
  100.    ; Setup IRQ handler
  101. ldr r0,=HandleIRQ       ;This routine is needed
  102. ldr r1,=IsrIRQ          ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c
  103. str r1,[r0]
  104. ;Copy and paste RW data/zero initialized data
  105. ldr r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
  106. ldr r1, =|Image$$RW$$Base|  ; and RAM copy
  107. ldr r3, =|Image$$ZI$$Base|  
  108. ;Zero init base => top of initialised data
  109. cmp r0, r1       ;Check that they are different
  110. beq %F2
  111. 1       
  112. cmp r1, r3       ;Copy init data
  113. ldrcc r2, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4         
  114. strcc r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4
  115. bcc %B1
  116. 2       
  117. ldr r1, =|Image$$ZI$$Limit| ;Top of zero init segment
  118. mov r2, #0
  119. 3       
  120. cmp r3, r1       ;Zero init
  121. strcc r2, [r3], #4
  122. bcc %B3
  123. bl Main         ;Don't use main() because ......
  124.     b .                       
  125. ;function initializing stacks
  126. InitStacks
  127. mrs r0,cpsr
  128. bic r0,r0,#MODEMASK
  129. orr r1,r0,#UNDEFMODE|NOINT
  130. msr cpsr_cxsf,r1 ;UndefMode
  131. ldr sp,=UndefStack
  132. orr r1,r0,#ABORTMODE|NOINT
  133. msr cpsr_cxsf,r1 ;AbortMode
  134. ldr sp,=AbortStack
  135. orr r1,r0,#IRQMODE|NOINT
  136. msr cpsr_cxsf,r1 ;IRQMode
  137. ldr sp,=IRQStack
  138.     
  139. orr r1,r0,#FIQMODE|NOINT
  140. msr cpsr_cxsf,r1 ;FIQMode
  141. ldr sp,=FIQStack
  142. bic r0,r0,#MODEMASK|NOINT
  143. orr r1,r0,#SVCMODE
  144. msr cpsr_cxsf,r1 ;SVCMode
  145. ldr sp,=SVCStack
  146. ;USER mode has not be initialized.
  147. mov pc,lr 
  148. ;The LR register won't be valid if the current mode is not SVC mode.
  149. LTORG
  150. SMRDATA DATA
  151. DCD  0x22111120 ;GCS0=GCS6=GCS7=32bit,other=16bit
  152. DCD  0x0700 ;GCS0 Tacs=Tcos=Tcoh=Tcah=Tacp=1clk,Tacc=14clk,PMC=0
  153. DCD  0x0700 ;GCS1 Tacs=Tcos=Tcoh=Tcah=Tacp=1clk,Tacc=14clk,PMC=0
  154. DCD  0x0700 ;GCS2 Tacs=Tcos=Tcoh=Tcah=Tacp=1clk,Tacc=14clk,PMC=0
  155. DCD  0x0700 ;GCS3 Tacs=Tcos=Tcoh=Tcah=Tacp=1clk,Tacc=14clk,PMC=0
  156. DCD  0x0700 ;GCS4 Tacs=Tcos=Tcoh=Tcah=Tacp=1clk,Tacc=14clk,PMC=0
  157. DCD  0x0700 ;GCS5 Tacs=Tcos=Tcoh=Tcah=Tacp=1clk,Tacc=14clk,PMC=0
  158. DCD  0x18005     ;GCS6 SDRAM,Trcd=3clk,SCAN=9bit
  159. DCD  0x18005     ;GCS7 SDRAM,Trcd=3clk,SCAN=9bit
  160. DCD  0x8c0459 ;REFEN=1,TREFMD=0,Trp=0,Tsrc=3,REFCNT=1113
  161. DCD  0x32        ;SCKE_EN=SCLK_EN=1 SCLK power saving mode, BANKSIZE 128M/128M
  162. DCD  0x30        ;MRSR6 CL=3clk
  163. DCD  0x30        ;MRSR7
  164.      ALIGN
  165.      AREA RamData, DATA, READWRITE
  166.         ^   _ISR_STARTADDRESS
  167. HandleReset  #   4
  168. HandleUndef  #   4
  169. HandleSWI    #   4
  170. HandlePabort    #   4
  171. HandleDabort    #   4
  172. HandleReserved  #   4
  173. HandleIRQ    #   4
  174. HandleFIQ    #   4
  175. HandleEINT0    #   4
  176. HandleEINT1    #   4
  177. HandleEINT2    #   4
  178. HandleEINT3    #   4
  179. HandleEINT4_7 #   4
  180. HandleEINT8_23 #   4
  181. HandleRSV6 #   4
  182. HandleBATFLT    #   4
  183. HandleTICK    #   4
  184. HandleWDT #   4
  185. HandleTIMER0  #   4
  186. HandleTIMER1  #   4
  187. HandleTIMER2  #   4
  188. HandleTIMER3  #   4
  189. HandleTIMER4  #   4
  190. HandleUART2   #   4
  191. HandleLCD  #   4
  192. HandleDMA0 #   4
  193. HandleDMA1 #   4
  194. HandleDMA2 #   4
  195. HandleDMA3 #   4
  196. HandleMMC #   4
  197. HandleSPI0 #   4
  198. HandleUART1 #   4
  199. HandleRSV24 #   4
  200. HandleUSBD #   4
  201. HandleUSBH #   4
  202. HandleIIC    #   4
  203. HandleUART0  #   4
  204. HandleSPI1  #   4
  205. HandleRTC  #   4
  206. HandleADC  #   4
  207.         END