IMX51+WINCE6.0基于SD_MMC启动---eboot(2)之OEMPlatformInit

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;       

}

为什么设置PMICMC13892_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]的值来选择媒介类型,如下图:

IMX51+WINCE6.0基于SD_MMC启动---eboot(2)之OEMPlatformInit_第1张图片

图4

然后再判断SMBR寄存器的BT_MEM_TYPE[1:0]的值就可以确认具体的启动媒介,如下图:

IMX51+WINCE6.0基于SD_MMC启动---eboot(2)之OEMPlatformInit_第2张图片

图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的默认时钟,这也是根据处理器复位后默认值来决定的,见下图:

IMX51+WINCE6.0基于SD_MMC启动---eboot(2)之OEMPlatformInit_第3张图片

图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的配置信息,为后面的加载或是下载系统做一些准备。

 

你可能感兴趣的:(IMX51+WINCE6.0基于SD_MMC启动---eboot(2)之OEMPlatformInit)