2440init.s
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:19k
源码类别:

uCOS

开发平台:

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