📄 2440init.s
字号:
;=========================================
;
;=========================================
GET Option.inc
GET memcfg.inc
GET 2440addr.inc
;====================================
; MMU Cache/TLB/etc on/off functions
;====================================
R1_I EQU (1<<12)
R1_C EQU (1<<2)
R1_A EQU (1<<1)
R1_M EQU (1)
R1_iA EQU (1<<31)
R1_nF EQU (1<<30)
BIT_SELFREFRESH EQU (1<<22)
;Pre-defined constants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x53
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
;The location of stacks
UserStack EQU (_STACK_BASEADDRESS-0x5000)
SVCStack EQU (_STACK_BASEADDRESS-0x4000)
UndefStack EQU (_STACK_BASEADDRESS-0x3000)
AbortStack EQU (_STACK_BASEADDRESS-0x2000)
IRQStack EQU (_STACK_BASEADDRESS-0x1000)
FIQStack EQU (_STACK_BASEADDRESS-0x0)
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;decrement sp(to store jump address)
stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address)
ldr r0,=$HandleLabel;load the address of HandleXXX to r0
ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX
str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack
ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)
MEND
IMPORT |Image$$RO$$Base| ; Base of ROM code
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$RW$$Limit| ; End of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialise
IMPORT Main ; The main entry of mon program
IMPORT __C_Inits ;
;IMPORT nand_init
IMPORT nand_read_ll
AREA Init,CODE,READONLY
ENTRY
EXPORT ImageEntryPoint
ImageEntryPoint
b ResetHandler
b HandlerUndef ;handler for Undefined mode
b HandlerSWI ;handler for SWI interrupt
b HandlerPabort ;handler for PAbort
b HandlerDabort ;handler for DAbort
b Auto_Reset ;reserved
b HandlerIRQ ;handler for IRQ interrupt
b HandlerFIQ ;handler for FIQ interrupt
;HandlerIRQ HANDLER HandleIRQ
HandlerIRQ
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9}
ldr r9,=INTOFFSET
ldr r9,[r9]
ldr r8,=HandleEINT0
add r8,r8,r9,lsl #2
ldr r8,[r8]
str r8,[sp,#8]
ldmfd sp!,{r8-r9,pc}
HandlerFIQ HANDLER HandleFIQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
EXPORT Auto_Reset
Auto_Reset
ldr r0,=WTCON ;watch dog disable
ldr r1,=0x8021
str r1,[r0]
b .
LTORG
EXPORT SWI_UNF_Def
EXPORT IRQ_FIQ_PABT_Def
EXPORT DABT_Def
SWI_UNF_Def
movs pc,lr
IRQ_FIQ_PABT_Def
subs pc,lr,#4
DABT_Def
subs pc,lr,#8
;=======
; ENTRY
;=======
ResetHandler
ldr r0,=WTCON ;watch dog disable
mov r1,#0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0xffffffff ;all interrupt disable
str r1,[r0]
ldr r0,=SRCPND
str r1,[r0]
ldr r0,=INTPND
str r1,[r0]
ldr r0,=INTSUBMSK
ldr r1,=0x7fff ;all sub interrupt disable, 2002/04/10
str r1,[r0]
;ldr r0,=SUBSRCPND
;str r1,[r0]
;To reduce PLL lock time, adjust the LOCKTIME register.
;ldr r0,=LOCKTIME
;ldr r1,=0xffffff
;str r1,[r0]
mov r1, #CLK_CTL_BASE
ldr r2, clock_locktime
str r2, [r1, #oLOCKTIME]
mov r1, #CLK_CTL_BASE
ldr r2, clkdivn_value
str r2, [r1, #oCLKDIVN]
mrc p15, 0, r1, c1, c0, 0 ; read ctrl register
orr r1, r1, #0xc0000000 ; Asynchronous
mcr p15, 0, r1, c1, c0, 0 ; write ctrl register
mov r1, #CLK_CTL_BASE
ldr r2, mpll_value ; clock default
;ldr r2, mpll_value_USER ; clock user set
str r2, [r1, #oMPLLCON]
;Set memory control registers
adr r0,SMRDATA
ldr r1,=BWSCON ;BWSCON Address
add r2, r0, #52 ;End address of SMRDATA
0
ldr r3, [r0], #4
str r3, [r1], #4
cmp r0, r2
bcc %B0
;Initialize stacks
bl InitStacks
; InitUART
; set GPIO for UART
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_H
ldr r2, gpio_con_uart
str r2, [r1, #oGPIO_CON]
ldr r2, gpio_up_uart
str r2, [r1, #oGPIO_UP]
ldr r1, SerBase
mov r2, #0x0
str r2, [r1, #oUFCON]
str r2, [r1, #oUMCON]
mov r2, #0x3
str r2, [r1, #oULCON]
ldr r2, =0x245
str r2, [r1, #oUCON]
UART_BRD EQU ((UART_PCLK / (UART_BAUD_RATE*16)) - 1)
mov r2, #UART_BRD
str r2, [r1, #oUBRDIV]
mov r3, #100
1 subs r3, r3, #0x1
bne %B1
;bl nand_init
; reset NAND
;nand_init
mov r1, #NAND_CTL_BASE
ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) ; Active low CE Control
str r2, [r1, #oNFCONT]
ldr r2, [r1, #oNFCONT]
ldr r2, =(0x6) ; RnB Clear
str r2, [r1, #oNFSTAT]
ldr r2, [r1, #oNFSTAT]
mov r2, #0xff ; RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 ; wait
1 add r3, r3, #0x1
cmp r3, #0xa
blt %B1
2 ldr r2, [r1, #oNFSTAT] ; wait ready
tst r2, #0x4
beq %B2
ldr r2, [r1, #oNFCONT]
orr r2, r2, #0x2 ; Flash Memory Chip Disable
str r2, [r1, #oNFCONT]
;Copy ROM code to SDRAM
adr r0, ImageEntryPoint
ldr r2, =|Image$$RW$$Base| ; and RAM copy
ldr r3, =|Image$$ZI$$Base|
sub r2,r3,r2
ldr r3, =|Image$$RO$$Limit|
ldr r1, =|Image$$RO$$Base| ; Get pointer to ROM data
add r2,r2,r3
cmp r0,#0
bne %F0
ldr r3,=BWSCON
ldr r3,[r3]
ands r3,r3,#0x06
bne %F1
; boot from NAND flash
mov r0,r1
sub r2,r2,r1
mov r1,#0
ldr lr, =On_The_Ram
b nand_read_ll
; boot from NOR flash
0
cmp r0,r1
beq %F2
1
cmp r1, r2 ; Copy init data
ldrcc r3, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4
strcc r3, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
bcc %B1
2
ldr pc,=On_The_Ram
On_The_Ram
;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 %F2
1
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 %B1
2
ldr r1, =|Image$$ZI$$Limit| ; Top of zero init segment
mov r2, #0
3
cmp r3, r1 ; Zero init
strcc r2, [r3], #4
bcc %B3
adrl r0, BootNand
adrl r1, BootNor
ldr r3,=BWSCON
ldr r3,[r3]
ands r3,r3,#0x06
movne r0,r1
bl PrintStr
adr r0,Say_Hello
bl PrintStr
bl __C_Inits
;sub lr,pc,#8
;ldr pc,=Main
bl Main ;Don't use main() because ......
b Auto_Reset
;function initializing stacks
InitStacks
;Don't use DRAM,such as stmfd,ldmfd......
;SVCstack is initialized before
;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
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
;USER mode has not be initialized.
mov pc,lr
;The LR register won't be valid if the current mode is not SVC mode.
EXPORT PrintChar
PrintChar
mov r1, #UART0_CTL_BASE
1
ldr r2, [r1, #oUTRSTAT]
;and r2, r2, #UTRSTAT_TX_EMPTY
tst r2, #UTRSTAT_TX_EMPTY
beq %B1
str r0, [r1, #oUTXHL]
mov pc, lr
PrintStr
stmfd sp!, {r4, lr}
movs r4, r0
ldmeqfd sp!, {r4, pc}
1
ldrb r0, [r4], #1
cmp r0, #0
ldmeqfd sp!, {r4, pc}
bl PrintChar
b %B1
; PrintHexNibble : prints the least-significant nibble in R0 as a
; hex digit
PrintHexNibble
adr r2, HEX_TO_ASCII_TABLE
and r0, r0, #0xF
ldr r0, [r2, r0] ; convert to ascii
b PrintChar
; PrintHexWord : prints the 4 bytes in R0 as 8 hex ascii characters
; followed by a newline
PrintHexWord
stmfd sp!, {r4, lr}
mov r4, r0
mov r0, r4, LSR #28
bl PrintHexNibble
mov r0, r4, LSR #24
bl PrintHexNibble
mov r0, r4, LSR #20
bl PrintHexNibble
mov r0, r4, LSR #16
bl PrintHexNibble
mov r0, r4, LSR #12
bl PrintHexNibble
mov r0, r4, LSR #8
bl PrintHexNibble
mov r0, r4, LSR #4
bl PrintHexNibble
mov r0, r4
bl PrintHexNibble
mov r0, #'\r'
bl PrintChar
mov r0, #'\n'
bl PrintChar
ldmfd sp!, {r4, pc}
ALIGN 4
HEX_TO_ASCII_TABLE
DCB "0123456789ABCDEF"
Say_Hello
DCB "Welcome to uCOS-II World.\r\n",0
BootNand
DCB "boot from NAND flash\r\n",0
BootNor
DCB "boot from NOR flash\r\n",0
ALIGN 4
SMRDATA
; Memory configuration should be optimized for best performance
; The following parameter is not optimized.
; Memory access cycle parameter strategy
; 1) The memory settings is safe parameters even at HCLK=75Mhz.
; 2) SDRAM refresh period is for HCLK=75Mhz.
DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) ;GCS0
DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) ;GCS1
DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) ;GCS2
DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) ;GCS3
DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) ;GCS4
DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) ;GCS5
DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6
DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7
DCD (0x008e04eb) ;DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
DCD 0xB2 ;SCLK power saving mode, BANKSIZE 128M/128M
DCD 0x20 ;MRSR6 CL=2clk
DCD 0x20 ;MRSR7
; Processor clock values
ALIGN 4
clock_locktime
DCD vLOCKTIME
mpll_value
DCD (M_MDIV<<12)+(M_PDIV<<4)+(M_SDIV)
clkdivn_value
DCD vCLKDIVN
; initial values for serial
;uart_ulcon
; DCD vULCON
;uart_ucon
; DCD vUCON
;uart_ufcon
; DCD vUFCON
;uart_umcon
; DCD vUMCON
SerBase
DCD UART0_CTL_BASE
; inital values for GPIO
gpio_con_uart
DCD vGPHCON
gpio_up_uart
DCD vGPHUP
AREA RamData, DATA, READWRITE
^ _INT_VIC_STARTADDRESS
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
;Don't use the label 'IntVectorTable',
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
HandleEINT0 # 4
HandleEINT1 # 4
HandleEINT2 # 4
HandleEINT3 # 4
HandleEINT4_7 # 4
HandleEINT8_23 # 4
HandleRSV6 # 4
HandleBATFLT # 4
HandleTICK # 4
HandleWDT # 4
HandleTIMER0 # 4
HandleTIMER1 # 4
HandleTIMER2 # 4
HandleTIMER3 # 4
HandleTIMER4 # 4
HandleUART2 # 4
HandleLCD # 4
HandleDMA0 # 4
HandleDMA1 # 4
HandleDMA2 # 4
HandleDMA3 # 4
HandleMMC # 4
HandleSPI0 # 4
HandleUART1 # 4
HandleRSV24 # 4
HandleUSBD # 4
HandleUSBH # 4
HandleIIC # 4
HandleUART0 # 4
HandleSPI1 # 4
HandleRTC # 4
HandleADC # 4
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -