?? hmsinit.s
字號:
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;
@;; Copyright (c) 2000-2001 Hyundai Electronics, Ltd. All rights reserved.
@;;
@;; ArMon Startup Code for
@;; HMS7201/7202 : CStartup.s
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; Some ARM720 CPSR bit discriptions
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.equ Mode_USR32, 0x10
.equ Mode_FIQ32, 0x11
.equ Mode_IRQ32, 0x12
.equ Mode_ABT32, 0x17
.equ Mode_UND32, 0x1b
.equ Mode_SVC32, 0x13
.equ I_Bit, 0x80
.equ F_Bit, 0x40
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; MMU Register discription
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@p15 CP 15
@c0 CN 0
@c1 CN 1
@c2 CN 2
@c3 CN 3
.equ CtrlMMU, 1
.equ CtrlAlign, 2
.equ CtrlCache, 4
.equ CtrlWBuff, 8
.equ CtrlBigEnd, 128
.equ CtrlSystem, 256
.equ CtrlROM, 512
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; SDRAM Mode Register
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ 22 20 21 19 18 18 16 15 14 13 12 11 _AMBA address pin
@ A11 A10 A09 A08 A07 A06 A05 A04 A03 A02 A01 A00 _SDRAM address pin
@ OPCODE | 0 | LMODE |BT | BL
@ OPCODE
@ 'b0000 : Burst Read/Write
@ 'bxx01 : Reserved
@ 'bxx10 : Burst read and Single write
@ 'bxx11 : Reserved
@ LMODE ( CE Latency )
@ 'b000 : Reserved
@ 'b001 : -
@ 'b010 : CAS2
@ 'b011 : CAS3
@ 'b1xx : Reserved
@ BT : Burst Type
@ 'b0 : Sequential
@ 'b1 : Interleave
@ BL : Burst Length
@ BT=0 BT=1
@ 'b000 : 1 1
@ 'b001 : 2 2
@ 'b010 : 4 4
@ 'b011 : 8 8
@ 'b100 : R R
@ 'b101 : R R
@ 'b110 : R R
@ 'b111 : F.P. R
@;
.equ SDRAM_MODE_CAS2, (0x20<<11) @0x10000
.equ SDRAM_MODE_CAS3, (0x30<<11) @0x18000
.equ SDRAM_MODE_BL1, (0x00<<11) @0x0
.equ SDRAM_MODE_BL2, (0x01<<11) @0x800
.equ SDRAM_MODE_BL4, (0x02<<11) @0x1000
.equ SDRAM_MODE_BL8, (0x03<<11) @0x1800
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; SDRAM Init Register Value
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.equ SDRAM_CTRL_RFE, 0x00800000 @; Refresh Enable
.equ SDRAM_CTRL_APE, 0x00400000 @; AutoPrecharge Enable
.equ SDRAM_CTRL_CAS2, 0x00200000 @; CAS2
.equ SDRAM_CTRL_CAS3, 0x00300000 @; CAS3
.equ SDRAM_CTRL_BTE, 0x00080000 @; Data Bus Tristate Enable
.equ SDRAM_CTRL_CCL, 0x00040000 @; Clock Control Enable
.equ SDRAM_CTRL_WBE, 0x00020000 @; Write Buffer Enable
.equ SDRAM_CTRL_B1E, 0x000000c0 @; BANK1 Enable
.equ SDRAM_CTRL_B0E, 0x0000000c @; BANK0 Enable
.equ SDRAM_CTRL_CAS2_AP, 0x00e200cc @ Disable DataBusTri
@.equ SDRAM_CTRL_CAS2_AP, 0x00ea00cc @ Data Bus trista
.equ SDRAM_CTRL_CAS2_NAP, 0x00a200cc
.equ SDRAM_CTRL_CAS3_AP, 0x00fa00cc
.equ SDRAM_CTRL_CAS3_NAP, 0x00ba00cc
.equ SDRAM_CTRL_CAS2_TEST, 0x00a400cc
.equ SDRAM_CASL, SDRAM_MODE_CAS2
.equ SDRAM_CTRL, SDRAM_CTRL_CAS2_NAP @iikoy
@.equ SDRAM_CTRL, SDRAM_CTRL_CAS2_TEST
@.equ SDRAM_CASL, SDRAM_MODE_CAS3
@.equ SDRAM_CTRL, SDRAM_CTRL_CAS3_AP
@.equ SDRAM_CTRL, SDRAM_CTRL_CAS3_NAP
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; Start here
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.text
@.extern syscall_handler
@.extern IRQHandler
@.extern FIQHandler
ENTRY:
B ColdReset
B UndefHandler
B syscall_handler
B PrefetchAbort
B DataAbort
B ReservedHandler
B IRQHandler
B FIQHandler
.align
IRQHandler:
@將要使用的寄存器壓棧r0,r1
stmdb sp!, {r0-r11, ip, lr}
ldr r0 ,=0x80024090 @中斷ID寄存器
ldr r0 ,[r0]
and r0 ,r0,#0x1f @取出iqr ID
ldr r1 ,=0x80024010 @SVR0
add r1 ,r1,r0, asl #2
ldr pc ,[r1]
ldmia sp!, {r0-r11, ip, lr}/* pop r0-r11, ip, lr */
subs pc, r14, #4
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ .if 1-STANDALONE @IF STANDALONE = 0
@; #define TF_ARMON_MAGIC 0x41524d4f // ARMO
@ .extern partition_table
@ .long 0x41524d4f @cmpmi r2, pc, asr #26
@ .long partition_table
@ .endif
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; Leave as nops
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; GBLA counter
@;;counter SETA 0
@;; WHILE counter<64 ; Entries for 0-63M
@;; DCD &0
@;;counter SETA counter+1
@;; WEND
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; Abort Handlers
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.extern abort
.align
UndefHandler:
mov r0, #0
sub r1, lr, #4
bl abort
B terminate
.align
PrefetchAbort:
mov r0, #1
sub r1, lr, #4
bl abort
B terminate
.align
DataAbort:
mov r0, #2
sub r1, lr, #4
bl abort
B terminate
.align
ReservedHandler:
mov r0, #3
sub r1, lr, #4
bl abort
B terminate
.align
syscall_handler:
b syscall_handler
.align
FIQHandler:
b FIQHandler
ColdReset:
ldr r0,=0x8002b000
mov r1,#0x0
str r1,[r0] @disable watchdog
ldr r0,=0x80024000
str r1,[r0] @disable all interrupt
ldr r0,=0x80024004
str r1,[r0] @clear all interrupt pending bits
ldr r0,=0x80003000
ldr r1, [r0]
and r1, r1, #0x3
orr r1, r1, #0x40
str r1, [r0] @設置MEMCFG0寄存器ROM chip0,禁止突發模式,正常訪問等待狀態數為8
mov r1, #0x1000
resetLoop:
bl delay10us
sub r1, r1, #1
cmp r1, #0
bne resetLoop
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; set system clock to 70 MHz
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldr r0,=0x80001000
ldr r1, [r0, #0x28]
bic r1, r1, #0xff
@;;;;;;; orr r1, r1, #0x76 ; 100 Mhz
orr r1, r1, #0x66 @ 70.04 Mhz
@;;;;;;; orr r1, r1, #0x6e ; 84.7 Mhz
str r1, [r0, #0x28]
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Initialize SDRAM Controller and Seting Mode Register
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; 7202 support 2 banks, so initialize both of them
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; ldr r2, =0x00a200cc
@.equ SDRAM_ini_val, 0x003e0000
/* SDRAM_IDLE 0x0032,0000 //(
!(0x1<<23 | 0x3<<2 | 0x3<<6) ) */
@.equ SDRAM_PRECHARGE_CHIP0, 0x007e000c
/* ( 0x1<<22 | 0x3<<2 ) */
@.equ SDRAM_PRECHARGE_CHIP1, 0x007e00c0
/* ( 0x1<<22 | 0x3<<6 ) */
@.equ SDRAM_REFRESH, 0xfe000000
/* ( 0x1<<23 & !(0x3<<6 | 0x3<<2) ) */
/* wait for 8us X 2 */
@.equ SDRAM_complete, 0xfe00cc
/* (0x1<<23 | 0x3<<6 | 0x3<<2) */
.equ SDRAM_Expect, 0xa2000c
@.equ SDRAM_mode, 0x32
ldr r0, =SDRAM_Expect
mov r1, #0x80000000
ldr r3, [r1]
cmp r3,r0
beq 50 /* need set? */
@ ldr r0, =SDRAM_ini_val /* init set */
/* str r0, [r1]
mov r3,#0x100
l10:
bl delay10us
sub r3,r3,#1
cmp r3,#0
bne l10
ldr r2, =SDRAM_PRECHARGE_CHIP0 /* precharge */
/* ldr r4, =SDRAM_PRECHARGE_CHIP1
orr r2,r2,r4
orr r2,r2,r0
mov r1, #0x80000000
str r2,[r1]
mov r3,#0x1000
l20:
bl delay10us
sub r3,r3,#1
cmp r3,#0
bne l20
mov r0,#0x80000004 /* set the rest regs */
/* mov r1,#0x118
str r1,[r0]
ldr r4,=SDRAM_REFRESH /* refresh */
/* orr r2,r2,r4
str r2,[r1]
mov r3,#0x1000
l30:
bl delay10us
sub r3,r3,#1
cmp r3,#0
bne l30
mov r1, #0x80000000 /* complete */
/* ldr r3, =SDRAM_Expect
str r3,[r1]
mov r3,#0x1000
l40:
bl delay10us
sub r3,r3,#1
cmp r3,#0
bne l40
mov r0,#0x44000000 /* set the mode register */
/* mov r2,#0x32
add r0,r0,r2,LSL#11
ldr r0,[r0]
bl delay10us
mov r0,#0x46000000
mov r2,#0x32
add r0,r0,r2,LSL#11
ldr r0,[r0]
mov r0,#0x80000008
mov r1,#0x3
str r1,[r0]
/*
ldr r2, =SDRAM_CTRL
mov r1, #0x80000000
ldr r3, [r1, #0]
cmp r3, r2
beq L5
@ IO_SdramControl = CAS2|SDRAM_WB;
mov r1, #0x220000 @ CAS2
@ mov r1, #0x320000 @ CAS3
mov r2, #0x80000000
str r1, [r2, #0]
@; Refresh Value = 0x230 for 16MB(128Mbit)x2
@; Refresh Value = 0x230/2 for 32MB(256Mbit)x2
@; For simplicity, Refresh value for 32MBx2 is used, and it would
@; be no problem for 16MBx2
@; 0x230 >> 1 = 0x118
@
mov r2, #0x118
mov r1, #0x80000000
str r2, [r1, #4]
@enable refresh
mov r2, #0xa20000
str r2, [r1]
@delay for refresh
mov r1,#0x10
refloop:
bl delay10us
sub r1, r1, #1
cmp r1, #0
bne refloop
@set slots
mov r1,#0x80000000
ldr r2,[r1]
orr r2,r2,#0xcc
str r2,[r1]
@ SDRAM Mode Register Setting
@ Tmp = IO(SdramModeReg | SdramModeBurstLength8 | SdramModeCAS2 |Device0);
mov r1, #SDRAM_CASL
add r1, r1, #SDRAM_MODE_BL8
add r1, r1, #0x44000000
ldr r1, [r1, #0]
mov r0, r1
@ Tmp = IO(SdramModeReg | SdramModeBurstLength8 | SdramModeCAS2 |Device1);
mov r1, #SDRAM_CASL
add r1, r1, #SDRAM_MODE_BL8
add r1, r1, #0x46000000
ldr r1, [r1, #0]
mov r0, r1
ldr r2, =SDRAM_CTRL
mov r1, #0x80000000
str r2, [r1, #0]
mov r2, #0
mov r1, #0x80000000
str r2, [r1, #8]
*/
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; End of Initialization
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; MMU Initialization ( Pagetable, and etc )
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
50:
/* .extern L0PageTable
@ Save r0 to #2 reg of coprocessor #15
@ This register value means the pagetable base address
ldr r0, =L0PageTable
@.ifdef ONSDRAM
@.if ONSDRAM @IF :DEF: ONSDRAM :LAND: ONSDRAM > 0
@orr r0, r0, #0x40000000
@.endif
@.endif
mcr p15, 0, r0, c2, c0, 0
nop
nop
nop
nop
nop
nop
mvn r0, #0
@ Save r0 to #3 reg of coprocessor #15
@ With #3 reg, domain access control can be utilized
mcr p15, 0, r0, c3, c0, 0
@ Save r0 to #0 reg of coprocessor #15
@ This enables MMU, Cache and WriteBuffer
mov r0, #CtrlMMU+CtrlCache+CtrlWBuff
mcr p15, 0, r0, c1, c0, 0
nop
nop
mov r0, #CtrlMMU+CtrlCache+CtrlWBuff
mcr p15, 0, r0, c1, c0, 0
nop
nop*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Now Switch to RUN Mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldr r0, =0x80001000
mov r1, #1
str r1, [r0]
nop
nop
nop
nop
nop
# ********************************************************
# * Copy and paste RW data/zero initialized data *
# ********************************************************
ldr r0, =Image_RO_Limit /* Get pointer to ROM data */
ldr r1, =Image_RW_Base /* and RAM copy */
ldr r3, =Image_ZI_Base /* Zero init base => top of initialised data */
cmp r0, r1 /* Check that they are different */
beq F1
F0:
cmp r1, r3 /* Copy init data */
LDRCC r2, [r0], #4 /* --> LDRCC r2, [r0] + ADD r0, r0, #4 */
strcc r2, [r1], #4 /* --> strcc r2, [r1] + ADD r1, r1, #4 */
bcc F0
F1:
ldr r1, =Image_ZI_Limit /* Top of zero init segment */
mov r2, #0
F2:
cmp r3, r1 /* Zero init */
strcc r2, [r3], #4
bcc F2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Stack Setup for each MODE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@; Set up SVC stack to be 4K on top of zero-init data
LDR r1, =installStack
ADD sp, r1, #4096
@; Set up IRQ and FIQ stacks
MOV r0, #(Mode_IRQ32 | I_Bit)
MSR cpsr_csxf, r0
MOV r0, r0
ADD sp, r1, #4096*2
MOV r0, #(Mode_FIQ32 | I_Bit | F_Bit)
MSR cpsr_csxf, r0
MOV r0, r0
ADD sp, r1, #4096*3
@; Set up undefine stacks
MOV r0, #(Mode_UND32 | I_Bit | F_Bit)
MSR cpsr_csxf, r0
MOV r0, r0
ADD sp, r1, #(4096*3+512)
@; Set up abort stacks
MOV r0, #(Mode_ABT32 | I_Bit | F_Bit)
MSR cpsr_csxf, r0
MOV r0, r0
ADD sp, r1, #(4096*3+1024)
@; Enter SVC mode
MOV r0,#Mode_SVC32
MSR cpsr_csxf, r0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Stack Setup for each MODE end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MRS r0, CPSR
bic r0, r0, #(I_Bit | F_Bit) /* enable interrupt */
msr CPSR_cxsf, r0
# jump to Main()
.extern Main
.if STANDALONE @IF STANDALONE = 1
MOV r0, #1
.endif
BL Main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Abnormal Termination
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
terminate:
B terminate
delay10us:
mov r0, #10
_delay1us:
sub r0, r0, #1
cmp r0, #0
bne _delay1us
mov pc, lr
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Stack Memory Allocation
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.data
@AREA Stack, ALIGN=10, DATA, NOINIT
installStack:
.zero 4096*5
TOPinstallStack:
.end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;; End of CStartup.s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -