start.s
上传用户:mhstny
上传日期:2022-08-05
资源大小:793k
文件大小:12k
源码类别:

微处理器开发

开发平台:

Unix_Linux

  1. ;=========================================
  2. ; NAME: 2410INIT.S
  3. ; DESC: C start up codes
  4. ;       Configure memory, ISR ,stacks
  5. ; Initialize C-variables
  6. ; HISTORY:
  7. ; 2002.02.25:kwtark: ver 0.0
  8. ; 2002.03.20:purnnamu: Add some functions for testing STOP,POWER_OFF mode
  9. ;=========================================
  10. GET option.inc
  11. GET memcfg.inc
  12. GET 2410addr.inc
  13. BIT_SELFREFRESH EQU (1<<22)
  14. ;Pre-defined constants
  15. USERMODE    EQU  0x10
  16. FIQMODE     EQU  0x11
  17. IRQMODE     EQU  0x12
  18. SVCMODE     EQU  0x13
  19. ABORTMODE   EQU  0x17
  20. UNDEFMODE   EQU  0x1b
  21. MODEMASK    EQU  0x1f
  22. NOINT       EQU  0xc0
  23. ;The location of stacks
  24. UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ 
  25. SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
  26. UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
  27. AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
  28. IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
  29. FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~ 
  30. ;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
  31. GBLL    THUMBCODE
  32. [ {CONFIG} = 16 
  33. THUMBCODE SETL  {TRUE}
  34.     CODE32
  35.      |   
  36. THUMBCODE SETL  {FALSE}
  37.      ]
  38.      MACRO
  39. MOV_PC_LR
  40.      [ THUMBCODE
  41.             bx lr
  42.      |
  43.             mov pc,lr
  44.      ]
  45. MEND
  46.      MACRO
  47. MOVEQ_PC_LR
  48.      [ THUMBCODE
  49.          bxeq lr
  50.      |
  51.             moveq pc,lr
  52.      ]
  53. MEND
  54.      MACRO
  55. $HandlerLabel HANDLER $HandleLabel
  56. $HandlerLabel
  57. sub sp,sp,#4        ;decrement sp(to store jump address)
  58. stmfd sp!,{r0}        ;PUSH the work register to stack(lr does't push because it return to original address)
  59. ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
  60. ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX
  61. str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
  62. ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
  63. MEND
  64. IMPORT  |Image$$RO$$Base| ; Base of ROM code
  65. IMPORT  |Image$$RO$$Limit|  ; End of ROM code (=start of ROM data)
  66. IMPORT  |Image$$RW$$Base|   ; Base of RAM to initialise
  67. IMPORT  |Image$$ZI$$Base|   ; Base and limit of area
  68. IMPORT  |Image$$ZI$$Limit|  ; to zero initialise
  69. IMPORT  Main 
  70. AREA    SelfBoot, CODE, READONLY
  71. ENTRY
  72. EXPORT __ENTRY
  73. __ENTRY  
  74. ResetEntry
  75. ;1)The code, which converts to Big-endian, should be in little endian code.
  76. ;2)The following little endian code will be compiled in Big-Endian mode. 
  77. ;  The code byte order should be changed as the memory bus width.
  78. ;3)The pseudo instruction,DCD can't be used here because the linker generates error.
  79. ASSERT :DEF:ENDIAN_CHANGE
  80. [ ENDIAN_CHANGE
  81.     ASSERT  :DEF:ENTRY_BUS_WIDTH
  82.     [ ENTRY_BUS_WIDTH=32
  83. b ChangeBigEndian     ;DCD 0xea000007 
  84.     ]
  85.     
  86.     [ ENTRY_BUS_WIDTH=16
  87. andeq r14,r7,r0,lsl #20   ;DCD 0x0007ea00
  88.     ]
  89.     
  90.     [ ENTRY_BUS_WIDTH=8
  91. streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea
  92.         ]
  93. |
  94. b ResetHandler  
  95.     ]
  96. b HandlerUndef ;handler for Undefined mode
  97. b HandlerSWI ;handler for SWI interrupt
  98. b HandlerPabort ;handler for PAbort
  99. b HandlerDabort ;handler for DAbort
  100. b . ;reserved
  101. b HandlerIRQ ;handler for IRQ interrupt 
  102. b HandlerFIQ ;handler for FIQ interrupt
  103. ;@0x20
  104. b EnterPWDN
  105. ChangeBigEndian
  106. ;@0x24
  107. [ ENTRY_BUS_WIDTH=32
  108.     DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0
  109.     DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80;  //Big-endian
  110.     DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0
  111. ]
  112. [ ENTRY_BUS_WIDTH=16
  113.     DCD 0x0f10ee11
  114.     DCD 0x0080e380
  115.     DCD 0x0f10ee01
  116. ]
  117. [ ENTRY_BUS_WIDTH=8
  118.     DCD 0x100f11ee
  119.     DCD 0x800080e3
  120.     DCD 0x100f01ee
  121.      ]
  122. DCD 0xffffffff  ;swinv 0xffffff is similar with NOP and run well in both endian mode. 
  123. DCD 0xffffffff
  124. DCD 0xffffffff
  125. DCD 0xffffffff
  126. DCD 0xffffffff
  127. b ResetHandler
  128. ;Function for entering power down mode
  129. ; 1. SDRAM should be in self-refresh mode.
  130. ; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.
  131. ; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.
  132. ; 4. The I-cache may have to be turned on. 
  133. ; 5. The location of the following code may have not to be changed.
  134. ;void EnterPWDN(int CLKCON); 
  135. EnterPWDN
  136. mov r2,r0 ;r2=rCLKCON
  137. tst r0,#0x8 ;POWER_OFF mode?
  138. bne ENTER_POWER_OFF
  139. ENTER_STOP
  140. ldr r0,=REFRESH
  141. ldr r3,[r0] ;r3=rREFRESH
  142. mov r1, r3
  143. orr r1, r1, #BIT_SELFREFRESH
  144. str r1, [r0] ;Enable SDRAM self-refresh
  145. mov r1,#16     ;wait until self-refresh is issued. may not be needed.
  146. 0 subs r1,r1,#1
  147. bne %B0
  148. ldr r0,=CLKCON ;enter STOP mode.
  149. str r2,[r0]    
  150. mov r1,#32
  151. 0 subs r1,r1,#1 ;1) wait until the STOP mode is in effect.
  152. bne %B0 ;2) Or wait here until the CPU&Peripherals will be turned-off
  153. ;   Entering POWER_OFF mode, only the reset by wake-up is available.
  154. ldr r0,=REFRESH ;exit from SDRAM self refresh mode.
  155. str r3,[r0]
  156. MOV_PC_LR
  157. ENTER_POWER_OFF
  158. ;NOTE.
  159. ;1) rGSTATUS3 should have the return address after wake-up from POWER_OFF mode.
  160. ldr r0,=REFRESH
  161. ldr r1,[r0] ;r1=rREFRESH
  162. orr r1, r1, #BIT_SELFREFRESH
  163. str r1, [r0] ;Enable SDRAM self-refresh
  164. mov r1,#16     ;Wait until self-refresh is issued,which may not be needed.
  165. 0 subs r1,r1,#1
  166. bne %B0
  167. ldr  r1,=MISCCR
  168. ldr r0,[r1]
  169. orr r0,r0,#(7<<17)  ;Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up 
  170. str r0,[r1]
  171. ldr r0,=CLKCON
  172. str r2,[r0]    
  173. b . ;CPU will die here.
  174. WAKEUP_POWER_OFF
  175. ;Release SCLKn after wake-up from the POWER_OFF mode.
  176. ldr  r1,=MISCCR
  177. ldr r0,[r1]
  178. bic r0,r0,#(7<<17)  ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->H
  179. str r0,[r1]
  180. ;Set memory control registers
  181.      ldr r0,=SMRDATA
  182. ldr r1,=BWSCON ;BWSCON Address
  183. add r2, r0, #52 ;End address of SMRDATA
  184. 0       
  185. ldr r3, [r0], #4    
  186. str r3, [r1], #4    
  187. cmp r2, r0
  188. bne %B0
  189. mov r1,#256
  190. 0 subs r1,r1,#1 ;1) wait until the SelfRefresh is released.
  191. bne %B0
  192. ldr r1,=GSTATUS3  ;GSTATUS3 has the start address just after POWER_OFF wake-up
  193. ldr r0,[r1]
  194. mov pc,r0
  195. LTORG   
  196. HandlerFIQ      HANDLER HandleFIQ
  197. HandlerIRQ      HANDLER HandleIRQ
  198. HandlerUndef    HANDLER HandleUndef
  199. HandlerSWI      HANDLER HandleSWI
  200. HandlerDabort   HANDLER HandleDabort
  201. HandlerPabort   HANDLER HandlePabort
  202. IsrIRQ  
  203. sub sp,sp,#4       ;reserved for PC
  204. stmfd sp!,{r8-r9}   
  205. ldr r9,=INTOFFSET
  206. ldr r9,[r9]
  207. ldr r8,=HandleEINT0
  208. add r8,r8,r9,lsl #2
  209. ldr r8,[r8]
  210. str r8,[sp,#8]
  211. ldmfd sp!,{r8-r9,pc}
  212. ;======================================================
  213. ; ENTRY  
  214. ;======================================================
  215. ResetHandler
  216. ldr r0,=WTCON       ;watch dog disable 
  217. ldr r1,=0x0         
  218. str r1,[r0]
  219. ;1 ldr r0, =0x300
  220. ; ldr r1, [r0]
  221. ; b %B1
  222. ldr r0,=INTMSK
  223. ldr r1,=0xffffffff  ;all interrupt disable
  224. str r1,[r0]
  225. ldr r0,=INTSUBMSK
  226. ldr r1,=0x3ff ;all sub interrupt disable
  227. str r1,[r0]
  228. [ {FALSE}
  229.         ; rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);    
  230.         ; Led_Display
  231. ldr r0,=GPFCON
  232. ldr r1,=0x5500
  233. str r1,[r0]
  234. ldr r0,=GPFDAT
  235. ldr r1,=0x10
  236. str r1,[r0]
  237. ]
  238. ;To reduce PLL lock time, adjust the LOCKTIME register. 
  239. ldr r0,=LOCKTIME
  240. ldr r1,=0xffffff
  241. str r1,[r0]
  242.         
  243.     [ PLL_ON_START
  244. ;Configure MPLL
  245. ldr r0,=MPLLCON          
  246. ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=12MHz,Fout=50MHz
  247. str r1,[r0]
  248. ]
  249. ;Check if the boot is caused by the wake-up from POWER_OFF mode.
  250. ldr r1,=GSTATUS2
  251. ldr r0,[r1]
  252. tst r0,#0x2
  253.         ;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP handler. 
  254. nop;bne WAKEUP_POWER_OFF
  255. EXPORT StartPointAfterPowerOffWakeUp
  256. StartPointAfterPowerOffWakeUp
  257. ;Set memory control registers
  258. adr r0, SMRDATA
  259. ldr r1,=BWSCON ;BWSCON Address
  260. add r2, r0, #52 ;End address of SMRDATA
  261. 0       
  262. ldr r3, [r0], #4    
  263. str r3, [r1], #4    
  264. cmp r2, r0
  265. bne %B0
  266. ;禁止Icache和Dcache,禁止MMU
  267. ;IMPORT  MMU_DisableICache
  268.     ;bl MMU_DisableICache ;
  269. ;IMPORT  MMU_DisableDCache
  270.     ;bl MMU_DisableDCache ;
  271.     ;IMPORT  MMU_InvalidateICache
  272.     ;bl  MMU_InvalidateICache ;
  273.     ;IMPORT  MMU_DisableMMU
  274.     ;bl  MMU_DisableMMU ;
  275.     ;Initialize stacks
  276. bl InitStacks
  277.    ; Setup IRQ handler
  278. ldr r0,=HandleIRQ       ;This routine is needed
  279. ldr r1,=IsrIRQ          ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c'
  280. str r1,[r0]
  281. ;===========================================================
  282.     adr r0, ResetEntry
  283. ldr r2, RO_Base
  284. cmp r0, r2
  285. beq InitRW
  286. ldr r3, RO_Limit
  287. 0
  288. ldmia r0!, {r4-r7}
  289. stmia r2!, {r4-r7}
  290. cmp r2, r3
  291. bcc %B0
  292. InitRW
  293. ldr r0, RO_Limit
  294. ldr r2, RW_Base
  295. ldr r3, ZI_Base
  296. 0
  297. cmp r2, r3
  298. ldrcc r1, [r0], #4
  299. strcc r1, [r2], #4
  300. bcc %B0
  301. mov r0, #0
  302. ldr r2,ZI_Base
  303. ldr r3, ZI_Limit
  304. 1
  305. cmp r2, r3
  306. strcc r0, [r2], #4
  307. bcc %B1
  308.    
  309.     [ :LNOT:THUMBCODE
  310. bl Main
  311.      b .                       
  312.     ]
  313.     [ THUMBCODE         ;for start-up code for Thumb mode
  314.      orr lr,pc,#1
  315.      bx lr
  316.      CODE16
  317.      bl Main        ;Don't use main() because ......
  318.      b .
  319.      CODE32
  320.     ]
  321. ;function initializing stacks
  322. InitStacks
  323. ;Don't use DRAM,such as stmfd,ldmfd......
  324. ;SVCstack is initialized before
  325. ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
  326. mrs r0,cpsr
  327. bic r0,r0,#MODEMASK
  328. orr r1,r0,#UNDEFMODE|NOINT
  329. msr cpsr_cxsf,r1 ;UndefMode
  330. ldr sp,=UndefStack
  331. orr r1,r0,#ABORTMODE|NOINT
  332. msr cpsr_cxsf,r1 ;AbortMode
  333. ldr sp,=AbortStack
  334. orr r1,r0,#IRQMODE|NOINT
  335. msr cpsr_cxsf,r1 ;IRQMode
  336. ldr sp,=IRQStack
  337.     
  338. orr r1,r0,#FIQMODE|NOINT
  339. msr cpsr_cxsf,r1 ;FIQMode
  340. ldr sp,=FIQStack
  341. bic r0,r0,#MODEMASK|NOINT
  342. orr r1,r0,#SVCMODE
  343. msr cpsr_cxsf,r1 ;SVCMode
  344. ldr sp,=SVCStack
  345. ;USER mode has not be initialized.
  346. mov pc,lr 
  347. ;The LR register won't be valid if the current mode is not SVC mode.
  348. LTORG
  349. SMRDATA DATA
  350. ; Memory configuration should be optimized for best performance 
  351. ; The following parameter is not optimized.                     
  352. ; Memory access cycle parameter strategy
  353. ; 1) The memory settings is  safe parameters even at HCLK=75Mhz.
  354. ; 2) SDRAM refresh period is for HCLK=75Mhz. 
  355.         DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
  356.      DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0
  357.      DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1 
  358.      DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2
  359.      DCD 0x1f7c;((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3
  360.      DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4
  361.      DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5
  362.      DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
  363.      DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7
  364.      DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)    
  365. DCD 0x32            ;SCLK power saving mode, BANKSIZE 128M/128M
  366.      DCD 0x30            ;MRSR6 CL=3clk
  367.      DCD 0x30            ;MRSR7
  368. ;     DCD 0x20            ;MRSR6 CL=2clk
  369. ;     DCD 0x20            ;MRSR7
  370. RO_Base   DCD |Image$$RO$$Base|
  371. RO_Limit    DCD |Image$$RO$$Limit|
  372. RW_Base   DCD |Image$$RW$$Base|
  373. ZI_Base  DCD |Image$$ZI$$Base|
  374. ZI_Limit DCD |Image$$ZI$$Limit|
  375.      ALIGN
  376.      AREA RamData, DATA, READWRITE
  377.         ^   _ISR_STARTADDRESS
  378. HandleReset  #   4
  379. HandleUndef  #   4
  380. HandleSWI    #   4
  381. HandlePabort    #   4
  382. HandleDabort    #   4
  383. HandleReserved  #   4
  384. HandleIRQ    #   4
  385. HandleFIQ    #   4
  386. ;Don't use the label 'IntVectorTable',
  387. ;The value of IntVectorTable is different with the address you think it may be.
  388. ;IntVectorTable
  389. HandleEINT0    #   4
  390. HandleEINT1    #   4
  391. HandleEINT2    #   4
  392. HandleEINT3    #   4
  393. HandleEINT4_7 #   4
  394. HandleEINT8_23 #   4
  395. HandleRSV6 #   4
  396. HandleBATFLT    #   4
  397. HandleTICK    #   4
  398. HandleWDT #   4
  399. HandleTIMER0  #   4
  400. HandleTIMER1  #   4
  401. HandleTIMER2  #   4
  402. HandleTIMER3  #   4
  403. HandleTIMER4  #   4
  404. HandleUART2   #   4
  405. HandleLCD  #   4
  406. HandleDMA0 #   4
  407. HandleDMA1 #   4
  408. HandleDMA2 #   4
  409. HandleDMA3 #   4
  410. HandleMMC #   4
  411. HandleSPI0 #   4
  412. HandleUART1 #   4
  413. HandleRSV24 #   4
  414. HandleUSBD #   4
  415. HandleUSBH #   4
  416. HandleIIC    #   4
  417. HandleUART0  #   4
  418. HandleSPI1  #   4
  419. HandleRTC  #   4
  420. HandleADC  #   4
  421.         END