P2020启动过程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

系统上电到执行第一条指令前,需要经过配置PLL、Local Bus控制器、LAW、MMU等操作,这些配置完全是由Cpu根据芯片的默认值和芯片外部配置引脚的输入状态自动完成的。如:

1) Cpu根据cfg_sys_pll[0:2]的输入状态决定当前CPU的BBC对SYS_CLK的倍频参数;

2) Cpu根据cfg_ddr_pll[0:2] 的输入状态决定DDR的时钟频率(DDR2和DDR3不同);

3) Cpu根据cfg_core0_pll[0:2]/cfg_core1_pll[0:2]的输入状态决定当前CPU的cor0/cor1对CCB的倍频参数;

4) Cpu根据cfg_cpu0_boot和cfg_cpu1_boot的输入状态决定复位时执行boot 代码的Core,如下图所示:

5) Cpu根据cfg_rom_loc[0:3]的输入状态决定Boot ROM的位置。

6)其它根据外部输入状态决定的配置。

以上,对软件来说最重要的配置是Boot ROM位置的配置。Boot ROM位置与cfg_rom_loc[0:3]输入状态的关系如下图所示:

在硬件连接无误的情况下,P2020启动的配置为:

cfg_cpu0_boot=1,core0启动;

cfg_cpu1_boot=0,core1等待;

cfg_rom_loc[0:3] =1110,从Local bus GPCM—16-bit ROM启动;

根据P2020的硬件手册,Cpu复位后执行的第一条指令的地址是

0xFFFF,FFFC。因此,Cpu要能正确执行U-boot代码,至少需要下面几个条件:● Local Access Window能正确转换U-boot代码的物理地址空间

● Local Bus Control能正确转换U-boot代码的物理地址空间

● MMU能正确转换U-boot代码的有效地址空间(e500核的MMU无法关闭)

首先,根据P2020手册,Local Access Window对Boot ROM的地址转换,不通过LAW寄存器配置。在复位时,映射0x0_FF80_0000到启动地址(硬件配置为Local bus GPCM),共8M空间。这样解决了第一个问题。

接着,P2020复位时Local Bus Control寄存器BRn/ORn有默认值为全0,设定了第0个Local Bus Bank的地址空间是从0x0000_0000开始的4G空间,且MSEL=GPCM。这样,所有映射到Local Bus上的地址都会使CS0有效。

然后,MMU在复位时也有默认值。实际上,虽然P2020的MMU有16个TLB1和512个TLB0,复位时仅TLB1的Entry0有效。Entry0将0xFFFF,F000开始的4k有效地址空间映射到0xFFFF,F000开始的4k物理地址空间中,TLB1的Entry0配置如下表所示:

有了以上的配置,P2020 Cpu复位时就能够从连接在Local Bus的CS0上的Nor Flash执行第一条指令了。具体过程如下:

Cpu从0xFFFF,FFFC有效地址开始执行,先经过MMU转换得到物理地址

0xFFFF,FFFC;然后,Local Access Window的特殊转换直接将0xFFFF,FFFC转换到Cpu的外围器件Local bus GPCM—16-bit ROM上;最后,由于Local Bus

的CS0覆盖了4G空间,0xFFFF,FFFC直接被送到了Nor Flash(Boot Flash)的地址总线上。如果外接Boot Flash只有16M BYTE,则地址总线仅24位,

0xFFFF,FFFC代表了Flash 0xFF,FFFC的地址。

/cpu/mpc85xx/u-boot.lds文件是连接器脚本文件,其中:

.bootpg RESET_VECTOR_ADDRESS - 0xffc:

{

cpu/mpc85xx/start.o (.bootpg)

} :text = 0xffff

规定了/cpu/mpc83xx/start.s的_start_e500代码段放在Flash倒数4K的位置。

.resetvec RESET_VECTOR_ADDRESS:

{

*(.resetvec)

} :text = 0xffff

规定了复位后从resetvec段开始取指令,这个resetvec段放在FFFFFFFC的位置,在/cpu/mpc85xx/resetvec.s中可以看到e500核从倒数第4个字节处取的是一条跳转指令为:

b _start_e500

跳转到位于倒数4K位置的_start_e500标号处。

_start_e500开始的代码会在空间1里建立一个4M的Entry映射,使用的是Entry15,这样就把所有的uboot代码都可以访问到了。然后再会跳到_start标号

开始的地方,_start标号位于倒数512K的位置,在这之后的过程和e300核的start.s 类似。

E500核的u-boot的启动是从/cpu/mpc85xx/start.s中的_start_e500标号开始的,经历了/cpu/mpc85xx/start.s,/cpu/mpc85xx/cpu_init_early.c,

/cpu/mpc85xx/cpu_init.c,/lib_ppc/Board.c等几个文件中的多个汇编和C函数,最后会在/lib_ppc/Board.c中的board_init_r函数中进入命令死循环,等待执行键入

的命令。其具体的流程如下图所示:

_start_e500函数

初始化e500核心,清除指令和数据cache,有效指令和数据cache,设置中断向量,禁止中断响应,禁止看门狗,只允许machine check中断,设置为supervisor级别,无效指令和数据cache,设置HID0寄存器等,为系统创建一个干净可靠的初始环境。

MMU初步配置

从前面P2020上电流程可以看出,上电之后,MMU只配置了4k空间,在这4k 空间内必须初步配置MMU,使MMU能够映射u-boot真实的有效地址空间。下面这段代码将TLB1的Entry0配置为4M空间。

lis r6,FSL_BOOKE_MAS0(1, 15, 0)@h

ori r6,r6,FSL_BOOKE_MAS0(1, 15, 0)@l

/* create a temp mapping in AS=1 to the 4M boot window */

lis r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@h

ori r7,r7,FSL_BOOKE_MAS1(1, 1, 0, 1, BOOKE_PAGESZ_4M)@l

lis r8,FSL_BOOKE_MAS2(TEXT_BASE & 0xffc00000,

(MAS2_I|MAS2_G))@h

ori r8,r8,FSL_BOOKE_MAS2(TEXT_BASE & 0xffc00000,

(MAS2_I|MAS2_G))@l

/* The 85xx has the default boot window 0xff800000 - 0xffffffff */

lis r9,FSL_BOOKE_MAS3(0xffc00000, 0,

(MAS3_SX|MAS3_SW|MAS3_SR))@h

ori r9,r9,FSL_BOOKE_MAS3(0xffc00000, 0,

(MAS3_SX|MAS3_SW|MAS3_SR))@l

mtspr MAS0,r6

mtspr MAS1,r7

mtspr MAS2,r8

mtspr MAS3,r9

isync

msync

tlbwe

经过以上配置,u-boot代码就可以使用TEXT_BASE定义的有效地址空间了。但是,这时的Local Bus Bank的配置还是默认值。后面的代码会重新修改MMU 映射,将u-boot映射到LAW分配的空间里。

Dcache中分配空间做堆栈

程序跑到这里,就要进入第一个C函数了。C函数的运行至少需要栈空间,但这时,RAM还没有初始化,只能在Dcache中锁定一定的空间,用做C的栈空间。

switch_as函数在Dcache中锁定16k的空间。

下面的几行代码将堆栈指针指向刚刚分配好的Dcache空间。

相关文档
最新文档