2008年7月24日星期四

Post-Processing flash.dio


windows mobile最终生成image通常叫做flash.bin。请记住其实是flash.dio,这个文件是一个真正的数据镜像,flash.bin是flash.dio在后期处理,也就是post-processing阶段生产的。
Flash.bin中会包含NAND flash每个sector info的附加信息,并且以block的大小分段。其实也就是把flash.dio中的原始数据加以分段,打包。

值得注意的是微软上面提到:
In addition, NandPostProc.exe also truncates TFAT by 4 blocks, and then adds two compaction blocks into IMGFS and into TFAT. These compaction blocks provide wear–leveling, and help lengthen the life of the flash hardware.

Flash.bin中imgfs分区和tfat分区会被加上gap,反正我是没理解微软的用意。他这样一改,会导致开头的MBR中的分区表信息和这里对不上,因为两个分区后移了。除非这4块区域被标记为未使用,那么查找分区时会自然向后查找,否则就会出错。下面是我用KITL抓到的错误:
Loaded 'cecompr.dll', no matching symbolic information found.
2928 PID:a7a9f512 TID:e7a7a85e ERROR: IMGFS!CVolume::LoadCompressionEngine: unable to load decompressor type "yyyyyyyyyyyyyyyy" from dll "CECOMPR.DLL"... expect failures!!!
Unloaded symbols for 'cecompr.dll'

这样的错误,我花了1个多月,才发现就是上面4 blocks导致。最后我临时换了方案,改烧flash.dio就OK。
所以如果你在porting platform时,遇到这样的问题,先参考一下我的经历。

4 条评论:

匿名 说...

有个问题请教下:我目前是使用flash.bin作为下载文件的,烧写时将flash.bin里的data和oob数据分辨烧到nandflash的相应区域里,系统能正常启动。但是现在有个需求,要使用4Kpage的大页nandflash,就有些困难了,因为flash。bin里的PAGE都是2K的,oob数据的具体含义我也不了解。请问你的flash.dio是怎么烧到nandflash里,主要是oob数据是如何填充的?
先谢了!
深圳 何生

cpuwolf 说...

我不太明白您讲的oob是什么东西。
flash.bin或者.dio烧录到nand flash的过程都是一样的,只是你如何处理这个数据源不太一样

匿名 说...

OOB是nandflash 的每个page后面多出的几个字节,用于存放控制信息,如坏块标志等信息。这个问题我已经找到答案了,谢谢

cpuwolf 说...

祝贺