一般情况下,bootloader是由OEM StartUP code 和Main Code两部分组成。OEM startup code 是首先执行的bootloader代码,它初始化内存寄存器、设置cpu频率并初始化缓存(cache),它也可以完成一些附加的初始化功能然后跳转到由%WinCEroot%PlatForm/<name>/Src/BootLoader/Eboot/Main.c实现的Main的入口点。OEM startup code 一般由汇编语言代码来实现。
Main code是管理boot loader执行的主要C语言代码,它通过接收来自串口的用户命令或检查相应的硬件开关来决定完成什么操作,也可以在main code 中实现一个OEM启动画面,当bootloader运行时,显示OEM的公司标志(logo)、bootloader版本信息或软件固件firmware等信息。
Main code主要包括如下代码区域:
映像下载代码:
以太网IO代码:
调试串口IO代码:
flash写入代码:
firmware监视器:
bootloader控制流程:
当打开电源或复位时,cpu首先执行StartUp函数,Startup函数通常由汇编语言代码编写,主要用来建立存储器访问和初始化缓存。然后Startup函数跳转到Blcommon框架的BootLoaderMain函数。Blcommon框架被实现为Blcommon.lib库,并与平台特定的BootLoader代码进行连接。Blcommon代码位于%WinCEroot%Public/common/Oak/Drivers/Ethdbg/Blcommon文件夹,它基本上为任何使用的BootLoader提供一个标准的控制流程。
bootloaderMain中用到的主要函数:
OEMDebugInit:初始化调试端口,通常为串口
OEMPlatformInit:完成平台特定的初始化,包括实时时钟,flash,网络适配器
OEMPreDownLoad:为平台创建一个平台名,获得动态ip地址或非配一个静态ip地址,初始化tftp传输
DownloadImage:下载操作系统映像到目标设备的ram或falsh
OEMLaunch:加载os运行时映像
%root%platform/<name>/src/bootloader/eboot/main.c中
OEMReadData:在下载过程中从传输端口读取数据。
OEMShowprogress:利用led或其他方式,为用户可视的显示下载进度。
OEMMapMemAddr:用于将flash存储器地址映射为一个在ram中的位置,用于在ram中临时存储要写入到flash中的操作系统运行时的映像。
OEMMIsFlashAddr:决定将正在下载的.bin文件存储到flash还是ram。
OEMWriteFlash:将临时缓存在ram中的操作系统映像写入到flash的最终位置,并验证操作确实成功完成。
OEMStartEraseFlash:用于初始化flash存储器的擦除过程,使bootloader知道存储器操作系统映像要多大的flash存储器空间。
OEMFinishEraseFlash:在操作系统运行时映像下载完毕后,结束flash存储器的擦除过程,保证flash存储器被完全擦除,并准备开始将映像文件写入到flash存储器。
OEMContinueEraseFlash:在.bin文件的每个记录下载过程中,周期性的被调用,以便继续flash存储器的擦除操作,直到flash存储器被完全擦除。