fw.s
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:30k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. ;******************************************************************************
  2. ;*
  3. ;* System On Chip(SOC)
  4. ;*
  5. ;* Copyright (c) 2002 Software Center, Samsung Electronics, Inc.
  6. ;* Copyright (c) 2002 Mobile Solution Project Team, Samsung Electronics, Inc.
  7. ;* All rights reserved.
  8. ;*
  9. ;* This software is the confidential and proprietary information of Samsung 
  10. ;* Electronics, Inc("Confidential Information"). You Shall not disclose such 
  11. ;* Confidential Information and shall use it only in accordance with the terms 
  12. ;* of the license agreement you entered into Samsung.
  13. ;*
  14. ;******************************************************************************
  15. OPT 2
  16. INCLUDE kxarm.h
  17. INCLUDE reg2440.a
  18. OPT 1
  19. OPT 128
  20. ;---------------------------------------------------------------------------
  21. ; 4 LED light function
  22. ; The LEDs are located below AMD Flash ROM
  23. MACRO
  24. LED_ON $data
  25. LDR     r10, =0x56000054        
  26. LDR     r11, =$data
  27. MOV     r11, r11, lsl #4
  28.    STR     r11, [r10]
  29.     MEND
  30. ;---------------------------------------------------------------------------
  31. ; 4 LED light function
  32. ; The LEDs are located below AMD Flash ROM
  33. MACRO
  34. VLED_ON $data
  35. LDR     r10, =0xB1600054        
  36. LDR     r11, =$data
  37. MOV     r11, r11, lsl #4
  38.    STR     r11, [r10]
  39.     MEND
  40. ;---------------------------------------------------------------------------
  41. IMPORT KernelStart
  42. IMPORT  ARMClearUTLB
  43. IMPORT  ARMFlushICache
  44. IMPORT  ARMFlushDCache
  45. EXPORT SelfRefreshAndPowerOff
  46. EXPORT SelfRefreshAndPowerOff2
  47. ; for S3C2440 v0.17 board
  48. ; 300MHz -> 1.1 +- 0.05 Volt
  49. ; 400MHz -> 1.2 +- 0.05 Volt
  50. ; 533MHz -> 1.35 +- 0.05 Volt
  51. ; /////////////////////////////////////////
  52. ; //   D4   D3   D2   D1   D0
  53. ; //    0    1    0    0    0      // 1.35V
  54. ; //    0    1    0    0    1      // 1.30V
  55. ; //    0    1    0    1    0      // 1.25V
  56. ; //    0    1    0    1    1      // 1.20V
  57. ; //    0    1    1    0    0      // 1.15V
  58. ; //    0    1    1    0    1      // 1.10V
  59. ; //    0    1    1    1    0      // 1.05V
  60. ; //    0    1    1    1    1      // 1.00V
  61. ; //    1    0    0    0    1      // 0.95V
  62. ; //    1    0    0    1    1      // 0.90V
  63. ; //    1    0    1    0    1      // 0.85V
  64. ; //    1    0    1    1    1      // 0.80V
  65. GBLA FIN
  66. FIN SETA  12 ; 12, 16
  67. GBLA S2440A
  68. S2440A SETA 1 ; 0 = S2440X, 1 = S2440A
  69. ;FCLK EQU (400)
  70. ;PLLVAL EQU ((((92)<<12) + (1<<4) + 0x0))
  71. ;FCLK EQU (533)
  72. ;PLLVAL  EQU     (((214 << 12) + (3 << 4) + 0))
  73. [ FIN = 12 ;
  74. GBLA CLKVAL
  75. ;CLKVAL SETA 300
  76. CLKVAL SETA 400
  77. [ CLKVAL = 300
  78. FCLK EQU (300)
  79. [ S2440A = 1 ; S2440A
  80. PLLVAL EQU (((67 << 12) + (1 << 4) + 1))
  81. | ; S2440X
  82. PLLVAL EQU (((67 << 12) + (1 << 4) + 0))
  83. ]
  84. CLKDIVVAL EQU 7 ; 0x0 = 1:1:1, 0x1 = 1:1:2, 0x2 = 1:2:2, 0x3 = 1:2:4, 0x4 = 1:4:4, 0x5 = 1:4:8, 0x6 = 1:3:3, 0x7 = 1:3:6
  85. D4VAL EQU 0 ; 1.05 V
  86. D3VAL EQU 1
  87. D2VAL EQU 1
  88. D1VAL EQU 1
  89. D0VAL EQU 0
  90. ]
  91. [ CLKVAL = 400
  92. FCLK EQU (400)
  93. [ S2440A = 1 ; S2440A
  94. PLLVAL EQU (((92 << 12) + (1 << 4) + 1))
  95. | ; S2440X
  96. PLLVAL EQU (((92 << 12) + (1 << 4) + 0))
  97. ]
  98. CLKDIVVAL EQU 5 ; 0x0 = 1:1:1, 0x1 = 1:1:2, 0x2 = 1:2:2, 0x3 = 1:2:4, 0x4 = 1:4:4, 0x5 = 1:4:8, 0x6 = 1:3:3, 0x7 = 1:3:6
  99. D4VAL EQU 0 ; 1.3V
  100. D3VAL EQU 1
  101. D2VAL EQU 0
  102. D1VAL EQU 0
  103. D0VAL EQU 1
  104. ]
  105. UPLLVAL EQU (((56 << 12) + (2 << 4) + 2))
  106. ] ; FIN = OSC_12MHZ
  107. [ FIN = 16
  108. GBLA CLKVAL
  109. ;CLKVAL SETA 296
  110. CLKVAL SETA 399
  111. ;CLKVAL SETA 530
  112. [ CLKVAL = 296
  113. FCLK EQU (296)
  114. [ S2440A = 1 ; S2440A
  115. PLLVAL EQU (((97 << 12) + (1 << 4) + 2))
  116. | ; S2440X
  117. PLLVAL EQU (((97 << 12) + (1 << 4) + 1))
  118. ]
  119. CLKDIVVAL EQU 7 ; 0x0 = 1:1:1, 0x1 = 1:1:2, 0x2 = 1:2:2, 0x3 = 1:2:4, 0x4 = 1:4:4, 0x5 = 1:4:8, 0x6 = 1:3:3, 0x7 = 1:3:6
  120. D4VAL EQU 0 ; 1.05 V
  121. D3VAL EQU 1
  122. D2VAL EQU 1
  123. D1VAL EQU 1
  124. D0VAL EQU 0
  125. ]
  126. [ CLKVAL = 399
  127. FCLK EQU (399)
  128. [ S2440A = 1 ; S2440A
  129. PLLVAL EQU (((110 << 12) + (3 << 4) + 1))
  130. | ; S2440X
  131. PLLVAL EQU (((110 << 12) + (3 << 4) + 0))
  132. ]
  133. CLKDIVVAL EQU 7 ; 0x0 = 1:1:1, 0x1 = 1:1:2, 0x2 = 1:2:2, 0x3 = 1:2:4, 0x4 = 1:4:4, 0x5 = 1:4:8, 0x6 = 1:3:3, 0x7 = 1:3:6
  134. D4VAL EQU 0 ; 1.3V
  135. D3VAL EQU 1
  136. D2VAL EQU 0
  137. D1VAL EQU 0
  138. D0VAL EQU 1
  139. ]
  140. [ CLKVAL = 530
  141. FCLK EQU (530)
  142. [ S2440A = 1 ; S2440A
  143. PLLVAL EQU (((86 << 12) + (1 << 4) + 1))
  144. | ; S2440X
  145. PLLVAL EQU (((86 << 12) + (1 << 4) + 0))
  146. ]
  147. CLKDIVVAL EQU 5 ; 0x0 = 1:1:1, 0x1 = 1:1:2, 0x2 = 1:2:2, 0x3 = 1:2:4, 0x4 = 1:4:4, 0x5 = 1:4:8, 0x6 = 1:3:3, 0x7 = 1:3:6
  148. D4VAL EQU 0 ; 1.35 V
  149. D3VAL EQU 1
  150. D2VAL EQU 0
  151. D1VAL EQU 0
  152. D0VAL EQU 0
  153. ]
  154. UPLLVAL EQU (((60 << 12) + (0x4 << 4) + 0x2))
  155. ] ; FIN = OSC_16MHZ
  156. R1_iA EQU (1 << 31)
  157. R1_nF EQU (1 << 30)
  158. ; Data Cache Characteristics.
  159. ;
  160. DCACHE_LINES_PER_SET_BITS       EQU     6
  161. DCACHE_LINES_PER_SET            EQU     64
  162. DCACHE_NUM_SETS                 EQU     8
  163. DCACHE_SET_INDEX_BIT            EQU     (32 - DCACHE_LINES_PER_SET_BITS)
  164. DCACHE_LINE_SIZE                EQU     32
  165. SLEEPDATA_BASE_VIRTUAL          EQU 0xAC024000 ; keep in sync w/ config.bib
  166. SLEEPDATA_BASE_PHYSICAL         EQU 0x30024000
  167. WORD_SIZE                EQU     (4)
  168. SleepState_Data_Start EQU     (0)
  169. SleepState_WakeAddr     EQU     (SleepState_Data_Start     )
  170. SleepState_MMUCTL           EQU     (SleepState_WakeAddr    + WORD_SIZE )
  171. SleepState_MMUTTB        EQU     (SleepState_MMUCTL   + WORD_SIZE )
  172. SleepState_MMUDOMAIN     EQU     (SleepState_MMUTTB   + WORD_SIZE )
  173. SleepState_SVC_SP        EQU     (SleepState_MMUDOMAIN   + WORD_SIZE )
  174. SleepState_SVC_SPSR      EQU     (SleepState_SVC_SP   + WORD_SIZE )
  175. SleepState_FIQ_SPSR      EQU     (SleepState_SVC_SPSR    + WORD_SIZE )
  176. SleepState_FIQ_R8        EQU     (SleepState_FIQ_SPSR    + WORD_SIZE )
  177. SleepState_FIQ_R9        EQU     (SleepState_FIQ_R8   + WORD_SIZE )
  178. SleepState_FIQ_R10       EQU     (SleepState_FIQ_R9   + WORD_SIZE )
  179. SleepState_FIQ_R11       EQU     (SleepState_FIQ_R10  + WORD_SIZE )
  180. SleepState_FIQ_R12       EQU     (SleepState_FIQ_R11  + WORD_SIZE )
  181. SleepState_FIQ_SP        EQU     (SleepState_FIQ_R12  + WORD_SIZE )
  182. SleepState_FIQ_LR        EQU     (SleepState_FIQ_SP   + WORD_SIZE )
  183. SleepState_ABT_SPSR      EQU     (SleepState_FIQ_LR   + WORD_SIZE )
  184. SleepState_ABT_SP        EQU     (SleepState_ABT_SPSR    + WORD_SIZE )
  185. SleepState_ABT_LR        EQU     (SleepState_ABT_SP   + WORD_SIZE )
  186. SleepState_IRQ_SPSR      EQU     (SleepState_ABT_LR   + WORD_SIZE )
  187. SleepState_IRQ_SP        EQU     (SleepState_IRQ_SPSR    + WORD_SIZE )
  188. SleepState_IRQ_LR        EQU     (SleepState_IRQ_SP   + WORD_SIZE )
  189. SleepState_UND_SPSR      EQU     (SleepState_IRQ_LR   + WORD_SIZE )
  190. SleepState_UND_SP        EQU     (SleepState_UND_SPSR    + WORD_SIZE )
  191. SleepState_UND_LR        EQU     (SleepState_UND_SP   + WORD_SIZE )
  192. SleepState_SYS_SP        EQU     (SleepState_UND_LR   + WORD_SIZE )
  193. SleepState_SYS_LR        EQU     (SleepState_SYS_SP   + WORD_SIZE )
  194. SleepState_Data_End      EQU     (SleepState_SYS_LR + WORD_SIZE )
  195. SLEEPDATA_SIZE      EQU     (SleepState_Data_End - SleepState_Data_Start) / 4
  196. MMU_CTL_MASK                    EQU 0x3FFF0000
  197. MMU_TTB_MASK                    EQU 0x00003FFF
  198. MMU_ID_MASK                     EQU 0xFFFFFFF0
  199. Mode_USR EQU    0x10
  200. Mode_FIQ EQU     0x11
  201. Mode_IRQ EQU    0x12
  202. Mode_SVC EQU    0x13
  203. Mode_ABT EQU    0x17
  204. Mode_UND EQU    0x1B
  205. Mode_SYS EQU     0x1F
  206. I_Bit            EQU    0x80
  207. F_Bit            EQU    0x40
  208. BIT_SELFREFRESH EQU (1<<22)
  209. HandleFIQ EQU 0x33ffff1c
  210. ;**
  211. ; * StartUp - Image EntryPoint
  212. ; *
  213. ; * @return .
  214. ; * @param .
  215. ; *
  216. STARTUPTEXT
  217. LEAF_ENTRY StartUp
  218. 1 b ResetHandler
  219. b %B1 ;handler for Undefined mode
  220. b %B1 ;handler for SWI interrupt
  221. b %B1 ;handler for PAbort
  222. b %B1 ;handler for DAbort
  223. b %B1 ;reserved
  224. b %B1    ;handler for IRQ interrupt 
  225. ;b HandlerFIQ      ;handler for FIQ interrupt
  226. ENTER_POWER_OFF ;FIQ Handler
  227. ; LED_ON 0x4
  228. ldr r0,=GPFCON
  229. ldr r1,=0x5500
  230. str r1,[r0]
  231. ldr r0,=GPFDAT
  232. ldr r1,=0x20
  233. str r1,[r0]
  234. ldr r5,=REFRESH
  235. ldr r6,[r5]
  236. orr r6, r6, #BIT_SELFREFRESH
  237. ldr  r3,=MISCCR
  238. ldr r4,[r3]
  239. orr r4,r4,#(3<<17)  
  240. bic r4,r4, #(7 << 20)
  241. orr r4,r4, #(6 << 20)
  242. ldr r2,=0x7fff8
  243. ldr r1,=CLKCON
  244. mov r0,#16    
  245. b _EPO ;This code isn't needed for code on the ROM
  246. ALIGN 32
  247. _EPO
  248. 1 str  r6, [r5] ;Enable SDRAM self-refresh
  249. 2 subs r0,r0,#1 ;Wait until self-refresh is issued,which may not be needed.
  250. bne %B2
  251. str r4,[r3] ;Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up 
  252. str  r2,[r1]     ;CPU will enter into POWER_OFF mode.
  253. b .
  254. LTORG   
  255. ResetHandler
  256. ; LED_ON 0xa
  257. ; for smdk2440 v0.17 board 533Mhz (by shlim 031107)
  258. [ {FALSE}
  259. ldr r0, = GPBDAT ; D4
  260. ldr r1, [r0]
  261. ldr r2, = 0x77f
  262. and r1, r1, r2
  263. ldr r2, = (0<<7)
  264. orr r1, r1, r2
  265. str r1, [r0]
  266. ]
  267. ldr r0, = GPFDAT ; D3~0
  268. ldr r1, [r0]
  269. ldr r2, = 0x0f
  270. and r1, r1, r2
  271. ldr r2, = (1<<7)
  272. orr r1, r1, r2
  273. ldr r2, = (0<<6)
  274. orr r1, r1, r2
  275. ldr r2, = (0<<5)
  276. orr r1, r1, r2
  277. ldr r2, = (0<<4)
  278. orr r1, r1, r2
  279. str r1, [r0]
  280. [ {FALSE}
  281. ldr r0, = GPBCON ; GPB7: Output
  282. ldr r1, [r0]
  283. ldr r2, = 0x3f3fff
  284. and r1, r1, r2
  285. ldr r2, = (1<<14)
  286. orr r1, r1, r2
  287. str r1, [r0]
  288. ]
  289. ldr r0, = GPFCON ; GPF4~7: Output
  290. ldr r1, [r0]
  291. ldr r2, = 0x00ff
  292. and r1, r1, r2
  293. ldr r2, = 0x5500
  294. orr r1, r1, r2
  295. str r1, [r0]
  296. [ {FALSE}
  297. ldr r0, = GPBDAT ; Latch enable
  298. ldr r1, [r0]
  299. ldr r2, = ~(0<<8)
  300. and r1, r1, r2
  301. str r1, [r0]
  302. ldr r0, = GPBCON ; GPB8: Output
  303. ldr r1, [r0]
  304. ldr r2, = 0x3cffff
  305. and r1, r1, r2
  306. ldr r2, = (1<<16)
  307. orr r1, r1, r2
  308. str r1, [r0]
  309. ldr r0, = GPBDAT ; Output enable
  310. ldr r1, [r0]
  311. ldr r2, = (1<<10)
  312. orr r1, r1, r2
  313. str r1, [r0]
  314. ldr r0, = GPBCON ; GPB10: Output
  315. ldr r1, [r0]
  316. ldr r2, = 0x0fffff
  317. and r1, r1, r2
  318. ldr r2, = (1<<20)
  319. orr r1, r1, r2
  320. str r1, [r0]
  321. ldr r0, = GPBDAT ; Latch disable
  322. ldr r1, [r0]
  323. ldr r2, = (1<<8)
  324. orr r1, r1, r2
  325. str r1, [r0]
  326. ]
  327. ; end for 533Mhz code
  328. ldr     r0, = INTMSK
  329. ldr r1, = ~BIT_BAT_FLT  ; all interrupt disable, nBATT_FLT =enabled
  330. str     r1, [r0]
  331. ldr r0, = INTSUBMSK
  332. ldr r1, = 0x7ff ;all sub interrupt disable
  333. str r1, [r0]
  334. ldr     r0, = INTMOD
  335. ldr r1, = BIT_BAT_FLT   ; set all interrupt as IRQ, BAT_FLT = FIQ
  336. str     r1, [r0]
  337. ldr  r1, =MISCCR     ; MISCCR's Bit [22:20] -> 100
  338. ldr r0, [r1]
  339. bic r0, r0, #(7 << 20)
  340. orr r0, r0, #(4 << 20)
  341. str r0, [r1]
  342. bl      ARMClearUTLB
  343. bl      ARMFlushICache
  344. ldr     r0, = (DCACHE_LINES_PER_SET - 1)    
  345. ldr     r1, = (DCACHE_NUM_SETS - 1)    
  346. ldr     r2, = DCACHE_SET_INDEX_BIT    
  347. ldr     r3, = DCACHE_LINE_SIZE     
  348. bl      ARMFlushDCache    
  349. nop
  350. nop
  351. nop
  352. ldr     r0, = GPFCON
  353. ldr     r1, = 0x55aa      
  354. str     r1, [r0]
  355. ldr     r0, = WTCON ; watch dog disable 
  356. ldr     r1, = 0x0         
  357. str     r1, [r0]
  358. [ {TRUE}
  359. ldr     r0, = CLKDIVN
  360. ldr     r1, = CLKDIVVAL ; 0x0 = 1:1:1  ,  0x1 = 1:1:2, use CLKDIVVAL instead of 7
  361. ; 0x2 = 1:2:2  ,  0x3 = 1:2:4,  0x4 = 1:4:4,  0x5 = 1:4:8, 0x6 = 1:3:3, 0x7 = 1:3:6
  362. str     r1, [r0]
  363. ands    r1, r1, #0xe ; Make AsyncBusMode
  364. beq     %F1
  365. mrc p15, 0, r0, c1, c0, 0
  366. orr r0, r0, #R1_nF:OR:R1_iA
  367. mcr p15, 0, r0, c1, c0, 0
  368. 1
  369. ldr r0, = LOCKTIME ; To reduce PLL lock time, adjust the LOCKTIME register. 
  370. ldr r1, = 0xffffff
  371. str r1, [r0]
  372. ldr     r0, = UPLLCON ; Fin=12MHz, Fout=48MHz
  373. [ FIN = 12
  374. ldr     r1, = ((0x38 << 12) + (0x2 << 4) + 0x2)  
  375. |
  376. ldr     r1, = ((60 << 12) + (4 << 4) + 0x2)  
  377. ]  
  378. str     r1, [r0]
  379. nop ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
  380. nop
  381. nop
  382. nop
  383. nop
  384. nop
  385. nop
  386. ldr r0, = CAMDIVN
  387. ldr r1, = 0
  388. str r1, [r0]
  389. ldr r0, = MPLLCON ; Configure MPLL ; Fin=12MHz, Fout=50MHz
  390. ldr r1, = PLLVAL
  391. str r1, [r0]
  392. ]
  393. mov     r0, #0x2000
  394. 1
  395. subs    r0, r0, #1
  396. bne     %B1
  397. ; :::::::::::::::::::::::::::::::::::::::::::::
  398. ;           Add for Power Management 
  399. ; - - - - - - - - - - - - - - - - - - - - - - -
  400. ldr r1, =GSTATUS2           ; Determine Booting Mode
  401. ldr r10, [r1]
  402. tst r10, #0x2 ; Power-Off reset Check
  403. beq %F2                     ; if not wakeup from PowerOffmode
  404. ;  goto Watchdog reset test.
  405. b %F3 ; if wakeup from PowerOff mode
  406. ;  goto Power-up code.
  407. ; Watchdog reset
  408. 2
  409. tst r10, #0x4 ; In case of the wake-up from Watchdog reset, 
  410. ;  go to SDRAM start address(0x3020_0000)
  411. b %F4 ; If not wakeup from Watchdog reset,
  412. beq %F4 ; If not wakeup from Watchdog reset,
  413. ;  goto Normal Mode.
  414. mov r0, #4
  415. str r0, [r1] ; Clear the GSTATUS2. Because same code is located in memory address.
  416. ; Set memory control registers
  417. add r0, pc, #SMRDATA - (. + 8)
  418. ldr     r1, = BWSCON ; BWSCON Address
  419. add r2, r0, #52 ; End address of SMRDATA
  420. loop0
  421. ldr     r3, [r0], #4    
  422. str     r3, [r1], #4    
  423. cmp     r2, r0
  424. bne loop0
  425. mov r1, #256
  426. loop1
  427. subs r1, r1, #1 ; wait until the SelfRefresh is released.
  428. bne loop1
  429. ldr r2, =0x201000 ; offset into the RAM 
  430. add r2, r2, #0x30000000 ; add physical base
  431. mov     pc, r2 ;  & jump to StartUp address
  432. b .
  433. ; Case of Power-off reset
  434. 3
  435. ldr  r1, =MISCCR     ; MISCCR's Bit 17, 18, 19 -> 0
  436. ldr r0, [r1]
  437. bic r0, r0, #(3 << 17)
  438. str r0, [r1]
  439. ; - - - - - - - - - - - - - - - - - - - - - - -
  440. ;           Add for Power Management 
  441. ; :::::::::::::::::::::::::::::::::::::::::::::
  442. 4
  443. add r0, pc, #SMRDATA - (. + 8)
  444. ldr     r1, = BWSCON ; BWSCON Address
  445. add r2, r0, #52 ; End address of SMRDATA
  446. 1       
  447. ldr     r3, [r0], #4    
  448. str     r3, [r1], #4    
  449. cmp     r2, r0
  450. bne     %B1
  451. ; :::::::::::::::::::::::::::::::::::::::::::::
  452. ;           Add for Power Management 
  453. ; - - - - - - - - - - - - - - - - - - - - - - -
  454. tst r10, #0x2 ; Power-Off reset check
  455. beq BringUpWinCE                    ; Normal Mode Booting
  456. ; Recover Process : Starting Point
  457. ldr r1, =GSTATUS2           ; Determine Booting Mode
  458. ldr r10, [r1]
  459. str r10, [r1] ; Clear Booting Mode
  460. ;  1. Checksum Calculation saved Data
  461. ldr  r5, =SLEEPDATA_BASE_PHYSICAL ; pointer to physical address of reserved Sleep mode info data structure 
  462. mov r3, r5 ; pointer for checksum calculation
  463. mov r2, #0
  464. ldr r0, =SLEEPDATA_SIZE ; get size of data structure to do checksum on
  465. 40
  466. ldr r1, [r3], #4 ; pointer to SLEEPDATA
  467. and r1, r1, #0x1
  468. mov r1, r1, LSL #31
  469. orr r1, r1, r1, LSR #1
  470. add r2, r2, r1
  471. subs r0, r0, #1 ; dec the count
  472. bne %b40         ; loop till done
  473. ldr r0,=GSTATUS3
  474. ldr r3, [r0] ; get the Sleep data checksum from the Power Manager Scratch pad register
  475. teq r2, r3         ; compare to what we saved before going to sleep
  476. ; bne BringUpWinCE     ; bad news - do a cold boot - If emergency power off case, normal booting.
  477. bne JumpToRAM ; bad news - do a cold boot - If emergency power off case, normal booting.
  478. b MMUENABLE
  479. JumpToRAM
  480. ldr r2, =0x201000 ; offset into the RAM 
  481. ldr r3, =0x30000000 ; add physical base
  482. add r2, r2, r3
  483. mov     pc, r2 ;  & jump to StartUp address
  484. MMUENABLE
  485. ;  2. MMU Enable
  486. ldr     r10, [r5, #SleepState_MMUDOMAIN] ; load the MMU domain access info
  487. ldr     r9,  [r5, #SleepState_MMUTTB] ; load the MMU TTB info
  488. ldr     r8,  [r5, #SleepState_MMUCTL] ; load the MMU control info
  489. ldr     r7,  [r5, #SleepState_WakeAddr] ; load the LR address
  490. nop
  491. nop
  492. nop
  493. nop
  494. nop
  495. ; if software reset
  496. mov r1, #0x38000000
  497. teq r1, r7
  498. bne %f1
  499. bl BringUpWinCE
  500. ; wakeup routine
  501. 1
  502. mcr p15, 0, r10, c3, c0, 0 ; setup access to domain 0
  503. mcr p15, 0, r9,  c2, c0, 0 ; PT address
  504. mcr p15, 0, r0,  c8, c7, 0     ; flush I+D TLBs
  505. mcr p15, 0, r8,  c1, c0, 0 ; restore MMU control
  506. ;  3. Jump to Kernel Image's fw.s(Awake_address)
  507. mov     pc, r7 ;  & jump to new virtual address (back up Power management stack)
  508. nop
  509. ; - - - - - - - - - - - - - - - - - - - - - - -
  510. ;           Add for Power Management 
  511. ; :::::::::::::::::::::::::::::::::::::::::::::
  512. BringUpWinCE
  513. ldr r0, = GPFDAT
  514. mov r1, #0x60
  515. str r1, [r0]
  516. add r0, pc, #OEMAddressTable - (. + 8)
  517. bl KernelStart
  518.         LTORG
  519. SMRDATA DATA
  520.         DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
  521.      DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) ;GCS0
  522.      DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) ;GCS1 
  523.      DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) ;GCS2
  524.      DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) ;GCS3
  525.      DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) ;GCS4
  526.      DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) ;GCS5
  527.      DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6
  528.      DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7
  529.      DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)    
  530.      DCD 0xB2 ;SCLK power saving mode, BANKSIZE 128M/128M
  531.      DCD 0x20 ;MRSR6 CL=3clk
  532.      DCD 0x20 ;MRSR7
  533. ;     DCD 0xB2 ;SCLK power saving mode, BANKSIZE 128M/128M
  534. ;     DCD 0x30 ;MRSR6 CL=3clk
  535. ;     DCD 0x30 ;MRSR7
  536. INCLUDE map.a
  537. TEXTAREA
  538. ;**
  539. ; * CPUPowerWDReset - Software reset routine. Use watchdog timer and SDRAM to self-refresh mode.
  540. ; *
  541. ; * Entry none
  542. ; * Exit none
  543. ; * Uses r0-r3
  544. ; *
  545. LEAF_ENTRY CPUPowerWDReset
  546. ; VLED_ON 0xb
  547. ;Watchdog reset enable.
  548. ldr r1, =vWTCON
  549. ldr r0, [r1]
  550. orr r0, r0, #(1<<5) ; Enable watchdog timer.
  551. str r0, [r1]
  552. ldr     r0, =vREFRESH
  553. ldr     r1, [r0] ; r1=rREFRESH
  554. orr     r1, r1, #(1 << 22)
  555. ;Set memory control self-refersh
  556. ldr r0,=vREFRESH
  557. ldr r3,[r0] ;r3=rREFRESH, may fill TLB
  558. orr r3, r3, #BIT_SELFREFRESH
  559. b %F1
  560. ALIGN 32 ;The following instructions will be in I-Cache
  561. 1
  562. str r3, [r0] ;Enable SDRAM self-refresh
  563. b .
  564. ;**
  565. ; * CPUPowerReset - Software reset routine. Just jump to StartUp in this file.
  566. ; *
  567. ; * Entry none
  568. ; * Exit none
  569. ; * Uses r0-r3
  570. ; *
  571. LEAF_ENTRY CPUPowerReset
  572.     ldr     r3, =SLEEPDATA_BASE_VIRTUAL ; base of Sleep mode storage
  573. mov     r2, #0x38000000             ; store Virtual return address
  574. str     r2, [r3], #4
  575. ; Disable MMU
  576. ldr r2, = PhysicalStart
  577. ldr     r3, = (0x8C000000 - 0x30000000)
  578. sub     r2, r2, r3
  579. mov     r1, #0x0070             ; Disable MMU
  580. mcr     p15, 0, r1, c1, c0, 0
  581. nop
  582. mov     pc, r2                  ; Jump to PStart
  583. nop
  584. ; MMU & caches now disabled.
  585. PhysicalStart
  586. bl      ARMClearUTLB
  587. bl      ARMFlushICache
  588. ldr     r0, = (DCACHE_LINES_PER_SET - 1)    
  589. ldr     r1, = (DCACHE_NUM_SETS - 1)    
  590. ldr     r2, = DCACHE_SET_INDEX_BIT    
  591. ldr     r3, = DCACHE_LINE_SIZE     
  592. bl      ARMFlushDCache
  593. ldr r2, =0x201000 ; offset into the RAM 
  594. ldr r3, =0x30000000 ; add physical base
  595. add r2, r2, r3
  596. mov     pc, r2 ;  & jump to StartUp address
  597. ;**
  598. ; * EmergencyCPUPowerOff - Emergency condition ( fast poweroff ).
  599. ; *
  600. ; * Entry none
  601. ; * Exit none
  602. ; * Uses r0-r3
  603. ; *
  604. LEAF_ENTRY EmergencyCPUPowerOff
  605. ;       1. Push SVC state onto our stack
  606. stmdb   sp!, {r4-r12}                   
  607. stmdb   sp!, {lr}
  608. ;       2. Save MMU & CPU Register to RAM
  609.     ldr     r3, =SLEEPDATA_BASE_VIRTUAL     ; base of Sleep mode storage
  610. ; ldr     r2, =Awake_address              ; store Virtual return address
  611. ldr     r2, =0xAC201000                 ; store Virtual return address
  612. str     r2, [r3], #4
  613. mrc     p15, 0, r2, c1, c0, 0           ; load r2 with MMU Control
  614. ldr     r0, =MMU_CTL_MASK               ; mask off the undefined bits
  615. bic     r2, r2, r0
  616. str     r2, [r3], #4                    ; store MMU Control data
  617. mrc     p15, 0, r2, c2, c0, 0           ; load r2 with TTB address.
  618. ldr     r0, =MMU_TTB_MASK               ; mask off the undefined bits
  619. bic     r2, r2, r0
  620. str     r2, [r3], #4                    ; store TTB address
  621. mrc     p15, 0, r2, c3, c0, 0           ; load r2 with domain access control.
  622. str     r2, [r3], #4                    ; store domain access control
  623. str     sp, [r3], #4                    ; store SVC stack pointer
  624. mrs     r2, spsr
  625. str     r2, [r3], #4                    ; store SVC status register
  626. mov     r1, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; Enter FIQ mode, no interrupts
  627. msr     cpsr, r1
  628. mrs     r2, spsr
  629. stmia   r3!, {r2, r8-r12, sp, lr}       ; store the FIQ mode registers
  630. mov     r1, #Mode_ABT:OR:I_Bit:OR:F_Bit ; Enter ABT mode, no interrupts
  631. msr     cpsr, r1
  632. mrs r0, spsr
  633. stmia   r3!, {r0, sp, lr}               ; store the ABT mode Registers
  634. mov     r1, #Mode_IRQ:OR:I_Bit:OR:F_Bit ; Enter IRQ mode, no interrupts
  635. msr     cpsr, r1
  636. mrs     r0, spsr
  637. stmia   r3!, {r0, sp, lr}               ; store the IRQ Mode Registers
  638. mov     r1, #Mode_UND:OR:I_Bit:OR:F_Bit ; Enter UND mode, no interrupts
  639. msr     cpsr, r1
  640. mrs     r0, spsr
  641. stmia   r3!, {r0, sp, lr}               ; store the UND mode Registers
  642. mov     r1, #Mode_SYS:OR:I_Bit:OR:F_Bit ; Enter SYS mode, no interrupts
  643. msr     cpsr, r1
  644. stmia   r3!, {sp, lr}                   ; store the SYS mode Registers
  645. mov     r1, #Mode_SVC:OR:I_Bit:OR:F_Bit ; Back to SVC mode, no interrupts
  646. msr     cpsr, r1
  647. ;       3. do Checksum on the Sleepdata
  648. [ {FALSE}
  649. ldr     r3, =SLEEPDATA_BASE_VIRTUAL ; get pointer to SLEEPDATA
  650. mov     r2, #0
  651. ldr     r0, =SLEEPDATA_SIZE ; get size of data structure (in words)
  652. 30
  653. ldr     r1, [r3], #4
  654. and     r1, r1, #0x1
  655. mov     r1, r1, LSL #31
  656. orr     r1, r1, r1, LSR #1
  657. add     r2, r2, r1
  658. subs    r0, r0, #1
  659. bne     %b30
  660. ]
  661. ldr     r0, =vGPIOBASE
  662. str     r2, [r0, #oGSTATUS3] ; Store in Power Manager Scratch pad register
  663. ;       4. Interrupt Disable 
  664.     ldr     r0, =vINTBASE
  665.     mvn     r2, #0
  666. str     r2, [r0, #oINTMSK]
  667. str     r2, [r0, #oSRCPND]
  668. str     r2, [r0, #oINTPND]
  669. ;       5. Cache Flush
  670. [ {FALSE}
  671. bl      ARMClearUTLB
  672. bl      ARMFlushICache
  673. ldr     r0, = (DCACHE_LINES_PER_SET - 1)    
  674. ldr     r1, = (DCACHE_NUM_SETS - 1)    
  675. ldr     r2, = DCACHE_SET_INDEX_BIT    
  676. ldr     r3, = DCACHE_LINE_SIZE     
  677. bl      ARMFlushDCache
  678. ]
  679. ;       6. Setting Wakeup External Interrupt(EINT0,1,2) Mode
  680. ldr     r0, =vGPIOBASE
  681. ldr     r1, =0x550a
  682. str     r1, [r0, #oGPFCON]
  683. ; ldr     r1, =0x55550100
  684. ; str     r1, [r0, #oGPGCON]
  685. ;       7. Go to Power-Off Mode
  686. ldr  r0, =vMISCCR
  687. ldr r0, [r0]
  688. ldr  r0, =vCLKCON
  689. ldr r0, [r0]
  690. ldr     r0, =vREFRESH
  691. ldr     r1, [r0] ; r1=rREFRESH
  692. orr     r1, r1, #(1 << 22)
  693. ldr  r2, =vMISCCR
  694. ldr r3, [r2]
  695. orr r3, r3, #(3<<17)        ; Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up 
  696. ldr     r4, =vCLKCON
  697. ldr     r5, =0x7fff8            ; Power Off Mode
  698. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  699. ; Sometimes it is not working in cache mode. So I modify to jump to ROM area.
  700. ldr r6, =0x92000000 ; make address to 0x9200 0020
  701. add r6, r6, #0x20 ; 
  702. mov     pc, r6 ; jump to Power off code in ROM
  703. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  704. b       SelfRefreshAndPowerOff2
  705.         
  706. ALIGN   32                      ; for I-Cache Line(32Byte, 8 Word)
  707. SelfRefreshAndPowerOff2 ; run with Instruction Cache's code
  708. str     r1, [r0] ; Enable SDRAM self-refresh
  709. str r3, [r2] ; MISCCR Setting
  710. str     r5, [r4] ; Power Off !!
  711. b       .
  712. LTORG
  713. ;**
  714. ; * CPUPowerOff - OFF button handler(Called from OEMPowerOff() in cfw.c)
  715. ; *     This routine is invoked when the OFF button is pressed. It is responsible
  716. ; * for any final power off state and putting the cpu into standby.
  717. ; *
  718. ; * Entry none
  719. ; * Exit none
  720. ; * Uses r0-r3
  721. ; *
  722. LEAF_ENTRY CPUPowerOff
  723. ;       1. Push SVC state onto our stack
  724. stmdb   sp!, {r4-r12}                   
  725. stmdb   sp!, {lr}
  726. ; VLED_ON 0x0
  727. ;       2. Save MMU & CPU Register to RAM
  728.     ldr     r3, =SLEEPDATA_BASE_VIRTUAL     ; base of Sleep mode storage
  729. ldr     r2, =Awake_address              ; store Virtual return address
  730. str     r2, [r3], #4
  731. mrc     p15, 0, r2, c1, c0, 0           ; load r2 with MMU Control
  732. ldr     r0, =MMU_CTL_MASK               ; mask off the undefined bits
  733. bic     r2, r2, r0
  734. str     r2, [r3], #4                    ; store MMU Control data
  735. mrc     p15, 0, r2, c2, c0, 0           ; load r2 with TTB address.
  736. ldr     r0, =MMU_TTB_MASK               ; mask off the undefined bits
  737. bic     r2, r2, r0
  738. str     r2, [r3], #4                    ; store TTB address
  739. mrc     p15, 0, r2, c3, c0, 0           ; load r2 with domain access control.
  740. str     r2, [r3], #4                    ; store domain access control
  741. str     sp, [r3], #4                    ; store SVC stack pointer
  742. mrs     r2, spsr
  743. str     r2, [r3], #4                    ; store SVC status register
  744. mov     r1, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; Enter FIQ mode, no interrupts
  745. msr     cpsr, r1
  746. mrs     r2, spsr
  747. stmia   r3!, {r2, r8-r12, sp, lr}       ; store the FIQ mode registers
  748. mov     r1, #Mode_ABT:OR:I_Bit:OR:F_Bit ; Enter ABT mode, no interrupts
  749. msr     cpsr, r1
  750. mrs r0, spsr
  751. stmia   r3!, {r0, sp, lr}               ; store the ABT mode Registers
  752. mov     r1, #Mode_IRQ:OR:I_Bit:OR:F_Bit ; Enter IRQ mode, no interrupts
  753. msr     cpsr, r1
  754. mrs     r0, spsr
  755. stmia   r3!, {r0, sp, lr}               ; store the IRQ Mode Registers
  756. mov     r1, #Mode_UND:OR:I_Bit:OR:F_Bit ; Enter UND mode, no interrupts
  757. msr     cpsr, r1
  758. mrs     r0, spsr
  759. stmia   r3!, {r0, sp, lr}               ; store the UND mode Registers
  760. mov     r1, #Mode_SYS:OR:I_Bit:OR:F_Bit ; Enter SYS mode, no interrupts
  761. msr     cpsr, r1
  762. stmia   r3!, {sp, lr}                   ; store the SYS mode Registers
  763. mov     r1, #Mode_SVC:OR:I_Bit:OR:F_Bit ; Back to SVC mode, no interrupts
  764. msr     cpsr, r1
  765. ;       3. do Checksum on the Sleepdata
  766. ldr     r3, =SLEEPDATA_BASE_VIRTUAL ; get pointer to SLEEPDATA
  767. mov     r2, #0
  768. ldr     r0, =SLEEPDATA_SIZE ; get size of data structure (in words)
  769. 30
  770. ldr     r1, [r3], #4
  771. and     r1, r1, #0x1
  772. mov     r1, r1, LSL #31
  773. orr     r1, r1, r1, LSR #1
  774. add     r2, r2, r1
  775. subs    r0, r0, #1
  776. bne     %b30
  777. ldr     r0, =vGPIOBASE
  778. str     r2, [r0, #oGSTATUS3] ; Store in Power Manager Scratch pad register
  779. ;       4. Interrupt Disable 
  780.     ldr     r0, =vINTBASE
  781.     mvn     r2, #0
  782. str     r2, [r0, #oINTMSK]
  783. str     r2, [r0, #oSRCPND]
  784. str     r2, [r0, #oINTPND]
  785. ;       5. Cache Flush
  786. bl      ARMClearUTLB
  787. bl      ARMFlushICache
  788. ldr     r0, = (DCACHE_LINES_PER_SET - 1)    
  789. ldr     r1, = (DCACHE_NUM_SETS - 1)    
  790. ldr     r2, = DCACHE_SET_INDEX_BIT    
  791. ldr     r3, = DCACHE_LINE_SIZE     
  792. bl      ARMFlushDCache
  793. ;       6. Setting Wakeup External Interrupt(EINT0,1,2) Mode
  794. ldr     r0, =vGPIOBASE
  795. ldr     r1, =0x550a
  796. str     r1, [r0, #oGPFCON]
  797. ; ldr     r1, =0x55550100
  798. ; str     r1, [r0, #oGPGCON]
  799. ;       7. Go to Power-Off Mode
  800. ldr  r0, =vMISCCR ; hit the TLB
  801. ldr r0, [r0]
  802. ldr  r0, =vCLKCON
  803. ldr r0, [r0]
  804. ldr     r0, =vREFRESH
  805. ldr     r1, [r0] ; r1=rREFRESH
  806. orr     r1, r1, #(1 << 22)
  807. ldr  r2, =vMISCCR
  808. ldr r3, [r2]
  809. orr r3, r3, #(3<<17)        ; Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up 
  810. bic r3, r3, #(7<<20)
  811. orr r3, r3, #(6<<20)
  812. ldr     r4, =vCLKCON
  813. ldr     r5, =0x7fff8            ; Power Off Mode
  814. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  815. ; Sometimes it is not working in cache mode. So I modify to jump to ROM area.
  816. ldr r6, =0x92000000 ; make address to 0x9200 0020
  817. add r6, r6, #0x20 ; 
  818. mov     pc, r6 ; jump to Power off code in ROM
  819. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  820. b       SelfRefreshAndPowerOff
  821. ALIGN   32                      ; for I-Cache Line(32Byte, 8 Word)
  822. SelfRefreshAndPowerOff ; run with Instruction Cache's code
  823. str     r1, [r0] ; Enable SDRAM self-refresh
  824. str r3, [r2] ; MISCCR Setting
  825. str     r5, [r4] ; Power Off !!
  826. b       .
  827. LTORG
  828. ; This point is called from EBOOT's startup code(MMU is enabled)
  829. ;       in this routine, left information(REGs, INTMSK, INTSUBMSK ...)
  830. Awake_address
  831. ;       1. Recover CPU Registers
  832. ldr     r3, =SLEEPDATA_BASE_VIRTUAL ; Sleep mode information data structure
  833. add     r2, r3, #SleepState_FIQ_SPSR
  834. mov     r1, #Mode_FIQ:OR:I_Bit:OR:F_Bit ; Enter FIQ mode, no interrupts - also FIQ
  835. msr     cpsr, r1
  836. ldr     r0,  [r2], #4
  837. msr     spsr, r0
  838. ldr     r8,  [r2], #4
  839. ldr     r9,  [r2], #4
  840. ldr     r10, [r2], #4
  841. ldr     r11, [r2], #4
  842. ldr     r12, [r2], #4
  843. ldr     sp,  [r2], #4
  844. ldr     lr,  [r2], #4
  845. mov     r1, #Mode_ABT:OR:I_Bit ; Enter ABT mode, no interrupts
  846. msr     cpsr, r1
  847. ldr     r0, [r2], #4
  848. msr     spsr, r0
  849. ldr     sp, [r2], #4
  850. ldr     lr, [r2], #4
  851. mov     r1, #Mode_IRQ:OR:I_Bit ; Enter IRQ mode, no interrupts
  852. msr     cpsr, r1
  853. ldr     r0, [r2], #4
  854. msr     spsr, r0
  855. ldr     sp, [r2], #4
  856. ldr     lr, [r2], #4
  857. mov     r1, #Mode_UND:OR:I_Bit ; Enter UND mode, no interrupts
  858. msr     cpsr, r1
  859. ldr     r0, [r2], #4
  860. msr     spsr, r0
  861. ldr     sp, [r2], #4
  862. ldr     lr, [r2], #4
  863. mov     r1, #Mode_SYS:OR:I_Bit ; Enter SYS mode, no interrupts
  864. msr     cpsr, r1
  865. ldr     sp, [r2], #4
  866. ldr     lr, [r2]
  867. mov     r1, #Mode_SVC:OR:I_Bit ; Enter SVC mode, no interrupts - FIQ is available
  868. msr     cpsr, r1
  869. ldr     r0, [r3, #SleepState_SVC_SPSR]
  870. msr     spsr, r0
  871. ;       2. Recover Last mode's REG's, & go back to caller of CPUPowerOff()
  872. ldr     sp, [r3, #SleepState_SVC_SP]
  873. ldr     lr, [sp], #4
  874. ldmia   sp!, {r4-r12}
  875. mov     pc, lr                          ; and now back to our sponsors
  876. END