idle man的学习空间

TQ2440启动代码分析(二)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;       When EINT0 is pressed,  Clear SDRAM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; check if EIN0 button is pressed

;这一段检测EINT0是否被按下,假如EINT0被按下,则清空SDRAM

       ldr     r0,=GPFCON

       ldr   r1,=0x0

       str    r1,[r0]

       ldr   r0,=GPFUP

       ldr   r1,=0xff

       str    r1,[r0]

;配置GPF

       ldr   r1,=GPFDAT

       ldr   r0,[r1]

       bic   r0,r0,#(0x1e<<1)  ; bit clear

       tst    r0,#0x1

       bne %F1

      

      

 

; Clear SDRAM Start

 

       ldr   r0,=GPFCON

       ldr   r1,=0x55aa

       str    r1,[r0]

;      ldr   r0,=GPFUP

;      ldr   r1,=0xff

;      str    r1,[r0]

       ldr   r0,=GPFDAT

       ldr   r1,=0x0

       str    r1,[r0]     ;LED=****

 

       mov r1,#0

       mov r2,#0

       mov r3,#0

       mov r4,#0

       mov r5,#0

       mov r6,#0

       mov r7,#0

       mov r8,#0

      

       ldr   r9,=0x4000000   ;64MB

       ldr   r0,=0x30000000

0    

       stmia       r0!,{r1-r8}

       subs r9,r9,#32

       bne  %B0

;以上这段清空SDRAM

;Clear SDRAM End

 

1

 

       ;Initialize stacks

       bl    InitStacks

 

;检测引脚OM[1:0],如果OM[1:0]!=0,选择从NOR Flash启动,如果OM[1:0]==0,则表示从nand flash启动

;===========================================================

       ldr   r0, =BWSCON 

       ldr   r0, [r0]

       ands r0, r0, #6        ;OM[1:0] != 0, NOR FLash boot

       bne  copy_proc_beg              ;do not read nand flash

       adr   r0, ResetEntry        ;OM[1:0] == 0, NAND FLash boot

       cmp r0, #0                           ;if use Multi-ice,

       bne  copy_proc_beg              ;do not read nand flash for boot

       ;nop

;===========================================================

nand_boot_beg

       [ {TRUE}

              bl RdNF2SDRAM

       ]

;nand flash启动,拷贝程序到steppingstone区域

       ldr   pc, =copy_proc_beg

;===========================================================

copy_proc_beg;

       adr   r0, ResetEntry

       ldr   r2, BaseOfROM

       cmp r0, r2

       ldreq       r0, TopOfROM

       beq  InitRam  

       ldr r3, TopOfROM

0    

       ldmia      r0!, {r4-r7}

       stmia       r2!, {r4-r7}

       cmp r2, r3

       bcc  %B0

      

       sub  r2, r2, r3

       sub  r0, r0, r2                     

             

InitRam  

       ldr   r2, BaseOfBSS

       ldr   r3, BaseOfZero     

0

       cmp r2, r3

       ldrcc       r1, [r0], #4

       strcc r1, [r2], #4

       bcc  %B0      

 

       mov r0,   #0

       ldr   r3,   EndOfBSS

1    

       cmp r2,   r3

       strcc r0, [r2], #4

       bcc  %B1

      

       ldr   pc, =%F2              ;goto compiler address

2

      

;      [ CLKDIV_VAL>1              ; means Fclk:Hclk is not 1:1.

;      bl    MMU_SetAsyncBusMode

;      |

;      bl MMU_SetFastBusMode     ; default value.

;      ]

      

 

;===========================================================

      ; Setup IRQ handler

       ldr   r0,=HandleIRQ      ;This routine is needed

       ldr   r1,=IsrIRQ     ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c

       str    r1,[r0]

 

    [ :LNOT:THUMBCODE

             bl    Main       ;Do not use main() because ......

             b     .

    ]

 

    [ THUMBCODE    ;for start-up code for Thumb mode

             orr   lr,pc,#1

             bx    lr

             CODE16

             bl    Main       ;Do not use main() because ......

             b     .

              CODE32

    ]

 

;堆栈初始化的顺序决定系统最后运行在哪种处理器模式,最后初始化哪种模式的堆栈,系

;统就运行在哪种模式。

;function initializing stacks

InitStacks

       ;Do not use DRAM,such as stmfd,ldmfd......

       ;SVCstack is initialized before

       ;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'

       mrs  r0,cpsr

       bic   r0,r0,#MODEMASK

       orr   r1,r0,#UNDEFMODE|NOINT

       msr  cpsr_cxsf,r1           ;UndefMode

       ldr   sp,=UndefStack             ; UndefStack=0x33FF_5C00

;先通过mrs 指令将状态寄存器值读取到r0,然后将r0 对应的处理器模式为修改成未定

;义指令中止模式,再写回状态寄存器使处理器真正切换到未定义指令中止模式,这就

;是“读出-修改-写回”的方式来修改状态寄存器的内容。最后将该模式的堆栈指针sp 指

; 向UndefStack 定义的地址,其他的模式操作方式也是一样

       orr   r1,r0,#ABORTMODE|NOINT

       msr  cpsr_cxsf,r1           ;AbortMode

       ldr   sp,=AbortStack             ; AbortStack=0x33FF_6000

 

       orr   r1,r0,#IRQMODE|NOINT

       msr  cpsr_cxsf,r1           ;IRQMode

       ldr   sp,=IRQStack        ; IRQStack=0x33FF_7000

 

       orr   r1,r0,#FIQMODE|NOINT

       msr  cpsr_cxsf,r1           ;FIQMode

       ldr   sp,=FIQStack         ; FIQStack=0x33FF_8000

 

       bic   r0,r0,#MODEMASK|NOINT

       orr   r1,r0,#SVCMODE

       msr  cpsr_cxsf,r1           ;SVCMode

       ldr   sp,=SVCStack        ; SVCStack=0x33FF_5800

 

       ;USER mode has not be initialized.

 

       mov pc,lr

       ;The LR register will not be valid if the current mode is not SVC mode.

      

       LTORG

 

这段程序的开始使用DATA 伪操作指明SMRDATA 标号处作为一段数据,而非代码。

接下来就用DCD 分配一个字的内存单元,一共13 个字数据。

SMRDATA DATA

; Memory configuration should be optimized for best performance

; The following parameter is not optimized.

; Memory access cycle parameter strategy

; 1) The memory settings is  safe parameters even at HCLK=75Mhz.

; 2) SDRAM refresh period is for HCLK<=75Mhz.

 

       DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))

       DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0

       DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1

       DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2

       DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3

       DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4

       DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5

       DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6

       DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7

       DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT)

 

       DCD 0x32          ;SCLK power saving mode, BANKSIZE 128M/128M

 

       DCD 0x30          ;MRSR6 CL=3clk

       DCD 0x30          ;MRSR7 CL=3clk

      

BaseOfROM   DCD       |Image$$RO$$Base|

TopOfROM    DCD       |Image$$RO$$Limit|

BaseOfBSS     DCD       |Image$$RW$$Base|

BaseOfZero    DCD       |Image$$ZI$$Base|

EndOfBSS     DCD       |Image$$ZI$$Limit|

 

       ALIGN

      

;Function for entering power down mode

; 1. SDRAM should be in self-refresh mode.

; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.

; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.

; 4. The I-cache may have to be turned on.

; 5. The location of the following code may have not to be changed.

 

;void EnterPWDN(int CLKCON);

EnterPWDN

       mov r2,r0              ;r2=rCLKCON

       tst r0,#0x8             ;SLEEP mode?

       bne ENTER_SLEEP

 

ENTER_STOP

       ldr r0,=REFRESH

       ldr r3,[r0]              ;r3=rREFRESH

       mov r1, r3

       orr r1, r1, #BIT_SELFREFRESH

       str r1, [r0]             ;Enable SDRAM self-refresh

 

       mov r1,#16                   ;wait until self-refresh is issued. may not be needed.

0     subs r1,r1,#1

       bne %B0

 

       ldr r0,=CLKCON          ;enter STOP mode.

       str r2,[r0]

 

       mov r1,#32

0     subs r1,r1,#1   ;1) wait until the STOP mode is in effect.

       bne %B0        ;2) Or wait here until the CPU&Peripherals will be turned-off

                     ;   Entering SLEEP mode, only the reset by wake-up is available.

 

       ldr r0,=REFRESH ;exit from SDRAM self refresh mode.

       str r3,[r0]

 

       MOV_PC_LR

 

ENTER_SLEEP

       ;NOTE.

       ;1) rGSTATUS3 should have the return address after wake-up from SLEEP mode.

 

       ldr r0,=REFRESH

       ldr r1,[r0]              ;r1=rREFRESH

       orr r1, r1, #BIT_SELFREFRESH

       str r1, [r0]             ;Enable SDRAM self-refresh

 

       mov r1,#16                   ;Wait until self-refresh is issued,which may not be needed.

0     subs r1,r1,#1

       bne %B0

 

       ldr   r1,=MISCCR

       ldr   r0,[r1]

       orr   r0,r0,#(7<<17)  ;Set SCLK0=0, SCLK1=0, SCKE=0.

       str    r0,[r1]

 

       ldr r0,=CLKCON          ; Enter sleep mode

       str r2,[r0]

 

       b .                 ;CPU will die here.

 

 WAKEUP_SLEEP;从睡眠状态醒过来

       ;Release SCLKn after wake-up from the SLEEP mode.

       ldr   r1,=MISCCR

       ldr   r0,[r1]

       bic   r0,r0,#(7<<17)  ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:0->=SCKE.

       str    r0,[r1]

 

       ;Set memory control registers

      ldr   r0,=SMRDATA      ;be careful!

       ldr   r1,=BWSCON       ;BWSCON Address

       add  r2, r0, #52      ;End address of SMRDATA

0

       ldr   r3, [r0], #4

       str    r3, [r1], #4

       cmp r2, r0

       bne  %B0

 

       mov r1,#256

0     subs r1,r1,#1   ;1) wait until the SelfRefresh is released.

       bne %B0

 

       ldr r1,=GSTATUS3       ;GSTATUS3 has the start address just after SLEEP wake-up

       ldr r0,[r1]

 

       mov pc,r0

      

;=====================================================================

; Clock division test

; Assemble code, because VSYNC time is very short

;=====================================================================

       EXPORT CLKDIV124

       EXPORT CLKDIV144

      

CLKDIV124

      

       ldr     r0, = CLKDIVN

       ldr     r1, = 0x3         ; 0x3 = 1:2:4

       str     r1, [r0]

;      wait until clock is stable

       nop

       nop

       nop

       nop

       nop

 

       ldr     r0, = REFRESH

       ldr     r1, [r0]

       bic          r1, r1, #0xff

       bic          r1, r1, #(0x7<<8)

       orr          r1, r1, #0x470 ; REFCNT135

       str     r1, [r0]

       nop

       nop

       nop

       nop

       nop

       mov     pc, lr

 

CLKDIV144

       ldr     r0, = CLKDIVN

       ldr     r1, = 0x4         ; 0x4 = 1:4:4

       str     r1, [r0]

;      wait until clock is stable

       nop

       nop

       nop

       nop

       nop

 

       ldr     r0, = REFRESH

       ldr     r1, [r0]

       bic          r1, r1, #0xff

       bic          r1, r1, #(0x7<<8)

       orr          r1, r1, #0x630 ; REFCNT675 - 1520

       str     r1, [r0]

       nop

       nop

       nop

       nop

       nop

       mov     pc, lr

 

       ALIGN;按照一定的规则对齐,^符号相当于伪指令MAP,用于定义一个结构化的内存表的首地址

 

       AREA RamData, DATA, READWRITE

;

       ^   _ISR_STARTADDRESS              ; _ISR_STARTADDRESS=0x33FF_FF00

HandleReset   #   4

HandleUndef #   4

HandleSWI            #   4

HandlePabort    #   4

HandleDabort    #   4

HandleReserved  #   4

HandleIRQ            #   4

HandleFIQ            #   4

 

;Do not use the label 'IntVectorTable',

;The value of IntVectorTable is different with the address you think it may be.

;IntVectorTable

;@0x33FF_FF20

HandleEINT0        #   4

HandleEINT1        #   4

HandleEINT2        #   4

HandleEINT3        #   4

HandleEINT4_7     #   4

HandleEINT8_23   #   4

HandleCAM          #   4            ; Added for 2440.

HandleBATFLT      #   4

HandleTICK          #   4

HandleWDT          #   4

HandleTIMER0     #   4

HandleTIMER1     #   4

HandleTIMER2     #   4

HandleTIMER3     #   4

HandleTIMER4     #   4

HandleUART2      #   4

;@0x33FF_FF60

HandleLCD           #   4

HandleDMA0        #   4

HandleDMA1        #   4

HandleDMA2        #   4

HandleDMA3        #   4

HandleMMC          #   4

HandleSPI0           #   4

HandleUART1              #   4

HandleNFCON             #   4            ; Added for 2440.

HandleUSBD         #   4

HandleUSBH         #   4

HandleIIC             #   4

HandleUART0       #   4

HandleSPI1          #   4

HandleRTC           #   4

HandleADC          #   4

;@0x33FF_FFA0

       END

posted on 2010-12-18 19:59  idle_man  阅读(1409)  评论(0编辑  收藏  举报

导航