bootloader
普通情况下,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:初始化调试port,通常为串口
OEMPlatformInit:完毕平台特定的初始化,包含实时时钟,flash,网络适配器
OEMPreDownLoad:为平台创建一个平台名,获得动态ip地址或非配一个静态ip地址,初始化tftp传输
DownloadImage:下载操作系统映像到目标设备的ram或falsh
OEMLaunch:载入os执行时映像
%root%platform/<name>/src/bootloader/eboot/main.c中
OEMReadData:在下载过程中从传输port读取数据。
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存储器被全然擦除。