开发WinCE设备更新工具过程--详记
2009-12-08 11:52
267 查看
最近在开发一款嵌入设备,基于WinCE5.0,使用的是SamSung的2416 cpu,基于2450的bsp。
首先是要了解eboot的详细流程,
main->BootloaderMain()
在看到第一句就碰到问题了,如下代码。
if (!KernelRelocate (pTOC))
{
// spin forever
HALT (BLERR_KERNELRELOCATE);
}
其中pToc唯一的赋值地方是在blcommon.c的声明,
ROMHDR * volatile const pTOC = (ROMHDR *)-1; // Gets replaced by RomLoader with real address
查了很多资料后,大概知道是romimage.exe给他做了赋值,具体的过程有待进一步了解。
///////////////////////////////////////////////////////////////////////////////////////
// 关于NandFlash擦除操作相关说明
对于NandFlash目前进行的分区如下:
1.保留区
保留区分为如下几部分:
1)Stepldr
2)TOC
3)EBOOT
2.BINFS
这是第一个分区,用于存储系统,NK.bin,在保留区的后
3.FAT1
这是第二个分区,用于存储driver
4.FAT2
这是第三个分区,用于存储应用程序
5.FAT3
这是第四个分区,属于用户数据区
6.开机画面
此区域用于存储开机画面的数据,不计入分区中。
如何标记保留区的块为保留块?
SectorInfo si;
// to keep bootpart off of our reserved blocks we must mark it as bad, reserved & read-only
si.bOEMReserved = OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY;
si.bBadBlock = BADBLOCKMARK;
si.dwReserved1 = 0xffffffff;
si.wReserved2 = 0xffff;
OALMSG(TRUE, (TEXT("Reserving Blocks [0x%x - 0x%x] .../r/n"), 0, IMAGE_START_BLOCK-1));
//给保留区域写入标志
for (i = 0; i < RESERVED_BOOT_BLOCKS; i++) {
FMD_WriteSector(i, NULL, &si, 1);
}
BOOL FMD_WriteSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors): 这个函数用于写nandflash的一个扇区。对于nandflash来说,分大page和小page,大page是2048个bytes一页,小page是512个bytes一页。所以大page每个扇区有2048 bytes,小page每个扇区有512 bytes。
startSectorAddr: nandflash物理扇区的起始地址,对于nandflash来说,就是nandflash中从哪个page开始。
pSectorBuff:扇区数据buffer,从nandflash中写入的每一个扇区的数据都存放在这个buffer中。
pSectorInfoBuff:扇区信息buffer,一般每个扇区的信息会被保存在nandflash的带外数据中,针对小page,带外数据有16 bytes,大page有64 bytes。从nandflash的带外数据将该扇区的相关信息读出来,存放在这个buffer中。
pSectorInfoBuff参数读取相应sector状态,如果pSectorInfoBuff参数为NULL则读写sector数据。pSectorBuff为非NULL则读写sector状态。
///////////////////////////////////////////////////////////////////////////////////////
首先是要了解eboot的详细流程,
main->BootloaderMain()
在看到第一句就碰到问题了,如下代码。
if (!KernelRelocate (pTOC))
{
// spin forever
HALT (BLERR_KERNELRELOCATE);
}
其中pToc唯一的赋值地方是在blcommon.c的声明,
ROMHDR * volatile const pTOC = (ROMHDR *)-1; // Gets replaced by RomLoader with real address
查了很多资料后,大概知道是romimage.exe给他做了赋值,具体的过程有待进一步了解。
///////////////////////////////////////////////////////////////////////////////////////
// 关于NandFlash擦除操作相关说明
对于NandFlash目前进行的分区如下:
1.保留区
保留区分为如下几部分:
1)Stepldr
2)TOC
3)EBOOT
2.BINFS
这是第一个分区,用于存储系统,NK.bin,在保留区的后
3.FAT1
这是第二个分区,用于存储driver
4.FAT2
这是第三个分区,用于存储应用程序
5.FAT3
这是第四个分区,属于用户数据区
6.开机画面
此区域用于存储开机画面的数据,不计入分区中。
如何标记保留区的块为保留块?
SectorInfo si;
// to keep bootpart off of our reserved blocks we must mark it as bad, reserved & read-only
si.bOEMReserved = OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY;
si.bBadBlock = BADBLOCKMARK;
si.dwReserved1 = 0xffffffff;
si.wReserved2 = 0xffff;
OALMSG(TRUE, (TEXT("Reserving Blocks [0x%x - 0x%x] .../r/n"), 0, IMAGE_START_BLOCK-1));
//给保留区域写入标志
for (i = 0; i < RESERVED_BOOT_BLOCKS; i++) {
FMD_WriteSector(i, NULL, &si, 1);
}
BOOL FMD_WriteSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors): 这个函数用于写nandflash的一个扇区。对于nandflash来说,分大page和小page,大page是2048个bytes一页,小page是512个bytes一页。所以大page每个扇区有2048 bytes,小page每个扇区有512 bytes。
startSectorAddr: nandflash物理扇区的起始地址,对于nandflash来说,就是nandflash中从哪个page开始。
pSectorBuff:扇区数据buffer,从nandflash中写入的每一个扇区的数据都存放在这个buffer中。
pSectorInfoBuff:扇区信息buffer,一般每个扇区的信息会被保存在nandflash的带外数据中,针对小page,带外数据有16 bytes,大page有64 bytes。从nandflash的带外数据将该扇区的相关信息读出来,存放在这个buffer中。
pSectorInfoBuff参数读取相应sector状态,如果pSectorInfoBuff参数为NULL则读写sector数据。pSectorBuff为非NULL则读写sector状态。
///////////////////////////////////////////////////////////////////////////////////////
相关文章推荐
- 项目开发过程中一些常用的工具[持续更新中]
- 安卓开发过程遇到的工具方法总结(持续更新~~)
- 建立LINUX开发环境并编译LINUX和UBOOT以及生成设备树过程总结
- Kiln:直接运行在iOS设备上的应用开发工具 (github.com)
- .net项目开发工具(最近更新)
- caffe开发过程中使用了哪些工具?
- Google推出Android 2.3 更新SDK和开发工具
- 开发中常用的软件、插件、工具汇总(实时更新)
- [xcode]_[开发工具]_[常用高效工具总结][持续更新]
- 关于samsung连接BLE设备的一些资料汇总和开发过程一些经验总结
- (持续更新)日积月累——iOS开发过程中遇到的一些小问题
- ExtJS结合WCF/Jquery结合WCF 分别开发的非常优秀的网页聊天工具,持续更新
- IoT开发的福音:2017年机智云平台工具和能力更新汇总
- CSS开发工具---持续更新
- 10个可以简化开发过程的MySQL工具
- 【转载】WinCE中中断的处理过程(驱动开发人员角度)
- 在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开发环境。文章通过一个具体的例子说明了这些嵌入式交叉编译开发工具的制作过程。 随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来
- 没头没尾--项目开发笔记:如何开发代码更新工具?!(上)
- javaweb开发过程中小工具系列之返回一个不重复的字符串
- javaweb开发过程中小工具系列之将Map转换成对象