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