📄 startup.s
字号:
;
; Copyright (c) Microsoft Corporation. All rights reserved.
;
; Use of this source code is subject to the terms of the Microsoft end-user
; license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
; If you did not accept the terms of the EULA, you are not authorized to use
; this source code. For a copy of the EULA, please see the LICENSE.RTF on your
; install media.
;
;------------------------------------------------------------------------------
;
; Copyright (C) 2004-2006,2007 Freescale Semiconductor, Inc. All Rights Reserved.
; THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
; AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
;
;------------------------------------------------------------------------------
;
; File: startup.s
;
; This file implements MX27 common initialization code. It's responsible
; for setting up the MX27 core before jumping to OEM-specific codes for
; board-level initialization.
;
;------------------------------------------------------------------------------
OPT 2 ; Disable listing
INCLUDE kxarm.h ; This defines the WinCE/ARM Calling Sequence
; Specification
INCLUDE mx27_base_mem.inc
INCLUDE mx27_base_regs.inc
OPT 1 ; Reenable listing
;------------------------------------------------------------------------------
; Defines
;------------------------------------------------------------------------------
;
; ARM constants
;
ARM_CPSR_PRECISE EQU (1 << 8)
ARM_CPSR_IRQDISABLE EQU (1 << 7)
ARM_CPSR_FIQDISABLE EQU (1 << 6)
ARM_CPSR_MODE_SVC EQU 0x13
ARM_CTRL_ICACHE EQU (1 << 12)
ARM_CTRL_DCACHE EQU (1 << 2)
ARM_CTRL_MMU EQU (1 << 0)
ARM_CTRL_VECTORS EQU (1 << 13)
ARM_CACR_FULL EQU 0x3
;
; AIPI Constants
;
AIPI_PSR0_OFFSET EQU 0x0000
AIPI_PSR1_OFFSET EQU 0x0004
AIPI_PAR_OFFSET EQU 0x0008
AIPI_AAOR_OFFSET EQU 0x000C
;
; MAX Constants
;
MAX_MPR0_OFFSET EQU 0x0000
MAX_AMPR0_OFFSET EQU 0x0004
MAX_SGPCR0_OFFSET EQU 0x0010
MAX_ASGPCR0_OFFSET EQU 0x0014
MAX_MPR1_OFFSET EQU 0x0100
MAX_AMPR1_OFFSET EQU 0x0104
MAX_SGPCR1_OFFSET EQU 0x0110
MAX_ASGPCR1_OFFSET EQU 0x0114
MAX_MPR2_OFFSET EQU 0x0200
MAX_AMPR2_OFFSET EQU 0x0204
MAX_SGPCR2_OFFSET EQU 0x0210
MAX_ASGPCR2_OFFSET EQU 0x0214
MAX_MGPCR0_OFFSET EQU 0x0800
MAX_MGPCR1_OFFSET EQU 0x0900
MAX_MGPCR2_OFFSET EQU 0x0A00
MAX_MGPCR3_OFFSET EQU 0x0B00
MAX_MGPCR4_OFFSET EQU 0x0C00
MAX_MGPCR5_OFFSET EQU 0x0D00
;
; M3IF Constants
;
M3IF_M3IFCTL_OFFSET EQU 0x0000
;
; AITC constants
;
AITC_INTCNTL_OFFSET EQU 0x0000
AITC_NIMASK_OFFSET EQU 0x0004
AITC_INTENNUM_OFFSET EQU 0x0008
AITC_INTDISNUM_OFFSET EQU 0x000C
AITC_INTENABLEH_OFFSET EQU 0x0010
AITC_INTENABLEL_OFFSET EQU 0x0014
AITC_INTTYPEH_OFFSET EQU 0x0018
AITC_INTTYPEL_OFFSET EQU 0x001C
AITC_NIPRIORITY7_OFFSET EQU 0x0020
AITC_NIPRIORITY6_OFFSET EQU 0x0024
AITC_NIPRIORITY5_OFFSET EQU 0x0028
AITC_NIPRIORITY4_OFFSET EQU 0x002C
AITC_NIPRIORITY3_OFFSET EQU 0x0030
AITC_NIPRIORITY2_OFFSET EQU 0x0034
AITC_NIPRIORITY1_OFFSET EQU 0x0038
AITC_NIPRIORITY0_OFFSET EQU 0x003C
AITC_NIVECSR_OFFSET EQU 0x0040
AITC_FIVECSR_OFFSET EQU 0x0044
AITC_INTSRCH_OFFSET EQU 0x0048
AITC_INTSRCL_OFFSET EQU 0x004C
AITC_INTFRCH_OFFSET EQU 0x0050
AITC_INTFRCL_OFFSET EQU 0x0054
AITC_NIPNDH_OFFSET EQU 0x0058
AITC_NIPNDL_OFFSET EQU 0x005C
AITC_FIPNDH_OFFSET EQU 0x0060
AITC_FIPNDL_OFFSET EQU 0x0064
IF :LNOT: :DEF: BOOTLOADER
GBLL BOOTLOADER
BOOTLOADER SETL {FALSE}
ENDIF
;------------------------------------------------------------------------------
; Macros
;------------------------------------------------------------------------------
;
; This macro is used to wait for a cp15 write and is needed
; when we have to ensure that the last operation to the co-pro
; was completed before continuing with operation.
;
MACRO
CPWAIT
mrc p15, 0, r0, c2, c0, 0 ; arbitrary read of cp15
mov r0, r0 ; wait for completion
sub pc, pc, #4 ; flush instruction pipeline
MEND
;------------------------------------------------------------------------------
; External Functions
;------------------------------------------------------------------------------
IMPORT OALInitSysCtrl
IMPORT OALInitPll
IMPORT OALInitGpio
IMPORT OALInitWeim
IMPORT OALInitEsdramc
IF :LNOT: BOOTLOADER
IMPORT KernelStart
ENDIF
;------------------------------------------------------------------------------
;
; Function: StartUp
;
; First routine executed on power on. Shared between EBOOT/Kernel.
;
; Normally exception vetors is placed before here but the linker always
; place a 4KB page with a branch to StartUp at the image start. So we DO NOT
; have control over the vector codes.
;
; Parameters:
; None.
;
; Returns:
; None.
;
;------------------------------------------------------------------------------
STARTUPTEXT
LEAF_ENTRY StartUp
;--------------------------------------------------------------------------
; MS RECOMMENDATION:
; Put the processor in supervisor mode
; Disable the interrupt request (IRQ) and fast interrupt request (FIQ)
; inputs
;--------------------------------------------------------------------------
mrs r0, cpsr ; r0 = CPSR
mov r0, #ARM_CPSR_MODE_SVC ; enter supervisor mode
orr r0, r0, #ARM_CPSR_IRQDISABLE ; disable normal IRQ
orr r0, r0, #ARM_CPSR_FIQDISABLE ; disable fast IRQ
msr cpsr_xc, r0 ; update CPSR control bits
;--------------------------------------------------------------------------
; MS RECOMMENDATION:
; Disable memory management unit (MMU) and both the instruction and data
; caches
;--------------------------------------------------------------------------
mrc p15, 0, r0, c1, c0, 0 ; r0 = system control reg
bic r0, r0, #ARM_CTRL_ICACHE ; disable ICache
bic r0, r0, #ARM_CTRL_DCACHE ; disable DCache
bic r0, r0, #ARM_CTRL_MMU ; disable MMU
bic r0, r0, #ARM_CTRL_VECTORS ; set vector base to 0x00000000
mcr p15, 0, r0, c1, c0, 0 ; update system control reg
;
; Set up AIPI registers for module access.
; PSR[1:0]: 10 = 32bit, 01 = 16bit, 00 = 8bit.
; PAR: 1 = Supervisor access only, 0 = Access rights is up to peripheral.
; AAOR: 1 = Atomic access only, 0 = Accept non-atomic access.
;
; AIPI1 settings:
; PSR[0]: 0x20040304
; PSR[1]: 0xDFFBFCFB (16-bit: WDOG, KPP, OWIRE, I2C)
; PAR: 0x00000001
; AAOR: 0x00000001 (reset value)
;
ldr r1, =CSP_BASE_REG_PA_AIPI1
ldr r0, =0x20040304
str r0, [r1, #AIPI_PSR0_OFFSET]
ldr r0, =0xDFFBFCFB
str r0, [r1, #AIPI_PSR1_OFFSET]
ldr r0, =0x00000001
str r0, [r1, #AIPI_PAR_OFFSET]
ldr r0, =0x00000001
str r0, [r1, #AIPI_AAOR_OFFSET]
;
; AIPI2 settings:
; PSR[0]: 0x07FFC200
; PSR[1]: 0xFFFFFFFF
; PAR: 0x00000001
; AAOR: 0x00000001 (reset value)
;
ldr r1, =CSP_BASE_REG_PA_AIPI2
ldr r0, =0x07FFC200
str r0, [r1, #AIPI_PSR0_OFFSET]
ldr r0, =0xFFFFFFFF
str r0, [r1, #AIPI_PSR1_OFFSET]
ldr r0, =0x00000001
str r0, [r1, #AIPI_PAR_OFFSET]
ldr r0, =0x00000001
str r0, [r1, #AIPI_AAOR_OFFSET]
;
; Set up MAX registers:
;
; MX27 MAX Master/Slave port assigments:
; Master0: I-AHB
; Master1: D-AHB
; Master2: SAHARA/EMMA
; Master3: DMA
; Master4: SLCDC/RTIC
; Master5: H264
;
; Slave0: PAHBMUX
; Slave1: CSI/ATA
; Slave2: M3IF Port3
;
ldr r1, =CSP_BASE_REG_PA_MAX
;
; Master Priority Register (0 - highest, 7 - lowest)
; SLCDC/RTIC > H264 > EMMA > DMA > D-AHB > I-AHB
; M4 > M5 > M2 > M3 > M1 > M0
;
ldr r0, =0x00103245
str r0, [r1, #MAX_MPR0_OFFSET]
str r0, [r1, #MAX_AMPR0_OFFSET]
str r0, [r1, #MAX_MPR1_OFFSET]
str r0, [r1, #MAX_AMPR1_OFFSET]
str r0, [r1, #MAX_MPR2_OFFSET]
str r0, [r1, #MAX_AMPR2_OFFSET]
;
; Slave General Purpose Control Register
; PARK - Ignored since PCTL not (0 << 0)
; PCTL - Park on last master (1 << 4)
; ARB - Fixed priority (0 << 8)
; HLP - Halt request has lowest priority (0 << 30)
; RO - Slave port registers can be written (0 << 31)
ldr r0, =(1 << 4)
str r0, [r1, #MAX_SGPCR0_OFFSET]
str r0, [r1, #MAX_ASGPCR0_OFFSET]
str r0, [r1, #MAX_SGPCR1_OFFSET]
str r0, [r1, #MAX_ASGPCR1_OFFSET]
str r0, [r1, #MAX_SGPCR2_OFFSET]
str r0, [r1, #MAX_ASGPCR2_OFFSET]
;
; Master General Purpose Control Register
; AULB - Arbitration any time during undefined burst length (1 << 0)
ldr r0, =(1 << 0)
str r0, [r1, #MAX_MGPCR0_OFFSET]
str r0, [r1, #MAX_MGPCR1_OFFSET]
str r0, [r1, #MAX_MGPCR2_OFFSET]
str r0, [r1, #MAX_MGPCR3_OFFSET]
str r0, [r1, #MAX_MGPCR4_OFFSET]
str r0, [r1, #MAX_MGPCR5_OFFSET]
;
; Configure M3IF registers
;
; M3IF Control Register (M3IFCTL)
; MRRP[0] = LCDC on priority list (1 << 0) = 0x00000001
; MRRP[1] = FEC not on priority list (0 << 1) = 0x00000000
; MRRP[2] = eMMA not on priority list (0 << 2) = 0x00000000
; MRRP[3] = MAX not on priority list (0 << 3) = 0x00000000
; MRRP[4] = H264-PO not on priority list (0 << 4) = 0x00000000
; MRRP[5] = H264-PO not on priority list (0 << 5) = 0x00000000
; MRRP[6] = H264-PO not on priority list (0 << 6) = 0x00000000
; MRRP[7] = USBOTG not on priority list (0 << 7) = 0x00000000
; ------------
; 0x00000001
;
ldr r1, =CSP_BASE_REG_PA_M3IF
ldr r0, =0x00000001
str r0, [r1, #M3IF_M3IFCTL_OFFSET]
;
; Enable ICache (TODO: Could we turn on it here??)
;
; mrc p15, 0, r0, c1, c0, 0 ; r0 = system control reg
; orr r0, r0, #ARM_CTRL_ICACHE ; enable ICache
; mcr p15, 0, r0, c1, c0, 0 ; update system control reg
; CPWAIT ; wait cp15 ready
;
; Set up temporary stack to VRAM (45KB on MX27: 0xFFFF4C00 - 0xFFFFFFFF)
;
ldr sp, =0xFFFFFFFC
;
; Call OEM-specific system control initialization
;
bl OALInitSysCtrl
;
; Call OEM-specific clock initialization
;
bl OALInitPll
;
; Call OEM-specific GPIO initialization
; (TODO: It has impact on CS4 CPLD status)
bl OALInitGpio
;
; Initialize Wireless External Interface Module (WEIM)
;
bl OALInitWeim
;
; Only configure ESDRAMC if running from SDRAM
;
ldr r1, =CSP_BASE_MEM_PA_CS0
cmp pc, r1
blt skip_esdramc_init
bl OALInitEsdramc
skip_esdramc_init
;--------------------------------------------------------------------------
; MS RECOMMENDATION:
; Configure the interrupt controller. Mask and clear any pending
; interrupts.
;--------------------------------------------------------------------------
mov r0, #0
ldr r1, =CSP_BASE_REG_PA_AITC
str r0, [r1, #AITC_INTENABLEH_OFFSET] ; disable all interrupt sources
str r0, [r1, #AITC_INTENABLEL_OFFSET]
str r0, [r1, #AITC_INTTYPEH_OFFSET] ; all sources generate normal IRQ
str r0, [r1, #AITC_INTTYPEL_OFFSET]
str r0, [r1, #AITC_INTFRCH_OFFSET] ; no sources forced
str r0, [r1, #AITC_INTFRCL_OFFSET]
str r0, [r1, #AITC_NIPRIORITY7_OFFSET] ; all sources lowest priority
str r0, [r1, #AITC_NIPRIORITY6_OFFSET]
str r0, [r1, #AITC_NIPRIORITY5_OFFSET]
str r0, [r1, #AITC_NIPRIORITY4_OFFSET]
str r0, [r1, #AITC_NIPRIORITY3_OFFSET]
str r0, [r1, #AITC_NIPRIORITY2_OFFSET]
str r0, [r1, #AITC_NIPRIORITY1_OFFSET]
str r0, [r1, #AITC_NIPRIORITY0_OFFSET]
;--------------------------------------------------------------------------
; MS RECOMMENDATION:
; Get the physical base address of the OEMAddressTable and store in r0.
;--------------------------------------------------------------------------
adr r0, g_oalAddressTable
;--------------------------------------------------------------------------
; MS RECOMMENDATION:
; Jump to KernelStart to boot WindowsCE or BootloaderMain for bootloader
;--------------------------------------------------------------------------
b KernelStart
spin
b spin
;
; Include memory configuration file with g_oalAddressTable
;
INCLUDE oemaddrtab_cfg.inc
ENTRY_END StartUp
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -