WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(9)-BINFS在Nand上的实现(OS镜像的烧写与加载)

之前的调式运行都是PB通过以太网下载到板子的RAM中运行,也就是CE直接运行在内存中.但是最终CE都是在设备上电后自动运行.这就需要将CE的OS镜像存储在非易失性设备中,然后bootloader将其复制到RAM中并运行.
板子上有64M的Nand Flash,我们就将系统镜像存储在Nand Flash中.PB首先通过以太网下载OS镜像到RAM,然后eboot再将其烧写到Nand Flash中.系统上电eboot启动后再读取Nand Flash中的系统镜像,将其加载到RAM中运行.
nk.bin是基于记录的OS镜像文件,需要通过一个类似解压的工作才能运行,而nk.nb0则是系统运行的二进制镜像,直接load到RAM中就可以运行了.BINFS的功能实现可以分3步来:
第一步:将OS镜像写入到Nand Flash中的BINFS文件系统,然后可以在eboot中进行读取并加载到RAM中运行
第二步:将NandFlash分成BINFS和FAT两个区,BINFS用来保存nk.bin,FAT用来作存储区
第三步:实现诸如Multibin等更高级的BINFS应用.

这次先实现第一步,实现OS镜像在BINFS中的存储和加载.如有错误,欢迎指正.
BINFS是Binary ROM Image File System,CE5.0的联机文档是这么说的:
The binary ROM Image File System (BINFS) is a file system that reads the binary image (.bin) file format generated by Romimage.exe. The .bin file format organizes data into specific sections. Each section contains a section header that specifies the starting address, length, and checksum values for that section. Romimage.exe writes data organized by logical sections, such as an application's text or .data region, to the .bin file.
PB下载到开发板的是nk.bin文件,在eboot中的Blcommon.c中的DownloadImage函数将其解压为nk.nb0,然后我们烧写nk.nb0到flash中.系统启动时eboot从flash中读取nk.nb0,然后加载到内存中运行.
1.增加eboot对BINFS的支持
(1)添加BOOTPART库
该库位于/PUBLIC/COMMON/OAK/DRIVERS/ETHDBG/BOOTPART,我们将其复制到BSP目录下,如/PLATFORM/GEC2410/SRC/COMMON/BOOTPART,该库实现了BINFS操作的各种函数.Flash驱动在SMDK已经实现了,在FMD库中.
(2)在eboot的source文件的TARGETLIBS中增加对该库的引用:
$(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/bootpart.lib
(3)也可以直接引用bootpart.lib,由于Flash配置的关系需要做些修改

同样在BP_OpenPartition中手动设置格式化的起始Block
BP_LowLevelFormat (18, g_FlashInfo.dwNumBlocks, dwFlags);
另外我们的nand.c中会调用变量dwLastWrittenLoc,在bootpart.cpp中需要extern "C"的声明
extern "C" {DWORD g_dwLastWrittenLoc;}  // Stores the byte address of the last physical flash address written to
重新编译该库.

(4)在OEMPlatformInit函数添加BINFS的初始化,

这里IMAGE_START_BLOCK就是BINFS在NandFlash起始的block bumber,实际值为0x12,即BINFS从block 18开始,之前的block的用来保存Nboot,eboot等(虽然现在eboot实现在nor flash中,并未用到,但为了可能用到因而暂时保留一个区).实际上block 18是MBR,block 19才开始是OS镜像的区域
#define RESERVED_BOOT_BLOCKS        (NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE)
#define IMAGE_START_BLOCK           RESERVED_BOOT_BLOCKS
BP_Init实际上调用了FMD_Init和FMD_GetInfo进行NandFlash的初始化和获取NandFlash的信息,保留了BINFS_RAM_START地址的一段内存将来用来处理Flash的相关信息.
(4) OEMMultiBINNotify
在原来SMDK2410的BSP中g_pOEMMultiBINNotify函数只能下载.nb0,我们需要修改来获取nk.bin的信息
在OEMDebugInit中创建一个新的函数指针OEMMultiBINNotify
   //g_pOEMMultiBINNotify = OEMDownloadFileNotify;
    g_pOEMMultiBINNotify = OEMMultiBINNotify;
OEMMultiBINNotify代码:

OEMMultiBINNotify获取PB将要下载的nk.bin信息,并保存在MultiBINInfo型的结构g_BINRegionInfo中.

(5)在nand.c中实现读写OS镜像函数:WriteDiskImageToSmartMedia和ReadRamImageFromBootMedia
[1]WriteDiskImageToSmartMedia
目前只支持一个nb0文件,即nk.nb0的保存,要支持multi-bin还需要在增加代码,第一步先支持单个镜像文件,然后再来支持multi-bin,有些代码是用来支持multi-bin的,这部分我没有修改,目前不会用到.

[2]ReadRamImageFromBootMedia
读就比较简单了,通过bootpart库的API去读取BINFS分区的文件(nk.nb0),放入指定的内存区域,然后就可以在OEMLaunch中跳转运行CE OS了.

(6)在OEMLaunch调用ReadRamImageFromBootMedia和WriteDiskImageToSmartMedia
在OEMLaunch添加以下代码:

设置加载地址:

(7)在eboot菜单中设置,这样就可以选择是连接PB下载nk.bin进行调试还是直接从Nand加载OS并运行了.
主要工作就是设置一些标志位,这样在OEMLaunch,OEMPreDownload中就可以进行判断就相应的处理了.
eboot菜单中添加:

菜单对应的执行代码:

OEMPreDownload的修改,在函数开始添加,这样如果从Flash启动就可以跳过bootme

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值