Bootloader Startup.s 学习笔记一

                WinCE  Bootloader Startup.s分析

                INCLUDE kxarm.h
                INCLUDE armmacros.s
                INCLUDE s3c2440a.inc

;-------------------------------------------------------------------------------

MemoryMap       EQU     0x2a4
BANK_SIZE       EQU     0x00100000      ; 1MB per bank in MemoryMap array
BANK_SHIFT      EQU     20


;   Define RAM space for the Page Tables:
;
PHYBASE         EQU     0x30000000      ; physical start
PTs             EQU     0x30010000      ; 1st level page table address (PHYBASE + 0x10000)
                                        ; save room for interrupt vectors.

;EQU就和#define一样,定义常量,这样解释够简单。

;-------------------------------------------------------------------------------

        TEXTAREA

        IMPORT  main

; Set up the MMU and Dcache for bootloader.
;
; This routine will initialize the first-level page table based up the contents
; of the MemoryMap array and enable the MMU and caches.
;
; Copy the image to RAM if it's not already running there.
;
; Include Files

 

; Defines

;------------------------------------------------------------------------------
; BUGBUG - ?


;LQM@ucdragon.net 2007-05-29
;PLLVAL      EQU     (((0x6e << 12) + (0x3 << 4) + 0x1)) ; 2440A
;PLLVAL      EQU     (((0x3e << 12) + (0x2 << 4) + 0x1)) ; 2440A
PLLVAL      EQU     (((0x5c << 12) + (0x1 << 4) + 0x1))  ;FIN 12M,fout 400

;------------------------------------------------------------------------------
; Cache Configuration

DCACHE_LINES_PER_SET_BITS   EQU     (6)
DCACHE_LINES_PER_SET        EQU     (64)
DCACHE_NUM_SETS             EQU     (8)
DCACHE_SET_INDEX_BIT        EQU     (32 - DCACHE_LINES_PER_SET_BITS)
DCACHE_LINE_SIZE            EQU     (32)

 

; External Variables

; External Functions

; Global Variables
 
; Local Variables
 
; Local Functions

;-------------------------------------------------------------------------------
;   Function: Startup
;
;   Main entry point for CPU initialization.
;

        STARTUPTEXT
        LEAF_ENTRY      StartUp
   
        ; Jump over power-off code.
        b       ResetHandler

ResetHandler

        ; Make sure that TLB & cache are consistent
        mov     r0, #0
        mcr     p15, 0, r0, c8, c7, 0           ; flush both TLB                      
        mcr     p15, 0, r0, c7, c5, 0           ; invalidate instruction cache
        mcr     p15, 0, r0, c7, c6, 0           ; invalidate data cache
       
         ;p15是系统控制协处理器,主要是对内存还有cashe进行管理。mcr指令,把ARM寄存器中的值传递到协处理寄存器中
         ;C8 是TLB Control,C7是Cashe/Write Buf Control, C6和C5具体用途不是很明白。
         ;具体可以参考ARM体系结构的官方文档。
         ;为啥要保证TLB和cache一致呢?
       
        ldr     r0, = GPFCON             
        ldr     r1, = 0x55aa     
        str     r1, [r0]

        ;配置F组I/0端口,高地址的四个端口为输出,低位的四个端口为中断。

        ldr     r0, = WTCON                     ; disable watch dog
        ldr     r1, = 0x0        
        str     r1, [r0]
       
        ;这里就是传说中的关看门狗了。具体寄存器查2440的datasheet。

        ldr     r0, = INTMSK
        ldr     r1, = 0xffffffff                ; disable all interrupts
        str     r1, [r0]

        ldr     r0, = INTSUBMSK
        ldr     r1, = 0x7fff                     ; disable all sub interrupt
        str     r1, [r0]

        ;关中断,这两个中断有什么区别了?

        ldr     r0, = INTMOD
        mov     r1, #0x0                        ; set all interrupt as IRQ  
        str     r1, [r0]

        ;设置所有中断为IRQ,0为IRQ,1为FIQ,难道后面要用?不确定。

        ldr     r0, = CLKDIVN
        ;LQM@ucdragon.net 2007-05-29,port to YL P/E 2440
        ;   ldr     r1, = 0x7
        ldr     r1, = 0x5           ; 0x0 = 1:1:1,  0x1 = 1:1:2, 0x2 = 1:2:2,  0x3 = 1:2:4,
                                    ; 0x7 = 1:3:6,  0x8 = 1:4:4
        str     r1, [r0]
   
        ;这个时钟控制的寄存器的具体用途有待了解,有没有什么资料可以科普一下我的?

        ands    r1, r1, #0xe                    ; set AsyncBusMode  and后面带s表示影响状态寄存器。
        beq     %F10
    
        ;相等就跳转,%F意思就是Forward,%B的意思就是backward。这里一定是向前跳转了。

        mrc     p15, 0, r0, c1, c0, 0
        orr     r0, r0, #R1_nF:OR:R1_iA
        mcr     p15, 0, r0, c1, c0, 0

        ;不相等就执行这里。同步TLB & cache ?这段代码不太明白。
10
        ldr     r0, = LOCKTIME                  ; To reduce PLL lock time, adjust the LOCKTIME register.
        ldr     r1, = 0xffffff
        str     r1, [r0]
       
        ;设置UPLL和MPLL为初始值。
   
   ldr  r0, = CAMDIVN
   ldr  r1, = 0
   str  r1, [r0]

        ;设置CAMDIVN为初始值。

        ldr     r0, = MPLLCON                   ; Configure MPLL
                                                ; Fin=16MHz, Fout=399.65MHz
        ldr     r1, = PLLVAL
        str     r1, [r0]

        ldr     r0, = UPLLCON                   ; Fin=16MHz, Fout=48MHz
;LQM@ucdragon.net 2007-05-29,port to YL P/E 2440
;        ldr     r1, = ((0x3c << 12) + (0x4 << 4) + 0x2)  ; 16Mhz
        ldr     r1, = ((0x38 << 12) + (0x2 << 4) + 0x2)   ; 12Mhz
        str     r1, [r0]
       
        ;设置MPLL和UPLL

        mov     r0, #0x2000
20  
        subs    r0, r0, #1
        bne     %B20
      
        ;这段代码?在等待什么?

;------------------------------------------------------------------------------
;   Add for Power Management

        ldr     r1, =GSTATUS2                   ; Determine Booting Mode
        ldr     r10, [r1]
      
        ;GSTATUSX:通用的状态寄存器  GSTATUS2:Reset Status

;------------------------------------------------------------------------------
;   Add for Power Management

        tst     r10, #0x2
        beq     BringUpWinCE                    ; Normal Mode Booting

        ;如果是正常启动,就跳转到BringUpWinCE

;------------------------------------------------------------------------------
;   Add for Power Management ?

BringUpWinCE

;------------------------------------------------------------------------------
;   Initialize memory controller


        add     r0, pc, #MEMCTRLTAB - (. + 8)
        ;这句话什么意思?

        ldr     r1, = BWSCON                    ; BWSCON Address
        add     r2, r0, #52                     ; End address of MEMCTRLTAB
40      ldr     r3, [r0], #4   
        str     r3, [r1], #4   
        cmp     r2, r0     
        bne     %B40
   
        ldr     r0, = GPFDAT
        mov     r1, #0x60
        str     r1, [r0]

;------------------------------------------------------------------------------
;   Copy boot loader to memory

        ands    r9, pc, #0xFF000000     ; see if we are in flash or in ram
        bne     %f20                    ; go ahead if we are already in ram
     
        ;判断PC是在Flash还是ram中,如果是Ram,就跳转到20处执行。

        ; This is the loop that perform copying.
        ldr     r0, = 0x38000           ; offset into the RAM
        add     r0, r0, #PHYBASE        ; add physical base
        mov     r1, r0                  ; (r1) copy destination
        ldr     r2, =0x0                ; (r2) flash started at physical address 0
        ldr     r3, =0x10000            ; counter (0x40000/4)
10      ldr     r4, [r2], #4
        str     r4, [r1], #4
        subs    r3, r3, #1
        bne     %b10
       
        ;这里Copy  Bootloader到RAM中。

        ; Restart from the RAM position after copying.
        mov pc, r0

        ;Copy完后重启。

        nop
        nop
        nop

        ; Shouldn't get here.
        b       .

 

      ;下面一段MMU让我头大的明天再来。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值