;********************************************************************************************
;*filename: boot.s
;*author: WUER xiao
;*create date: 2008-6-17 9:25
;*description: This file is used for 16 bit NOR FLASH bootloader
;*modify history:
;*misc:
;********************************************************************************************
PMU_PLTR EQU 0x10001000 ; PLL的稳定过渡时间
PMU_PMCR EQU 0x10001004 ; 系统主时钟PLL的控制寄存器
PMU_PUCR EQU 0x10001008 ; USB时钟PLL的控制寄存器
PMU_PCSR EQU 0x1000100C ; 内部模块时钟源供给的控制寄存器
PMU_PDSLOW EQU 0x10001010 ; SLOW状态下时钟的分频因子
PMU_PMDR EQU 0x10001014 ; 芯片工作模式寄存器
PMU_RCTR EQU 0x10001018 ; Reset控制寄存器
PMU_CLRWAKUP EQU 0x1000101C ; WakeUp清除寄存器
EMI_CSACONF EQU 0x11000000 ; CSA参数配置寄存器
EMI_CSECONF EQU 0x11000010 ; CSE参数配置寄存器
EMI_CSFCONF EQU 0x11000014 ; CSF参数配置寄存器
EMI_SDCONF1 EQU 0x11000018 ; SDRAM时序配置寄存器1
EMI_SDCONF2 EQU 0x1100001C ; SDRAM时序配置寄存器2, SDRAM初始化用到的配置信息
EMI_REMAPCONF EQU 0x11000020 ; 片选空间及地址映射REMAP配置寄存器
AREA BOOTLOADER, CODE, READONLY
ENTRY ; Mark first instruction to execute
;************************************************************************************
; init the PMU and get the memory space;
; 关于功耗管理模块的实现机制在后续版本可能会作出调整, 使其层次化更加清晰,封装性更好
;************************************************************************************
ldr r4, =PMU_PCSR ; 打开所有模块时钟
ldr r5, =0x0001FFFF ; 由低位到高位依次(一共11bit有效)表示:esram lcdc pmu dmac emi mac adc ssi uart2 uart1 uart0
str r5, [ r4 ]
ldr r4, =PMU_PLTR ; 配置PLL稳定过度时间为保守值50us.
ldr r5, =0x00FA00FA ; 其实,低16bit reserved
str r5, [ r4 ]
;//PLL控制寄存器配置有待进一步确认,Fout=Fi*PV/(PD+1),但是Fi=?
ldr r4, =PMU_PMCR ; 配置系统时钟为80MHz
ldr r5, =0x0000400b ; 00E -- 56M 00A -- 40M 00B -- 44M
str r5, [ r4 ]
ldr r4, =PMU_PMDR ; 由SLOW模式进入NORMAL模式
ldr r5, =0x00000001 ; 00:slow,01:normal,10:sleep,11:idle
str r5, [ r4 ]
;//PLL控制寄存器配置有待进一步确认,Fout=Fi*PV/(PD+1),但是Fi=?
ldr r4, =PMU_PMCR ; 配置系统时钟为80MHz
ldr r5, =0x0000c00b ;7A8
str r5, [ r4 ]
; ldr r4, =0x11000000 ; 这里注意不需要csa配置,因为现在程序已经在norflash中运行,再对它进行配置会导致启动不稳定(比如上次一个客户的10次里面有2次左右系统起不来)
; ldr r5, =0x08a6a6a1
; str r5, [ r4 ]
ldr r4, =0x11000010 ; CSE片选时序参数配置
ldr r5, =0x8ca6a6a1
str r5, [ r4 ]
ldr r4, =0x11000018 ; SDRAM参数配置1
ldr r5, =0x1e104177
str r5, [ r4 ]
ldr r4, =0x1100001c ; SDRAM参数配置2
ldr r5, =0x80002860
str r5, [ r4 ]
nop
nop
nop
;拷贝kernel代码到SDram
ldr r3, =0x0
ldr r1, =0x30008000 ;the address of SDRAM 这个地址要注意,一般要和下面的pc指针一起改变的
ldr r2, =0x20001000 ;the address of NorFlash
LOOP
ldmia r2!, {r4-r12}
stmia r1!, {r4-r12}
add r3, r3, #1
cmp r3, #0x2f000 ;注意这个数字是和应用程序的大小相关的,也和上面多load多store的寄存器个数有关,比如这里我们使用了9个寄存器进行搬运,则这里实际的大小为9*0x2f00=1.65M
bne LOOP
;remap操作
ldr pc, =0x200000a0
mov r0, r0
mov r0, r0
mov r0, r0
mov r0, r0
mov r0, r0
REMAP
ldr r1, =0x11000020 ;REMAP 0 ADDRESS TO SDRAM
ldr r2, =0x0b
str r2, [r1]
nop
nop
nop
;重新设定PC,开始操作系统启动
ldr pc, =0x30008000
nop
nop
nop
DEAD
b DEAD
END
阅读(1500) | 评论(1) | 转发(0) |