微软精心设计一套和具体硬件无关的bootloader 软件框架,此框架包含以下几个部分:
(1)BLCOMMON;
(2)OEM代码;
(3)EBOOT特定代码;
(4)存储管理代码;
(5)EDBG驱动程序;
这五部分代码的开发程度如下:
(1)blcommon 是OEM用户不能修改的,代码存放在%WINCEROOT%/PUBLIC/COMMON/OAK/DRIVER/ETHDOG/BLCOMMON
(2)oem代码需要用户自行实现;
(3)EBOOT代码,以太网操作相关的函数;
(4)存储管理,存储分区,以及FLASH驱动,存放在%WINCEROOT%/PUBLIC/COMMON/OAK/DRIVER/ETHDOG/bootpart
(5)EDBG驱动程序,OEM用户有可能需要进行修改,%WINCEROOT%/PUBLIC/COMMON/OAK/DRIVER/ETHDOG
进入EBOOT之后,首先运行的是Main函数,Main函数的实现非常的简单:
void main(void)
{
BootloaderMain();
/ / Should never get here.
SpinForever();
}
常用的函数的功能如下:
StartUp() :CPU最先执行的函数。也就是启动代码。
BootLoaderMain() :先后调用KernelRelocate、OEMDebugInit、OEMPlatformInit、OEMPreDownload等函数。
KernelRelocate():把镜像中的全局变量Copy到Ram中,该过程完成之后,其他模块才能正常访问保存的全局数据。
OEMDebugInit() :初始化串口。
OEMPlatformInit() :执行特定平台的初始化工作,如时钟、一些驱动程序。EBoot的菜单选项就在这个里面实现的。
OEMPreDownload() :做下载前的准备工作。根据用户在菜单中的选择,判断是下载还是直接启动。
DownloadImage() :下载操作系统镜像到RAM或者Flash。
OEMLaunch() :负责启动镜像。
OEMReadData() :从远程计算机读取数据,并判断是从USB下载还是从SD下载。SD下载的大部分的功能实现都是仿照USB下载来完成的,如果EBOOT中没有USB下载可以仿照,也可以仿照网络下载,实现方式都是大同小异。只是FAT文件系统和SD读写需要自己实现。
OEMMapMemAddr() :专用于写Flash时使用。因为写flash的速度非常慢,所以此函数将Flash镜像临时缓冲到RAM中。
OEMShowProgress() :从函数名就能看出。
OEMIsFLashAddr() :判断一个地址是否是Flash的地址。
OEMFinishEraseFlash() :判断是否完成了擦除Flash内容工作。
OEMWriteFlash() :写镜像到Flash。
OEMStartEraseFlash() :开始擦除Flash。
OEMContinueEraseFlash() :继续擦除Flash工作。
图示如下:
参考原文:http://blog.csdn.net/basonjiang_sz/archive/2010/05/17/5599295.aspx
参考原文:http://blog.csdn.net/hejianhua/archive/2010/01/15/5194280.aspx
参考原文:http://blogold.chinaunix.net/u1/56388/showart_2493569.html