注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

男儿当自强的博客

每天进步一点

 
 
 

日志

 
 
 
 

WINCE6.0+S3C2443的启动过程---eboot4  

2010-10-12 21:30:07|  分类: wince的bootloade |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://blog.csdn.net/chinesedragon2010/archive/2010/10/05/5922489.aspx

 

2 main函数

void main(void)

{

    //MemoryTest_Function();

    BootloaderMain();

    // Should never get here.

    SpinForever();

}

Main函数主要是通过调用BootloaderMain函数来实现其功能的,下面来看看BootloaderMain函数的流程图:

             WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客                            

2.1 KernelRelocate()

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

⑴pTOC的结构体ROMHDR

结构体ROMHDR在\WINCE600\PUBLIC\COMMON\OAK\INC\Romldr.h中定义,如下所示

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

 

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

从上图我们知道Physical first=0x80038000,这就是eboot\boot.bib中eboot指定的地址

EBOOT    80038000  00040000  RAMIMAGE

Physical last=0x8004FE54=image start+length=0x80038000+0x00017E54,所以从physical first到physical last这段内存的大小就是eboot.bin的大小

 

RAM Free – RAM Start=0x7000,这段RAM用于做什么呢?不知道,还望知者指教,难道是用于全局变量的重定位吗?用于把boot loader中的全局变量重定位到这段RAM中吗?我想也许是,见我发的相关帖子http://topic.csdn.net/u/20101009/10/d2598ab6-f926-49f1-a708-7bc8c9ec2e6d.html

对于如何实现重定位的,见下面这个链接,在此就不描述了。

http://blog.csdn.net/chinesedragon2010/archive/2010/10/09/5929007.aspx

 

2.2 OEMDebugInit ()

BOOL OEMDebugInit(void)

{

 

    // Set up function callbacks used by blcommon.

    //

    g_pOEMVerifyMemory   = OEMVerifyMemory;      // Verify RAM.

    g_pOEMMultiBINNotify = OEMMultiBINNotify;

 

    // Call serial initialization routine (shared with the OAL).

    //

    OEMInitDebugSerial();

 

    return(TRUE);

}

OEMDebugInit函数主要用于设置后blcommon.lib库需要回调的函数OEMVerifyMemory和OEMMultiBINNotify,这两个函数的具体作用,后面再详细描述。OEMDebugInit函数还调用OEMInitDebugSerial函数来初始化用于debug的串口端口。

 

2.3 OEMPlatformInit ()

注:本文是基于SD卡的更新方式

OEMPlatformInit()的工作如下:

2.3.1 初始化显示控制器

通过调用函数InitDisplay来初始化LCD控制器,初始化之后可以来显示eboot阶段的logo信息。

 

2.3.2 初始化BSP参数结构体

通过调用函数OALArgsInit(pBSPArgs)来初始化BSP的共享数据,OAL与EBoot会共享一些参数,即EBoot会将一些参数传给OAL使用,在此可以给参数初始化。

// Initialize the BSP args structure.

    //

OALArgsInit(pBSPArgs);     

pBSPArgs在eboot\loader.h的相关定义如下

// Driver globals pointer (parameter sharing memory used by bootloader and OS).

//

#define pBSPArgs        ((BSP_ARGS *) IMAGE_SHARE_ARGS_UA_START)

IMAGE_SHARE_ARGS_UA_START对应的虚拟和物理地址的宏定义如下:

#define IMAGE_SHARE_ARGS_PA_START       0x30020000

#define IMAGE_SHARE_ARGS_UA_START       0xA0020000

pBSPArgs是一个结构体((BSP_ARGS)类型的指针。BSP_ARGS结构体的成员中,就保存了这些共享参数。它指向的是bootloader和OS共享的参数内存区域,用于在bootloader和OS的OAL及驱动之间传共享的参数,这个内存的其实地址和大小在files\config.bib下面定义:

; Common RAM areas

       ARGS                80020000  00000800  RESERVED

 

接下来看看BSP_ARGS结构体的定义:

typedef struct {

    OAL_ARGS_HEADER header;

    UINT8 deviceId[16];         // Device identification

    OAL_KITL_ARGS kitl;

    //UINT8 uuid[16];

    BOOL bUpdateMode;      // TRUE = Enter update mode on reboot.

    BOOL bHiveCleanFlag;     / TRUE = Clean hive at boot

    BOOL bCleanBootFlag;     // TRUE = Clear RAM, hive, user store at boot

    BOOL bFormatPartFlag;     // TRUE = Format partion when mounted at boot

       DWORD      nfsblk;

       HANDLE g_SDCardDetectEvent; //kim

       DWORD g_SDCardState ;

       //我们可以在这个结构体中定义项目所需要的在bootloader和OS之间共享的数据。

} BSP_ARGS, *PBSP_ARGS;

重点解释下面的结构体成员:

header是信息头,用来指示pBSPArgs所指内存是否包含有效信息。

deviceId是设备ID,用来标识KITL使用的端口外设。

kitl用于存储KITL端口的相关配置信息。

 

2.3.3 初始化nandflash及从nandflash中获取信息

⑴ FMD_GetInfo()

// Get flash info

    if (!FMD_GetInfo(&flashInfo)) {

        OALMSG(OAL_ERROR, (L"ERROR: BLFlashDownload: "

            L"FMD_GetInfo call failed\r\n"

        ));

}

FMD_GetInfo的主要函数体如下:

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

先是通过ReadFlashID函数来得到当前nandflash的ID,然后分离出此ID的MID和DID,接着通过数值astNandSpec来比较当前nandflash的MID和DID是否和astNandSpec中支持的吻合,如果不吻合就需要在astNandSpec中假如,这也是如果项目所使用的nandflash发生变化时,而astNandSpec又没有相应的支持,就需要astNandSpec中假如新的nandflash的技术参数。

 

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

获取nandflash的技术参数,比如此nandflash有多少个block,每个block有多少页,每个sector的大小是多少,每个block有多少个Byte。

 

 

2.3.4 读取TOC信息

TOC: Table Of Contents, OEM on disk structure.

通过调用函数TOC_Read()来从nandflash中读取出TOC的信息

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

我们目前nandflash的保存布局是:stepldr保存在第0个block中,TOC保存在第1个block中,eboot保存在第2个block中,nk保存在第三个block开始的地方,上面的代码是从第1个block中把TOC的信息读取出来保存在g_pTOC这个全局的指针数组中。

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

通过判读从nandflash中读取出来的g_pTOC是否为NULL和g_pTOC->dwSignature是否等于0x434F544E来判断当前的TOC信息是否有效。

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

Si是SectorInfo的结构体变量,这个结构体的定义如下:

typedef struct _SectorInfo

{

    DWORD dwReserved1;              // Reserved - used by FAL

    BYTE  bOEMReserved;             // For use by OEM

    BYTE  bBadBlock;             // Indicates if block is BAD

    WORD  wReserved2;               // Reserved - used by FAL

   

}SectorInfo, *PSectorInfo;

在NAND FLASH中,每个物理扇区的Spare区都保存一个SectorInfo的数据结构:

dwReserved1:这部分保留给FAL层使用,FAL层将填写逻辑扇区号。

bOEMReserved:这部分保留给OEM使用,可用于定义读写属性。

bBadBlock:这部分是由nandflash芯片坏块标志定义。

wReserved2:这部分保留给FAL层使用,FAL层将填写标志位来防止掉电错粗。

FAL层通过FMD_ReadSector与FMD_WriteSector函数来获取和写入扇区信息。

 WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

解析来看看TOC的结构体

 WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

 

 WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

 

 WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

 

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

 

WINCE6.0+S3C2443的启动过程---eboot4 - 男儿当自强 - 男儿当自强的博客

  评论这张
 
阅读(999)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017