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让我头大的明天再来。。。。