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

Windows CE

开发平台:

Windows_Unix

  1. ;
  2. ; Copyright (c) Microsoft Corporation.  All rights reserved.
  3. ;
  4. ;
  5. ; Use of this source code is subject to the terms of the Microsoft end-user
  6. ; license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  7. ; If you did not accept the terms of the EULA, you are not authorized to use
  8. ; this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  9. ; install media.
  10. ;
  11. ;                                                                     
  12. ; Module Name: 2440init.s                                           
  13. ; Start up code for NAND bootloader. 
  14. ;
  15. ;      
  16. ;=========================================
  17. ; NAME: 2440INIT.S
  18. ; DESC: C start up codes
  19. ;       Configure memory, ISR ,stacks
  20. ;   Initialize C-variables
  21. ; HISTORY:
  22. ; 2002.02.25:kwtark: ver 0.0
  23. ; 2002.03.20:purnnamu: Add some functions for testing STOP,POWER_OFF mode
  24. ;=========================================
  25.     INCLUDE option.inc
  26.     INCLUDE memcfg.inc
  27.     INCLUDE 2440addr.inc
  28.     IMPORT  Port_Init
  29.     GBLL    NOT_MIN_CODE
  30. NOT_MIN_CODE SETL  {FALSE}
  31. BIT_SELFREFRESH EQU (1<<22)
  32. ;Pre-defined constants
  33. USERMODE    EQU     0x10
  34. FIQMODE     EQU     0x11
  35. IRQMODE     EQU     0x12
  36. SVCMODE     EQU     0x13
  37. ABORTMODE   EQU     0x17
  38. UNDEFMODE   EQU     0x1b
  39. MODEMASK    EQU     0x1f
  40. NOINT       EQU     0xc0
  41. SDRAM_CLEAR EQU     0x0
  42. SDRAM_TEST  EQU     0x12345678
  43. DELAY       EQU     0x200
  44. ;The location of stacks
  45. UserStack   EQU (_STACK_BASEADDRESS-0x3800) ;0x31ff4800 ~ 
  46. SVCStack    EQU (_STACK_BASEADDRESS-0x2800) ;0x31ff5800 ~ // 256 byte stack
  47. UndefStack  EQU (_STACK_BASEADDRESS-0x2400) ;0x31ff5c00 ~
  48. AbortStack  EQU (_STACK_BASEADDRESS-0x2000) ;0x31ff6000 ~
  49. IRQStack    EQU (_STACK_BASEADDRESS-0x1000) ;0x31ff7000 ~
  50. FIQStack    EQU (_STACK_BASEADDRESS-0x0)    ;0x31ff8000 ~ 
  51. _FCLK   EQU (406)
  52. R1_iA   EQU (1<<31)
  53. R1_nF   EQU (1<<30)
  54. ; :::::::::::::::::::::::::::::::::::::::::::::
  55. ;           BEGIN: Power Management 
  56. ; - - - - - - - - - - - - - - - - - - - - - - -
  57. Mode_USR            EQU     0x10
  58. Mode_FIQ            EQU     0x11
  59. Mode_IRQ            EQU     0x12
  60. Mode_SVC            EQU     0x13
  61. Mode_ABT            EQU     0x17
  62. Mode_UND            EQU     0x1B
  63. Mode_SYS            EQU     0x1F
  64. I_Bit               EQU     0x80
  65. F_Bit               EQU     0x40
  66. ; - - - - - - - - - - - - - - - - - - - - - - -
  67. ;           END: Power Management 
  68. ; :::::::::::::::::::::::::::::::::::::::::::::
  69. ;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
  70.     GBLL    THUMBCODE
  71.     [ {CONFIG} = 16 
  72. THUMBCODE SETL  {TRUE}
  73.         CODE32
  74.         |   
  75. THUMBCODE SETL  {FALSE}
  76.         ]
  77.         MACRO
  78.     MOV_PC_LR
  79.         [ THUMBCODE
  80.             bx lr
  81.         |
  82.             mov pc,lr
  83.         ]
  84.     MEND
  85.         MACRO
  86.     MOVEQ_PC_LR
  87.         [ THUMBCODE
  88.             bxeq lr
  89.         |
  90.             moveq pc,lr
  91.         ]
  92.     MEND
  93.         MACRO
  94. $HandlerLabel HANDLER $HandleLabel
  95. $HandlerLabel
  96.     sub sp,sp,#4        ;decrement sp(to store jump address)
  97.     stmfd   sp!,{r0}        ;PUSH the work register to stack(lr does't push because it return to original address)
  98.     ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
  99.     ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX
  100.     str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
  101.     ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
  102.     MEND
  103.     
  104. ;---------------------------------------------------------------------------
  105. ; 4 LED light function
  106. ; The LEDs are located below AMD Flash ROM
  107. MACRO
  108. LED_ON $data
  109. LDR     r10, =0x56000054        
  110. LDR     r11, =$data
  111. MOV     r11, r11, lsl #4
  112.    STR     r11, [r10]
  113.     MEND
  114. ;---------------------------------------------------------------------------
  115.     IMPORT  |Image$$RO$$Limit|  ; End of ROM code (=start of ROM data)
  116.     IMPORT  |Image$$RW$$Base|   ; Base of RAM to initialise
  117.     IMPORT  |Image$$ZI$$Base|   ; Base and limit of area
  118.     IMPORT  |Image$$ZI$$Limit|  ; to zero initialise
  119.     
  120.     IMPORT  Main    ; The main entry of mon program
  121.     AREA    Init,CODE,READONLY
  122.     ENTRY 
  123.     ;1)The code, which converts to Big-endian, should be in little endian code.
  124.     ;2)The following little endian code will be compiled in Big-Endian mode. 
  125.     ;  The code byte order should be changed as the memory bus width.
  126.     ;3)The pseudo instruction,DCD can't be used here because the linker generates error.
  127.     ASSERT  :DEF:ENDIAN_CHANGE
  128.     
  129.     b   ResetHandler    ; 0x00 Reset
  130.     b   .               ; 0x04 Undefined
  131.     b   .               ; 0x08 Supervisor
  132.     b   .               ; 0x0c Prefetch Abort
  133.     b   .               ; 0x10 Data Abort
  134.     b   .               ; 0x14 Reserved
  135.     b   .               ; 0x18 IRQ
  136.     b   .               ; 0x1c FIQ
  137. PowerHandler
  138. str     r1, [r0] ; Enable SDRAM self-refresh
  139. str r3, [r2] ; MISCCR Setting
  140. str     r5, [r4] ; Power Off !!
  141. b       .
  142.     
  143.     LTORG   
  144.     
  145. ;=======
  146. ; ENTRY  
  147. ;=======
  148. ResetHandler
  149. ldr     r0, = GPFCON
  150. ldr     r1, = 0x55aa      
  151. str     r1, [r0]
  152.     ldr r0,=WTCON       ;watch dog disable 
  153.     ldr r1,=0x0         
  154.     str r1,[r0]
  155.     ldr r0,=INTMSK
  156.     ldr r1,=0xffffffff  ;all interrupt disable
  157.     str r1,[r0]
  158.     ldr r0,=INTSUBMSK
  159.     ldr r1,=0x7ff       ;all sub interrupt disable
  160.     str r1,[r0]
  161.     ldr     r0, = INTMOD
  162.     mov r1, #0x0        ; set all interrupt as IRQ (not FIQ)
  163.     str     r1, [r0]
  164.     ; configure GPIO pins
  165.     bl  Port_Init
  166.     ; CLKDIVN
  167.     ldr r0,=CLKDIVN
  168.     ldr r1,=0x7     ; 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
  169.     str r1,[r0]
  170.     ; delay
  171.     mov     r0, #DELAY
  172. 5   subs    r0, r0, #1
  173.     bne     %B5
  174.     ; MMU_SetAsyncBusMode FCLK:HCLK= 1:2
  175.     ands r1, r1, #0x2
  176.     beq %F1
  177.     mrc p15,0,r0,c1,c0,0
  178.     orr r0,r0,#R1_nF:OR:R1_iA
  179.     mcr p15,0,r0,c1,c0,0
  180. 1
  181.     ;To reduce PLL lock time, adjust the LOCKTIME register. 
  182.     ldr r0,=LOCKTIME
  183.     ldr r1,=0xffffff
  184.     str r1,[r0]
  185.     ; delay
  186.     mov     r0, #DELAY
  187. 5   subs    r0, r0, #1
  188.     bne     %B5
  189.     ;Configure MPLL
  190.     ldr r0,=MPLLCON          
  191. ;    ldr r1,=((110<<12)+(3<<4)+1)  ;Fin=16MHz,Fout=399MHz
  192.     ldr r1,=((0x7f<<12)+(0x2<<4)+0x1)  ;Fin=12MHz,Fout=405MHz
  193.     str r1,[r0]
  194.     ; delay
  195.     mov     r0, #DELAY
  196. 5   subs    r0, r0, #1
  197.     bne     %B5
  198.     ;Configure UPLL
  199.     ldr     r0, =UPLLCON          
  200. ;   ldr     r1, =((60<<12)+(4<<4)+2)  ;Fin=16MHz, Fout=48MHz
  201.     ldr     r1, =((0x48<<12)+(0x3<<4)+0x2)  ;Fin=12MHz, Fout=48MHz
  202.     str     r1, [r0]
  203.     ; delay
  204.     mov     r0, #0x200
  205. 5   subs    r0, r0, #1
  206.     bne     %B5
  207. ; :::::::::::::::::::::::::::::::::::::::::::::
  208. ;           BEGIN: Power Management 
  209. ; - - - - - - - - - - - - - - - - - - - - - - -
  210. ldr r1, =GSTATUS2           ; Determine Booting Mode
  211. ldr r10, [r1]
  212. tst r10, #0x2
  213. beq %F2                     ; if not wakeup from PowerOffmode Skip
  214.                                 ;    MISCCR setting
  215. LED_ON 0xc
  216. str r10, [r1] ; Clear Test
  217. ; B .
  218. ldr  r1, =MISCCR         ; MISCCR's Bit 17, 18, 19 -> 0
  219. ldr r0, [r1]                ; I don't know why, Just fallow Sample Code.
  220. bic r0, r0, #(3 << 17)      ; SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->H
  221. str r0, [r1]
  222. ; Set memory control registers
  223. add r0, pc, #SMRDATA - (. + 8)
  224. ldr r1, =BWSCON ; BWSCON Address
  225. add r2, r0, #52 ; End address of SMRDATA
  226. loop10
  227. ldr r3, [r0], #4
  228. str r3, [r1], #4
  229. cmp r2, r0
  230. bne loop10
  231. mov r1, #256
  232. loop11
  233. subs r1, r1, #1 ; wait until the SelfRefresh is released.
  234. bne loop11
  235. ldr r2, =0x201000 ; offset into the RAM 
  236. add r2, r2, #0x30000000 ; add physical base
  237. mov     pc, r2 ;  & jump to StartUp address
  238. nop
  239. nop
  240. nop
  241. b .
  242. b %F3 ; if wakeup from PowerOff mode
  243. ;  goto Power-up code.
  244. ; Watchdog reset
  245. 2
  246. tst r10, #0x4 ; In case of the wake-up from Watchdog reset, 
  247. ;  go to SDRAM start address(0x3000_0000)
  248. b %F4 ; If not wakeup from Watchdog reset,
  249. ; beq %F4 ; If not wakeup from Watchdog reset,
  250. ;  goto Normal Mode.
  251. mov r0, #4
  252. str r0, [r1] ; Clear the GSTATUS2. Because same code is located in memory address.
  253. ; Set memory control registers
  254. ldr r0, =SMRDATA
  255. ldr r1, =BWSCON ; BWSCON Address
  256. add r2, r0, #52 ; End address of SMRDATA
  257. loop0
  258. ldr r3, [r0], #4
  259. str r3, [r1], #4
  260. cmp r2, r0
  261. bne loop0
  262. mov r1, #256
  263. loop1
  264. subs r1, r1, #1 ; wait until the SelfRefresh is released.
  265. bne loop1
  266. ldr r2, =0x201000 ; offset into the RAM 
  267. add r2, r2, #0x30000000 ; add physical base
  268. mov     pc, r2 ;  & jump to StartUp address
  269. b .
  270. ; Case of Power off reset
  271. 3
  272. ldr  r1, =MISCCR         ; MISCCR's Bit 17, 18, 19 -> 0
  273. ldr r0, [r1]                ; I don't know why, Just fallow Sample Code.
  274. bic r0, r0, #(3 << 17)      ; SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->H
  275. str r0, [r1]
  276. ; - - - - - - - - - - - - - - - - - - - - - - -
  277. ;           END: Power Management 
  278. ; :::::::::::::::::::::::::::::::::::::::::::::
  279. 4
  280.     ; Configure memory controller
  281.     ;ldr    r0,=SMRDATA
  282.     add     r0, pc, #SMRDATA - (. + 8)
  283.     ldr r1,=BWSCON  ;BWSCON Address
  284.     add r2, r0, #52 ;End address of SMRDATA
  285. 0       
  286.     ldr r3, [r0], #4    
  287.     str r3, [r1], #4    
  288.     cmp r2, r0      
  289.     bne %B0
  290. BringUpWinCE    
  291.     ;Normal Boot: Clear SDRAM
  292.     ldr r1,=SDRAM_CLEAR
  293.     ldr r2,=SDRAM_CLEAR
  294.     ldr r3,=SDRAM_CLEAR
  295.     ldr r4,=SDRAM_CLEAR
  296.     ldr r5,=SDRAM_CLEAR
  297.     ldr r6,=SDRAM_CLEAR
  298.     ldr r7,=SDRAM_CLEAR
  299.     ldr r8,=SDRAM_CLEAR
  300. 1   
  301.     ldr r9,=SDRAM_SIZE
  302.     ldr r0,=SDRAM_BASE
  303. 0   
  304.     stmia   r0!,{r1-r8}
  305.     subs    r9,r9,#32 
  306.     bne %B0
  307.     ; Initialize stacks
  308.     ldr sp,=SVCStack            ; r13 = 0x33ff5800
  309.     
  310.     ;Copy and paste RW data/zero initialized data
  311.     ldr r0, =|Image$$RO$$Limit| ; r0 = pointer to ROM data (0x000009bc)
  312.     ldr r1, =|Image$$RW$$Base|  ; r1 = RAM copy (0x31ff0000)
  313.     ldr r3, =|Image$$ZI$$Base|  ; r3 = globals (0x31ff0004)
  314.     
  315.     ;Zero init base => top of initialised data
  316.     cmp r0, r1      ; Check that they are different
  317.     beq %F2
  318. 1       
  319.     cmp r1, r3      ; Copy init data
  320.     ldrcc   r2, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4         
  321.     strcc   r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4
  322.     bcc %B1
  323. 2       
  324.     ldr r1, =|Image$$ZI$$Limit| ; Top of zero init segment
  325.     mov r2, #0
  326. 3       
  327.     cmp r3, r1      ; Zero init
  328.     strcc   r2, [r3], #4
  329.     bcc %B3
  330.     b   Main
  331.     LTORG
  332. SMRDATA DATA
  333. ; Memory configuration should be optimized for best performance 
  334. ; The following parameter is not optimized.                     
  335. ; Memory access cycle parameter strategy
  336. ; 1) The memory settings is  safe parameters even at HCLK=75Mhz.
  337. ; 2) SDRAM refresh period is for HCLK=75Mhz. 
  338.         DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
  339.         DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0
  340.         DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1 
  341.         DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2
  342.         DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3
  343.         DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4
  344.         DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5
  345.         DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
  346.         DCD ((B7_MT<<15)+(B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
  347.         DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
  348.         
  349.         DCD 0x32            ;SCLK power saving mode, BANKSIZE 128M/128M
  350.         DCD 0x30            ;MRSR6 CL=3clk
  351.         DCD 0x30            ;MRSR7
  352.         ALIGN
  353.         AREA RamData, DATA, READWRITE
  354.         ^   _ISR_STARTADDRESS
  355. HandleReset     #   4 
  356. HandleUndef     #   4
  357. HandleSWI       #   4
  358. HandlePabort    #   4
  359. HandleDabort    #   4
  360. HandleReserved  #   4
  361. HandleIRQ       #   4
  362. HandleFIQ       #   4
  363. ;Don't use the label 'IntVectorTable',
  364. ;The value of IntVectorTable is different with the address you think it may be.
  365. ;IntVectorTable
  366. HandleEINT0     #   4
  367. HandleEINT1     #   4
  368. HandleEINT2     #   4
  369. HandleEINT3     #   4
  370. HandleEINT4_7   #   4
  371. HandleEINT8_23  #   4
  372. HandleRSV6      #   4
  373. HandleBATFLT    #   4
  374. HandleTICK      #   4
  375. HandleWDT       #   4
  376. HandleTIMER0    #   4
  377. HandleTIMER1    #   4
  378. HandleTIMER2    #   4
  379. HandleTIMER3    #   4
  380. HandleTIMER4    #   4
  381. HandleUART2     #   4
  382. HandleLCD       #   4
  383. HandleDMA0      #   4
  384. HandleDMA1      #   4
  385. HandleDMA2      #   4
  386. HandleDMA3      #   4
  387. HandleMMC       #   4
  388. HandleSPI0      #   4
  389. HandleUART1     #   4
  390. HandleRSV24     #   4
  391. HandleUSBD      #   4
  392. HandleUSBH      #   4
  393. HandleIIC       #   4
  394. HandleUART0     #   4
  395. HandleSPI1      #   4
  396. HandleRTC       #   4
  397. HandleADC       #   4
  398.         END