首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

WINCE6.0的NandFlash分区挂载有关问题

2012-02-02 
WINCE6.0的NandFlash分区挂载问题环境:Uboot + Eboot + Wince 6.0,S3C6410 CPU,Samsung K9G8G08 1G Bytes

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
[解决办法]

探讨
我把MBR记录打印出来了,发现第1次成功启动和以后启动的MBR记录是一样的,都有2个分区,
第1个是binfs分区(蓝色标注部分),第2个是fat分区(见红色标注部分),分区表如下:
.....
分区表都正常,并没有被覆盖掉,会是什么问题引起的呢?

热点排行