WINCE6.0的NandFlash分区挂载问题
环境:Uboot + Eboot + Wince 6.0,S3C6410 CPU,Samsung K9G8G08 1G Bytes NandFlash。
现象:
1、EBoot下载nk.bin文件后第一次启动wince,控制面板-->存储管理器中可以看到
part00、*part01两个分区,part00为BINFS格式,类型:0x21,part01为ExFat
(FAT)格式,类型:0x0B。
其中part01带*号,表示已经挂载上,我的设备中可以看到NandFlash的文件夹,
可以正常拷贝、读写文件,part01的标志为0x00000010
2、关机后重新启动,Eboot使用已经存在的image启动,进入wince后发现NandFlash文件夹
消失了,在存储管理器中可以看到part00和part01两个分区,但part01没有加*号了,
并且flags的标志变为0x00000000。
3、以后再次断电重启,情况都与2相同。part01分区也不能手工格式化和挂载。
4、研究Eboot代码发现,第一次下载nk.nb0时调用了nand.cpp中的WriteOSImageToBootMedia()函数,
该函数中有如下2个调用,分别创建了binfs和fat分区:
创建BINFS分区:
hPart = BP_OpenPartition( (IMAGE_START_BLOCK+1)*PAGES_PER_BLOCK,// next block of MBR
(SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength))+1)*PAGES_PER_BLOCK, // align to block
PART_BINFS,
TRUE,
PART_OPEN_ALWAYS);
创建FAT分区:
hPartEx = BP_OpenPartition( NEXT_FREE_LOC,
USE_REMAINING_SPACE,
PART_DOS32,
FALSE,
PART_OPEN_ALWAYS);
根据启动时串口输出信息,启动时以上两个分区都不存在,因此都重新创建了。
以后启动时调用了ReadOSImageFromBootMedia()函数,该函数调用了如下函数:
hPart = BP_OpenPartition( NEXT_FREE_LOC,
USE_REMAINING_SPACE,
PART_BINFS,
TRUE,
PART_OPEN_EXISTING);
根据启动时串口输出信息,再次打开时binfs分区是存在的。
5、尝试了多种方法,比如改注册表,修改第2个BP_OpenPartition函数的的第4个参数为FALSE,都没有成功。
现在注册表的相关信息如下:
;-------------- NAND Flash Block Device Driver ----------------------------------
; HIVE BOOT SECTION
IF BSP_NONANDFS !
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NANDFLASH]
"Prefix"="DSK"
"Dll"="nandflash.dll"
"Index"=dword:1
"Order"=dword:0
"Profile"="NANDFLASH"
"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
IF IMGHIVEREG
"Flags"=dword:1000
ENDIF IMGHIVEREG
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NANDFLASH]
"DriverPath"="Drivers\\BuiltIn\\NANDFLASH"
"LoadFlags"=dword:1; load synchronously
"BootPhase"=dword:0
IF IMGHIVEREG
"MountAsBootable"=dword:1; for Hive-based registry
ENDIF IMGHIVEREG
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH]
"DefaultFileSystem"="BINFS"
"PartitionDriver"="mspart.dll"
"Name"="Microsoft Flash Disk"
"AutoPart"=dword:1
"AutoMount"=dword:1
"AutoFormat"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH\BINFS]
"MountHidden"=dword:1
"MountAsROM"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH\FATFS]
"FormatExfat"=dword:1
"Flags"=dword:14; deprecated in CE6.0 (0x4 : FATFS_DISABLE_AUTOSCAN, 0x10 : FATFS_ENABLE_BACKUP_FAT)
"DisableAutoScan"=dword:1
"CheckForFormat"=dword:1
"EnableWriteBack"=dword:1
"AutoPart"=dword:1
"AutoMount"=dword:1
"AutoFormat"=dword:1
"Folder"="NandFlash"
"MountAsRoot"=dword:1; for ROM-only file system
IF IMGHIVEREG
"MountAsBootable"=dword:1; for Hive-based registry
ENDIF IMGHIVEREG
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NANDFLASH\Filters\CacheFilt]
"Dll"="cachefilt.dll"
"LockIOBuffers"=dword:1
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH\FATFS\Filters\CacheFilt]
"Dll"="cachefilt.dll"
"LockIOBuffers"=dword:1
ENDIF BSP_NONANDFS !
; END HIVE BOOT SECTION
;-------------------------------------
希望达到的效果:
wince启动后part01分区能被自动mount上,作为一个fat文件系统使用,断电启动后放到里面的内容不会丢失。
希望各位大虾多多指点,非常感谢。
btw:经过多次测试,发现在Eboot中格式化一下BINFS分区,然后重新下载nk.nb0文件,然后启动wince,part01分区就能正常挂载。但再次启动又不能挂载了。
[解决办法]
可以确认一下MBR写在哪里了,能读到吗?
系统第二次启动的时候很有可能是没有读到MBR,因为第一次可以说明分区都已经新建成功了。
[解决办法]
个人觉得原因如下:
nand flash驱动不行(和eboot共享)
或者是BSP不知道哪里有格式化的设置。
更换别人成功的BSP来试试。只能这样才能排除问题,不然很难找原因的。
[解决办法]
以后启动时调用了ReadOSImageFromBootMedia()函数,该函数调用了如下函数:
hPart = BP_OpenPartition( NEXT_FREE_LOC,
USE_REMAINING_SPACE,
PART_BINFS,
TRUE,
PART_OPEN_EXISTING);
根据启动时串口输出信息,再次打开时binfs分区是存在的。
ReadOSImageFromBootMedia()函数为什么还要调BP_OpenPartition?????
[解决办法]
另外,目前采用的是:RAM and ROM File Sytem,以及RAM based Registr
你先试试把RAM based Register换成hive base Register
[解决办法]