CE 5.0 使用剩余NAND作FAT求助

liaohuchen   2008-12-10 11:37 楼主
系统中使用64MB的NAND,512Byte 小页模式。前20个block保留给EBOOT。MBR在第21个block。后边的28M格式化成BINFS用来保存NK镜像。把之后的剩余空间格式化成PART_EXT(也试过DOS32)用作存储空间。参考了eeworld上的相关讨论之后,已经可以在文件浏览器中看到FAT分区。

但是在系统第一次启动格式化FAT分区后,重启后系统就无法再启动了。调试发现除了保留的前20个block外所有的block都被格式化了,这样OS也被干掉了。只有把前28M(包括OS)都设为保留区,系统才可以正常使用。感觉这样的话EBOOT中建立的分区就没有用了。

问题:
怎样让OS启动时候去读取EBOOT建立的MBR中的分区信息,然后使用正确的FAT分区呢?这样的话格式化就应该不会影响到OS了。

谢谢!

我的注册表如下:

; HIVE BOOT SECTION ;
[HKEY_LOCAL_MACHINE\init\BootVars]
   "SYSTEMHIVE"="system.hv"
;  "PROFILEDIR"="Documents and Settings"
   "Start DevMgr"=dword:1
   "Flags"=dword:0  ;5.0下决定在哪个阶段启动device.exe的表项
   "RegistryFlags"=dword:1

[HKEY_LOCAL_MACHINE\init\BootVars]
   "DefaultUser"="default"

; HIVE BOOT SECTION
; @CESYSGEN IF CE_MODULES_SDNPCID

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Support BINFS Section
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Add BinFS to partition table
[HKEY_LOCAL_MACHINE\System\StorageManager\PartitionTable]
    "21"="BINFS"

[HKEY_LOCAL_MACHINE\System\StorageManager\BINFS]
    "Folder"="BINFS"
    "FriendlyName"="Bin FileSystem"
    "Dll"="binfs.dll"
    "Paging"=dword:1
; MountFlags:
; 0x10 specifies that this file system is to be mounted as an external
;      ROM filesystem shadowing the \windows directory
; 0x1 specifies that the mountpoint \BINFS is to be hidden
;
    "MountFlags"=dword:10
    "BootPhase"=dword:0

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\MSFlash]
    "DriverPath"="Drivers\\BuiltIn\\MSFlash"
    ; LoadFlags 0x01 == load synchronously
    "LoadFlags"=dword:1
    "Order"=dword:0
;    "MountFlags"=dword:10
    "BootPhase"=dword:0
    "Flags"=dword:1000

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\MSFlash]
        "Prefix"="DSK"
        "Order"=dword:0
        "Dll"="Dm644xNand.dll"        
        "Profile"="MSFlash"
;        "MountFlags"=dword:10
        "FriendlyName"="MSFLASH Driver"
        "BootPhase"=dword:0
        "Flags"=dword:1000

; Bind BINFS to the block driver
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash]
    "DefaultFileSystem"="BINFS"
    "PartitionDriver"="mspart.dll"
    "AutoMount"=dword:1
    "AutoPart"=dword:1
    "Folder"="NandFlash"
    "Name"="Microsoft Flash Disk"
    "BootPhase"=dword:0
    "Flags"=dword:1000
    "MountAsHidden"=dword:1
    "MountAsRom"=dword:1
;    "MountFlags"=dword:00000004
;    "MountHidden"=dword:00000000

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\MSFlash\FATFS]
    "FriendlyName"="FAT FileSystem"
    "Dll"="fatfsd.dll"
    "Flags"=dword:00280014
    "Paging"=dword:1
    "CacheSize"=dword:0
    "EnableCacheWarm"=dword:0
    "EnableCache"=dword:1
    "MountAsBootable"=dword:1
;    "MountAsRom"=dword:1
;    "MountAsRoot"=dword:1
; @CESYSGEN ENDIF CE_MODULES_SDNPCID
; END HIVE BOOT SECTION

回复评论 (13)

这是flash驱动问题,你只要把NK占用的部分标记为保留的block即可。

这个可以在eboot中实现。
OALMSG(TRUE, (TEXT("Reserving Blocks [0x%x - 0x%x] ...\r\n"), 0, IMAGE_START_BLOCK-1));
                for (i = 0; i < IMAGE_START_SECTOR; i++) {
                    FMD_WriteSector(i, NULL, &si, 1);
                }
                OALMSG(TRUE, (TEXT("...reserve complete.\r\n")));
IMAGE_START_SECTOR这个东西你改成(NBOOT_BLOCK_SIZE + TOC_BLOCK_SIZE + EBOOT_BLOCK_SIZE)的大小即可。
也可以在flash驱动中检测状态(坏块)的函数把NK占用的block标记为坏块或者保留块即可。
点赞  2008-12-10 11:50
好多人弄过了!GOOGLE一下!
点赞  2008-12-10 12:59
谢谢googleman,我现在就是在FLASH驱动里把NK,bootloader, MBR所占用的BLOCK都标为保留块。

我想确定是不是EBOOT里所做的分区就没有用了?因为感觉OS没有读MBR的分区信息。

另外在这种情况下(标为保留块),如果我需要建立两个FAT分区,应该怎么做呢?
点赞  2008-12-10 13:18
gooogleman 你还蛮快的啊

LZ的注册表好多东西啊,有关键值设置,好好查一下msdn,每个人出现的问题都不会完全相同的
点赞  2008-12-10 13:30
引用: 引用 3 楼 andbf 的回复:
谢谢googleman,我现在就是在FLASH驱动里把NK,bootloader, MBR所占用的BLOCK都标为保留块。

我想确定是不是EBOOT里所做的分区就没有用了?因为感觉OS没有读MBR的分区信息。

另外在这种情况下(标为保留块),如果我需要建立两个FAT分区,应该怎么做呢?


不过有点奇怪,你的注册表并没有设置自动格式化 分区
不像我说的问题。
第一次起来,第二次起不来。?
我觉得像是你没有烧写nboot。
你下载的是到内存吧,第一次起来了,然后第二次(断电之后)你还是起不来。?
是这样吗?如果是,那么看看是不是烧写完整了。
点赞  2008-12-10 13:41
对不起,贴错了注册表,贴了一个正在实验的。下边这个才是我上边说的情况所用的注册表。
第二次起不来,是在OS的block没有标记为保留块的情况下。如果标记为保留块就可以起来了。请问需要把MBR也标记为保留块吗?还是没有关系?

; HIVE BOOT SECTION ;
[HKEY_LOCAL_MACHINE\init\BootVars]
   "SYSTEMHIVE"="system.hv"
;  "PROFILEDIR"="Documents and Settings"
   "Start DevMgr"=dword:1
   "RegistryFlags"=dword:1

[HKEY_LOCAL_MACHINE\init\BootVars]
   "DefaultUser"="default"

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\FlashDisk]
    "DriverPath"="Drivers\\BuiltIn\\FlashDisk"
    "LoadFlags"=dword:1
    "MountFlags"=dword:11
    "BootPhase"=dword:00000000
    "Flags"=dword:1000
   
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FlashDisk]
   "Prefix"="DSK"
   "Dll"="Dm644xNand"
   "Order"=dword:0
   "Ioctl"=dword:4
   "Profile"="FlashDisk"
   "FriendlyName"="Freescale NAND Flash Driver"
   "MountFlags"=dword:11
   "BootPhase"=dword:0
   "Flags"=dword:1000
;   "Index"=dword:1
   "FSD"="FATFS.DLL"
   "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"


[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDisk]
    "DefaultFileSystem"="FATFS"
    "AutoMount"=dword:1  
    "AutoPart"=dword:1
    "MountFlags"=dword:2
    "Folder"="NAND Flash"
    "Name"="NAND FLASH"
    "AutoFormat"=dword:1
    "BootPhase"=dword:0
    "Flags"=dword:1000
    "FileSystem"="fatfsd.dll"
    "PartitionDriver"="mspart.dll"
点赞  2008-12-10 14:12
引用: 引用 6 楼 andbf 的回复:
对不起,贴错了注册表,贴了一个正在实验的。下边这个才是我上边说的情况所用的注册表。
第二次起不来,是在OS的block没有标记为保留块的情况下。如果标记为保留块就可以起来了。请问需要把MBR也标记为保留块吗?还是没有关系?

要,其实MBR一般在开始的地方,所以eboot都具备这个功能。
起来了就结贴,给分!!哈哈。
点赞  2008-12-10 14:18
呵呵。好, 给分给分。

最后请教一个问题:OS起来后会去读MBR吗?如果会,为什么还会把OS给earse掉了?
点赞  2008-12-10 14:28
我指如果OS不标为保留块的情况下。是因为MBR里没有分区的起始,结束地址吗?
点赞  2008-12-10 14:29
引用: 引用 9 楼 andbf 的回复:
我指如果OS不标为保留块的情况下。是因为MBR里没有分区的起始,结束地址吗?

要,其实MBR一般在开始的地方,所以eboot都具备这个功能。
起来了就结贴,给分!!哈哈。


噢噢,我说错了,这个MBR是在FAT区的。所以它是没有被标记的。
系统启动是要读取他的。这个你要看看代码。

刚才我一时兴趣,说错答案了,收回。
点赞  2008-12-10 14:35

所以似乎我的MBR位置不对。我的是MBR-》BINFS-》FAT。刚才看了一下NAND的spare区,逻辑扇区0位于MBR所在的sector。是不是我应该把MBR挪到BINFS后边,这样子BINFS就不分配逻辑号,也就不会被操作到?
点赞  2008-12-10 14:48
把 NK 存放区域设置成保护块, 或者在 FMD_GetBlockInfo 中直接把 NK 区域返回为 BAD_BLOCK
点赞  2008-12-10 16:19
谢谢大家!我差不多明白了,NK要保护起来,但是MBR不应该保护起来。我之前把MBR也给保护起来了。
点赞  2008-12-10 16:33
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复