startup.s
来自「SAMSUNG S3C6410 CPU BSP for winmobile6」· S 代码 · 共 487 行
S
487 行
;------------------------------------------------------------------------------
;
; 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.
;
;------------------------------------------------------------------------------
;
; File: startup.s
;
; Hardware startup routine for Samsung SMDK6410 board.
;
;------------------------------------------------------------------------------
INCLUDE kxarm.h
INCLUDE s3c6410.inc
INCLUDE image_cfg.inc
[ POP_OPTION = POP_NONE
INCLUDE MemParam_mDDR.inc
]
[ POP_OPTION = POP_X5A
INCLUDE MemParam_X5A.inc
]
DRAM_BaseAddress EQU (0x50000000)
ONENAND_BaseAddress EQU (0x70100000)
ONENAND_ReadBase EQU (0x01000000) ;6410 Base Map01 command
DownloadAddress EQU (DRAM_BaseAddress+0x01300000)
ONBL2_START_BLOCK EQU (0)
ONBL2_START_PAGE EQU (2)
ONBL2_END_PAGE EQU (63)
IMPORT main ; C entrypoint for Steppingstone loader.
STARTUPTEXT
;------------------------------------------------------------------------------
;
; StartUp Entry
;
; Main entry point for CPU initialization.
;
;------------------------------------------------------------------------------
LEAF_ENTRY StartUp
b ResetHandler
b . ; HandlerUndef (0x00000004)
b . ; HandlerSWI (0x00000008)
b . ; HandlerPabort (0x0000000C)
b . ; HandlerDabort (0x00000010)
b . ; HandlerReserved (0x00000014)
b . ; HandlerIRQ (0x00000018)
b . ; HandlerFIQ (0x0000001C)
;------------------------------------------------------------------------------
; End of StartUp
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;
; ResetHandler Function
;
; Reset Exception Handler
;
;------------------------------------------------------------------------------
ResetHandler
;------------------------------------
; Enable Instruction Cache
;------------------------------------
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 ; Invalidate Entire I&D Cache
mrc p15, 0, r0, c1, c0, 0 ; Enable I Cache
orr r0, r0, #R1_I
mcr p15, 0, r0, c1, c0, 0
;------------------------------------
; Peripheral Port Setup
;------------------------------------
ldr r0, =0x70000013 ; Base Addres : 0x70000000, Size : 256 MB (0x13)
mcr p15,0,r0,c15,c2,4
;------------------------------------
; Disable WatchDog Timer
;------------------------------------
ldr r0, =WTCON
ldr r1, =0x0
str r1, [r0]
;--------------------------------------------
; Memport1 drive strength change 3mA->7mA
;--------------------------------------------
ldr r3, =MEM1DRVCON
ldr r4, =0xaaaaaaaa
str r4, [r3]
ldr r3, =MEM0DRVCON
ldr r4, =0xaaaaaaaa
str r4, [r3]
;------------------------------------
; Change PLL Value
;------------------------------------
[ SYNCMODE ; Operating Mode Change
ldr r0, =OTHERS
ldr r1, [r0]
mov r2, #0x40 ; OTHERS[6] = "1"
orr r1, r1, r2
str r1, [r0] ; SYNCMUXSEL
;DELAY
NOP
NOP
NOP
NOP
NOP
ldr r2, =((1<<7)) ; SYNCMODE,
orr r1, r1, r2
str r1, [r0] ; Assert SYNCACK, VICSYNCEN
Check_SYNCACK
ldr r1, [r0]
ldr r2, =(0xF<<8)
and r1, r1, r2 ; OTHERS[11:8]
cmp r1, #0xF00
bne Check_SYNCACK
]
ldr r1, =0x4b1 ; Lock Time Value, Fin=12MHz - 0x4B1(min)
ldr r2, =0xe13 ; Lock Time : 0xe13 (300us @Fin12MHz) for EPLL
ldr r0, =APLL_LOCK ; APLL Lock Time
str r1, [r0]
str r1, [r0, #0x4] ; MPLL Lock Time
str r2, [r0, #0x8] ; EPLL Lock Time
ldr r1, [r0,#0x20] ; Load Clock Divider Value
bic r1, r1, #0x30000
bic r1, r1, #0xff00
bic r1, r1, #0xff
ldr r2, =((PCLK_DIV<<12)+(HCLKx2_DIV<<9)+(HCLK_DIV<<8)+(MPLL_DIV<<4)+(APLL_DIV<<0))
orr r1, r1, r2
str r1, [r0,#0x20] ; CLK_DIV0 Register
ldr r1, =((1<<31)+(APLL_MVAL<<16)+(APLL_PVAL<<8)+(APLL_SVAL))
str r1, [r0, #0xC] ; APLL_CON
ldr r1, =((1<<31)+(MPLL_MVAL<<16)+(MPLL_PVAL<<8)+(MPLL_SVAL))
str r1, [r0, #0x10] ; MPLL_CON
ldr r1, =EPLL_KVAL
str r1, [r0, #0x18] ; EPLL_CON1
ldr r1, =((1<<31)+(EPLL_MVAL<<16)+(EPLL_PVAL<<8)+(EPLL_SVAL))
str r1, [r0, #0x14] ; EPLL_CON0
;------------------------------------
; Enable PLL Clock Out
;------------------------------------
ldr r0, =CLK_SRC
ldr r1, [r0]
orr r1, r1, #0x7 ; PLL Clockout
str r1, [r0] ; System will be waiting for PLL unlocked after this instruction
;------------------------------------
; OneNAND Setting
;------------------------------------
ldr r0, =ONENAND_BaseAddress
ldr r1, =0x40e0
str r1, [r0]
mov r0, #0x00000000 ; bootram region in OneNAND
mov r1, #0x0C000000 ; steppingstone region
boot_to_step
ldmia r0!, {r4-r7,r9-r12}
stmia r1!, {r4-r7,r9-r12} ; Copy the image from DataBuffer0 into Stepping Stone.
cmp r0, #0x400
bne boot_to_step
add pc, pc, #0x0c000000
stepping_stone
nop
;------------------------------------
; Expand Memory Port 1 to x32
;------------------------------------
ldr r0, =MEM_SYS_CFG
ldr r1, [r0]
bic r1, r1, #0x80 ; ADDR_EXPAND to "0"
str r1, [r0]
;------------------------------------
; Initialize Dynamic Memory Controller
;------------------------------------
bl InitDMC
;------------------------------------
; Power Management Routine
; (WakeUp Processing)
;------------------------------------
ldr r0, =RST_STAT
ldr r1, [r0]
and r1, r1, #0x3F
cmp r1, #0x8
bne Normal_Boot_Sequence ; Normal Booting (Not Wake Up)
ldr r0, =DRAM_BASE_PA_START ; DRAM Base Physical Address
add r0, r0, #IMAGE_NK_OFFSET ; NK Offset in DRAM
mov pc, r0 ; Jump to StartUp address
b .
Normal_Boot_Sequence
;------------------------------------
; Clear DRAM
;------------------------------------
[ {FALSE}
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 r0, =DRAM_BASE_PA_START ; Start address (Physical 0x5000.0000)
ldr r9, =DRAM_SIZE ; 128 MB of RAM
10
stmia r0!, {r1-r8}
subs r9, r9, #32
bne %B10
]
ldr r7, =DownloadAddress ; Address to download
mov r4, #ONBL2_START_BLOCK ; Block Number....................rb1004
mov r3, #ONBL2_START_PAGE ; Page Number
page_increment
;nop
;b page_increment
ldr r2, =ONENAND_ReadBase ; Map01 command base address
add r2, r2, r4, LSL #12 ; Block Address Setting....................rb1004
mov r8, #0x80 ; Count to move (0x80*4burst*4byte = 2KB)
add r3, r3, #1 ; Increment the Page Number
add r2, r2, r3, LSL #6 ; Address to load data
move_page
ldmia r2, {r9-r12} ;
stmia r7!, {r9-r12} ;
subs r8, r8, #0x1 ; Count decrement
bne move_page
ldr r0, =0x70100000
int_wait
; ldr r1, [r0, #0x30]
; tst r1, #0x400 ; check the INT_ACT bit of OneNand INT_ERR_STAT register
; beq int_wait
mov r1, #0x400
str r1, [r0, #0x50] ; clear the INT_ACT bit
cmp r3, #63 ; Repeat movement to page number 63 (126KB)
blt page_increment
add r4, r4, #1 ; Block Number Increment...............rb1004
mov r3, #0xFFFFFFFF ; .....................rb1004
cmp r4, #1 ; Block Size Number....................rb1004
blt page_increment ; .....................rb1004
ldr r0, =DownloadAddress
mov pc, r0 ; Jump to download address
;------------------------------------
; Jump to Main() "C" Routine
;------------------------------------
bl main
b . ; Should not be here...
ENTRY_END
;------------------------------------------------------------------------------
;
; InitDMC Function
;
; Initialize DMC(Dynamic Memory Controller) and DRAM
;
;------------------------------------------------------------------------------
LEAF_ENTRY InitDMC
;---------------------------
; Initialize DMC (mDDR)
;---------------------------
[ USE_DMC1
ldr r0, =DMC1_BASE ; DMC1 base address
ldr r1, =0x4
str r1, [r0, #INDEX_MEMCCMD] ; Enter the Config. Mode
[ DVS_EN
ldr r1, =DMC_DDR_REFRESH_PRD_DVS ; Refresh Rate is set to the lowest HCLK frequency when DVS is enabled
|
ldr r1, =DMC_DDR_REFRESH_PRD ; Timing Para.
]
str r1, [r0, #INDEX_REFRESH]
ldr r1, =DMC_DDR_CAS_LATENCY
str r1, [r0, #INDEX_CASLAT]
ldr r1, =DMC_DDR_t_DQSS
str r1, [r0, #INDEX_T_DQSS]
ldr r1, =DMC_DDR_t_MRD
str r1, [r0, #INDEX_T_MRD]
ldr r1, =DMC_DDR_t_RAS
str r1, [r0, #INDEX_T_RAS]
ldr r1, =DMC_DDR_t_RC
str r1, [r0, #INDEX_T_RC]
ldr r1, =DMC_DDR_t_RCD
ldr r2, =DMC_DDR_schedule_RCD
orr r1, r1, r2
str r1, [r0, #INDEX_T_RCD]
;ldr r1, =DMC_DDR_t_RFC
;ldr r2, =DMC_DDR_schedule_RFC
;orr r1, r1, r2
ldr r1, =0xB2
str r1, [r0, #INDEX_T_RFC]
ldr r1, =DMC_DDR_t_RP
ldr r2, =DMC_DDR_schedule_RP
orr r1, r1, r2
str r1, [r0, #INDEX_T_RP]
ldr r1, =DMC_DDR_t_RRD
str r1, [r0, #INDEX_T_RRD]
ldr r1, =DMC_DDR_t_WR
str r1, [r0, #INDEX_T_WR]
ldr r1, =DMC_DDR_t_WTR
str r1, [r0, #INDEX_T_WTR]
ldr r1, =DMC_DDR_t_XP
str r1, [r0, #INDEX_T_XP]
ldr r1, =DMC_DDR_t_XSR
str r1, [r0, #INDEX_T_XSR]
ldr r1, =DMC_DDR_t_ESR
str r1, [r0, #INDEX_T_ESR]
ldr r1, =DMC1_MEM_CFG
str r1, [r0, #INDEX_MEMCFG]
ldr r1, =DMC1_MEM_CFG2
str r1, [r0, #INDEX_MEMCFG2]
[ USE_DMC1_CHIP0
ldr r1, =DMC1_CHIP0_CFG
str r1, [r0, #INDEX_CHIP0_CFG]
]
[ USE_DMC1_CHIP1
ldr r1, =DMC1_CHIP1_CFG
str r1, [r0, #INDEX_CHIP1_CFG]
]
[{TRUE}
ldr r1, =DMC1_USER_CFG
str r1, [r0, #INDEX_USER_CFG]
]
;---------------------------------------------
; DMC1 DDR Chip 0 configuration direct command reg
;---------------------------------------------
[ USE_DMC1_CHIP0
; DMC1 DDR Chip 0 configuration direct command reg
; NOP
ldr r1, =DMC_NOP0
str r1, [r0, #INDEX_DIRECTCMD]
; Precharge All
ldr r1, =DMC_PA0
str r1, [r0, #INDEX_DIRECTCMD]
; Auto Refresh 2 time
ldr r1, =DMC_AR0
str r1, [r0, #INDEX_DIRECTCMD]
str r1, [r0, #INDEX_DIRECTCMD]
; Mode Reg (MRS, CAS3, BL4)
ldr r1, =DMC_mDDR_MR0
str r1, [r0, #INDEX_DIRECTCMD]
; EMRS
ldr r1, =DMC_mDDR_EMR0 ; DS:Full, PASR:Full Array
str r1, [r0, #INDEX_DIRECTCMD]
] ; USE_DMC1_CHIP0
;---------------------------------------------
; DMC1 DDR Chip 1 configuration direct command reg
;---------------------------------------------
[ USE_DMC1_CHIP1
; DMC1 DDR Chip 1 configuration direct command reg
; NOP
ldr r1, =DMC_NOP1
str r1, [r0, #INDEX_DIRECTCMD]
; Precharge All
ldr r1, =DMC_PA1
str r1, [r0, #INDEX_DIRECTCMD]
; Auto Refresh 2 time
ldr r1, =DMC_AR1
str r1, [r0, #INDEX_DIRECTCMD]
str r1, [r0, #INDEX_DIRECTCMD]
; EMRS
ldr r1, =DMC_mDDR_EMR1 ; DS:Full, PASR:Full Array
str r1, [r0, #INDEX_DIRECTCMD]
; Mode Reg (MRS, CAS3, BL4)
ldr r1, =DMC_mDDR_MR1
str r1, [r0, #INDEX_DIRECTCMD]
] ; USE_DMC1_CHIP1
; Enable DMC1
mov r1, #0x0
str r1, [r0, #INDEX_MEMCCMD]
Wait_for_DMC1Ready
ldr r1, [r0, #INDEX_MEMSTAT]
mov r2, #0x3
and r1, r1, r2
cmp r1, #0x1
bne Wait_for_DMC1Ready
] ; USE_DMC1
NOP
mov pc, lr
ENTRY_END
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?