IMX51+WINCE6.0基于SD_MMC启动---eboot(2)之OEMPlatformInit
1. OALPmicInit
PMIC主要是给处理器机器部分外围电路供电,此函数的主要作用如下:
(1) 选择并配置CSPI引脚
(2) 配置CSPI控制器CONTROLREG和CONFIGREG
(3) 设置PMIC来输出合适的电压、电流。
比如// Send PMICcommands to power on supplies required for boot
// VGEN = 1V8_DIG2 = 1.8 (power EthernetPHY)
if(!OALPmicWriteMasked(MC13892_REG_SET0_ADDR,
CSP_BITFMASK(MC13892_REG_SET0_VGEN3),
CSP_BITFVAL(MC13892_REG_SET0_VGEN3, 0)))
{
OALMSG(OAL_ERROR,(_T("OALPmicInit: Unable to configure VGEN3\r\n")));
goto cleanUp;
}
为什么设置PMIC的MC13892_REG_SET0_ADDR(0x1E=30)的MC13892_REG_SET0_VGEN3位的值为0时,VGEN3输出的是1.8V呢?加MC13892数据手册的第88页,相关说明如下:
图1
2. BootTimerInit
初始化EPIT(Enhanced Periodic Interrupt Timer,增强型周期性中断定时器),因为后面的OALStall函数在实现过程中需要用到。
3. 获取启动模式和判断启动媒介
(4) 启动模式
IMX51有4种启动模式,启动模式由BOOT_MODE0/1的值来决定,这两个值由硬件电路来决定,如下图:
图2
图2的BMOD0/1分别接的是CPU的BOOT_MODE0/1,在设备启动的时候,这两个引脚的值会记录在SRC(System Reset Controller,系统复位控制)的SBMR(SRCBoot Mode Register)就存期的BMOD[1:0]位,这两位的值对应的启动模式如下:
图3
(5) 启动媒介
IMX51支持的启动媒介有NAND FLASH、EEPROM、SD/MMC等,根据SBMR寄存器的描述,先通过获取SMBR寄存器的BT_MEM_CTL[1:0]的值来选择媒介类型,如下图:
图4
然后再判断SMBR寄存器的BT_MEM_TYPE[1:0]的值就可以确认具体的启动媒介,如下图:
图5
4. SD/MMC初始化
SD1接口连接INAND,SD2接口连接TF卡,IMX51有4路的ESDHC。
(1) 配置SD1_CMD、SD1_CLK、SD1_DAT0、SD1_DAT1、SD1_DAT2和SD1_DAT3引脚功能。
(2) 在初始化INAND控制器之前,先通过设置SYSCTL(System Control Register,系统控制寄存器)的RSTA=1来复位,此复位动作除了card检测电路之外,会影响整个host控制器(也就是ESDHC控制器)。ROC、RW、RW1C和RWAC这样的寄存器位被清零。在ESDHC的功能寄存器有效后,ESDHC设置RSTA=0,此事host驱动可以读取这些寄存器。在设置为RSTA=1来复位ESDHC后,建议host驱动reset和重新初始化外部的card(这里为INAND)。
(3) 复位完成后,接着mask寄存器IRQSIGEN(中断信号使能寄存器)的所有的SDHC中断位,目的是在重新初始化ESDHC控制器前,不影响SDHC中断。
(4) 除了CINS和CRM位,使能IRQSTAT(中断状态使能寄存器)的所有位,因为在eboot阶段不需要出来card的插入和拔出的动作。
(5) 设置SD/MMC时钟频率,其中最大频率为52MHZ(见数据手册的ESDHC部分),这里涉及到时钟的选择和判断,下面以ESDH1时钟的初始化来举例:
1) main.c函数调用OEMDebugInit--->OEMInitDebugSerial---> OALBspArgsInit(pBspArgs),最后在OALBspArgsInit函数中设置ESDH1的默认时钟,这也是根据处理器复位后默认值来决定的,见下图:
图6
由图6可见复位后,CCM(时钟控制模块)串行时钟多路选择寄存器CSCMR1的esdhc1_clk_sel[1:0]=10,标明从pll3_sw_clk获取时钟。
2) pll3经过CSCDR1寄存器的PRED和PODF分频后再给ESDHC1提供时钟
3) 记录下DDK_CLK_TREE_NODE的值。
(6) 发送CMD0来复位card
(7) 初始化SD/MMC card
(8) 获取要nboot、eboot和nk的偏移地址和大小
图7
如果系统采用小NK,则NK大小为62M,如果是大NK,则为96M,这里因为没有定义IMGSMALLNK环境变量,所以为小NK。上图是IMX51评估板平台的分配图,假如图6的2M不够,还可以扩展。
5. LoadBootCFG
SD/MMC初始化后,调用此函数来获取bootloader的配置信息,为后面的加载或是下载系统做一些准备。