T4240是freescale推出的一款基于power架构e6500内核的处理器,拥有12核24线程的核心,以及rapidio,万兆网口等高速接口,算是比较高端的一款PPC芯片了。
人们常常分析uboot的执行流程,但CPU从上电到执行uboot前这段时间都做了什么可能大部分人都不太关注,这里介绍一下T4240的POR(power on reset)相关的逻辑,重点是与人们常用的e500内核(如p2020)所不同的地方。t4240参考手册中列出了大致的顺序,但其中细节还是需要反复阅读才能理解的。本文请结合T4240参考手册进行阅读,因为大量的图表不方便一一列出来,太占地方。
一,上电复位后,por sequence中与p2020不同的是多了一个PBL(pre-bootloader)阶段。该阶段可以理解为CPU的一个功能模块,在上电复位后执行,主要功能有两个:
1,加载rcw与pbi(若在rcw中设置pbi有效)到RCW
2,执行PBI(若使能)
那么PBL加载RCW之前,是如何找到RCW的位置呢?
二,通过配置CPU外部指定管脚信号可以进行以下几种功能的上电复位初始化:
1,RCW源所在位置
2,通用输入(general-purpose input)
3,DRAM类型选择
4,SerDes XVDD电压选择
5,IFC外部收发器使能极性选择
其中第2条,通用输入是用来进行用户自定义的配置的,将cfg_gpinput[7:0]信号在上电复位后立即锁存至GPPORCR1寄存器中,后续可以用户自己读取,进行自定义操作。
三,p2020通过外部信号需要配置的功能有25个,而t4240只有5个需要配置。其中没有通过管脚信号配置的,在读取rcw后根据rcw与pbi再进行配置,可以节省大量的外部管脚。详情见T4240参考手册4.6.4.1。
四,这里我们重点关注rcw源的配置,根据手册中4.6.3.1节表4-8可以看到rcw源具体配置各个位。
RCW源可以配置为NOR,nand,spi,i2c,hardcoded等方式,这里我们假设配置为nor flash,通过cfg_rcw_src[0:8],可以设置取出来的数据大小端格式,取地址/数据的寻址位数,以及片选(CS)和地址锁存(ALE)的信号先后顺序。
五,那么此时CPU的PBL模块就要开始从nor上加载rcw了。需要注意的是还有一部分名叫pbi(pre-bootloader initialisition)部分与rcw在一起,该部分数据可选,即可以有,也可以没有,主要功能是进行一些外设的初始化工作。pbi与rcw共同组成PBL在flash上的image。各个flash接口的起始地址(starting addresses)如下所示:
IFC 0x0000_0000
I2C 0x0000_0000
eSPI 0x0000_0000
eSDHC 0x0000_1000
iic从设备地址应设为0x50。
因此,pbl功能模块开始寻找首个正常工作的存储块,并从其中的首地址开始提取pbl image。从ifc接口的0地址开始读取pbl iamge(rcw+pbi)。因此烧写pbl image应烧写至nor flash的0地址,这样也与uboot不冲突。
六,至此我们理顺了CPU上电复位后如何读取到rcw的,那么ifc是如何从0地址开始读取nor flash设备的呢。
由手册12.1.1.2 nor flash features可以看到,片选信号CS0在系统复位时是可用的,因此硬件设计是将CS0连接到nor flash片选使能信号上。复位时,IFC_CPSR0,IFC_CSOR0_NOR寄存器处于复位状态,其中部分位为0,部分位根据外部信号即rcw源选择管脚的状态进行配置。详情参考手册12.3节内容。
总之最终结果就是ifc接口配置为nor flash,并且使能bank0区域。这样nor flash的0地址就可以被访问到了。
七,完成PBL的执行后,需要找到uboot所在地址区域,以加载bootloader。根据4.6.4.1节RCW整个区域各个位的定义可以知道配置启动的位在192-223bits上(boot configuration),包含了pbi源设置(PBI_SRC),boot单元位置(boot location),boot暂停模式(boot hold off mode),secure boot模式,ifc工作模式。
根据表中所述,pbi与boot_loc所处必须在同一个存储设备中。
我们可以通过此部分设置从ifc接口开始boot。(注意,若RCW源的配置信号cfg_rcw_src配置为了非ifc接口,则以cfg_rcw_src为准。)
因此我们必须将bootloader也放置在nor flash上。接下来的加载uboot,运行uboot的过程就与p2020类似了,主要是通过上电复位后默认的mmu配置将最后4k的boot page映射至cpu地址空间上,然后根据law默认的配置,将0xff80_0000至0xffff_ffff配置为boot window。根据先前的RCW配置,boot_loc为ifc设备,因此这样当CPU完成POR序列(包含PBL)后,读取第一条从0xffff_fffc来的指令,就会从nor
flash中读取。