由于项目规定,产品不带串口和网口,调试的时候对系统的下载只能采用直接烧录的形式,这个在调试的时候方便了,但是如果装机了要更新就麻烦了,所以研究在WinCE下直接更新的方法,折腾了一阵,总算搞定,简单记录一下几个要点。
由于没有SD卡,与外界通讯的方式只有WIFI与USB同步,考虑到FLASH空间足够,因此考虑将烧录文件拷贝到FLASH内,读取后直接写入对应的FLASH空间。
首先要实现的是在WINCE下对FLASH的烧写。经过查找,找到了一些资料,通过对FLASH驱动的修改实现。方法是在FMD.C文件中,对FMD_OEMIoControl进行扩展,增加FMD_EraseBlock与FMD_WriteSector命令实现。增加新的IO控制码,并配置相关参数及传递需要的数据,可以实现应用程序对FLASH指定地址的擦写。
之后就是对烧录文件的读取,由于每次执行FMD_WriteSector命令,只能写入一个Sector长度的数据(BSP这样设定了),所以对于文件也是按照sector长度进行读取,然后进行写入。由于我烧录的时候nb0文件,因此可以不需要对文件进行解读,直接读取后烧录就可以。
操作过程:
1、调用FMD_EraseBlock对需求区域进行擦除;
2、打开NK.NB0文件,应用程序中采用了CreatFile的方式进行对应路径的文件打开;
3、使用ReadFile每次读取2k的数据,然后调用FMD_WriteSector将数据依次写入FLASH指定地址,直到完成;
4、完成后重启系统,更新完成。
调试中碰到了几个参数设置问题,所以折腾了好几天才解决,记录一下:
1、FMD_OEMIoControl接收的参数是BYTE型的,所以数值较大时候,需要采用数组方式分拆传送,之前就有擦除的块ID超过255导致擦错地方的情况……
2、有些FLASH中对FLASH进行了保护,所以在进行擦写前,要先确定该区域可编程。
3、FMD_WriteSector中有一个SectorInfo参数,可能不同的BSP操作不同,所以当时在网上查到别人使用了NULL,照搬,怎么写都不对,使用烧录器读出数据,都是对的,就是重启后系统错误然后就挂了,查了蛮久才发现原来是没有传递这个参数,导致SPARE区被写成了0xFF,读取失败,而之前读取数据对比读的都是main区……
sectorinfo定义:
typedef struct _SectorInfo {
DWORD dwReserved1;
BYTE bOEMReserved;
BYTE bBadBlock;
WORD wReserved2;
} SectorInfo, *PSectorInfo;
可以根据自己的代码进行参数的配置。