📄 startup.s
字号:
;
; Copyright (c) Microsoft Corporation. All rights reserved.
;
;
; Use of this sample source code is subject to the terms of the Microsoft
; license agreement under which you licensed this sample source code. If
; you did not accept the terms of the license agreement, you are not
; authorized to use this sample source code. For the terms of the license,
; please see the license agreement between you and Microsoft or, if applicable,
; see the LICENSE.RTF on your install media or the root of your tools installation.
; THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
;
;++
;
; Module Name:
;
; startup.s
;
; Abstract:
;
; This module implements Bulverde initialization code. It's responsible
; for setting up the Bulverde core. Board-level initialization is done
; in OEM-specific code.
;
; Environment:
;
; Revision History:
;
; Notes:
;
; Register Useage: r10 is used to hold the contents of the RCSR throughout
; this module. The rest of the registers are fair game.
;
;--
;
;-------------------------------------------------------------------------------
; Copyright 2000-2003 Intel Corporation All Rights Reserved.
;
; Portions of the source code contained or described herein and all documents
; related to such source code (Material) are owned by Intel Corporation
; or its suppliers or licensors and is licensed by Microsoft Corporation for distribution.
; Title to the Material remains with Intel Corporation or its suppliers and licensors.
; Use of the Materials is subject to the terms of the Microsoft license agreement which accompanied the Materials.
; No other license under any patent, copyright, trade secret or other intellectual
; property right is granted to or conferred upon you by disclosure or
; delivery of the Materials, either expressly, by implication, inducement,
; estoppel or otherwise
; Some portion of the Materials may be copyrighted by Microsoft Corporation.
;
;-------------------------------------------------------------------------------
;
; Disable listing
OPT 2
INCLUDE kxarm.h
INCLUDE bulverde.inc
INCLUDE bulverde_macros.inc
INCLUDE xlli_bulverde_defs.inc
INCLUDE xllp_pm_sleepcontext.inc
; Re-enable listing
OPT 1
; PQOAL BSP imports
IMPORT OALStartUp
IMPORT OALXScaleSetFrequencies
; XLLI/XLLP imports
IMPORT xlli_mem_init
IMPORT xlli_intr_init
IMPORT xlli_mem_Tmax
IMPORT xlli_mem_Topt
IMPORT xlli_mem_restart
IMPORT xlli_ost_init
IMPORT xlli_pwrmgr_init
IMPORT xlli_IMpwr_init
IMPORT XllpPmValidateResumeFromSleep
IMPORT XllpPmGoToContextRestoration
IMPORT xlli_GPIO_init
IMPORT xlli_setClocks
IMPORT xlli_freq_change
STARTUPTEXT
;*******************************************************************************
;
; StartUp() is the entry point on Reset (all forms of Reset)
;
; Desription: StartUp is the first routine executed when powering on
; the system. It is also executed first after all forms of XScale
; resets. The code is shared between the bootloader and the CE kernel.
;
; Regardless of the build type, we disable the MMU and caches
; immediately and flush them.
;
;*******************************************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Note 1: Normally, we'd have our exception vectors here, but the linker
; currently insert a 4K "jump page" at the start of the image. Therefore,
; we do NOT have control of the vector code. They insert a branch to
; StartUp at physical address 0.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Note 2: - The MMU assumed to be inactive at this time so physical addresses
; should be used.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LEAF_ENTRY StartUp
; Perform pre-initialization (enter supervisor mode, disable MMU and caches,
; and determine the reason for the reset.
;
bl PreInit
; r10 now contains the contents of the power manager registers RCSR in the
; lower half and PSSR in the upper half. If we're in this routine because
; of a hardware/power-on reset, then we need to continue in this routine and
; initialize all hardware. Otherwise, we'll assume the hardware's already
; been initialized and we can skip.
;
;jump directly to OALstartup if this was not a reset
tst r10, #(RCSR_HARD_RESET :OR: RCSR_WDOG_RESET :OR: RCSR_SLEEP_RESET :OR: RCSR_GPIO_RESET)
beq OALStartUp
; If we're here because of a GPIO reset, skip the memory controller
; initialization because all memory registers (except for configuration
; registers are maintained across the reboot).
;
tst r10, #RCSR_GPIO_RESET
bne Continue_StartUp
; Initialize the Bulverde memory controller.
;
bl xlli_mem_init
; If we're here because of a hardware reset then skip sleep reset check
tst r10, #RCSR_HARD_RESET
bne Continue_StartUp
; We may be here because of a sleep reset. Try to resume from the sleep
; state. At this point, it may be a watchdog reset or a sleep/software reset.
;
ldr r0, =xlli_PMRCREGS_PHYSICAL_BASE ; read the PSPR register
ldr r0, [r0, #xlli_PSPR_offset] ;
mov r1, r10 ; packed RCSR+PSSR required in r1
bl XllpPmValidateResumeFromSleep ; r0-r6 are lost
cmp r0, #0 ; zero return: OK to restore
bne Failed_Sleep_Resume ; treat as a full-init reset
; At this point, the reset could have been caused by a resume from sleep
; or by a software reset. For now, assume it was a sleep-based reset.
;
; TODO: handling a software reset requires use of a flag - where to put it?
;
b Sleep_Reset_Not_SoftReset
;
Failed_Sleep_Resume
; Make sure sleep-mediated reset flag is cleared (won't be set if we're here
; because of a POR, hardware, or watchdog reset.
;
ldr r1, =xlli_RCSR_SMR
bic r10, r10, r1
Continue_StartUp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Common startup code.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Initialize the interrupt controller.
;
bl xlli_intr_init
; Enable core clocks (don't touch the RTC).
;
bl EnableClks
; Set maximum memory controller values, then reset the controller for them
; to take effect. If we're here because of a GPIO reset, these are the
; configuration values that didn't persist across the reboot.
;
bl xlli_mem_Tmax
bl xlli_mem_restart
; Use OEM-selected clock frequencies this is a function call into OEM code
; which may need to abstract board-specific GPIO switch reads, etc. to
; select clock frequencies.
;
bl OALXScaleSetFrequencies
; Set optimal memory controller values (based on the memory clock frequency
; chosen above, then reset the controller for them to take effect.
;
bl xlli_mem_Topt
bl xlli_mem_restart
; Initialize the OS timers.
;
bl xlli_ost_init
; Initialize the power manager.
;
bl xlli_pwrmgr_init
; Power-up internal memory.
;
bl xlli_IMpwr_init
; Jump to OAL startup code.
;
b OALStartUp
Sleep_Reset_Not_SoftReset
;Initialize the clocks with the following XLLI sequence
bl xlli_mem_Tmax
bl xlli_mem_restart
bl xlli_GPIO_init
bl xlli_setClocks ; will poke CCCR so must do Frequency Change
bl xlli_freq_change
bl xlli_mem_Topt
bl xlli_mem_restart
ldr r0, =xlli_PMRCREGS_PHYSICAL_BASE ; Get the Power Manager base address
ldr r0, [r0, #xlli_PSPR_offset] ; Phys. addr of save data
mov r1, r10 ; Packed RCSR+PSSR
b XllpPmGoToContextRestoration ; Never returns.
; if it returns jump to Failed Reset
b Failed_Sleep_Resume
ENTRY_END
;-------------------------------------------------------------------------------
LTORG ; insert a literal pool here.
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;
; PreInit: perform CPU pre-initialization tasks (enter supervisor mode, disable
; MMUs and caches, determine reset reason, etc.
;
; Inputs: r10 contains an optional flag - TBD
;
; On return: r10 has RCSR in lower half and PSSR in upper half
;
; Register used: r0-r2, r10, r12
;
;-------------------------------------------------------------------------------
;
ALIGN
PreInit
; Put the CPU in Supervisor mode (SVC) and disable IRQ and FIQ interrupts.
;
ldr r0, =(Mode_SVC :OR: NoIntsMask)
msr cpsr_c, r0
; Disable the MMU, caches, and write-buffer and flush.
;
ldr r0, =0x2043 ; enable access to all coprocessors
mcr p15, 0, r0, c15, c1, 0 ;
CPWAIT r0 ;
ldr r0, =0x00000078 ; get a zero to turn things off (must write bits[6:3] as 1s)
mcr p15, 0, r0, c1, c0, 0 ; turn off MMU, I&D caches, and write buffer
CPWAIT r0 ;
;ldr r0, =0x00000000 ; get a zero to turn things off
;mcr p15, 0, r0, c8, c7, 0 ; flush (invalidate) I/D TLBs
;mcr p15, 0, r0, c7, c7, 0 ; flush (invalidate) I/D caches
;mcr p15, 0, r0, c7, c10, 4 ; drain the write buffer
;nop ;
;nop ;
;nop ;
mvn r0, #0 ; grant manager access to all domains
mcr p15, 0, r0, c3, c0, 0 ;
; Read the reset cause bits in RCSR.
;
ldr r0, =BULVERDE_BASE_REG_PA_PWR
ldr r10, [r0, #RCSR_OFFSET]
; Extract the reset cause bits.
;
mov r2, #RCSR_ALL ; Mask RCSR
and r10, r10, r2 ; r10 now holds the conditioned Reset Reason
; Clear the reset cause bits (they're sticky).
;
str r2, [r0, #RCSR_OFFSET]
; Read and store PSSR in the upper half of r10.
;
ldr r12, [r0, #PSSR_OFFSET]
mov r2, #PSSR_VALID_MASK ; mask PSSR (all in lower byte)
and r12, r12, r2 ; r12 now holds the conditioned PSSR
mov r12, r12, lsl #16 ; move to upper half of register
orr r10, r10, r12 ; r10 now has RCSR in lower half and PSSR in upper
; Enable data aborts for VDD and BATT faults (alternative is to use interrupt)
;
mov r1, #(PMCR_BIDAE:OR:PMCR_VIDAE) ; Enable imprecise data aborts on VDD and BATT faults.
str r1, [r0, #PMCR_OFFSET]
IF Interworking :LOR: Thumbing
bx lr
ELSE
mov pc, lr ; return to caller.
ENDIF
;-------------------------------------------------------------------------------
LTORG ; insert a literal pool here.
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
;
; EnableClks: Enable the Bulverde core clocks/timers.
;
; Inputs: None.
;
; On return: N/A.
;
; Register used: r1, r2
;
;-------------------------------------------------------------------------------
;
ALIGN
EnableClks
; Enable only the clocks that are necessary for startup (memory controller
; and OS timer clocks).
;
ldr r1, =BULVERDE_BASE_REG_PA_CLKMGR
ldr r2, =CKEN_DEFAULT
str r2, [r1, #CKEN_OFFSET]
IF Interworking :LOR: Thumbing
bx lr
ELSE
mov pc, lr ; return to caller.
ENDIF
;-------------------------------------------------------------------------------
LTORG ; insert a literal pool here.
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -