新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ARM启动代码分析(2440init.c)

ARM启动代码分析(2440init.c)

作者: 时间:2016-11-22 来源:网络 收藏


;刚设置好PLL时,系统认为这是PLL还没稳定,所有这时不用PLL的时钟,而用外部晶振做时钟,
;将PLL锁住,过了LOCKTIME后认为PLL已经稳定了,才使用PLL给系统提供时钟。例如S3c2410手
;;册上给出锁住时间必须大于150us,外部晶振为12M,那么(1/12M)*N>150us,其中N为U_LTIME
或M_LTIME,N>1800,可以设置U_LTIME或和M_LTIME为0xfff,(0xfff=4096>1800),此时LOCKTIME=0xffffff.
;To reduce PLL lock time, adjust the LOCKTIME register.
ldrr0,=LOCKTIME
ldrr1,=0xffffff
strr1,[r0]

本文引用地址:https://www.eepw.com.cn/article/201611/320023.htm

[ PLL_ON_START
; Added for confirm clock divide. for 2440.
; Setting value Fclk:Hclk:Pclk
; 这里设置的 Fclk:Hclk:Pclk = 1:3:6,因为 CLKDIV_VAL = 7
ldrr0,=CLKDIVN
ldrr1,=CLKDIV_VAL; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.
strr1,[r0] ;数据表示分频数

;UPLL和MPLL的控制参数
;PLLCON Bit Description Initial State
;MDIV [19:12] Main divider control 0x96 / 0x4d
;PDIV [9:4] Pre-divider control 0x03 / 0x03
;SDIV [1:0] Post divider control 0x0 / 0x0

;InputFrequency OutputFrequency MDIV PDIV SDIV
;12.0000MHz 48.00 MHz(Note) 56(0x38) 2 2
;12.0000MHz 96.00 MHz(Note) 56(0x38) 2 1
;12.0000MHz 271.50 MHz 173(0xad) 2 2
;12.0000MHz 304.00 MHz 68(0x44) 1 1
;12.0000MHz 405.00 MHz 127(0x7f) 2 1
;12.0000MHz 532.00 MHz 125(0x7d) 1 1


;Configure UPLL
; 根据手册,要对PLL进行设置的话,就需要先设置UPLLCON,再设置MPLLCON
; 并且中间需要有至少七个指令周期的延时

ldrr0,=UPLLCON
ldrr1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)
strr1,[r0]

nop; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
nop
nop
nop
nop
nop
nop
;Configure MPLL
ldrr0,=MPLLCON
ldrr1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)
strr1,[r0]
]

;Check if the boot is caused by the wake-up from SLEEP mode.
ldrr1,=GSTATUS2
ldrr0,[r1]
tstr0,#0x2
;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.
bneWAKEUP_SLEEP

;EXPORT伪指令声明一个全局标号
EXPORT StartPointAfterSleepWakeUp
StartPointAfterSleepWakeUp


;3.置存储相关寄存器的程序
;这是设置SDRAM,flash ROM 存储器连接和工作时序的程序,片选定义的程序
;SMRDATA map在下面的程序中定义
;SMRDATA中涉及的值请参考memcfg.s程序
;具体寄存器各位含义请参考s3c44b0 spec
;Set memory control registers
ldrr0,=SMRDATA
ldrr1,=BWSCON;BWSCON Address
addr2, r0, #52;End address of SMRDATA


; beq %F[ ]中,b为跳转指令,eq为相等条件标识,整条语句的意思就是
; 如果相等,则在此条语句后面的代码中搜索[ ]标号并跳转。
; 同样的 bcc %B[ ] 其中cc为无符号数小于,%B在此条语句前面的代码中搜索并跳转

;下面是一个循环
;首先把r0指向的地址单元的一个字(4字节)的内容复制到r3中,
;然后r0+4,这样的话下次取的值将会是SMRDATA中的下一个个字
;
;将r3中的值写入到r1的地址单元(BWSCON)中,并将r1+1,即
;下一次将会写入到BWSCON的下一个控制器
;控制器以此为:BWSCON - BANKCON0 - BANKCON1 - BANKCON2 ……BANKCON7
;BANKSIZE - MRSRB6 - MRSRB7


0
ldrr3, [r0], #4
strr3, [r1], #4
cmpr2, r0
bne%B0;不等于0时跳转,也就是说一直循环直到将上面所说的控制器全部,设置了值之后才继续执行下一步
;r0 是这个数据区的起始地址,r2 是数据区的结束地址,r1 是寄存器的起始地址。这样,
;用一个判断语句就可以把内存中的数据赋给这13 个存储控制寄存器了。


;Initialize stacks
;4.初始化各模式下的栈指针
blInitStacks


; Setup IRQ handler
;5.设置缺省中断处理函数
ldrr0,=HandleIRQ ;This routine is needed
ldrr1,=IsrIRQ ;if there isnt subs pc,lr,#4 at 0x18, 0x1c
strr1,[r0]
;initialize the IRQ 将普通中断判断程序的入口地址给HandleIRQ


;6.将数据段拷贝到ram中 将零初始化数据段清零 跳入C语言的main函数执行 到这步结束bootloader初步引导结束
;由于 ROM 和 Flash 的读取速度相对较慢,这样无疑会降低代码的执行速度和系统的运行效率。
;为此,需要把系统的代码复制到 RAM 中运行。
;If main() is used, the variable initialization will be done in __main().
[:LNOT:USE_MAIN
;Copy and paste RW data/zero initialized data
LDR r0, =|Image

RO
Limit| ; Get pointer to ROM data/*RO 段结束地址 */
LDR r1, =|Image
RW
Base| ; and RAM copy/*RO 段起始地址 */
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
]



;这里不能写main,因为写了main,系统会自动为我们完成一些初始化工作,
;而这些工作在这段程序中是由我们显式地人为完成的。
[ :LNOT:THUMBCODE
blMain ;Dont use main() because ......
b.
]

[ THUMBCODE ;for start-up code for Thumb mode
orrlr,pc,#1
bxlr
CODE16
blMain ;Dont use main() because ......
b.
CODE32
]


;function initializing stacks
InitStacks
;Dont 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
mrsr0,cpsr
bicr0,r0,#MODEMASK
orrr1,r0,#UNDEFMODE|NOINT
msrcpsr_cxsf,r1;UndefMode
ldrsp,=UndefStack; UndefStack=0x33FF_5C00

orrr1,r0,#ABORTMODE|NOINT
msrcpsr_cxsf,r1;AbortMode
ldrsp,=AbortStack; AbortStack=0x33FF_6000

orrr1,r0,#IRQMODE|NOINT
msrcpsr_cxsf,r1;IRQMode
ldrsp,=IRQStack; IRQStack=0x33FF_7000

orrr1,r0,#FIQMODE|NOINT
msrcpsr_cxsf,r1;FIQMode
ldrsp,=FIQStack; FIQStack=0x33FF_8000

bicr0,r0,#MODEMASK|NOINT
orrr1,r0,#SVCMODE
msrcpsr_cxsf,r1;SVCMode
ldrsp,=SVCStack; SVCStack=0x33FF_5800

;USER mode has not be initialized.

movpc,lr
;The LR register wont be valid if the current mode is not SVC mode.


;=====================================================================
; Clock division test
; Assemble code, because VSYNC time is very short
;=====================================================================
EXPORT CLKDIV124
EXPORT CLKDIV144

CLKDIV124

ldr r0, = CLKDIVN
ldr r1, = 0x3; 0x3 = 1:2:4
str r1, [r0]
;wait until clock is stable
nop
nop
nop
nop
nop

ldr r0, = REFRESH
ldr r1, [r0]
bicr1, r1, #0xff
bicr1, r1, #(0x7<<8)
orrr1, r1, #0x470; REFCNT135
str r1, [r0]
nop
nop
nop
nop
nop
mov pc, lr

CLKDIV144
ldr r0, = CLKDIVN
ldr r1, = 0x4; 0x4 = 1:4:4
str r1, [r0]
;wait until clock is stable
nop
nop
nop
nop
nop

ldr r0, = REFRESH
ldr r1, [r0]
bicr1, r1, #0xff
bicr1, r1, #(0x7<<8)
orrr1, r1, #0x630; REFCNT675 - 1520
str r1, [r0]
nop
nop
nop
nop
nop
mov pc, lr


LTORG

SMRDATA DATA
; 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 ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)

DCD 0x32 ;SCLK power saving mode, BANKSIZE 128M/128M

DCD 0x30 ;MRSR6 CL=3clk
DCD 0x30 ;MRSR7 CL=3clk


ALIGN

AREA RamData, DATA, READWRITE

^ _ISR_STARTADDRESS; _ISR_STARTADDRESS=0x33FF_FF00
;表定位在 RAM 高端,基地址为 _ISR_STARTADDRESS
;^是MAP的同义词,#是FIELD的同义词
HandleReset # 4
HandleUndef # 4
HandleSWI# 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ# 4
HandleFIQ# 4

;Dont use the label IntVectorTable,
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
;@0x33FF_FF20
HandleEINT0# 4
HandleEINT1# 4
HandleEINT2# 4
HandleEINT3# 4
HandleEINT4_7 # 4
HandleEINT8_23 # 4
HandleCAM# 4; Added for 2440.
HandleBATFLT # 4
HandleTICK# 4
HandleWDT# 4
HandleTIMER0 # 4
HandleTIMER1 # 4
HandleTIMER2 # 4
HandleTIMER3 # 4
HandleTIMER4 # 4
HandleUART2 # 4
;@0x33FF_FF60
HandleLCD # 4
HandleDMA0# 4
HandleDMA1# 4
HandleDMA2# 4
HandleDMA3# 4
HandleMMC# 4
HandleSPI0# 4
HandleUART1# 4
HandleNFCON# 4; Added for 2440.
HandleUSBD# 4
HandleUSBH# 4
HandleIIC# 4
HandleUART0 # 4
HandleSPI1 # 4
HandleRTC # 4
HandleADC # 4
;@0x33FF_FFA0
END


上一页 1 2 下一页

关键词: ARM启动代码244

评论


技术专区

关闭