none
如何异步加载NAND FLASH 驱动? RRS feed

  • 问题

  •  

    大家好,我在微软中文技术论坛 http://forums.microsoft.com/china/ShowPost.aspx?PostID=2553441&SiteID=15看到一篇加快FLASH初始化速度,从加快启动时间的帖子《如何改善WinCE的启动时间》,我按照ARM-WinCE的做法,将NAND FLASH分为三块区域,A块128M,用于存贮BOOTLOADER,IMAGE之类的,B块256M,为FAT文件系统,C块为640M,也为FAT文件系统。我为B,C两块分别写了驱动,其中B块为同步加载,C块为异步加载,但是当我改了之后,并没有达到我所要的效果,感觉C块也是同步加载,从而不能减少开机时间。因为我在C块的有打印信息如下:

    OEMInit Done...
    OEMGetExtensionDRAM
    Sp=ffffc7cc
    IOCTL_HAL_INIT_RTC
    FMD::FMD_Init:NOSYSCALL = 0
    FMD::FMD_Init:VirtualAlloc
    NandFlash FMD_Init Done
    FMD::FMD_Init:NOSYSCALL = 0
    FMD::FMD_Init:VirtualAlloc
    NandFlash2 FMD_Init Done
    NandFlash FMD_GetBlockStatus(0)
    NandFlash FMD_GetBlockStatus(1)
    NandFlash FMD_GetBlockStatus(2)
    ......
    NandFlash FMD_GetBlockStatus(5116)
    NandFlash FMD_GetBlockStatus(5117)
    NandFlash FMD_GetBlockStatus(5118)
    NandFlash FMD_GetBlockStatus(5119)

    C_DM9000:Surprisepen dsk1 device ok
    FMD_OEMIoControl:IOCTL_FMD_READ_SECTOR
    NandFlash FMD_OEMReadSector ECC Error,page 128 parameters
    NandFlash FMD_OEMReadSector fatal ECC Error
    MAC:20-4-9-18-2-6d
    C_DM9000:Big SmileeviceOnSetupFilter(0)
     
    第一个文件系统的初始化之后,用了2秒去扫描文件系统,然后打印出“FMD::FMD_Init:NOSYSCALL = 0”,这我基本上还是可以理解,因为这是同步加载
    第二个文件系统的初始化之后,一直在打印NandFlash FMD_GetBlockStatus(i),一直到5119,这我就不能理解了,因为异步加载应该允许先初始化别的东西,NandFlash FMD_GetBlockStatus(i),应该和别的打印信息交错打印出来的才对,但是,却不是这样。
    所以我想问:为NAND FLASH分区域应该注意哪些问题?还是我的注册表不对?我的注册表如下:
    [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FlashDrv]
     "Prefix"="DSK"
     "Dll"="FLASHDRV.dll"
     "FSD"="FATFS.DLL" 
     "Order"=dword:0
     "Ioctl"=dword:4
     "Profile"="FlashDrv"
     "FriendlyName"="MS Flash Driver"
     "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
    IF BSP_SAFEMODE !
     "Flags"=dword:1000
    ENDIF BSP_SAFEMODE !
    [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv]
     "Folder"="Flash Disk"
     "Name"="Microsoft Flash Disk"
     
     ;cuiwei add 2007-6-19 14:51
    IF BSP_SAFEMODE !
     "MountAsBootable"=dword:1
     "AutoFormat"=dword:1
    ENDIF BSP_SAFEMODE !
     ;end of cuiwei
     

    ; Keep FATFS from trying to shadow \Windows
    [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv\FATFS]
     "MountFlags"=dword:2
     
    IF BSP_SAFEMODE !
     ;cuiwei add 2007-6-19 14:51
        "MountAsRoot"=dword:1
     ;end of cuiwei
    ENDIF BSP_SAFEMODE !
     
    [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FlashDrv1]
     "Prefix"="DSK"
     "Dll"="FLASHDRV1.dll"
     "FSD"="FATFS.DLL" 
     "Order"=dword:2000
     "Ioctl"=dword:4
     "Profile"="FlashDrv1"
     "FriendlyName"="MS Flash Driver"
     "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
    IF BSP_SAFEMODE !
     "Flags"=dword:1000
    ENDIF BSP_SAFEMODE !
    [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv1]
     "Folder"="Flash Disk"
     "Name"="Microsoft Flash Disk"
     
     ;cuiwei add 2007-6-19 14:51
    IF BSP_SAFEMODE !
     "MountAsBootable"=dword:1
     "AutoFormat"=dword:1
    ENDIF BSP_SAFEMODE !
     LoadFlags=dword:2
     BootPhase=dword:2
     ;end of cuiwei
     

    ; Keep FATFS from trying to shadow \Windows
    [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv1\FATFS]
     "MountFlags"=dword:2
     
    IF BSP_SAFEMODE !
     ;cuiwei add 2007-6-19 14:51
        "MountAsRoot"=dword:1
     ;end of cuiwei
    ENDIF BSP_SAFEMODE !
     
    [HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
        "FriendlyName"="FAT FileSystem"
        "Dll"="fatfsd.dll"
        "Flags"=dword:00000024
        "Paging"=dword:1
        "CacheSize"=dword:0
     
    不知道有没有什么问题呢?谢谢大家的帮助.
    2008年10月17日 6:32

答案

  •  

    你觉得和HIVE没有关系,你有没有测试过阿?

     

    也可能是我记错了。你的loadflags和bootphase放的位置对么?我给你个参考的:

     

    [HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NSFlash]
    "DriverPath"="Drivers\\BuiltIn\\NANDFlash"
    "LoadFlags"=dword:2
    "BootPhase"=dword:2

     

    因为你有两个FAT,所以同步加载的可以支持HIVE,异步加载的就没必要了。至于异步加载和HIVE有没有关系,你自己试一下吧,我已经记不清了。

    2008年10月17日 9:18

全部回复

  •  

    你的注册表配置太多了,一点一点看太复杂。你参考的那篇贴子的确不错。不过我建议你不要一步到位,至少目前看来,你也只是推测是异步加载有问题,也许是别的问题导致的呢?

     

     

    我建议只加载一个FAT文件系统,而且是以异步的形式加载的,另一个先不要,应该是做如下设置:

    "LoadFlags"=dword:2
    "BootPhase"=dword:2

     

    就可以实现异步加载了,这里有个问题,就是异步加载的FAT不能支持HIVE注册表,如果我没记错的话。

     

    等你在一个FAT文件系统上实现了异步加载,你在加第二个文件系统看看。这样有助于区分问题。

    2008年10月17日 7:40
  •  

         谢谢WinCE_Studying的帮助,因为我们的机器是每次关机就是真的关闭电源,彻底关机,因此我们用的是HIVE注册表,但是对于上注册表我们是从用了关键字HIVE BOOT SECTION,从而能保证这些注册信息是在NK.BIN中,这样,当系统启动的时候,还是可以在文件系统还没有建立起来时,读到这些注册表,因此我不认为“异步加载的FAT一定不支持HIVE注册表”,下面我按照WinCE_Studying的提议,修改的注册表,只加载一个文件系统,且是异步,但是我发现还是同步加载:

    ; HIVE BOOT SECTION
    [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\FlashDrv]
     "Prefix"="DSK"
     "Dll"="FLASHDRV.dll"
     "FSD"="FATFS.DLL" 
     "Order"=dword:0
     "Ioctl"=dword:4
     "Profile"="FlashDrv"
     "FriendlyName"="MS Flash Driver"
     "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
     "Flags"=dword:1000


    [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv]
     "Folder"="Flash Disk"
     "Name"="Microsoft Flash Disk"

      "MountAsBootable"=dword:1
     "AutoFormat"=dword:1
     "LoadFlags"=dword:2
     "BootPhase"=dword:2


    [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDrv\FATFS]
     "MountFlags"=dword:2
      "MountAsRoot"=dword:1

    [HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
        "FriendlyName"="FAT FileSystem"
        "Dll"="fatfsd.dll"
        "Flags"=dword:00000024
        "Paging"=dword:1
        "CacheSize"=dword:0

    ;END HIVE BOOT SECTION

     

    这个注册表看似比较复杂,不过我觉得关键的就是红字那部分,但是还是不能异步加载,还郁闷,请大家指教阿,谢谢。

    2008年10月17日 9:05
  •  

    你觉得和HIVE没有关系,你有没有测试过阿?

     

    也可能是我记错了。你的loadflags和bootphase放的位置对么?我给你个参考的:

     

    [HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NSFlash]
    "DriverPath"="Drivers\\BuiltIn\\NANDFlash"
    "LoadFlags"=dword:2
    "BootPhase"=dword:2

     

    因为你有两个FAT,所以同步加载的可以支持HIVE,异步加载的就没必要了。至于异步加载和HIVE有没有关系,你自己试一下吧,我已经记不清了。

    2008年10月17日 9:18
  • 杨哲,你好!

             我的系统基于pxa255+wince4.2平台,nandflash为1G。系统启动时,EBOOT会调用FMD_INIT等几个函数初始化nandflash;系统启动结束后(驱动都加载了,界面也出来了),又开始自动检测nandflash的坏区,也即有个函数循环调用FMD_GetBlockStatus函数依次检测nandflash的每个块的好坏,请问是哪个函数在调用FMD_GetBlockStatus呢?

            我的nandflash没有分区,请问nandflash的驱动是什么时候加载的?文件系统呢?坏区的检测能否跳过呢?

    2008年10月23日 2:57