?? startup.s
字號:
; 2003.09.23 KT2000N
; *******************************************************
; * NAME : STARTUP.S *
; * Version : 25.11.2002 ver 1.0 (8MBYTE) *
; * Project name: MBA-2410(S3C2410) *
; * Description: *
; * C start up codes *
; * Configure Memory, Initialize Ports, ISR, Stacks *
; * Initialize C-variables *
; * Fill zeros into zero-initialized C-variables *
; * *
; * CONSINE,CO LTD. *
; *******************************************************
;;------------------------------------
;; | RESERVED |
;; |----------------------------|0x48000000
;; | (NAND FLASH) |
;; |----------------------------|0x40000000
;; | RESERVED |
;; |----------------------------|0x38000000
;; | Interrupt Handler |
;; |----------------------------|0x37FFFF00
;; | STACK AREA |
;; |----------------------------|0x37000000
;; | HEAP AREA(R/W base) |
;; |----------------------------|0x31000000 DATA AREA(R/W AND ZI)
;; | APPLICATION AREA(SDRAM) |
;; |----------------------------|0x30000000
;; | RESERVED |
;; |----------------------------|0x28000000
;; | SM501 |
;; |----------------------------|0x20000000 (128KBYTE)
;; | RESERVED |
;; |----------------------------|0x08000000
;; | (NORFLASH) |
;; ---------------------------- 0x00000000 BOOT RO BASE 0x00
_ISR_STARTADDRESS EQU 0x37FFFF00
;Pre-defined constants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
R1_I EQU (1<<12)
AREA Init,CODE,READONLY
GET 2410.s
IMPORT |Image$$BOOTROM$$Limit|
IMPORT |Image$$SDRAM$$Base|
IMPORT |Image$$SDRAM$$Limit|
IMPORT |Image$$SDRAM$$Length|
IMPORT |Image$$SDRAM1$$ZI$$Base|
IMPORT |Image$$SDRAM1$$ZI$$Limit|
IMPORT |Image$$SDRAM1$$Base|
IMPORT |Image$$SDRAM1$$Limit|
IMPORT |Image$$SDRAM1$$Length|
IMPORT main_boot
EXPORT __user_initial_stackheap
ENTRY
b ResetHandler ;for debug 0x00
b HandlerUndef ;handlerUndef 0x04
b HandlerSWI ;SWI interrupt handler 0x08
b HandlerPabort ;handlerPAbort 0x0c
b HandlerDabort ;handlerDAbort 0x10
b . ;handlerReserved 0x14
b HandlerIRQ ;0x18
b HandlerFIQ ;0x1c
;***************
;* START *
;***************
ResetHandler
ldr r0,=|Image$$BOOTROM$$Limit|
ldr r0,=|Image$$SDRAM$$Length|
ldr r0,=|Image$$SDRAM$$Base|
ldr r0,=|Image$$SDRAM1$$Base|
ldr r0,=|Image$$SDRAM1$$Length|
ldr r0,=|Image$$SDRAM1$$ZI$$Base|
ldr r0,=|Image$$SDRAM1$$ZI$$Limit|
ldr r0,=|Image$$SDRAM$$Limit|
ldr r0,=|Image$$SDRAM1$$Limit|
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr_cxsf,r0
ldr r0,=WTCON ;watch dog disable
ldr r1,=0x0
str r1,[r0]
ldr r0,=1000
delay1
sub r0,r0,#1 ;r0-1->r0
cmp r0,#0x1
bne delay1 ;!=
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
ldr r1, =0x7ff
ldr r0, =INTSUBMSK
str r1, [r0]
;****************************************************
;* Configuration Port control registers *
;****************************************************
; Clock configration
ldr r0,=LOCKTIME ;PLL lock counter value;
ldr r1,=0xFFFFFF
str r1,[r0]
ldr r0,=MPLLCON ;Fout=(MDIV+8)*Fin/((PDIV+2)*2^SDIV)
;Fout*2^SDIV<170 and 1<Fin/(PDIV+2)<2
;MDIV=bit 19-12,PDIV=bit 9-4 SDIV=bit 1-0
ldr r1,=0x44011 ;152M
str r1,[r0]
ldr r0,=4000 ;
delay2
sub r0,r0,#1 ;r0-1->r0
cmp r0,#0x1
bne delay2 ;!=
ldr r0,=UPLLCON ;USB時鐘
ldr r1,=0x48032 ;
str r1,[r0]
ldr r0,=CLKCON ;enable peripherals clock
ldr r1,=0x7fff0 ;使能外部時鐘
str r1,[r0]
ldr r0,=4000 ;
delay3
sub r0,r0,#1 ;r0-1->r0
cmp r0,#0x1
bne delay3 ;!=
ldr r0, =CLKDIVN ;分頻比
mov r1, #3
str r1, [r0]
;;;Nandinit
mov r1, #0x4E000000
ldr r2, =0xf830 ; initial value
str r2, [r1, #0x00]
ldr r2, [r1, #0x00]
bic r2, r2, #0x800 ; enable chip
str r2, [r1, #0x00]
mov r2, #0xff ; RESET command
strb r2, [r1, #0x04]
mov r3, #0 ; wait
one add r3, r3, #0x1
cmp r3, #0xa
blt one
two ldr r2, [r1, #0x10] ; wait ready
tst r2, #0x1
beq two
ldr r2, [r1, #0x00]
orr r2, r2, #0x800 ; disable chip
str r2, [r1, #0x00]
;;;Nandinit
mov r0, #0
mcr p15, 0, r0, c7, c7, 0
mcr p15, 0, r0, c8, c7, 0
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300
bic r0, r0, #0x00000087
orr r0, r0, #0x00000002
orr r0, r0, #0x00001000
mcr p15, 0, r0, c1, c0, 0
;Memory configration
ldr r0,=SMRDATA ;
ldmia r0,{r1-r13} ;將r0中的數據讀到r1--r13中,r0自動加1
ldr r0,=BWSCON
stmia r0,{r1-r13}
;****************************************************
;* Initialize stacks *
;****************************************************
ldr sp, =SVCStack
bl InitStacks
;init interrupt controller
ldr r0,=INTMOD ;all interrupt is IRQ interrupt
ldr r1,=0x0
str r1,[r0]
ldr r3, =0x30000000
ldr r1, =0x30140000
mov r2, #0
3
cmp r3, r1 ;把0x30100000--0x30140000清0
strcc r2, [r3],#4
bcc %b3
ldr r3, =0x37000000
ldr r1, =0x37020000
mov r2, #0
4
cmp r3, r1 ;把0x37000000--0x037020000清0
strcc r2, [r3],#4
bcc %b4
;****************************************************搬系統程序到運行區域
ldr r0,=|Image$$BOOTROM$$Limit|;****ROM代碼區結束地址(=ROM數據的起始地址)
ldr r1,=|Image$$SDRAM$$Limit|;****
ldr r3,=|Image$$SDRAM$$Length|;****
ldr r4,=|Image$$SDRAM$$Base|;****
ldr r5,=0
0
cmp r5, r3 ; Copy prog to SDRAM
ldrcc r2, [r0],#4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4//r0
strcc r2, [r4],#4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
add r5,r5,#4
bcc %b0
ldr r3,=|Image$$SDRAM1$$Base|
ldr r1,=|Image$$SDRAM1$$Length|
ldr r5,=0
1
cmp r5, r1 ; Copy init data
ldrcc r2, [r0],#4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4
strcc r2, [r3],#4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
add r5,r5,#4
bcc %b1
;Zero init base => top of initialised data
ldr r3, =|Image$$SDRAM1$$ZI$$Base|
; Top of zero init segment
ldr r1, =|Image$$SDRAM1$$ZI$$Limit|
mov r2, #0
2
cmp r3, r1 ; Zero init
strcc r2, [r3],#4
bcc %b2
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
loop ;主循環部分
; LDR r0,=PDATG
; LDR r1,[r0]
; EOR r1,r1,#4
; STR r1,[r0] ;喂狗部分
bl main_boot
b loop
B .
DCB "####廣州市科賽恩電氣技術有限公司###"
DCB "www.cosine-ee.com"
HandlerFIQ
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandleFIQ
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
HandlerUndef
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandleUndef
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
HandlerSWI
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandleSWI
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
HandlerDabort
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandleDabort
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
HandlerPabort
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandlePabort
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
HandlerIRQ
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=HandleIRQ
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
__user_initial_stackheap
LDR r0, =|Image$$SDRAM1$$ZI$$Limit| ;Heap B
LDR r1, =|Image$$SDRAM1$$ZI$$Limit| ;Stack B
add r1,r1,#0x8000
; r2 not used (HL)
; r3 not used (SL)
MOV pc, lr
;****************************************************
;* The function for initializing stack *
;****************************************************
InitStacks
mrs r0,cpsr
bic r0,r0,#MODEMASK ;MODEMASK=0x1f
orr r1,r0,#UNDEFMODE|NOINT ;UNDEFMODE=0x1b ;NOINT=0xc0
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UndefStack
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=IRQStack
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode
ldr sp,=FIQStack
bic r0,r0,#MODEMASK|NOINT
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack
mov pc,lr ;The LR register may be not valid for the mode changes.子程序返回
SMRDATA
DCD 0x221ed110 ;2410;分配一段內存單元
DCD 0x7ffc ;GCS0:BOOT ROM;;
DCD 0x7ffc ;GCS1 no use;;;
DCD 0x700 ;GCS2 Nor FLASH;;
DCD 0x1f4c ;GCS4 no use;;;
DCD 0x54a8 ;GCS5 no use;;
DCD 0x700 ;GCS3 no use;;
DCD 0x18009 ;GCS6;;
DCD 0x18009 ;GCS7 no use;;
DCD 0x8e0459 ;REFRESH
DCD 0x32 ;SCLK BANKSIZE=8M
DCD 0x30 ;MRSR6 CL=2clk
DCD 0x30 ;MRSR7
ALIGN
AREA RamData, DATA, READWRITE
^ (_ISR_STARTADDRESS-0x20000)
UserStack # 256
SVCStack # 65536
UndefStack # 256
AbortStack # 256
IRQStack # 4096
FIQStack # 256
^ (_ISR_STARTADDRESS)
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -