找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3661|回复: 0
打印 上一主题 下一主题
收起左侧

辛苦找到的三星S3C2440A处理器正确的初始化文件-具备CPSR寄存器相关功能位开启

[复制链接]
跳转到指定楼层
楼主
ID:104126 发表于 2016-1-24 02:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  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. AREA    Init,CODE,READONLY
  74. ENTRY

  75. EXPORT __ENTRY
  76. __ENTRY
  77. ResetEntry
  78. ;1)The code, which converts to Big-endian, should be in little endian code.
  79. ;2)The following little endian code will be compiled in Big-Endian mode.
  80. ;  The code byte order should be changed as the memory bus width.
  81. ;3)The pseudo instruction,DCD can not be used here because the linker generates error.
  82. ASSERT :DEF:ENDIAN_CHANGE
  83. [ ENDIAN_CHANGE
  84.      ASSERT  :DEF:ENTRY_BUS_WIDTH
  85.      [ ENTRY_BUS_WIDTH=32
  86.   b ChangeBigEndian     ;DCD 0xea000007
  87.      ]
  88.      [ ENTRY_BUS_WIDTH=16
  89.   andeq r14,r7,r0,lsl #20   ;DCD 0x0007ea00
  90.      ]
  91.      [ ENTRY_BUS_WIDTH=8
  92.   streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea
  93.      ]
  94. |
  95.      b ResetHandler
  96.     ]
  97. b HandlerUndef ;handler for Undefined mode
  98. b HandlerSWI ;handler for SWI interrupt
  99. b HandlerPabort ;handler for PAbort
  100. b HandlerDabort ;handler for DAbort
  101. b .  ;reserved
  102. b HandlerIRQ ;handler for IRQ interrupt
  103. b HandlerFIQ ;handler for FIQ interrupt
  104. ;@0x20
  105. b EnterPWDN ; Must be @0x20.
  106. ChangeBigEndian
  107. ;@0x24
  108. [ ENTRY_BUS_WIDTH=32
  109.      DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0
  110.      DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80;  //Big-endian
  111.      DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0
  112. ]
  113. [ ENTRY_BUS_WIDTH=16
  114.      DCD 0x0f10ee11
  115.      DCD 0x0080e380
  116.      DCD 0x0f10ee01
  117. ]
  118. [ ENTRY_BUS_WIDTH=8
  119.      DCD 0x100f11ee
  120.      DCD 0x800080e3
  121.      DCD 0x100f01ee
  122.     ]
  123. DCD 0xffffffff  ;swinv 0xffffff is similar with NOP and run well in both endian mode.
  124. DCD 0xffffffff
  125. DCD 0xffffffff
  126. DCD 0xffffffff
  127. DCD 0xffffffff
  128. b ResetHandler

  129. HandlerFIQ      HANDLER HandleFIQ
  130. HandlerIRQ      HANDLER HandleIRQ
  131. HandlerUndef    HANDLER HandleUndef
  132. HandlerSWI      HANDLER HandleSWI
  133. HandlerDabort   HANDLER HandleDabort
  134. HandlerPabort   HANDLER HandlePabort
  135. IsrIRQ
  136. sub sp,sp,#4       ;reserved for PC
  137. stmfd sp!,{r8-r9}
  138. ldr r9,=INTOFFSET
  139. ldr r9,[r9]
  140. ldr r8,=HandleEINT0
  141. add r8,r8,r9,lsl #2
  142. ldr r8,[r8]
  143. str r8,[sp,#8]
  144. ldmfd sp!,{r8-r9,pc}

  145. LTORG
  146. ;=======
  147. ; ENTRY
  148. ;=======
  149. ResetHandler
  150. ldr r0,=WTCON       ;watch dog disable
  151. ldr r1,=0x0
  152. str r1,[r0]
  153. ldr r0,=INTMSK
  154. ldr r1,=0xffffffff  ;all interrupt disable
  155. str r1,[r0]
  156. ldr r0,=INTSUBMSK
  157. ldr r1,=0x7fff  ;all sub interrupt disable
  158. str r1,[r0]
  159. [ {TRUE}
  160. ;rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
  161. ; Led_Display
  162. ldr r0,=GPBCON
  163. ldr r1,=0x00555555
  164. str r1,[r0]
  165. ldr r0,=GPBDAT
  166. ldr r1,=0x07fe
  167. str r1,[r0]
  168. ]
  169. ;To reduce PLL lock time, adjust the LOCKTIME register.
  170. ldr r0,=LOCKTIME
  171. ldr r1,=0xffffff
  172. str r1,[r0]
  173.     [ PLL_ON_START
  174. ; Added for confirm clock divide. for 2440.
  175. ; Setting value Fclk:Hclk:Pclk
  176. ldr r0,=CLKDIVN
  177. 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.
  178. str r1,[r0]
  179. ; MMU_SetAsyncBusMode and MMU_SetFastBusMode over 4K, so do not call here
  180. ; call it after copy
  181. ; [ CLKDIV_VAL>1   ; means Fclk:Hclk is not 1:1.
  182. ; bl MMU_SetAsyncBusMode
  183. ; |
  184. ; bl MMU_SetFastBusMode ; default value.
  185. ; ]
  186. ;program has not been copied, so use these directly
  187. [ CLKDIV_VAL>1   ; means Fclk:Hclk is not 1:1.
  188. mrc p15,0,r0,c1,c0,0
  189. orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA
  190. mcr p15,0,r0,c1,c0,0
  191. |
  192. mrc p15,0,r0,c1,c0,0
  193. bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF
  194. mcr p15,0,r0,c1,c0,0
  195. ]

  196. ;Configure UPLL
  197. ldr r0,=UPLLCON
  198. ldr r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)
  199. str r1,[r0]
  200. nop ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
  201. nop
  202. nop
  203. nop
  204. nop
  205. nop
  206. nop
  207. ;Configure MPLL
  208. ldr r0,=MPLLCON
  209. ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=16.9344MHz
  210. str r1,[r0]
  211.     ]
  212. ;Check if the boot is caused by the wake-up from SLEEP mode.
  213. ldr r1,=GSTATUS2
  214. ldr r0,[r1]
  215. tst r0,#0x2
  216. ;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.
  217. bne WAKEUP_SLEEP
  218. EXPORT StartPointAfterSleepWakeUp
  219. StartPointAfterSleepWakeUp
  220. ;Set memory control registers
  221.   ;ldr r0,=SMRDATA
  222.   adrl r0, SMRDATA ;be careful!
  223. ldr r1,=BWSCON ;BWSCON Address
  224. add r2, r0, #52 ;End address of SMRDATA
  225. 0
  226. ldr r3, [r0], #4
  227. str r3, [r1], #4
  228. cmp r2, r0
  229. bne %B0
  230. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  231. ;;;;;;;;;;;;;       When EINT0 is pressed,  Clear SDRAM
  232. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  233. ; check if EIN0 button is pressed
  234.        ldr r0,=GPFCON
  235. ldr r1,=0x0
  236. str r1,[r0]
  237. ldr r0,=GPFUP
  238. ldr r1,=0xff
  239. str r1,[r0]
  240. ldr r1,=GPFDAT
  241. ldr r0,[r1]
  242.        bic r0,r0,#(0x1e<<1)  ; bit clear
  243. tst r0,#0x1
  244. bne %F1


  245. ; Clear SDRAM Start

  246. ldr r0,=GPFCON
  247. ldr r1,=0x55aa
  248. str r1,[r0]
  249. ; ldr r0,=GPFUP
  250. ; ldr r1,=0xff
  251. ; str r1,[r0]
  252. ldr r0,=GPFDAT
  253. ldr r1,=0x0
  254. str r1,[r0] ;LED=****
  255. mov r1,#0
  256. mov r2,#0
  257. mov r3,#0
  258. mov r4,#0
  259. mov r5,#0
  260. mov r6,#0
  261. mov r7,#0
  262. mov r8,#0

  263. ldr r9,=0x4000000   ;64MB
  264. ldr r0,=0x30000000
  265. 0
  266. stmia r0!,{r1-r8}
  267. subs r9,r9,#32
  268. bne %B0
  269. ;Clear SDRAM End
  270. 1
  271.    ;Initialize stacks
  272. bl InitStacks
  273. ;===========================================================

  274. ldr r0, =BWSCON
  275. ldr r0, [r0]
  276. ands r0, r0, #6  ;OM[1:0] != 0, NOR FLash boot
  277. bne copy_proc_beg  ;do not read nand flash
  278. adr r0, ResetEntry  ;OM[1:0] == 0, NAND FLash boot
  279. cmp r0, #0    ;if use Multi-ice,
  280. bne copy_proc_beg  ;do not read nand flash for boot
  281. ;nop
  282. ;===========================================================
  283. nand_boot_beg
  284. mov r5, #NFCONF
  285. ;set timing value
  286. ldr r0, =(7<<12)|(7<<8)|(7<<4)
  287. str r0, [r5]
  288. ;enable control
  289. ldr r0, =(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
  290. str r0, [r5, #4]

  291. bl ReadNandID
  292. mov r6, #0
  293. ldr r0, =0xec73
  294. cmp r5, r0
  295. beq %F1
  296. ldr r0, =0xec75
  297. cmp r5, r0
  298. beq %F1
  299. mov r6, #1
  300. 1
  301. bl ReadNandStatus

  302. mov r8, #0
  303. ldr r9, =ResetEntry
  304. 2
  305. ands r0, r8, #0x1f
  306. bne  %F3
  307. mov  r0, r8
  308. bl  CheckBadBlk
  309. cmp  r0, #0
  310. addne r8, r8, #32
  311. bne  %F4
  312. 3
  313. mov r0, r8
  314. mov r1, r9
  315. bl ReadNandPage
  316. add r9, r9, #512
  317. add r8, r8, #1
  318. 4
  319. cmp r8, #5120
  320. bcc %B2

  321. mov r5, #NFCONF   ;DsNandFlash
  322. ldr r0, [r5, #4]
  323. bic r0, r0, #1
  324. str r0, [r5, #4]
  325. ldr pc, =copy_proc_beg
  326. ;===========================================================
  327. copy_proc_beg
  328. adr r0, ResetEntry
  329. ldr r2, BaseOfROM
  330. cmp r0, r2
  331. ldreq r0, TopOfROM
  332. beq InitRam
  333. ldr r3, TopOfROM
  334. 0
  335. ldmia r0!, {r4-r7}
  336. stmia r2!, {r4-r7}
  337. cmp r2, r3
  338. bcc %B0

  339. sub r2, r2, r3
  340. sub r0, r0, r2   
  341.   
  342. InitRam
  343. ldr r2, BaseOfBSS
  344. ldr r3, BaseOfZero
  345. 0
  346. cmp r2, r3
  347. ldrcc r1, [r0], #4
  348. strcc r1, [r2], #4
  349. bcc %B0
  350. mov r0, #0
  351. ldr r3, EndOfBSS
  352. 1
  353. cmp r2, r3
  354. strcc r0, [r2], #4
  355. bcc %B1

  356. ldr pc, =%F2  ;goto compiler address
  357. 2

  358. ; [ CLKDIV_VAL>1   ; means Fclk:Hclk is not 1:1.
  359. ; bl MMU_SetAsyncBusMode
  360. ; |
  361. ; bl MMU_SetFastBusMode ; default value.
  362. ; ]

  363. ;bl Led_Test
  364. ;===========================================================
  365.    ; Setup IRQ handler
  366. ldr r0,=HandleIRQ       ;This routine is needed
  367. ldr r1,=IsrIRQ   ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c
  368. str r1,[r0]
  369. ; ;Copy and paste RW data/zero initialized data
  370. ; ldr r0, =|Image$RO$Limit| ; Get pointer to ROM data
  371. ; ldr r1, =|Image$RW$Base|  ; and RAM copy
  372. ; ldr r3, =|Image$ZI$Base|
  373. ;
  374. ; ;Zero init base => top of initialised data
  375. ; cmp r0, r1      ; Check that they are different
  376. ; beq %F2
  377. ;1
  378. ; cmp r1, r3      ; Copy init data
  379. ; ldrcc r2, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4
  380. ; strcc r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4
  381. ; bcc %B1
  382. ;2
  383. ; ldr r1, =|Image$ZI$Limit| ; Top of zero init segment
  384. ; mov r2, #0
  385. ;3
  386. ; cmp r3, r1      ; Zero init
  387. ; strcc r2, [r3], #4
  388. ; bcc %B3

  389.     [ :LNOT:THUMBCODE
  390.    bl Main ;Do not use main() because ......
  391.    ;ldr pc, =Main ;
  392.    b .
  393.     ]
  394.     [ THUMBCODE  ;for start-up code for Thumb mode
  395.    orr lr,pc,#1
  396.    bx lr
  397.    CODE16
  398.    bl Main ;Do not use main() because ......
  399.    b .
  400.   CODE32
  401.     ]

  402. ;function initializing stacks
  403. InitStacks
  404. ;Do not use DRAM,such as stmfd,ldmfd......
  405. ;SVCstack is initialized before
  406. ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
  407. mrs r0,cpsr
  408. bic r0,r0,#MODEMASK
  409. orr r1,r0,#UNDEFMODE|NOINT
  410. msr cpsr_cxsf,r1  ;UndefMode
  411. ldr sp,=UndefStack  ; UndefStack=0x33FF_5C00
  412. orr r1,r0,#ABORTMODE|NOINT
  413. msr cpsr_cxsf,r1  ;AbortMode
  414. ldr sp,=AbortStack  ; AbortStack=0x33FF_6000
  415. orr r1,r0,#IRQMODE|NOINT
  416. msr cpsr_cxsf,r1  ;IRQMode
  417. ldr sp,=IRQStack  ; IRQStack=0x33FF_7000
  418. orr r1,r0,#FIQMODE|NOINT
  419. msr cpsr_cxsf,r1  ;FIQMode
  420. ldr sp,=FIQStack  ; FIQStack=0x33FF_8000
  421. bic r0,r0,#MODEMASK|NOINT
  422. orr r1,r0,#SVCMODE
  423. msr cpsr_cxsf,r1  ;SVCMode
  424. ldr sp,=SVCStack  ; SVCStack=0x33FF_5800
  425. ;USER mode has not be initialized.
  426. mov pc,lr
  427. ;The LR register will not be valid if the current mode is not SVC mode.

  428. ;===========================================================
  429. ReadNandID
  430. mov      r7,#NFCONF
  431. ldr      r0,[r7,#4]  ;NFChipEn();
  432. bic      r0,r0,#2
  433. str      r0,[r7,#4]
  434. mov      r0,#0x90  ;WrNFCmd(RdIDCMD);
  435. strb     r0,[r7,#8]
  436. mov      r4,#0   ;WrNFAddr(0);
  437. strb     r4,[r7,#0xc]
  438. 1       ;while(NFIsBusy());
  439. ldr      r0,[r7,#0x20]
  440. tst      r0,#1
  441. beq      %B1
  442. ldrb     r0,[r7,#0x10] ;id  = RdNFDat()<<8;
  443. mov      r0,r0,lsl #8
  444. ldrb     r1,[r7,#0x10] ;id |= RdNFDat();
  445. orr      r5,r1,r0
  446. ldr      r0,[r7,#4]  ;NFChipDs();
  447. orr      r0,r0,#2
  448. str      r0,[r7,#4]
  449. mov   pc,lr

  450. ReadNandStatus
  451. mov   r7,#NFCONF
  452. ldr      r0,[r7,#4]  ;NFChipEn();
  453. bic      r0,r0,#2
  454. str      r0,[r7,#4]
  455. mov      r0,#0x70  ;WrNFCmd(QUERYCMD);
  456. strb     r0,[r7,#8]
  457. ldrb     r1,[r7,#0x10] ;r1 = RdNFDat();
  458. ldr      r0,[r7,#4]  ;NFChipDs();
  459. orr      r0,r0,#2
  460. str      r0,[r7,#4]
  461. mov   pc,lr
  462. WaitNandBusy
  463. mov      r0,#0x70  ;WrNFCmd(QUERYCMD);
  464. mov      r1,#NFCONF
  465. strb     r0,[r1,#8]
  466. 1       ;while(!(RdNFDat()&0x40));
  467. ldrb     r0,[r1,#0x10]
  468. tst      r0,#0x40
  469. beq   %B1
  470. mov      r0,#0   ;WrNFCmd(READCMD0);
  471. strb     r0,[r1,#8]
  472. mov      pc,lr
  473. CheckBadBlk
  474. mov  r7, lr
  475. mov  r5, #NFCONF

  476. bic      r0,r0,#0x1f ;addr &= ~0x1f;
  477. ldr      r1,[r5,#4]  ;NFChipEn()
  478. bic      r1,r1,#2
  479. str      r1,[r5,#4]
  480. mov      r1,#0x50  ;WrNFCmd(READCMD2)
  481. strb     r1,[r5,#8]
  482. mov      r1, #5;6  ;6->5
  483. strb     r1,[r5,#0xc] ;WrNFAddr(5);(6) 6->5
  484. strb     r0,[r5,#0xc] ;WrNFAddr(addr)
  485. mov      r1,r0,lsr #8 ;WrNFAddr(addr>>8)
  486. strb     r1,[r5,#0xc]
  487. cmp      r6,#0   ;if(NandAddr)  
  488. movne    r0,r0,lsr #16 ;WrNFAddr(addr>>16)
  489. strneb   r0,[r5,#0xc]

  490. ; bl  WaitNandBusy ;WaitNFBusy()
  491. ;do not use WaitNandBusy, after WaitNandBusy will read part A!
  492. mov r0, #100
  493. 1
  494. subs r0, r0, #1
  495. bne %B1
  496. 2
  497. ldr r0, [r5, #0x20]
  498. tst r0, #1
  499. beq %B2
  500. ldrb r0, [r5,#0x10] ;RdNFDat()
  501. sub  r0, r0, #0xff

  502. mov      r1,#0   ;WrNFCmd(READCMD0)
  503. strb     r1,[r5,#8]

  504. ldr      r1,[r5,#4]  ;NFChipDs()
  505. orr      r1,r1,#2
  506. str      r1,[r5,#4]

  507. mov  pc, r7

  508. ReadNandPage
  509. mov   r7,lr
  510. mov      r4,r1
  511. mov      r5,#NFCONF
  512. ldr      r1,[r5,#4]  ;NFChipEn()
  513. bic      r1,r1,#2
  514. str      r1,[r5,#4]
  515. mov      r1,#0   ;WrNFCmd(READCMD0)
  516. strb     r1,[r5,#8]
  517. strb     r1,[r5,#0xc] ;WrNFAddr(0)
  518. strb     r0,[r5,#0xc] ;WrNFAddr(addr)
  519. mov      r1,r0,lsr #8 ;WrNFAddr(addr>>8)
  520. strb     r1,[r5,#0xc]
  521. cmp      r6,#0   ;if(NandAddr)  
  522. movne    r0,r0,lsr #16 ;WrNFAddr(addr>>16)
  523. strneb   r0,[r5,#0xc]

  524. ldr      r0,[r5,#4]  ;InitEcc()
  525. orr      r0,r0,#0x10
  526. str      r0,[r5,#4]

  527. bl       WaitNandBusy ;WaitNFBusy()

  528. mov      r0,#0   ;for(i=0; i<512; i++)
  529. 1
  530. ldrb     r1,[r5,#0x10] ;buf[i] = RdNFDat()
  531. strb     r1,[r4,r0]
  532. add      r0,r0,#1
  533. bic      r0,r0,#0x10000
  534. cmp      r0,#0x200
  535. bcc      %B1

  536. ldr      r0,[r5,#4]  ;NFChipDs()
  537. orr      r0,r0,#2
  538. str      r0,[r5,#4]
  539.   
  540. mov   pc,r7

  541. ;===========================================================
  542. LTORG
  543. ;GCS0->SST39VF1601
  544. ;GCS1->16c550
  545. ;GCS2->IDE
  546. ;GCS3->CS8900
  547. ;GCS4->DM9000
  548. ;GCS5->CF Card
  549. ;GCS6->SDRAM
  550. ;GCS7->unused
  551. SMRDATA DATA
  552. ; Memory configuration should be optimized for best performance
  553. ; The following parameter is not optimized.
  554. ; Memory access cycle parameter strategy
  555. ; 1) The memory settings is  safe parameters even at HCLK=75Mhz.
  556. ; 2) SDRAM refresh period is for HCLK<=75Mhz.
  557. DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
  558. DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0
  559. DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1
  560. DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2
  561. DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3
  562. DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4
  563. DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5
  564. DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
  565. DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7
  566. DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT)
  567. DCD 0x32     ;SCLK power saving mode, BANKSIZE 128M/128M
  568. DCD 0x30     ;MRSR6 CL=3clk
  569. DCD 0x30     ;MRSR7 CL=3clk

  570. BaseOfROM DCD |Image$RO$Base|
  571. TopOfROM DCD |Image$RO$Limit|
  572. BaseOfBSS DCD |Image$RW$Base|
  573. BaseOfZero DCD |Image$ZI$Base|
  574. EndOfBSS DCD |Image$ZI$Limit|
  575. ALIGN

  576. ;Function for entering power down mode
  577. ; 1. SDRAM should be in self-refresh mode.
  578. ; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.
  579. ; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.
  580. ; 4. The I-cache may have to be turned on.
  581. ; 5. The location of the following code may have not to be changed.
  582. ;void EnterPWDN(int CLKCON);
  583. EnterPWDN
  584. mov r2,r0  ;r2=rCLKCON
  585. tst r0,#0x8  ;SLEEP mode?
  586. bne ENTER_SLEEP
  587. ENTER_STOP
  588. ldr r0,=REFRESH
  589. ldr r3,[r0]  ;r3=rREFRESH
  590. mov r1, r3
  591. orr r1, r1, #BIT_SELFREFRESH
  592. str r1, [r0]  ;Enable SDRAM self-refresh
  593. mov r1,#16   ;wait until self-refresh is issued. may not be needed.
  594. 0 subs r1,r1,#1
  595. bne %B0
  596. ldr r0,=CLKCON  ;enter STOP mode.
  597. str r2,[r0]
  598. mov r1,#32
  599. 0 subs r1,r1,#1 ;1) wait until the STOP mode is in effect.
  600. bne %B0  ;2) Or wait here until the CPU&Peripherals will be turned-off
  601.    ;   Entering SLEEP mode, only the reset by wake-up is available.
  602. ldr r0,=REFRESH ;exit from SDRAM self refresh mode.
  603. str r3,[r0]
  604. MOV_PC_LR
  605. ENTER_SLEEP
  606. ;NOTE.
  607. ;1) rGSTATUS3 should have the return address after wake-up from SLEEP mode.
  608. ldr r0,=REFRESH
  609. ldr r1,[r0]  ;r1=rREFRESH
  610. orr r1, r1, #BIT_SELFREFRESH
  611. str r1, [r0]  ;Enable SDRAM self-refresh
  612. mov r1,#16   ;Wait until self-refresh is issued,which may not be needed.
  613. 0 subs r1,r1,#1
  614. bne %B0
  615. ldr r1,=MISCCR
  616. ldr r0,[r1]
  617. orr r0,r0,#(7<<17)  ;Set SCLK0=0, SCLK1=0, SCKE=0.
  618. str r0,[r1]
  619. ldr r0,=CLKCON  ; Enter sleep mode
  620. str r2,[r0]
  621. b .   ;CPU will die here.

  622. WAKEUP_SLEEP
  623. ;Release SCLKn after wake-up from the SLEEP mode.
  624. ldr r1,=MISCCR
  625. ldr r0,[r1]
  626. bic r0,r0,#(7<<17)  ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:0->=SCKE.
  627. str r0,[r1]
  628. ;Set memory control registers
  629.   ldr r0,=SMRDATA ;be careful!
  630. ldr r1,=BWSCON ;BWSCON Address
  631. add r2, r0, #52 ;End address of SMRDATA
  632. 0
  633. ldr r3, [r0], #4
  634. str r3, [r1], #4
  635. cmp r2, r0
  636. bne %B0
  637. mov r1,#256
  638. 0 subs r1,r1,#1 ;1) wait until the SelfRefresh is released.
  639. bne %B0
  640. ldr r1,=GSTATUS3  ;GSTATUS3 has the start address just after SLEEP wake-up
  641. ldr r0,[r1]
  642. mov pc,r0

  643. ;=====================================================================
  644. ; Clock division test
  645. ; Assemble code, because VSYNC time is very short
  646. ;=====================================================================
  647. EXPORT CLKDIV124
  648. EXPORT CLKDIV144

  649. CLKDIV124

  650. ldr     r0, = CLKDIVN
  651. ldr     r1, = 0x3  ; 0x3 = 1:2:4
  652. str     r1, [r0]
  653. ; wait until clock is stable
  654. nop
  655. nop
  656. nop
  657. nop
  658. nop
  659. ldr     r0, = REFRESH
  660. ldr     r1, [r0]
  661. bic  r1, r1, #0xff
  662. bic  r1, r1, #(0x7<<8)
  663. orr  r1, r1, #0x470 ; REFCNT135
  664. str     r1, [r0]
  665. nop
  666. nop
  667. nop
  668. nop
  669. nop
  670. mov     pc, lr
  671. CLKDIV144
  672. ldr     r0, = CLKDIVN
  673. ldr     r1, = 0x4  ; 0x4 = 1:4:4
  674. str     r1, [r0]
  675. ; wait until clock is stable
  676. nop
  677. nop
  678. nop
  679. nop
  680. nop
  681. ldr     r0, = REFRESH
  682. ldr     r1, [r0]
  683. bic  r1, r1, #0xff
  684. bic  r1, r1, #(0x7<<8)
  685. orr  r1, r1, #0x630 ; REFCNT675 - 1520
  686. str     r1, [r0]
  687. nop
  688. nop
  689. nop
  690. nop
  691. nop
  692. mov     pc, lr

  693. ALIGN
  694. AREA RamData, DATA, READWRITE
  695. ^   _ISR_STARTADDRESS  ; _ISR_STARTADDRESS=0x33FF_FF00
  696. HandleReset  #   4
  697. HandleUndef  #   4
  698. HandleSWI  #   4
  699. HandlePabort    #   4
  700. HandleDabort    #   4
  701. HandleReserved  #   4
  702. HandleIRQ  #   4
  703. HandleFIQ  #   4
  704. ;Do not use the label 'IntVectorTable',
  705. ;The value of IntVectorTable is different with the address you think it may be.
  706. ;IntVectorTable
  707. ;@0x33FF_FF20
  708. HandleEINT0  #   4
  709. HandleEINT1  #   4
  710. HandleEINT2  #   4
  711. HandleEINT3  #   4
  712. HandleEINT4_7 #   4
  713. HandleEINT8_23 #   4
  714. HandleCAM  #   4  ; Added for 2440.
  715. HandleBATFLT #   4
  716. HandleTICK  #   4
  717. HandleWDT  #   4
  718. HandleTIMER0  #   4
  719. HandleTIMER1  #   4
  720. HandleTIMER2  #   4
  721. HandleTIMER3  #   4
  722. HandleTIMER4  #   4
  723. HandleUART2   #   4
  724. ;@0x33FF_FF60
  725. HandleLCD   #   4
  726. HandleDMA0  #   4
  727. HandleDMA1  #   4
  728. HandleDMA2  #   4
  729. HandleDMA3  #   4
  730. HandleMMC  #   4
  731. HandleSPI0  #   4
  732. HandleUART1  #   4
  733. HandleNFCON  #   4  ; Added for 2440.
  734. HandleUSBD  #   4
  735. HandleUSBH  #   4
  736. HandleIIC  #   4
  737. HandleUART0  #   4
  738. HandleSPI1   #   4
  739. HandleRTC   #   4
  740. HandleADC   #   4
  741. ;@0x33FF_FFA0
  742. END
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表