Chinaunix首页 | 论坛 | 博客
  • 博客访问: 985730
  • 博文数量: 153
  • 博客积分: 4195
  • 博客等级: 上校
  • 技术积分: 2631
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-22 11:32
文章存档

2012年(7)

2010年(35)

2009年(111)

分类:

2009-11-12 18:57:38

;********************************************************************************************
;*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
阅读(1452) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-11-16 11:02:44

还有一个需要注意的地方,如果你已经修改了bootloader,一定要注意remap那一块, ;remap操作 ldr pc, =0x200000a0//此时的pc的值需要变化,才能落入下面的mov指令区域