simon5430
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望67点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
阅读:3558回复:21

NAND 驱动已经挂载在文件系统下后,如何在应用程序中调用FMD_OEMIoControl函数

楼主#
更多 发布于:2007-09-13 15:46
各位大侠,知道的请指点一下,谢谢。
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
沙发#
发布于:2007-09-13 17:21
定义个IOCTL的值,例如
#define IOCTL_DISK_ACCESS_FMDOEMIOCTL \
    CTL_CODE(IOCTL_DISK_BASE, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
在你的FMD_OEMIoControl()针对这个值处理,
应用程序调用DeviceIoControl(...)函数.
simon5430
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望67点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-09-14 09:23
谢谢zhengshijie  的回复。

你所说的我知道,问题在于我无法创建DSK的设备,那么DeviceIoControl根本就无法调用了
NandHandle = CreateFile(L"DSK1:",
GENERIC_READ | GENERIC_WRITE,
NULL,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_WRITE_THROUGH,
NULL);

此函数调用后无法创建DSK设备,不知道咋回事啊?

大家有没有碰到过这样的问题,非常感谢
shaohui99
驱动牛犊
驱动牛犊
  • 注册日期2007-05-15
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分190分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-09-14 10:46
Re:NAND 驱动已经挂载在文件系统下后,如何在应用程序中调用FMD_OEMIoCont
    HANDLE hNand;
    hNand = CreateFile( TEXT("\\NAND FLASH\\Vol:"), GENERIC_WRITE|GENERIC_READ,
                            0,                    // exclusive access
                            NULL,                 // no security attrs
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL
                            );
"NAND FLASH" 可以换成你在Windows CE下看到的名字,CE5.0 就是NAND FLASH
simon5430
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望67点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-09-14 11:17
谢谢shaohui99 ,你这种方式是创建一个文件,得到是文件句柄,我试试看。

CE代码中有用DSK的,但是我老是不成功,莫名其妙。

郁闷,那个大侠知道。
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-09-15 18:24
CreateFile的用法有问题:
第三个参数得用:FILE_SHARE_READ|FILE_SHARE_WRITE,

attribute得为0,它不是普通文件,不能用这些东西.
学海无涯
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
6楼#
发布于:2007-09-15 20:41
我的方式 是AP直接把FLASHDRV.DLL加载近来,直接呼叫各子程序
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-09-19 13:15
; HIVE BOOT SECTION
; @CESYSGEN IF CE_MODULES_SDNPCID

IF BSP_SMFLASH_WB910
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\MSFlash]
    "Profile"="FlashDisk"
    "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
    "Order"=dword:0
    ;"FriendlyName"="MSFLASH Driver"
    "Dll"="smflash.dll"
    "Prefix"="DSK"
    "FriendlyName"="WB910_NANDFLASH"
    "BmlVolumeId"=dword:0
    "BmlPartitionId"=dword:8
    "Index"=dword:7

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDisk]
    "Name"="WB910NAND "
    "Folder"="NANDFLASH"  
    "DefaultFileSystem"="FATFS"
    "AutoMount"=dword:1  
    "AutoPart"=dword:1
    "AutoFormat"=dword:1
    "PartitionDriver"="mspart.dll"
    "Ioctl"=dword:4
    "BootPhase"=dword:0

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\FlashDisk\FATFS]
    "Flags"=dword:00000024        
    "Dll"="fatfsd.dll"
    "Paging"=dword:1
    "EnableCacheWarm"=dword:0
    "CacheSize"=dword:0
    ;"MountAsBootable"=dword:1    ;;have changed. add
    ;"MountAsRoot"=dword:1

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

; @CESYSGEN ENDIF CE_MODULES_SDNPCID
; END HIVE BOOT SECTION

如果注册表的设置如上面所示,我该将CreatFile()的第一个参数设置成什么?
因为CETK测试的时候有个参数 /disk DSKx:
需要设置,但是始终设置不对,不管设置成:NANDFLASH还是DSK7都不行。
谢谢。。
做一个出色的程序员!
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-09-19 13:18
那位知道CETK下面Flash Memory Read/Write and Performance Test
用来测试NAND Flash的时候,命令行参数怎么设置?
还望指点,谢谢。
做一个出色的程序员!
simon5430
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望67点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-09-19 15:15
把创建的代码修改了一下,当然也修改了属性,但是还是无法创建成功。
从DSK0 ~ DSK9,都没有戏。

                                          for ( i = 1; i <= 9; i++ )
        {
        
            // Create device name
            _stprintf( szTemp, TEXT("DSK%u:"), i );

            // Attempt to open the device
            hDiskFile = CreateFile(szTemp,    // file to open
                            GENERIC_READ|GENERIC_WRITE,
                            0,
                            NULL,
                            OPEN_EXISTING,
                            0,
                            0);


            if (hDiskFile == INVALID_HANDLE_VALUE)
            {
                //RETAILMSG(1,(_T("Could not open I2C device\n")));            
            }
            else
            {
                RETAILMSG(1,(_T("Succeed in creating DISK device\n")));
                break;
            }
        }
zhuxiaofeng
驱动小牛
驱动小牛
  • 注册日期2007-04-06
  • 最后登录2010-04-15
  • 粉丝0
  • 关注0
  • 积分1013分
  • 威望243点
  • 贡献值0点
  • 好评度202点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-09-19 15:41
它好像不是DSK设备,不能用DSk来打开。
我也尝试过不行的。
在存储管理里面他前面根本就不是DSK.
不像SD卡前面就是DSK1或者什么的。
做一个出色的程序员!
simon5430
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望67点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-09-19 15:47
但是生成的DLL文件,都是以DSK为前缀的,并且在注册表中,prefix也是DSK。

真是郁闷ing
shaohui99
驱动牛犊
驱动牛犊
  • 注册日期2007-05-15
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分190分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-09-20 11:43
Re:NAND 驱动已经挂载在文件系统下后,如何在应用程序中调用FMD_OEMIoCont
你试过我的方法没有?怎么不试一下?正确的方法居然没人认识
microsun
论坛版主
论坛版主
  • 注册日期2002-11-11
  • 最后登录2014-07-18
  • 粉丝0
  • 关注0
  • 积分1052分
  • 威望1159点
  • 贡献值0点
  • 好评度848点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-09-20 20:33
兄弟,你好好看一下CreateFile每一个参数的含义再做,起码你得与别的程序共享啊,你想想是不是
学海无涯
shaohui99
驱动牛犊
驱动牛犊
  • 注册日期2007-05-15
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分190分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-09-21 09:24
Re:NAND 驱动已经挂载在文件系统下后,如何在应用程序中调用FMD_OEMIoCont
共不共享这个问题不是重点,如果是自己的系统并且确定其他的程序没有同时调用它就可以了。何况你调用完了就关闭它。问题的重点是调用 FMD_OEMIoControl 的方法。
shaohui99
驱动牛犊
驱动牛犊
  • 注册日期2007-05-15
  • 最后登录2008-06-19
  • 粉丝0
  • 关注0
  • 积分190分
  • 威望30点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-09-21 09:29
Re:NAND 驱动已经挂载在文件系统下后,如何在应用程序中调用FMD_OEMIoCont
更重要的是,如果楼主想通过FMD_OEMIoControl 往NAND FLASH中写一些自己的数据或者更新OS,在这个过程中不允许其他的程序再调用 FMD_OEMIoControl ,以免打断烧写流程。
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-09-21 09:58
我的方法是把nand驱动重新以别的prefix再加载一次。比如FLY,只要注册表里面加载了。再CreateFile肯定是可以的。
http://www.esdevelop.cn
simon5430
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望67点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-09-21 10:37
  HANDLE hNand;
    hNand = CreateFile( TEXT("\\NAND FLASH\\Vol:"), GENERIC_WRITE|GENERIC_READ,
                            0,                    // exclusive access
                            NULL,                // no security attrs
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL
                            );


谢谢shaohui99 ,试了你的方法,在调用DeviceIoControl时,在FAT层就返回来了。

还没有到达FAL这一层。
simon5430
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望67点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-09-21 10:56
shuiii ,你的方法我一直在尝试,老是出现错误,加载DLL时,出现以下怪错误。
50841 PID:400002 TID:de0002 nand_flash.DLL DLL_PROCESS_ATTACH
  50846 PID:400002 TID:de0002 Kernel DLL 'fmd.dll' needs thread creation/deletion notification
  50854 PID:400002 TID:de0002 DEVICE!CreateDevice: illegal entry point combination in driver DLL 'nad.dll'
  50859 PID:400002 TID:de0002 NAD.DLL DLL_PROCESS_DETACH
  50873 PID:400002 TID:de0002 CreateDevice: creation of type 'NAD', index 1, lib 'nad.dll' returning 0x00000000, error code 1
  50880 PID:400002 TID:de0002 DEVICE!I_ActivateDeviceEx: couldn't activate: prefix NAD, index 1, dll nad.dll, context 0x1
shuiii
驱动牛犊
驱动牛犊
  • 注册日期2005-08-26
  • 最后登录2011-05-30
  • 粉丝1
  • 关注0
  • 积分605分
  • 威望173点
  • 贡献值0点
  • 好评度57点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-09-21 12:55
我是参照流驱动重新写的nand驱动,里面加了一些标准的API。
http://www.esdevelop.cn
上一页
游客

返回顶部