📄 boot.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
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; SDRAM Mode Register
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ 22 20 21 19 18 17 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_NAP, 0x00a2000c
.equ SDRAM_CASL, SDRAM_MODE_CAS2
.equ SDRAM_CTRL, SDRAM_CTRL_CAS2_NAP
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; Start here
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.text
.extern syscall_handler
.extern IRQHandler
.extern FIQHandler
ENTRY:
B ColdReset
B UndefinedInstruction
B syscall_handler
B PrefetchAbort
B DataAbort
B ReservedHandler
B IRQHandler
B FIQHandler
@;;; GBLA counter
@;;;counter SETA 0
@;;; WHILE counter<64 ; Entries for 0-63M
@;;; DCD &0
@;;;counter SETA counter+1
@;;; WEND
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;; Abort Handlers
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.extern abort
.ALIGN
UndefinedInstruction:
mov r0, #0
sub r1, lr, #4
bl abort
B terminate
.ALIGN
syscall_handler:
mov r0, #0
sub r1, lr, #4
B syscall_handler
.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
IRQHandler:
.align
FIQHandler:
/***************************************
;; power up enter here
***************************************/
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, #0x1 @16 bits for access
orr r1, r1, #0x40 @for non_burst RD_WT=15 Acce_WT = 8
str r1, [r0]
@;;delay
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, #0x66 @ 70.04 Mhz
str r1, [r0, #0x28]
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; init_sdram
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ldr r2, =SDRAM_CTRL
mov r1, #0x80000000
ldr r3, [r1, #0]
bic r3,r3,#0xff000000
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] @ sdram_ctl init_val
@; 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
@
orr r1,r1,#0xc
mov r2,#0x80000000
str r1,[r2,#0] @enable precharge
mov r1,#0x10
refloop:
bl delay10us
sub r1, r1, #1
cmp r1, #0
bne refloop
mov r2, #0x118
mov r1, #0x80000000
str r2, [r1, #4] @set the refresh rate
@enable refresh
mov r2, #0xa20000
str r2, [r1] @enable refresh
@delay for refresh
mov r1,#0x10
refloop0:
bl delay10us
sub r1, r1, #1
cmp r1, #0
bne refloop0
@ 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, r0
/* @ 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]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Now Switch to RUN Mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
L5: 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
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 + -