WinCE Bootloader学习笔记
之Bootloader框架
以下代码都是基于s3c2440的,WinCE Bootloader。
从Startup.s汇编中的b main 指令,就跳转到了Bootloader的C语言部分的main函数,C部分开始运行。这一部分的主要工作框架图如下:
其实首先是跳转到Main()函数,如下:
void main(void)
{
// Clear LEDs.
OEMWriteDebugLED(0, 0x3); //初始化LED,这个可以不用去看。
// Common boot loader (blcommon) main routine.
BootloaderMain(); //Bootloader的主要流程是在这里完成的,详见上图。
// Should never get here.
SpinForever(); //不可能运行到这里。
}
在Main()函数中调用了BootloaderMain()函数,这里有意思的部分就开始了。一来就给我这种菜鸟初学者一个大陷阱。代码如下:
void BootloaderMain (void)
{
//......................省略...........................................
// relocate globals to RAM
if (!KernelRelocate (pTOC)) //拷贝全局变量到RAM
{
// spin forever
HALT (BLERR_KERNELRELOCATE);
}
// (1) Init debug support. We can use OEMWriteDebugString afterward.
if (!OEMDebugInit ()) //初始化串口
{
// spin forever
HALT (BLERR_DBGINIT);
}
// output banner
EdbgOutputDebugString (NKSignon, CURRENT_VERSION_MAJOR, CURRENT_VERSION_MINOR);
// (3) initialize platform (clock, drivers, transports, etc)
if (!OEMPlatformInit ()) //平台初始化,时钟,驱动等
{
// spin forever
HALT (BLERR_PLATINIT);
}
// system ready, preparing for download
EdbgOutputDebugString ("System ready!/r/nPreparing for download.../r/n");
// (4) call OEM specific pre-download function
switch (dwAction = OEMPreDownload () //为下载准备一些初始化工作
{
//......................暂时省略,后面会分析...........................................
//......................知道OEMLaunch在这里调用就好.....................
OEMLaunch (dwImageStart, dwImageLength,
dwLaunchAddr, (const ROMHDR *)dwpToc); //启动内核
}
}
框架大概就是这样,具体函数分析在后面的文章给出。