[经验] wince 下实现多nandflash分区方法探讨

Wince.Android   2013-12-19 10:18 楼主

1)eboot中


[cpp] view plaincopy


  • #define PART_MYFS1        0x11  
  • #define PART_MYFS2        0x12  
  •   
  •     // 创建第一个FAT分区 ,100M大小  
  •     hPartEx1 = BP_OpenPartition( NEXT_FREE_LOC,  
  •                                 SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(100*1024*1024))*PAGES_PER_BLOCK, // align to block  
  •                                 PART_MYFS1,  
  •                                 TRUE,  
  •                                 PART_OPEN_ALWAYS);  
  •   
  •     // create extended partition in whatever is left  
  •     //  
  •     hPartEx2 = BP_OpenPartition( NEXT_FREE_LOC,  
  •                                 USE_REMAINING_SPACE,  
  •                                 PART_MYFS2,  
  •                                 TRUE,//这里需要根据自己的需要,使用TRUE或这FALSE  
  •                                 PART_OPEN_ALWAYS);  


2)注册表配置
[HKEY_LOCAL_MACHINE\init\BootVars]
        "SYSTEMHIVE"="system.hv"
;        "Start DevMgr"=dword:1
        "ProfileDir"="Documents and Settings"
        "RegistryFlags"=dword:1
;        "Flags"=dword:3
        "DefaultUser"="default"

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SMFLASH]
        "Dll"="nandflash.dll"
        "Prefix"="DSK"
        "Profile"="SMFLASH"
        "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
        "Order"=dword:0
        "FriendlyName"="S3C2440 NAND Driver"
        
[HKEY_LOCAL_MACHINE\System\StorageManager\PartitionTable]
        "11"="MYFS1"
        "12"="MYFS2"

; [HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH]
   ; "Name"="nand flash driver"   ;这一段不加也可以正常显示!!
   ; "Folder"="Hard Disk"
   ; "AutoMount"=dword:1
   ; "DefaultFileSystem"="EXFAT"
   ; "PartitionDriver"="mspart.dll"

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH\MYFS1]
;        "FormatExfat"=dword:1
        "Flags"=dword:14
        "EnableWriteBack"=dword:1
    "FriendlyName"="MYFS1"
    "Folder"="DISK2"
    "Dll"="exfat.dll"
    "Util"="fatutil.dll"
    "DisableAutoFormat"=dword:1
    "DisableAutoScan"=dword:1
    "EnableCache"=dword:1
    "CacheSize"=dword:0
    "CacheDll"="diskcache.dll"


[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH\MYFS2]
;        "FormatExfat"=dword:1
        "Flags"=dword:14
    "FriendlyName"="MYFS2"
    "Folder"="PART2"
    "Dll"="exfat.dll"
    "Util"="fatutil.dll"
    "DisableAutoFormat"=dword:1
    "DisableAutoScan"=dword:1
    "EnableWriteBack"=dword:1
    "EnableCache"=dword:1
    "CacheSize"=dword:0

    "CacheDll"="diskcache.dll"


转自:http://www.armce.com/bbs/thread-2882-1-1.html

如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460

回复评论 (6)

WINCE下创建多个文件分区

********************************LoongEmbedded********************************

作者:LoongEmbedded(kandi)

时间:2011.01.11

类别:WINCE驱动开发

********************************LoongEmbedded********************************

系统:WINCE6.0+S3C2443

实现分区的是在eboot\nand.cpp下面的WriteOSImageToBootMedia中实现的,

1.创建一个分区的代码如下所以

图1

关于这个函数的详细介绍,可以参考http://blog.csdn.net/LoongEmbedded/archive/2010/11/02/5981033.aspx,上面的代码就是在基于nandflash的剩余空间(除去存放系统映像占用的一部分空间)创建FAT32的文件分区。

2.创建两个分区

怎么实现呢?我在实现一个分区并且在系统启动后显示kandi这个盘符的platform.reg中下面的注册表信息

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NANDFLASH]

    "Prefix"="DSK"

    "Dll"="smflash.dll"

    "Index"=dword:1

    "Order"=dword:0

    "Profile"="NANDFLASH"

    "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"

IF IMGHIVEREG

    "Flags"=dword:00001000

ENDIF ;IMGHIVEREG

     

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH\FATFS]

    "Flags"=dword:14

         "Folder"="kandi"

    "FormatExfat"=dword:1

    "CheckForFormat"=dword:1

    "EnableWriteBack"=dword:1

IF IMGHIVEREG   

    "MountAsBootable"=dword:1

ENDIF ;IMGHIVEREG

在上面的注册表的基础上添加下面的内容:

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NANDFLASH2]

    "Prefix"="DSK"

    "Dll"="smflash.dll"

    "Index"=dword:9

    "Order"=dword:0

    "Profile"="NANDFLASH2"

    "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"

IF IMGHIVEREG

    "Flags"=dword:00001000

ENDIF ;IMGHIVEREG

     

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NANDFLASH2\FATFS]

    "Flags"=dword:14

         "Folder"="kandi2"

    "FormatExfat"=dword:1

    "CheckForFormat"=dword:1

    "EnableWriteBack"=dword:1

IF IMGHIVEREG   

    "MountAsBootable"=dword:1

ENDIF ;IMGHIVEREG

做这些修改更新系统后,真的可以看到kandi和kandi2这两个盘符,可是当我把A.exe拷贝到kandi文件夹中,而把B.exe拷贝到kandi2文件夹中,然后重启发现kandi和kandi2文件夹中都有A.exe和B.exe,说明没有真正实现两个分区,还只是同一个分区,后来想到到在eboot\nand.cpp下面的WriteOSImageToBootMedia中实现,就加参考实现一个分区的代码做了一下修改

图2

但是这样实现也只能看到kandi一个盘符,问题出现在哪里呢?原来是调用BP_OpenPartition函数会调用GetPartitionTableIndex函数,来识别BP_OpenPartition创建的文件分区是否已经创建过,如果创建过,WINCE50就不会再创建新的同种类型的文件分区。因为GetPartitionTableIndex函数的缘故,所以理论上同种类型的文件分区只能创建一个,但是也可以通过修改第二个BP_OpenPartition函数的第4个参数(由TRUE改为FALSE)再创建一个两个同种类型的文件分区,如下所示

图3

经过图3的修改,我们更新系统启动后可以看到下面的两个盘符:

图4

3.实现三个分区

有了上面的基础之后,我们不难实现3个分区,代码如下:

图5

修改更新系统之后,可以看到3个盘符:

图6

4隐藏分区

实现如下:

图7

这样的系统起来后就看不到分区了

图8

参考链接:

在wince50里创建多个文件分区的方法

http://hi.baidu.com/galloncity/blog/item/c6553700b67d7c081c958336.html

如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
点赞  2013-12-19 10:19
不知道怎么回事,第一种方法我试过,没成功。
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
点赞  2013-12-19 10:20
// Flags for Part_FileSystem

#define PART_UNKNOWN            0
#define PART_DOS2_FAT           0x01    // legit DOS partition
#define PART_DOS3_FAT           0x04    // legit DOS partition
#define PART_EXTENDED           0x05    // legit DOS partition
#define PART_DOS4_FAT           0x06    // legit DOS partition
#define PART_DOS32              0x0B    // legit DOS partition (FAT32)
#define PART_DOS32X13           0x0C    // Same as 0x0B only "use LBA"
#define PART_DOSX13             0x0E    // Same as 0x06 only "use LBA"
#define PART_DOSX13X            0x0F    // Same as 0x05 only "use LBA"
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
点赞  2013-12-19 13:51
[HKEY_LOCAL_MACHINE\System\StorageManager\PartitionTable]
    "01"="FATFS"
    "04"="FATFS"
    "06"="FATFS"
    "07"="MSIFS"
    "0B"="FATFS"
    "0C"="FATFS"
    "0E"="FATFS"
    "0F"="FATFS"
    "20"="BOOT"
    "21"="BINFS"
    "22"="RAWFS"
    "23"="RAWFS"
    "25"="IMGFS"
    "26"="BINARY"
如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
点赞  2013-12-19 16:58
其实要multi-nand才有意义,你这样分出来的区不能加快启动速度
点赞  2013-12-26 22:36
引用: xiaoyaodid 发表于 2013-12-26 22:36
其实要multi-nand才有意义,你这样分出来的区不能加快启动速度

不是为了加快速度启动,上面明显是为了分出多个fat 分区而已,咋会这样呢,是吧。
点赞  2014-2-9 17:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复