【转载】WinCE Eboot中的BLCOMMON
转载自:http://blog.csdn.net/nanjianhui/archive/2008/10/20/3111422.aspx
在EBOOT中,从Startup.s跳转到C程序入口以后,程序就可以用C语言来编写了,这样感觉就好多了。一般C语言的入口就是一个Main函数,也可能叫其他的名字。在这个Main函数中会掉用BootloaderMain函数,该函数在BLCOMMON模块中被定义的。一般Main函数的写法如下:
void (void)
{
// Common boot loader (blcommon) main routine.
BootloaderMain();
// Should never get here.
SpinForever();
}
从程序中可以看出,EBoot在进入C程序以后,只调用了BootloaderMain函数,至于SpinForever函数实际上就是一个while的死循环。所以可以看出,Eboot的所有工作都在BootloaderMain中完成,源代码可以在” \WINCE600\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON”里找到。具体流程如图:
下面介绍一下具体步骤:
1. BootloaderMain函数首先调用KernelRelocate函数将Bootloader中用到的全局变量拷贝到RAM中。
2. 然后调用OEMDebugInit函数来初始化Debug调试功能,一般都是初始化串口,这样从这里以后就可以使用串口打印调试信息了。
3. 之后调用OEMPlatformInit函数,来对板子进行初始化,很多和平台相关的初始化工作都可以在这个函数中完成。
4. 调用OEMPreDownload函数,从流程上来说应该是为下载内核做一些准备工作,该函数执行后,根据返回值得不同可以选择下载内核,或者跳转执行。实际上,该函数中首先会读取Boot配置信息,然后初始化下载设备,一般是网卡设备。
5. 如果OEMPreDownload函数返回BL_DOWNLOAD时,将会从主机下载WinCE image。
6. 如果OEMPreDownload函数返回BL_JUMP时,直接跳转到WinCE image所在的位置开始执行。
其中涉及的OEM函数都是需要用户自己实现的,然后被BLCOMMON模块来调用。这些函数会在以后介绍。