📄 startup.s
字号:
;**********************************************************************
;
; Filename: startup.s
;
; Description: Initialization before the MMU gets turned. This is
; the first code that gets executed.
;
; THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
; ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
; PARTICULAR PURPOSE.
;
; Use of this source code is subject to the terms of the Cirrus 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
; EULA.RTF on your install media.
;
; Copyright(c) Cirrus Logic Corporation 2002, All Rights Reserved
;
;**********************************************************************
OPT 2 ; disable listing
INCLUDE kxarm.h
INCLUDE memorymap.inc
OPT 1 ; reenable listing
OPT 128 ; disable listing of macro expansions
;
; ASync bus mode, little endian, MMU disabled
;
CP15R1Init EQU 0xC0001078
CLKSET1DEFAULT EQU 0x000398e7
EBOOT_RUN_FLAG EQU 0x00001234
REG_LED_ADDRESS EQU 0x80840020
;
; Static memory settings.
;
SMCBCR_IDCY_MASK EQU 0x0000000F
SMCBCR_IDCY_SHIFT EQU 0
SMCBCR_WST1_MASK EQU 0x000003E0
SMCBCR_WST1_SHIFT EQU 5
SMCBCR_RBLE EQU 0x00000400
SMCBCR_WST2_MASK EQU 0x0000F800
SMCBCR_WST2_SHIFT EQU 11
SMCBCR_WPERR EQU 0x02000000
SMCBCR_WP EQU 0x04000000
SMCBCR_PME EQU 0x08000000
SMCBCR_MASK EQU 0x30000000
SMCBCR_MW_8BIT EQU 0x00000000
SMCBCR_MW_16BIT EQU 0x10000000
SMCBCR_MW_32BIT EQU 0x20000000
SMCBCR_EBIBRKDIS EQU 0x40000000
ROMHDR_dllfirst EQU 0x8
ROMHDR_dlllast EQU 0xC
ROMHDR_physfirst EQU 0x10
ROMHDR_physlast EQU 0x14
REG_SCRATCH_REG0 EQU 0x80930040
IF EP93XX_SDRAM_WIDTH = 16
ROM_OFFSET EQU 0xDFF40000
ELSE
ROM_OFFSET EQU 0XDFD40000
ENDIF
IMPORT KernelStart
IMPORT OEMAddressTable
IMPORT SysconSetup
IMPORT SdramCfg
IMPORT pTOC
;**********************************************************************
; StartUp routine to initialize the processor.
;**********************************************************************
STARTUPTEXT
StartString
DCB "CRUS", 0
LEAF_ENTRY StartUp
;
; Kill watch dog timer. Before any thing else.
;
; ldr r0, =0x80940000
; ldr r1, =0xAA55
; str r1, [r0]
;
; ensure SVC32 mode with IRQ and FIQ disabled
;
mov r0, #0xd3
msr cpsr_c, r0
;
; Turn off the MMU
;
ldr r0, =CP15R1Init
mcr p15, 0, r0, c1, c0, 0
nop
nop
;
; If we loaded through eboot, SDRAM is already configured.
; Check the CLKSET1 register to see if it has been modified.
;
ldr r0, =REG_SCRATCH_REG0
ldr r1, [r0]
ldr r0, =EBOOT_RUN_FLAG
cmp r0, r1
beq DontConfigureSDRAM
;
;
; Configure SDRAM
;
bl SdramCfg
DontConfigureSDRAM
;
; If we want an image that copies from flash to ram use the following.
;
;
; Configure the flash chips
IF EP93XX_FLASH_TYPE = "FLASH_TYPE_J3"
ldr r0, =( (4:SHL:SMCBCR_WST2_SHIFT) :or: \
(15:SHL:SMCBCR_WST1_SHIFT) )
ELSE
ldr r0, =((31:SHL:SMCBCR_WST2_SHIFT) :or: \
(31:SHL:SMCBCR_WST1_SHIFT) )
ENDIF
IF EP93XX_FLASH_WIDTH =16
ldr r1, =SMCBCR_MW_16BIT
ELSE
ldr r1, =SMCBCR_MW_32BIT
ENDIF
ldr r2, =((1 :and:SMCBCR_IDCY_MASK) :or: \
SMCBCR_WP :or: \
SMCBCR_PME :or: \
SMCBCR_RBLE)
orr r0, r0, r1
orr r0, r0, r2
ldr r1, =REG_FLASH_CONFIG
str r0, [r1]
nop
IF COPY_FLASH_TO_RAM
bl CopyCodeToRam
ENDIF
;
; create a temporary stack below kernel memory from config.bib
;
ExecuteFromRam
ldr r0, =EP93XX_SDRAM_PHY_ADDR
add r0, r0, #0x00040000 ;sp is set to the buffer of EDBG.
mov sp, r0
bl SysconSetup
;
; clear out magic words for memory and heap
; (r0) = physical address of OEMAddressTable
;
;
; Calculate the physical address of the table.
;
; r0 - Virtual address of OEMAddressTable
; r1 - Physical Address of Startup
; r2 - Virtual Address of Startup
;
; r0 = r0 - r2 + r1 = Physical address of OEMAddressTable
;
ldr r0,=OEMAddressTable
adr r1,StartUp
ldr r2,=StartUp
add r0, r0, r1
sub r0, r0, r2
bl KernelStart
;
; KernelStart should never return:
;
b .
;;***********************************************************************************
;;CopyCodeToRam function starts
;;***********************************************************************************
IF COPY_FLASH_TO_RAM
LEAF_ENTRY CopyCodeToRam
;
; Get the address of the table of contents and adjust for the flash address.
;
ldr r0, =pTOC
ldr r3, =ROM_OFFSET
add r0, r0, r3
ldr r4, [r0]
add r4, r4, r3
;
; Get the dll first and dll last address.
; r1 = Destiniation = dllfirst
; r11 = length = dlllast - dllfirst
;
ldr r1, [r4, #ROMHDR_dllfirst]
ldr r11, [r4, #ROMHDR_dlllast]
;
; Make sure that r1 and r11 are on a 0x20 boundary.
;
ldr r2, =0x07FFFFE0
ldr r0, =EP93XX_SDRAM_PHY_ADDR
and r1, r1, r2
orr r1, r1, r0
and r11, r11, r2
add r11, r11, #0x20
orr r11, r11, r0
;*************************************************************************
; Copy routine.
;
; r0 = Source
; r1 = Destination
;r10 = The last address of first piece of SDRAM.
; r11 = End Address Address of Destination
; r12 = LED counter
; r13 = LED address.
;
;*************************************************************************
;Get the end address of first piece of SDRAM from OEMAddressTable.
ldr r9,=OEMAddressTable
ldr r8, =ROM_OFFSET
add r9, r9,r8
ldr r2, [r9, #8] ; r2 is the size of first piece of SDRAM in M bytes.
cmp r2,#64
BHS GreatThan64M
ldr r10, [r9, #0x4];the physical address of first piece of SDRAM
ldr r2, [r9, #0x8] ;the size of first piece of SDRAM
mov r2, r2, LSL #20 ;change the size from xxM to xxxxx BYTES
add r10, r10, r2 ;then, r10 is the last physical address of first piece of SDRAM.
b SecondSDRAMEnd
GreatThan64M
ldr r2,=EP93XX_SDRAM_PHY_ADDR
add r10,r2,#0x4000000
SecondSDRAMEnd
;Initialize LED state;;
ldr r13, =REG_LED_ADDRESS
ldr r2, [r13]
and r2, r2, #0xFFFFFFFC
orr r2, r2, #1
str r2, [r13]
ldr r12, =0x3FFFF
ldr r0, =EP93XX_FLASH_PHY_ADDR
NKCopyLoop
ldmia r0!, {r2-r9}
stmia r1!, {r2-r9}
NK8MegTest
cmp r1, r10
bne NKLedTest
ldr r9,=OEMAddressTable
ldr r8, =ROM_OFFSET
add r9, r9,r8
ldr r1, [r9, #0x10]; set destination address to the second piece of SDRAM.
sub r11, r11, r10
add r11, r11, r1
NKLedTest
ands r2, r0, r12
beq ToggleLED
NKCopyTest
cmp r1, r11
bne NKCopyLoop
ldr r0, =EP93XX_SDRAM_PHY_ADDR
ldr r2, =ExecuteFromRam
and r2, r2, #0x00FFFFFF
orr r2, r2, r0
mov pc, r2
ToggleLED
ldr r2, [r13]
eor r2, r2, #3
str r2, [r13]
b NKCopyTest
mov pc, lr
ENDIF
; End of initialization code & data
TEXTAREA
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -