|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
一、处理器读取的第一条指令在/uboot/cpu/mpc8260/start.S中的_start:标号处执行。在完成了CPU本身基本初始化以后,主要是初始化CPU内部寄存器的一些状态,
.globl
_start
_start:
li
r21, BOOTFLAG_COLD
/* Normal Power-On: Boot from FLASH*/
nop
b
boot_cold
boot_cold:
#if defined(CONFIG_MPC8260ADS) && defined(CFG_DEFAULT_IMMR)
lis
r3, CFG_DEFAULT_IMMR@h
保留IMMR默认地址
在README文档中找到:如果CONFIG_MPC8260ADS被定义,则CONFIG_ADSTYPE的值可能是:CFG_8272ADS
IMMR:内部内存映射寄存器(internal memory map register),定义指定设备以及指定基地址的内存映射。
nop
lwz
r4, 0(r3)
nop
rlwinm
r4, r4, 0, 8, 5
nop
oris
r4, r4, 0x0200
nop
stw
r4, 0(r3)
nop
#endif /* CONFIG_MPC8260ADS && CFG_DEFAULT_IMMR */
以上部分是设置了默认IMMR地址,把CFG_DEFAULT_IMMR的[5:8]位清零,其他数值不变,并且与0x200进行或操作,最后放回到r3寄存器中。由于编译时设置了TEXT_BASE的值为0xFFF00000,所以没有定义LOWBOOT,因此不使用IMMR的默认地址。此段代码可以被注释掉
boot_warm:
mfmsr
r5
/* save msr contents
*/
MSR:设备状态寄存器(machine state register),设置内核当前使用状态,基本上是初始化内核第一个被配置的寄存器,属于SLR寄存器组,但是不能用mfspr,mtspr寄存器访问,使用专门的mtmsr,mfmsr才能访问。
#if defined(CFG_DEFAULT_IMMR)
lis
r3, CFG_IMMR@h
ori
r3, r3, CFG_IMMR@l
lis
r4, CFG_DEFAULT_IMMR@h
stw
r3, 0x1A8(r4)
为什么是这个值?答:IMMR寄存器地址为0x101A8,这里是向寄存器IMMR中写值0xF000 0000
#endif /* CFG_DEFAULT_IMMR */
我个人认为以上都是配置内存处理器内部映射的基地址
接下来
bl
init_8260_core
init_8260_core:
/* Initialize machine status; enable machine check interrupt
*/
li
r3, MSR_KERNEL
/* Set ME and RI flags */
ME位:(machine check enable)
RI位:Recoverable interrupt
rlwimi
r3, r5, 0, 25, 25
/* preserve IP bit set by HRCW */
#ifdef DEBUG
rlwimi
r3, r5, 0, 21, 22
/* debugger might set SE & BE bits */
#endif
SYNC
/* Some chip revs need this... */
Sync指令:为了防止数据缓存与指令缓存产生冲突,有些处理器需要执行,尤其在mtspr指令前,以及tibie, tibla指令执行后需要执行。大多数msr寄存器,spr寄存器操作后都需要执行sync。
mtmsr
r3
保存MSR
SYNC
mtspr
SRR1, r3
/* Make SRR1 match MSR */
设置保存MSR
接下来指向寄存器基地址
lis
r3, (CFG_IMMR+IM_REGBASE)@h
CFG_IMMR=0xF000 0000
IM_REGBASE没有找到
为什么是这个地址?
答:IM_开头的在ppc_asm.tmpl文件中,
IM_REGBASE= 0x10000
#if !defined(CONFIG_COGENT)
lis
r4, CFG_SYPCR@h
CFG_SYPCR=0xFFF FFFC3
ori
r4, r4, CFG_SYPCR@l
stw
r4, IM_SYPCR@l(r3)
#endif /* !CONFIG_COGENT */
把系统保护控制寄存器(SYPCR)中的值拷贝到处理器中,对系统监视器,看门狗和总线监视器时钟进行配置。我连看门狗都没有,所以也没有管它,应该不会有什么影响。
#if defined(CONFIG_WATCHDOG)
li
r4, 21868
/* = 0x556c */
sth
r4, IM_SWSR@l(r3)
li
r4, -21959
/* = 0xaa39 */
sth
r4, IM_SWSR@l(r3)
#endif /* CONFIG_WATCHDOG *
如果需要初始化看门狗,对其进行初始化。“CFG_”作为prefix的,都是头文件中已经配置好用来进行设定的值。这个取决于个人硬件的配置。看门狗有机会在研究。 |
|