⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 startup.s

📁 6410BSP3
💻 S
📖 第 1 页 / 共 3 页
字号:
        bic        r2, r2, r0
        str        r2, [r3], #4                ; [SleepState_MMUTTB0]

        ;---------------------------------
        ; CP15 Translation Table Base Register1

        mrc        p15, 0, r2, c2, c0, 1        ; load r2 with TTB Register1
        str        r2, [r3], #4                ; [SleepState_MMUTTB1]

        ;---------------------------------------
        ; CP15 Translation Table Base Control Register

        mrc         p15, 0, r2, c2, c0, 2        ; load r2 with TTB Control Register
        str        r2, [r3], #4                ; [SleepState_MMUTTBCTL]

        ;---------------------------------
        ; CP15 Domain Access Control Register

        mrc        p15, 0, r2, c3, c0, 0        ; load r2 with Domain Access Control Register
        str        r2, [r3], #4                ; [SleepState_MMUDOMAIN]

;-----------------------------------------------
;    3. Save CPU Register into Sleep Data Area in DRAM
;-----------------------------------------------

        ;---------------------------
        ; Supervisor mode CPU Register

        str        sp, [r3], #4                ; [SleepState_SVC_SP]

        mrs        r2, spsr                    ; Status Register
        str        r2, [r3], #4                ; [SleepState_SVC_SPSR]

        ;----------------------
        ; FIQ mode CPU Registers

        mov        r1, #Mode_FIQ | NOINT        ; Enter FIQ mode, no interrupts
        msr        cpsr, r1
        mrs        r2, spsr                    ; Status Register
        stmia    r3!, {r2, r8-r12, sp, lr}        ; Store FIQ mode registers [SleepState_FIQ_SPSR~SleepState_FIQ_LR]

        ;----------------------
        ; Abort mode CPU Registers

        mov        r1, #Mode_ABT | NOINT    ; Enter ABT mode, no interrupts
        msr        cpsr, r1
        mrs        r0, spsr                    ; Status Register
        stmia    r3!, {r0, sp, lr}            ; Store ABT mode Registers [SleepState_ABT_SPSR~SleepState_ABT_LR]

        ;----------------------
        ; IRQ mode CPU Registers

        mov        r1, #Mode_IRQ | NOINT    ; Enter IRQ mode, no interrupts
        msr        cpsr, r1
        mrs        r0, spsr                    ; Status Register
        stmia    r3!, {r0, sp, lr}            ; Store the IRQ Mode Registers [SleepState_IRQ_SPSR~SleepState_IRQ_LR]

        ;---------------------------
        ; Undefined mode CPU Registers

        mov        r1, #Mode_UND | NOINT    ; Enter UND mode, no interrupts
        msr        cpsr, r1
        mrs        r0, spsr                    ; Status Register
        stmia    r3!, {r0, sp, lr}            ; Store the UND mode Registers [SleepState_UND_SPSR~SleepState_UND_LR]

        ;------------------------------
        ; System(User) mode CPU Registers

        mov        r1, #Mode_SYS | NOINT    ; Enter SYS mode, no interrupts
        msr        cpsr, r1
        stmia    r3!, {sp, lr}                ; Store the SYS mode Registers [SleepState_SYS_SP, SleepState_SYS_LR]

        ;----------------------------------------------------
        ;Add following : SISO added
        ; 3-1. Save VFP Register into Sleep Data Area in DRAM
        ;----------------------------------------------------

        ;--------------------------------------
        ;    Floating Point Status and Control Register using FMRX
        ;    FMRX{cond} Rd, VFPsysreg     VFPsysreg -> Rd
        ; FMXR{cond} VFPsysreg, Rd         Rd -> VFPsysreg
        ;      FPSCR
        fmrx    r2, fpscr
        str    r2, [r3], #4     ;    [SleepState_VFP_FPSCR]

        ;------------------------------------------
        ;    Floating Point Exception Register
        fmrx    r2, fpexc
        str    r2, [r3], #4       ;    [SleepState_VFP_FPEXC]

        ;-----------------------------------------
        ;VFP Register File (using FLDMX, FSTMX)
        ; FLDM<addressmode><precision>{cond} Rn,{!} VFPregisters
        ;FSTM<addressmode><precision>{cond} Rn,{!} VFPregisters
        ; <addressmode>
        ;IA : Incremental address After each transfer
        ;DB : Decremental address Before each transfer
        ;EA : Empty Ascending stack operation, this is the same as DB for loads, and the same as IA for saves.
        ;FD : Full Descending stack operation, this is the same as IA for loads, and the same as DB for saves.
        ; <precision>
        ;      S : for single-precision
        ;        D : for double-precision
        ;        X : for unspecified precision
        ;    example::
        ;        FLDMIAS    r2, {s1-s5}
        ;        FSTMFDD    r13!, {d3-d6}
        ;        FSTMFDX    r13!, {d0-d3}
        ;        FLDMFDX    r13!, {d0-d3}
        fstmiax    r3!,    {d0-d15}

        ;------------------------------
        ; Return to SVC mode

        mov        r1, #Mode_SVC | NOINT    ; Back to SVC mode, no interrupts
        msr        cpsr, r1

;-----------------------------------------------------
;    4. Calculate CheckSum of Sleep Data
;-----------------------------------------------------

        ldr        r3, =IMAGE_SLEEP_DATA_UA_START    ; Base of Sleep Data Area
        ldr        r2, =0x0
        ldr        r0, =(SLEEPDATA_SIZE-1)            ; Size of Sleep Data Area (in words)

CheckSum_Loop

        ldr        r1, [r3], #4
        and        r1, r1, #0x1
        mov        r1, r1, LSL #31
        orr        r1, r1, r1, LSR #1
        add        r2, r2, r1
        subs        r0, r0, #1
        bne        CheckSum_Loop

        ldr        r0, =vINFORM1
        str        r2, [r0]                            ; Store CheckSum in INFORM1 Register (in SysCon)

;-----------------------------------------------------
;    5. Clear TLB and Flush Cache
;-----------------------------------------------------

        bl        OALClearDTLB
        bl        OALClearITLB
        bl        OALFlushDCache
        bl        OALFlushICache

;-----------------------------------------------------
;    6. Set Oscillation pad and Power Stable Counter
;-----------------------------------------------------

        ldr     r0, =vOSC_STABLE
        ldr     r1, =0x1
        str     r1, [r0]

        ldr     r0, =vPWR_STABLE
        ldr     r1, =0x1
        str     r1, [r0]

;-----------------------------------------------------
;    7. Set Power Mode to Sleep
;-----------------------------------------------------

        VLED_ON 0x6

        ldr        r0, =vPWR_CFG
        ldr        r2, [r0]
        bic        r2, r2, #0x60            ; Clear STANDBYWFI
        orr        r2, r2, #0x60            ; Enter SLEEP mode
        str        r2, [r0]

        ldr        r0, =vSLEEP_CFG
        ldr        r2, [r0]
        bic        r2, r2, #0x61            ; Disable OSC_EN (Disable X-tal Osc Pad in Sleep mode)
        str        r2, [r0]

;-----------------------------------------------------
;    8. Set Power Mode to Sleep
;-----------------------------------------------------

        bl        System_WaitForInterrupt
        b        .

;------------------------------------------------------------------------------
;    Now CPU is in Sleep Mode
;------------------------------------------------------------------------------

WakeUp_Address

;-----------------------------------------------------
;    1. Restore CPU Register from Sleep Data Area in DRAM
;-----------------------------------------------------

        VLED_ON    0x3

        ldr        r3, =IMAGE_SLEEP_DATA_UA_START    ; Sleep Data Area Base Address

        ;----------------------
        ; FIQ mode CPU Registers

        mov        r1, #Mode_FIQ | NOINT                ; Enter FIQ mode, no interrupts
        msr        cpsr, r1

        ldr        r0,    [r3, #SleepState_FIQ_SPSR]
        msr        spsr, r0
        ldr        r8,    [r3, #SleepState_FIQ_R8]
        ldr        r9,    [r3, #SleepState_FIQ_R9]
        ldr        r10,    [r3, #SleepState_FIQ_R10]
        ldr        r11,    [r3, #SleepState_FIQ_R11]
        ldr        r12,    [r3, #SleepState_FIQ_R12]
        ldr        sp,    [r3, #SleepState_FIQ_SP]
        ldr        lr,    [r3, #SleepState_FIQ_LR]

        ;-----------------------
        ; Abort mode CPU Registers

        mov        r1, #Mode_ABT | I_Bit                ; Enter ABT mode, no IRQ - FIQ is available
        msr        cpsr, r1

        ldr        r0,    [r3, #SleepState_ABT_SPSR]
        msr        spsr, r0
        ldr        sp,    [r3, #SleepState_ABT_SP]
        ldr        lr,    [r3, #SleepState_ABT_LR]

        ;----------------------
        ; IRQ mode CPU Registers

        mov        r1, #Mode_IRQ | I_Bit                ; Enter IRQ mode, no IRQ - FIQ is available
        msr        cpsr, r1

        ldr        r0,    [r3, #SleepState_IRQ_SPSR]
        msr        spsr, r0
        ldr        sp,    [r3, #SleepState_IRQ_SP]
        ldr        lr,    [r3, #SleepState_IRQ_LR]

        ;---------------------------
        ; Undefined mode CPU Registers

        mov        r1, #Mode_UND | I_Bit                ; Enter UND mode, no IRQ - FIQ is available
        msr        cpsr, r1

        ldr        r0,    [r3, #SleepState_UND_SPSR]
        msr        spsr, r0
        ldr        sp,    [r3, #SleepState_UND_SP]
        ldr        lr,    [r3, #SleepState_UND_LR]

        ;------------------------------
        ; System(User) mode CPU Registers

        mov        r1, #Mode_SYS | I_Bit                ; Enter SYS mode, no IRQ - FIQ is available
        msr        cpsr, r1

        ldr        sp,    [r3, #SleepState_SYS_SP]
        ldr        lr,    [r3, #SleepState_SYS_LR]

        ;----------------------------
        ; Supervisor mode CPU Registers

        mov        r1, #Mode_SVC | I_Bit                ; Enter SVC mode, no IRQ - FIQ is available
        msr        cpsr, r1

        ldr        r0, [r3, #SleepState_SVC_SPSR]
        msr        spsr, r0
        ldr        sp, [r3, #SleepState_SVC_SP]

        ;----------------------------------------
             ; Add following: SISO added
           ; 1-1 Restore VFP system control registers
           ;----------------------------------------

        ;--------------------------------------
        ;FMRX{cond} Rd, VFPsysreg     VFPsysreg -> Rd
        ; FMXR{cond} VFPsysreg, Rd         Rd -> VFPsysreg
        ;      FPSCR
        ldr        r0, [r3, #SleepState_VFP_FPSCR]
        fmxr    fpscr, r0

        ;------------------------------------------
        ;    Floating Point Exception Register
        ldr        r0, [r3, #SleepState_VFP_FPEXC]
        fmxr    fpexc, r0

;----------------------------------
;    2. Pop SVC Register from our Stack
;----------------------------------

        ldr        lr, [sp], #4
        ldmia    sp!, {r4-r12}

;--------------------------------------
;    3. Return to Caller of OALCPUPowerOff()
;--------------------------------------

        mov     pc, lr                          ; and now back to our sponsors

        ENTRY_END


;------------------------------------------------------------------------------
;    End of OALCPUPowerOff
;------------------------------------------------------------------------------

        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -