嵌入式xworks系统初始化(PowerPC汇编)
?系統初始化
系統初始化對不同的CPU,基本步驟是類似的.
系統初始化的主要步驟以 下啟動 關閉中斷 放boot type到堆棧 清空緩存
VxWorks 系統的 PowerPC BSP,系統開機后執行的第一個函數 romInit(),在ROM的起點,這里是運用運用的PowerPC匯編語言
/* 定義內部函數 internals */
.globl romInit /* start of system code */
.globl _romInit /* start of system code */
/* 定義外部函數 externals */
.extern romStart /* system initialization routine */
.text
.align 2
/*******************************************************************************
*
* romInit ( int startType /@ only used by 2nd entry point @/ )
*/
romInit:
_romInit:
bl cold /* 冷啟動 */
bl warm /* 熱啟動 */
cold:
li p5, BOOT_COLD? /*BOOT_COLD是否是宏定義,p5是否是SPR,li是load立即數吧?*/
bl start /* skip over next instruction */
warm:
or p5, p0, p0 /* startType to p5 */
start: /* 此處是系統啟動開始 */
/* 屏蔽MSR中CE,EE位,關閉所有的外部中斷
/*
* Disable external interrupts
*/
mfmsr p0 /* p0 = msr */
INT_MASK (p0, p1) /* mask EE and CE bit */
ori p1,p1,_PPC_MSR_ME /* enable machine checks */
mtmsr p1 /* msr = p1 */
isync
/* 下面兩步是按照硬件定義初始化一些SPR,DCR寄存器,置0或置1
/* SPR是特殊功能寄存器,DCR為設備控制寄存器,還有MSR機器狀態寄存器,這些是PowerPC內核中很重要的寄存器
/* 初始化SPR,DCR寄存器置0
* Initalize registers that need to be set to zero.
*/
addi r4,r0,0x0000
mtspr SGR,r4 /* 解鎖所有存儲區域 SPR 中 SGR 位置0 */
mtspr ESR, r4 /* SPR中的錯誤狀態位 ESR 清0 */
mtspr TCR, r4 /* 關閉所有的 timers */
mtspr PIT, r4 /* 清0 PIT timer */
mtdcr UICER, r4 /* 關閉中斷控制器(UIC)中的所有中斷 */
mtspr XER, r4 /* 清0 integer exception 寄存器 */
/* 初始化另外一些SPR,DCR寄存器,置1
* Initalize registers that need to be cleared with 0xFFFFFFFF.
*/
addis r4,r0,0xffff
ori r4,r4,0xffff
mtspr TSR, r4 /* timer */
mtspr DBSR, r4 /* 調試狀態位置1 */
mtdcr UICSR, r4 /* 清除中斷控制器(UIC)中的所有 pending 中斷 */
mtdcr dmasr, r4 /* DMA狀態寄存器置1 */
/* PowerPC405用2個緩存,一個是16K指令緩存(ICU),一個是6K數據緩存(DCU),下面是清空著2個緩存,并根據硬件設置緩存 */
/* 清空指令緩存 */
/*BESR type regs ZZZZZZZZZZZZ
* Invalidate the entire instruction cache. This can be done
* with a single iccci instruction in the processor core.
*/
iccci r0, r0?? /*清空指令cache*/
/*清空數據緩存
* Invalidate the entire data cache.
* The 405 processor core in the 405GP has 128 congruence classes.
* Each cache line in the 405 processor is 32 bytes.
*/
/*
* Turn the instruction cache on for faster boot-up.
* Also, the icache is needed to help initialize Bank 0
* of the EBC to speed up accesses to flash.
* address space 0x00000000-0x07ffffff is cached
* address space 0xf8000000-0xffffffff is cached
*/
lis p0, HIADJ(_PPC403_ICCR_DEFAULT_VAL)???? /*HIADJ(_PPC403_ICCR_DEFAULT_VAL)?是否是宏定義?*/
addi p0, p0, LO(_PPC403_ICCR_DEFAULT_VAL)??? /*LO(_PPC403_ICCR_DEFAULT_VAL)?是否是宏定義?*/
mtspr _PPC403_ICCR, p0
isync
/* 初始化外部總線控制器(EBC),跳轉指令BL,執行extBusCntlrInit
* /
bl extBusCntlrInit
/*
* Now that the EBC Bank 0 has been set up, turn the I-cache off if
* i-cache was not specified in config.h. It is also invalidated
* again.
*/
#ifndef USER_I_CACHE_ENABLE
li p0, 0 /* clear p0 */
mtspr _PPC403_ICCR, p0 /* turn off i-cache */
isync
iccci r0, r0 /* invalidate the I-cache again */
#endif
/* 初始化與SDRAM有關的IIC(inter-integrated circut)寄存器IIC0,
* Initialize IIC0 for use in automatic SDRAM configuration
*/
#ifdef LOCAL_MEM_AUTOSIZE
bl iic0Init
#endif
/* 初始化SDRAM,BL跳轉執行sdramInit
* Configure the SDRAM controller only if this is a cold boot.
* If the SDRAM controller is reinitialized on a warm boot, the
* boot line will get wiped out because of the ECC SDRAM memory
* initialization.
*/
li p0, BOOT_COLD
and. p0, p0, p5 /* p5 is saved at the entry of romInit */
beq skip?? ?/*and與beq連用,先是用and進行位與運算,然后將位與的結果與0比較,如果為0,則跳到beq緊跟著的標記(如beq skip,則跳到skip處)。*/
bl sdramInit
skip:
/*
* Clear the CPU reservation bit
*/
li r0, 0
lwarx p0, r0, r0??? /*lwarx裝入指定地址的內存的內容,并且保留內存地址的內容 */
stwcx. p0, r0, r0 /*判斷保留的地址是否和本指令的相同,如果相同則存入一個值到內存,否則什么都不干,根據是否存入內存設置條件寄存器*/
#ifdef PPC405GP_REVA
/* 設置中斷向量表到0x0000 */
li p0, 0x2100/4??? /*作用是什么?*/
mtctr p0
lis p0, WALNUT_EVPR_VAL?? /*WALNUT_EVPR_VAL的值左移16位賦給p0*/
li p1, 0x0000
zeroOut:
stw p1,0x0(p0)
addi p0, p0, 4
bdnz zeroOut
#endif
/* 初始化堆棧
/* Initialize the stack pointer (r1) */
lis sp, HIADJ(STACK_ADRS)
addi sp, sp, LO(STACK_ADRS)
#if FALSE /* SDA not supported */
/* initialize r2 and r13 according to EABI standard */
lis r2, HIADJ(_SDA2_BASE_)
addi r2, r2, LO(_SDA2_BASE_)
lis r13, HIADJ(_SDA_BASE_)
addi r13, r13, LO(_SDA_BASE_)
#endif
/* 得到C代 碼romStart()在ROM中的地址,保證romInit執行結束后,系統跳轉執行romStart()
/* calculate C entry point: routine - entry point + ROM base */
lis p1, HIADJ(romStart) /* p1 = romstart */
addi p1, p1, LO(romStart)????? /*routine地址*/
lis p2, HIADJ(romInit) /* p2 = romInit */
addi p2, p2, LO(romInit)???? /*入口地址地址*/
/* ROM_TEXT_ADRS為ROM的入口地址,在文件makefile定義,為0xfff80100
lis p3, HIADJ(ROM_TEXT_ADRS) /* p3 = ROM_TEXT_ADRS */
addi p3, p3, LO(ROM_TEXT_ADRS)???? /*ROM base地址*/
subf p1, p2, p1 /* p1 = p1 - p2 */
add p1, p1, p3 /* p1 = p1 + p3 */
/* p1中是romStart()的地址,這里把這個地址放到連接寄存器LR中.??
mtlr p1 /* link register = C entry point */??
or p0, p5, p5 /* p0 = startType */
addi sp, sp, -FRAMEBASESZ /* get frame stack */
/* 跳轉到LR中romStart()的地址,執行romStart()
blr /* branch to link register */
總結
以上是生活随笔為你收集整理的嵌入式xworks系统初始化(PowerPC汇编)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌 Alphabet 第四季度净利润同
- 下一篇: PowerPC汇编指令