2440init.s
上传用户:jankzhpno
上传日期:2022-08-03
资源大小:4763k
文件大小:20k
源码类别:

Windows CE

开发平台:

Visual C++

  1. ;=========================================
  2. ; NAME: 2440INIT.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,Sleep mode
  9. ; 2003.03.14:DonGo: Modified for 2440.
  10. ;=========================================
  11. GET option.inc
  12. GET memcfg.inc
  13. GET 2440addr.inc
  14. BIT_SELFREFRESH EQU (1<<22)
  15. ;Pre-defined constants
  16. USERMODE    EQU  0x10
  17. FIQMODE     EQU  0x11
  18. IRQMODE     EQU  0x12
  19. SVCMODE     EQU  0x13
  20. ABORTMODE   EQU  0x17
  21. UNDEFMODE   EQU  0x1b
  22. MODEMASK    EQU  0x1f
  23. NOINT       EQU  0xc0
  24. ;The location of stacks
  25. UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~
  26. SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
  27. UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
  28. AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
  29. IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
  30. FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~
  31. ;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
  32. GBLL    THUMBCODE
  33. [ {CONFIG} = 16
  34. THUMBCODE SETL  {TRUE}
  35.     CODE32
  36.   |
  37. THUMBCODE SETL  {FALSE}
  38.     ]
  39.   MACRO
  40. MOV_PC_LR
  41.   [ THUMBCODE
  42.     bx lr
  43.   |
  44.     mov pc,lr
  45.   ]
  46. MEND
  47.   MACRO
  48. MOVEQ_PC_LR
  49.   [ THUMBCODE
  50.         bxeq lr
  51.   |
  52.     moveq pc,lr
  53.   ]
  54. MEND
  55.   MACRO
  56. $HandlerLabel HANDLER $HandleLabel
  57. $HandlerLabel
  58. sub sp,sp,#4 ;decrement sp(to store jump address)
  59. stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)
  60. ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
  61. ldr     r0,[r0]  ;load the contents(service routine start address) of HandleXXX
  62. str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
  63. ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
  64. MEND
  65. IMPORT  |Image$$RO$$Base| ; Base of ROM code
  66. IMPORT  |Image$$RO$$Limit|  ; End of ROM code (=start of ROM data)
  67. IMPORT  |Image$$RW$$Base|   ; Base of RAM to initialise
  68. IMPORT  |Image$$ZI$$Base|   ; Base and limit of area
  69. IMPORT  |Image$$ZI$$Limit|  ; to zero initialise
  70. IMPORT MMU_SetAsyncBusMode
  71. IMPORT MMU_SetFastBusMode ;
  72. IMPORT  Main    ; The main entry of mon program
  73. IMPORT  CopyProgramFromNand
  74. AREA    Init,CODE,READONLY
  75. ENTRY
  76. EXPORT __ENTRY
  77. __ENTRY
  78. ResetEntry
  79. ;1)The code, which converts to Big-endian, should be in little endian code.
  80. ;2)The following little endian code will be compiled in Big-Endian mode.
  81. ;  The code byte order should be changed as the memory bus width.
  82. ;3)The pseudo instruction,DCD can not be used here because the linker generates error.
  83. ASSERT :DEF:ENDIAN_CHANGE
  84. [ ENDIAN_CHANGE
  85.     ASSERT  :DEF:ENTRY_BUS_WIDTH
  86.     [ ENTRY_BUS_WIDTH=32
  87. b ChangeBigEndian     ;DCD 0xea000007
  88.     ]
  89.     [ ENTRY_BUS_WIDTH=16
  90. andeq r14,r7,r0,lsl #20   ;DCD 0x0007ea00
  91.     ]
  92.     [ ENTRY_BUS_WIDTH=8
  93. streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea
  94.     ]
  95. |
  96.     b ResetHandler
  97.     ]
  98. b HandlerUndef ;handler for Undefined mode
  99. b HandlerSWI ;handler for SWI interrupt
  100. b HandlerPabort ;handler for PAbort
  101. b HandlerDabort ;handler for DAbort
  102. b . ;reserved
  103. b HandlerIRQ ;handler for IRQ interrupt
  104. b HandlerFIQ ;handler for FIQ interrupt
  105. ;@0x20
  106. b EnterPWDN ; Must be @0x20.
  107. ChangeBigEndian
  108. ;@0x24
  109. [ ENTRY_BUS_WIDTH=32
  110.     DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0
  111.     DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80;  //Big-endian
  112.     DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0
  113. ]
  114. [ ENTRY_BUS_WIDTH=16
  115.     DCD 0x0f10ee11
  116.     DCD 0x0080e380
  117.     DCD 0x0f10ee01
  118. ]
  119. [ ENTRY_BUS_WIDTH=8
  120.     DCD 0x100f11ee
  121.     DCD 0x800080e3
  122.     DCD 0x100f01ee
  123.     ]
  124. DCD 0xffffffff  ;swinv 0xffffff is similar with NOP and run well in both endian mode.
  125. DCD 0xffffffff
  126. DCD 0xffffffff
  127. DCD 0xffffffff
  128. DCD 0xffffffff
  129. b ResetHandler
  130. HandlerFIQ      HANDLER HandleFIQ
  131. HandlerIRQ      HANDLER HandleIRQ
  132. HandlerUndef    HANDLER HandleUndef
  133. HandlerSWI      HANDLER HandleSWI
  134. HandlerDabort   HANDLER HandleDabort
  135. HandlerPabort   HANDLER HandlePabort
  136. IsrIRQ
  137. sub sp,sp,#4       ;reserved for PC
  138. stmfd sp!,{r8-r9}
  139. ldr r9,=INTOFFSET
  140. ldr r9,[r9]
  141. ldr r8,=HandleEINT0
  142. add r8,r8,r9,lsl #2
  143. ldr r8,[r8]
  144. str r8,[sp,#8]
  145. ldmfd sp!,{r8-r9,pc}
  146. LTORG
  147. ;=======
  148. ; ENTRY
  149. ;=======
  150. ResetHandler
  151. ldr r0,=WTCON       ;watch dog disable
  152. ldr r1,=0x0
  153. str r1,[r0]
  154. ldr r0,=INTMSK
  155. ldr r1,=0xffffffff  ;all interrupt disable
  156. str r1,[r0]
  157. ldr r0,=INTSUBMSK
  158. ldr r1,=0x7fff ;all sub interrupt disable
  159. str r1,[r0]
  160. [ {TRUE}
  161. ;rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
  162. ; Led_Display
  163. ldr r0,=GPBCON
  164. ldr r1,=0x00555555
  165. str r1,[r0]
  166. ldr r0,=GPBDAT
  167. ldr r1,=0x07fe
  168. str r1,[r0]
  169. ]
  170. ;To reduce PLL lock time, adjust the LOCKTIME register.
  171. ldr r0,=LOCKTIME
  172. ldr r1,=0xffffff
  173. str r1,[r0]
  174.     [ PLL_ON_START
  175. ; Added for confirm clock divide. for 2440.
  176. ; Setting value Fclk:Hclk:Pclk
  177. ldr r0,=CLKDIVN
  178. ldr r1,=CLKDIV_VAL ; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.
  179. str r1,[r0]
  180. ; MMU_SetAsyncBusMode and MMU_SetFastBusMode over 4K, so do not call here
  181. ; call it after copy
  182. ; [ CLKDIV_VAL>1  ; means Fclk:Hclk is not 1:1.
  183. ; bl MMU_SetAsyncBusMode
  184. ; |
  185. ; bl MMU_SetFastBusMode ; default value.
  186. ; ]
  187. ;program has not been copied, so use these directly
  188. [ CLKDIV_VAL>1  ; means Fclk:Hclk is not 1:1.
  189. mrc p15,0,r0,c1,c0,0
  190. orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA
  191. mcr p15,0,r0,c1,c0,0
  192. |
  193. mrc p15,0,r0,c1,c0,0
  194. bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF
  195. mcr p15,0,r0,c1,c0,0
  196. ]
  197. ;Configure UPLL
  198. ldr r0,=UPLLCON
  199. ldr r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)  
  200. str r1,[r0]
  201. nop ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
  202. nop
  203. nop
  204. nop
  205. nop
  206. nop
  207. nop
  208. ;Configure MPLL
  209. ldr r0,=MPLLCON
  210. ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=16.9344MHz
  211. str r1,[r0]
  212.     ]
  213. ;Check if the boot is caused by the wake-up from SLEEP mode.
  214. ldr r1,=GSTATUS2
  215. ldr r0,[r1]
  216. tst r0,#0x2
  217. ;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.
  218. bne WAKEUP_SLEEP
  219. EXPORT StartPointAfterSleepWakeUp
  220. StartPointAfterSleepWakeUp
  221. ;Set memory control registers
  222.   ;ldr r0,=SMRDATA
  223.   adrl r0, SMRDATA ;be careful!
  224. ldr r1,=BWSCON ;BWSCON Address
  225. add r2, r0, #52 ;End address of SMRDATA
  226. 0
  227. ldr r3, [r0], #4
  228. str r3, [r1], #4
  229. cmp r2, r0
  230. bne %B0
  231. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  232. ;;;;;;;;;;;;;       When EINT0 is pressed,  Clear SDRAM 
  233. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  234. ; check if EIN0 button is pressed
  235.        ldr r0,=GPFCON
  236. ldr r1,=0x0
  237. str r1,[r0]
  238. ldr r0,=GPFUP
  239. ldr r1,=0xff
  240. str r1,[r0]
  241. ldr r1,=GPFDAT
  242. ldr r0,[r1]
  243.        bic r0,r0,#(0x1e<<1)  ; bit clear
  244. tst r0,#0x1
  245. bne %F1
  246. ; Clear SDRAM Start
  247.   
  248. ldr r0,=GPFCON
  249. ldr r1,=0x55aa
  250. str r1,[r0]
  251. ; ldr r0,=GPFUP
  252. ; ldr r1,=0xff
  253. ; str r1,[r0]
  254. ldr r0,=GPFDAT
  255. ldr r1,=0x0
  256. str r1,[r0] ;LED=****
  257. mov r1,#0
  258. mov r2,#0
  259. mov r3,#0
  260. mov r4,#0
  261. mov r5,#0
  262. mov r6,#0
  263. mov r7,#0
  264. mov r8,#0
  265. ldr r9,=0x4000000   ;64MB
  266. ldr r0,=0x30000000
  267. 0
  268. stmia r0!,{r1-r8}
  269. subs r9,r9,#32 
  270. bne %B0
  271. ;Clear SDRAM End
  272. 1
  273.   ;Initialize stacks
  274. bl InitStacks
  275. ;===========================================================
  276. ldr r0, =BWSCON
  277. ldr r0, [r0]
  278. ands r0, r0, #6 ;OM[1:0] != 0, NOR FLash boot
  279. bne copy_proc_beg ;do not read nand flash
  280. adr r0, ResetEntry ;OM[1:0] == 0, NAND FLash boot
  281. cmp r0, #0 ;if use Multi-ice, 
  282. bne copy_proc_beg ;do not read nand flash for boot
  283. ;nop
  284. ;===========================================================
  285. nand_boot_beg
  286. [ {TRUE}
  287. bl CopyProgramFromNand
  288. |
  289. mov r5, #NFCONF
  290. ;set timing value
  291. ldr r0, =(7<<12)|(7<<8)|(7<<4)
  292. str r0, [r5]
  293. ;enable control
  294. ldr r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
  295. str r0, [r5, #4]
  296. bl ReadNandID
  297. mov r6, #0
  298. ldr r0, =0xec73
  299. cmp r5, r0
  300. beq %F1
  301. ldr r0, =0xec75
  302. cmp r5, r0
  303. beq %F1
  304. mov r6, #1
  305. 1
  306. bl ReadNandStatus
  307. mov r8, #0
  308. ldr r9, =ResetEntry
  309. 2
  310. ands r0, r8, #0x1f
  311. bne %F3
  312. mov r0, r8
  313. bl CheckBadBlk
  314. cmp r0, #0
  315. addne r8, r8, #32
  316. bne %F4
  317. 3
  318. mov r0, r8
  319. mov r1, r9
  320. bl ReadNandPage
  321. add r9, r9, #512
  322. add r8, r8, #1
  323. 4
  324. cmp r8, #5120
  325. bcc %B2
  326. mov r5, #NFCONF ;DsNandFlash
  327. ldr r0, [r5, #4]
  328. bic r0, r0, #1
  329. str r0, [r5, #4]
  330. ]
  331. ldr pc, =copy_proc_beg
  332. ;===========================================================
  333. copy_proc_beg
  334. adr r0, ResetEntry
  335. ldr r2, BaseOfROM
  336. cmp r0, r2
  337. ldreq r0, TopOfROM
  338. beq InitRam
  339. ldr r3, TopOfROM
  340. 0
  341. ldmia r0!, {r4-r7}
  342. stmia r2!, {r4-r7}
  343. cmp r2, r3
  344. bcc %B0
  345. sub r2, r2, r3
  346. sub r0, r0, r2
  347. InitRam
  348. ldr r2, BaseOfBSS
  349. ldr r3, BaseOfZero
  350. 0
  351. cmp r2, r3
  352. ldrcc r1, [r0], #4
  353. strcc r1, [r2], #4
  354. bcc %B0
  355. mov r0, #0
  356. ldr r3, EndOfBSS
  357. 1
  358. cmp r2, r3
  359. strcc r0, [r2], #4
  360. bcc %B1
  361. ldr pc, =%F2 ;goto compiler address
  362. 2
  363. ; [ CLKDIV_VAL>1  ; means Fclk:Hclk is not 1:1.
  364. ; bl MMU_SetAsyncBusMode
  365. ; |
  366. ; bl MMU_SetFastBusMode ; default value.
  367. ; ]
  368. ;bl Led_Test
  369. ;===========================================================
  370.    ; Setup IRQ handler
  371. ldr r0,=HandleIRQ       ;This routine is needed
  372. ldr r1,=IsrIRQ   ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c
  373. str r1,[r0]
  374. ; ;Copy and paste RW data/zero initialized data
  375. ; ldr r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
  376. ; ldr r1, =|Image$$RW$$Base|  ; and RAM copy
  377. ; ldr r3, =|Image$$ZI$$Base|
  378. ;
  379. ; ;Zero init base => top of initialised data
  380. ; cmp r0, r1      ; Check that they are different
  381. ; beq %F2
  382. ;1
  383. ; cmp r1, r3      ; Copy init data
  384. ; ldrcc r2, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4
  385. ; strcc r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4
  386. ; bcc %B1
  387. ;2
  388. ; ldr r1, =|Image$$ZI$$Limit| ; Top of zero init segment
  389. ; mov r2, #0
  390. ;3
  391. ; cmp r3, r1      ; Zero init
  392. ; strcc r2, [r3], #4
  393. ; bcc %B3
  394.     [ :LNOT:THUMBCODE
  395.   bl Main ;Do not use main() because ......
  396.   ;ldr pc, =Main ;
  397.   b .
  398.     ]
  399.     [ THUMBCODE  ;for start-up code for Thumb mode
  400.   orr lr,pc,#1
  401.   bx lr
  402.   CODE16
  403.   bl Main ;Do not use main() because ......
  404.   b .
  405. CODE32
  406.     ]
  407. ;function initializing stacks
  408. InitStacks
  409. ;Do not use DRAM,such as stmfd,ldmfd......
  410. ;SVCstack is initialized before
  411. ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
  412. mrs r0,cpsr
  413. bic r0,r0,#MODEMASK
  414. orr r1,r0,#UNDEFMODE|NOINT
  415. msr cpsr_cxsf,r1 ;UndefMode
  416. ldr sp,=UndefStack ; UndefStack=0x33FF_5C00
  417. orr r1,r0,#ABORTMODE|NOINT
  418. msr cpsr_cxsf,r1 ;AbortMode
  419. ldr sp,=AbortStack ; AbortStack=0x33FF_6000
  420. orr r1,r0,#IRQMODE|NOINT
  421. msr cpsr_cxsf,r1 ;IRQMode
  422. ldr sp,=IRQStack ; IRQStack=0x33FF_7000
  423. orr r1,r0,#FIQMODE|NOINT
  424. msr cpsr_cxsf,r1 ;FIQMode
  425. ldr sp,=FIQStack ; FIQStack=0x33FF_8000
  426. bic r0,r0,#MODEMASK|NOINT
  427. orr r1,r0,#SVCMODE
  428. msr cpsr_cxsf,r1 ;SVCMode
  429. ldr sp,=SVCStack ; SVCStack=0x33FF_5800
  430. ;USER mode has not be initialized.
  431. mov pc,lr
  432. ;The LR register will not be valid if the current mode is not SVC mode.
  433. ;===========================================================
  434. [ {TRUE}
  435. |
  436. ReadNandID
  437. mov      r7,#NFCONF
  438. ldr      r0,[r7,#4] ;NFChipEn();
  439. bic      r0,r0,#2
  440. str      r0,[r7,#4]
  441. mov      r0,#0x90 ;WrNFCmd(RdIDCMD);
  442. strb     r0,[r7,#8]
  443. mov      r4,#0 ;WrNFAddr(0);
  444. strb     r4,[r7,#0xc]
  445. 1 ;while(NFIsBusy());
  446. ldr      r0,[r7,#0x20]
  447. tst      r0,#1
  448. beq      %B1
  449. ldrb     r0,[r7,#0x10] ;id  = RdNFDat()<<8;
  450. mov      r0,r0,lsl #8
  451. ldrb     r1,[r7,#0x10] ;id |= RdNFDat();
  452. orr      r5,r1,r0
  453. ldr      r0,[r7,#4] ;NFChipDs();
  454. orr      r0,r0,#2
  455. str      r0,[r7,#4]
  456. mov  pc,lr
  457. ReadNandStatus
  458. mov  r7,#NFCONF
  459. ldr      r0,[r7,#4] ;NFChipEn();
  460. bic      r0,r0,#2
  461. str      r0,[r7,#4]
  462. mov      r0,#0x70 ;WrNFCmd(QUERYCMD);
  463. strb     r0,[r7,#8]
  464. ldrb     r1,[r7,#0x10] ;r1 = RdNFDat();
  465. ldr      r0,[r7,#4] ;NFChipDs();
  466. orr      r0,r0,#2
  467. str      r0,[r7,#4]
  468. mov  pc,lr
  469. WaitNandBusy
  470. mov      r0,#0x70 ;WrNFCmd(QUERYCMD);
  471. mov      r1,#NFCONF
  472. strb     r0,[r1,#8]
  473. 1 ;while(!(RdNFDat()&0x40));
  474. ldrb     r0,[r1,#0x10]
  475. tst      r0,#0x40
  476. beq  %B1
  477. mov      r0,#0 ;WrNFCmd(READCMD0);
  478. strb     r0,[r1,#8]
  479. mov      pc,lr
  480. CheckBadBlk
  481. mov r7, lr
  482. mov r5, #NFCONF
  483. bic      r0,r0,#0x1f ;addr &= ~0x1f;
  484. ldr      r1,[r5,#4] ;NFChipEn()
  485. bic      r1,r1,#2
  486. str      r1,[r5,#4]
  487. mov      r1,#0x50 ;WrNFCmd(READCMD2)
  488. strb     r1,[r5,#8]
  489. mov      r1, #5;6 ;6->5
  490. strb     r1,[r5,#0xc] ;WrNFAddr(5);(6) 6->5
  491. strb     r0,[r5,#0xc] ;WrNFAddr(addr)
  492. mov      r1,r0,lsr #8 ;WrNFAddr(addr>>8)
  493. strb     r1,[r5,#0xc]
  494. cmp      r6,#0 ;if(NandAddr)
  495. movne    r0,r0,lsr #16 ;WrNFAddr(addr>>16)
  496. strneb   r0,[r5,#0xc]
  497. ; bl WaitNandBusy ;WaitNFBusy()
  498. ;do not use WaitNandBusy, after WaitNandBusy will read part A!
  499. mov r0, #100
  500. 1
  501. subs r0, r0, #1
  502. bne %B1
  503. 2
  504. ldr r0, [r5, #0x20]
  505. tst r0, #1
  506. beq %B2
  507. ldrb r0, [r5,#0x10] ;RdNFDat()
  508. sub r0, r0, #0xff
  509. mov      r1,#0 ;WrNFCmd(READCMD0)
  510. strb     r1,[r5,#8]
  511. ldr      r1,[r5,#4] ;NFChipDs()
  512. orr      r1,r1,#2
  513. str      r1,[r5,#4]
  514. mov pc, r7
  515. ReadNandPage
  516. mov  r7,lr
  517. mov      r4,r1
  518. mov      r5,#NFCONF
  519. ldr      r1,[r5,#4] ;NFChipEn()
  520. bic      r1,r1,#2
  521. str      r1,[r5,#4]
  522. mov      r1,#0 ;WrNFCmd(READCMD0)
  523. strb     r1,[r5,#8]
  524. strb     r1,[r5,#0xc] ;WrNFAddr(0)
  525. strb     r0,[r5,#0xc] ;WrNFAddr(addr)
  526. mov      r1,r0,lsr #8 ;WrNFAddr(addr>>8)
  527. strb     r1,[r5,#0xc]
  528. cmp      r6,#0 ;if(NandAddr)
  529. movne    r0,r0,lsr #16 ;WrNFAddr(addr>>16)
  530. strneb   r0,[r5,#0xc]
  531. ldr      r0,[r5,#4] ;InitEcc()
  532. orr      r0,r0,#0x10
  533. str      r0,[r5,#4]
  534. bl       WaitNandBusy ;WaitNFBusy()
  535. mov      r0,#0 ;for(i=0; i<512; i++)
  536. 1
  537. ldrb     r1,[r5,#0x10] ;buf[i] = RdNFDat()
  538. strb     r1,[r4,r0]
  539. add      r0,r0,#1
  540. bic      r0,r0,#0x10000
  541. cmp      r0,#0x200
  542. bcc      %B1
  543. ldr      r0,[r5,#4] ;NFChipDs()
  544. orr      r0,r0,#2
  545. str      r0,[r5,#4]
  546. mov  pc,r7
  547. ]
  548. ;===========================================================
  549. LTORG
  550. ;GCS0->SST39VF1601
  551. ;GCS1->16c550
  552. ;GCS2->IDE
  553. ;GCS3->CS8900
  554. ;GCS4->DM9000
  555. ;GCS5->CF Card
  556. ;GCS6->SDRAM
  557. ;GCS7->unused
  558. SMRDATA DATA
  559. ; Memory configuration should be optimized for best performance
  560. ; The following parameter is not optimized.
  561. ; Memory access cycle parameter strategy
  562. ; 1) The memory settings is  safe parameters even at HCLK=75Mhz.
  563. ; 2) SDRAM refresh period is for HCLK<=75Mhz.
  564. DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
  565. DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0
  566. DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1
  567. DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2
  568. DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3
  569. DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4
  570. DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5
  571. DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
  572. DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7
  573. DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT)
  574. DCD 0x32     ;SCLK power saving mode, BANKSIZE 128M/128M
  575. DCD 0x30     ;MRSR6 CL=3clk
  576. DCD 0x30     ;MRSR7 CL=3clk
  577. BaseOfROM DCD |Image$$RO$$Base|
  578. TopOfROM DCD |Image$$RO$$Limit|
  579. BaseOfBSS DCD |Image$$RW$$Base|
  580. BaseOfZero DCD |Image$$ZI$$Base|
  581. EndOfBSS DCD |Image$$ZI$$Limit|
  582. ALIGN
  583. ;Function for entering power down mode
  584. ; 1. SDRAM should be in self-refresh mode.
  585. ; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.
  586. ; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.
  587. ; 4. The I-cache may have to be turned on.
  588. ; 5. The location of the following code may have not to be changed.
  589. ;void EnterPWDN(int CLKCON);
  590. EnterPWDN
  591. mov r2,r0 ;r2=rCLKCON
  592. tst r0,#0x8 ;SLEEP mode?
  593. bne ENTER_SLEEP
  594. ENTER_STOP
  595. ldr r0,=REFRESH
  596. ldr r3,[r0] ;r3=rREFRESH
  597. mov r1, r3
  598. orr r1, r1, #BIT_SELFREFRESH
  599. str r1, [r0] ;Enable SDRAM self-refresh
  600. mov r1,#16 ;wait until self-refresh is issued. may not be needed.
  601. 0 subs r1,r1,#1
  602. bne %B0
  603. ldr r0,=CLKCON ;enter STOP mode.
  604. str r2,[r0]
  605. mov r1,#32
  606. 0 subs r1,r1,#1 ;1) wait until the STOP mode is in effect.
  607. bne %B0 ;2) Or wait here until the CPU&Peripherals will be turned-off
  608. ;   Entering SLEEP mode, only the reset by wake-up is available.
  609. ldr r0,=REFRESH ;exit from SDRAM self refresh mode.
  610. str r3,[r0]
  611. MOV_PC_LR
  612. ENTER_SLEEP
  613. ;NOTE.
  614. ;1) rGSTATUS3 should have the return address after wake-up from SLEEP mode.
  615. ldr r0,=REFRESH
  616. ldr r1,[r0] ;r1=rREFRESH
  617. orr r1, r1, #BIT_SELFREFRESH
  618. str r1, [r0] ;Enable SDRAM self-refresh
  619. mov r1,#16 ;Wait until self-refresh is issued,which may not be needed.
  620. 0 subs r1,r1,#1
  621. bne %B0
  622. ldr r1,=MISCCR
  623. ldr r0,[r1]
  624. orr r0,r0,#(7<<17)  ;Set SCLK0=0, SCLK1=0, SCKE=0.
  625. str r0,[r1]
  626. ldr r0,=CLKCON ; Enter sleep mode
  627. str r2,[r0]
  628. b . ;CPU will die here.
  629. WAKEUP_SLEEP
  630. ;Release SCLKn after wake-up from the SLEEP mode.
  631. ldr r1,=MISCCR
  632. ldr r0,[r1]
  633. bic r0,r0,#(7<<17)  ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:0->=SCKE.
  634. str r0,[r1]
  635. ;Set memory control registers
  636.   ldr r0,=SMRDATA ;be careful! 
  637. ldr r1,=BWSCON ;BWSCON Address
  638. add r2, r0, #52 ;End address of SMRDATA
  639. 0
  640. ldr r3, [r0], #4
  641. str r3, [r1], #4
  642. cmp r2, r0
  643. bne %B0
  644. mov r1,#256
  645. 0 subs r1,r1,#1 ;1) wait until the SelfRefresh is released.
  646. bne %B0
  647. ldr r1,=GSTATUS3  ;GSTATUS3 has the start address just after SLEEP wake-up
  648. ldr r0,[r1]
  649. mov pc,r0
  650. ;=====================================================================
  651. ; Clock division test
  652. ; Assemble code, because VSYNC time is very short
  653. ;=====================================================================
  654. EXPORT CLKDIV124
  655. EXPORT CLKDIV144
  656. CLKDIV124
  657. ldr     r0, = CLKDIVN
  658. ldr     r1, = 0x3 ; 0x3 = 1:2:4
  659. str     r1, [r0]
  660. ; wait until clock is stable
  661. nop
  662. nop
  663. nop
  664. nop
  665. nop
  666. ldr     r0, = REFRESH
  667. ldr     r1, [r0]
  668. bic r1, r1, #0xff
  669. bic r1, r1, #(0x7<<8)
  670. orr r1, r1, #0x470 ; REFCNT135
  671. str     r1, [r0]
  672. nop
  673. nop
  674. nop
  675. nop
  676. nop
  677. mov     pc, lr
  678. CLKDIV144
  679. ldr     r0, = CLKDIVN
  680. ldr     r1, = 0x4 ; 0x4 = 1:4:4
  681. str     r1, [r0]
  682. ; wait until clock is stable
  683. nop
  684. nop
  685. nop
  686. nop
  687. nop
  688. ldr     r0, = REFRESH
  689. ldr     r1, [r0]
  690. bic r1, r1, #0xff
  691. bic r1, r1, #(0x7<<8)
  692. orr r1, r1, #0x630 ; REFCNT675 - 1520
  693. str     r1, [r0]
  694. nop
  695. nop
  696. nop
  697. nop
  698. nop
  699. mov     pc, lr
  700. ALIGN
  701. AREA RamData, DATA, READWRITE
  702. ^   _ISR_STARTADDRESS ; _ISR_STARTADDRESS=0x33FF_FF00
  703. HandleReset  #   4
  704. HandleUndef  #   4
  705. HandleSWI #   4
  706. HandlePabort    #   4
  707. HandleDabort    #   4
  708. HandleReserved  #   4
  709. HandleIRQ #   4
  710. HandleFIQ #   4
  711. ;Do not use the label 'IntVectorTable',
  712. ;The value of IntVectorTable is different with the address you think it may be.
  713. ;IntVectorTable
  714. ;@0x33FF_FF20
  715. HandleEINT0 #   4
  716. HandleEINT1 #   4
  717. HandleEINT2 #   4
  718. HandleEINT3 #   4
  719. HandleEINT4_7 #   4
  720. HandleEINT8_23 #   4
  721. HandleCAM #   4 ; Added for 2440.
  722. HandleBATFLT #   4
  723. HandleTICK #   4
  724. HandleWDT #   4
  725. HandleTIMER0  #   4
  726. HandleTIMER1  #   4
  727. HandleTIMER2  #   4
  728. HandleTIMER3  #   4
  729. HandleTIMER4  #   4
  730. HandleUART2   #   4
  731. ;@0x33FF_FF60
  732. HandleLCD  #   4
  733. HandleDMA0 #   4
  734. HandleDMA1 #   4
  735. HandleDMA2 #   4
  736. HandleDMA3 #   4
  737. HandleMMC #   4
  738. HandleSPI0 #   4
  739. HandleUART1 #   4
  740. HandleNFCON #   4 ; Added for 2440.
  741. HandleUSBD #   4
  742. HandleUSBH #   4
  743. HandleIIC #   4
  744. HandleUART0  #   4
  745. HandleSPI1  #   4
  746. HandleRTC  #   4
  747. HandleADC  #   4
  748. ;@0x33FF_FFA0
  749. END