9185|6

854

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

wince6.0 mass storage,RNDIS 和activesync USB 连接的实现方法探讨 [复制链接]

S5pv210 下有现成的注册表

IF BSP_USBFN_RNDIS
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
    "DefaultClientDriver"=- ; erase previous default
    "DefaultClientDriver"="RNDIS"
ENDIF

IF BSP_USBFN_SERIAL
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
    "DefaultClientDriver"=- ; erase previous default
    "DefaultClientDriver"="Serial_Class"
ENDIF

IF BSP_USBFN_MSF
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
    "DefaultClientDriver"=- ; erase previous default
    "DefaultClientDriver"="Mass_Storage_Class"

[HKEY_LOCAL_MACHINE\Drivers\SDCARD\ClientDrivers\Class\SDMemory_Class]
    "Index"=dword:3

[HKEY_LOCAL_MACHINE\Drivers\SDCARD\ClientDrivers\Class\SDMemory_Class\High_Capacity]
    "Index"=dword:3

[HKEY_LOCAL_MACHINE\Drivers\SDCARD\ClientDrivers\Class\MMC_Class]
    "Index"=dword:3
ENDIF

[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Mass_Storage_Class]
    "Dll"="usbmsfn.dll"
    "InterfaceSubClass"=dword:06
    "InterfaceProtocol"=dword:50
    "FriendlyName"="Mass Storage"
    "idVendor"=dword:045E
    "Manufacturer"="Generic Manufacturer (PROTOTYPE--Remember to change idVendor)"
    "idProduct"=dword:FFFF
    "Product"="Generic Mass Storage (PROTOTYPE--Remember to change idVendor)"
    "bcdDevice"=dword:0
; for SDMMC
    "DeviceName"="DSK3:" ; SDMMC DSK index
    "Removable"=dword:1  ; Removable option
    "Type"=dword:1 ;0-nand, 1-sdmmc
    "SDSlot0"="HSC1:"      ; SD Slot

[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\RNDIS]
    "idVendor"=dword:0547
    "Manufacturer"=LOC_USBFN_RNDIS_MANUFACTURER
    "idProduct"=dword:2c2d
    "Product"=LOC_USBFN_RNDIS_PRODUCT


[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Serial_Class]
    "FriendlyName"=LOC_USBFN_SERIAL_NAME
    "idVendor"=dword:0547
    "Manufacturer"=LOC_USBFN_SERIAL_MANUFACTURER
    "idProduct"=dword:2720
    "Product"=LOC_USBFN_SERIAL_PRODUCT
    "Index"=dword:0
               
[HKEY_CURRENT_USER\ControlPanel\Comm]
    "Cnct"="`USB"

[HKEY_LOCAL_MACHINE\DebugZones]
    "USBFN"=dword:ffff
    "Serial"=dword:ffff
    "PM"=dword:ffff






修改注册表,然后重启,的确是可以实现 mass storage,RNDIS 和activesync  切换,但是要像手机一样,不重启切换要怎么做呢?
点赞 关注
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460

回复
举报

854

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
  百度一下
http://bbs.csdn.net/topics/310030218
IOCTL_UFN_CHANGE_CURRENT_CLIENT 这个貌似可以实现

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

作者:LoongEmbedded(kandi)

时间:2012.05.04

类别:WINCE驱动开发

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

根据客户的要求,希望我们WINCE设备可以作为PC机器的可移动磁盘,并且可以通过应用软件能够实现mass storage和ActiveSync的切换,那怎么实现这个功能呢:

1.       系统组件

选择ActiveSync、mass storage和serial组件,如下图所示:


图1

2.       驱动的支持以及需要注意的注册表项

我们先来看USB客户端驱动的注册表信息

IF BSP_USBFNCLASS == MASS_STORAGE

[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]

    "DefaultClientDriver"=- ; erase previous default

    "DefaultClientDriver"="Mass_Storage_Class"

ENDIF BSP_USBFNCLASS


[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Mass_Storage_Class]

    "Dll"="usbmsfn.dll"

    "InterfaceSubClass"=dword:06

    "InterfaceProtocol"=dword:50

    "DeviceName"="DSK1:" ; 被映射为U盘的存储设备的设备名

    "FriendlyName"="Mass Storage";显示设备名

    "idVendor"=dword:045E; Vendor ID,应该向USB组织申请

    "Manufacturer"="Generic Manufacturer (PROTOTYPE--Remember to change idVendor)";厂商命

    "idProduct"=dword:FFFF; Product ID,由厂商定义

    "Product"="Generic Mass Storage (PROTOTYPE--Remember to change idVendor)";产品名

    "bcdDevice"=dword:0;设备的版本号


[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\RNDIS]

    "idVendor"=dword:0547

    "Manufacturer"=LOC_USBFN_RNDIS_MANUFACTURER

    "idProduct"=dword:2c2d

    "Product"=LOC_USBFN_RNDIS_PRODUCT


[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Serial_Class]

    "FriendlyName"=LOC_USBFN_SERIAL_NAME

    "idVendor"=dword:045E

    "Manufacturer"=LOC_USBFN_SERIAL_MANUFACTURER

    "idProduct"=dword:00CE

    "Product"=LOC_USBFN_SERIAL_PRODUCT

    "Index"=dword:5


[HKEY_CURRENT_USER\ControlPanel\Comm]

"Cnct"="`USB"

在上面的注册表信息中,如果要把SD卡或是flash分区作为PC机的可移动盘,一定要让"DeviceName"="DSK1:"中的1和SD卡驱动或是flash驱动的index一致,这样就可以实现这个功能了。

3.       mass storage和ActiveSync切换

这个功能可以通过一个应用软件来实现,主要的工作如下:

⑴基于GUID调用FindFirstDevice函数获取到USB控制器驱动(比如s3c2450_usbfn.dll)的句柄。

⑵通过上面获取的驱动句柄,以控制码IOCTL_UFN_GET_CURRENT_CLIENT调用DeviceIoControl函数来获取当前已经加载的USB客户端驱动,然后以控制码IOCTL_UFN_CHANGE_CURRENT_CLIENT调用DeviceIoControl函数来切换USB客户端驱动(比如由mass storage切换为ActiveSync)。

⑶修改注册表信息,比如把"DefaultClientDriver"="Mass_Storage_Class"改为"DefaultClientDriver"="serial"


具体的代码如下:

#define FILE_DEVICE_UNKNOWN             0x00000022

#define METHOD_BUFFERED                 0

#define FILE_ANY_ACCESS                 0

#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \

    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \

)

#define _UFN_ACCESS_CTL_CODE(_Function)  \

    CTL_CODE(FILE_DEVICE_UNKNOWN, _Function, METHOD_BUFFERED, FILE_ANY_ACCESS)


#define IOCTL_UFN_GET_CURRENT_CLIENT                _UFN_ACCESS_CTL_CODE(3)

#define IOCTL_UFN_CHANGE_CURRENT_CLIENT             _UFN_ACCESS_CTL_CODE(4)




#define UFN_CLIENT_NAME_MAX_CHARS 128

#define UFN_CLIENT_DESCRIPTION_MAX_CHARS 250


typedef struct _UFN_CLIENT_INFO {

    TCHAR szName[UFN_CLIENT_NAME_MAX_CHARS];

    TCHAR szDescription[UFN_CLIENT_DESCRIPTION_MAX_CHARS];

} UFN_CLIENT_INFO, *PUFN_CLIENT_INFO;


typedef struct _UFN_CLIENT_NAME {

    TCHAR szName[UFN_CLIENT_NAME_MAX_CHARS];

} UFN_CLIENT_NAME, *PUFN_CLIENT_NAME;


static HKEY hOpenKey=NULL;

#define DRIVER_USB_KEY TEXT("Drivers\\USB\\FunctionDrivers")

#define DRIVER_USB_NAME TEXT("DefaultClientDriver")

#define DRIVER_USB_VALUE_SERIAL TEXT("Serial_Class")

#define DRIVER_USB_VALUE_STORAGE TEXT("Mass_Storage_Class")

HANDLE GetUfncontroller()


{


    HANDLE hUfn = NULL;


DEVMGR_DEVICE_INFORMATION di;


memset(&di, 0, sizeof(di));


di.dwSize = sizeof(di);

GUID guidUsbFn = { 0xE2BDC372, 0x598F, 0x4619, 0xBC, 0x50, 0x54, 0xB3, 0xF7, 0x84, 0x8D, 0x35 };

    HANDLE hf = FindFirstDevice(DeviceSearchByGuid, &guidUsbFn, &di);


if (hf != INVALID_HANDLE_VALUE)


{


   hUfn = CreateFile(di.szBusName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);


CloseHandle(hf);


}


else


{


   hUfn = INVALID_HANDLE_VALUE;


}


return hUfn;


}


void CusbfunctionswitchDlg::OnBnClickedStorageActivesyncSwitch()

{

         // TODO: Add your control notification handler code here

         HANDLE hDisk = NULL;

         BOOL   fnTypeStorage = TRUE;


         UFN_CLIENT_NAME uname;


         UFN_CLIENT_INFO uinfo;


         DWORD dwReturn = 0;


         _tcscpy(uname.szName, L"Mass_Storage_Class");




         hDisk = GetUfncontroller();


         if (hDisk == INVALID_HANDLE_VALUE)


         {


         RETAILMSG(1, (TEXT("invalid usb handle, error = %d/r/n"), GetLastError()));



         }


         if (DeviceIoControl(hDisk, IOCTL_UFN_GET_CURRENT_CLIENT, NULL, 0, &uinfo, sizeof(uinfo), &dwReturn, 0) && (dwReturn == sizeof(uinfo)))


         {


         if (_tcscmp(L"Mass_Storage_Class", uinfo.szName) == 0)

         {

                   _tcscpy(uname.szName, L"Serial_Class");

                   fnTypeStorage = FALSE;


         }

         else

         {

                   fnTypeStorage = TRUE;

         }


         }

         if (!DeviceIoControl(hDisk, IOCTL_UFN_CHANGE_CURRENT_CLIENT, &uname, sizeof(uname), NULL, 0, NULL, NULL))


         {

                   RETAILMSG(1, (TEXT("deviceiocontrol failed, error = %d/r/n"), GetLastError()));


         }

         else

         {

                   LONG    lResult = 0;


                   if(fnTypeStorage)

                   {



                            lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE, DRIVER_USB_KEY, 0, 0, &hOpenKey );


                            if(ERROR_SUCCESS == lResult)

                            {

                                     lResult = RegSetValueEx(hOpenKey,DRIVER_USB_NAME,0,REG_SZ,(BYTE *)DRIVER_USB_VALUE_STORAGE,sizeof(DRIVER_USB_VALUE_STORAGE));

                            }


                   }

                   else

                   {

                            lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE, DRIVER_USB_KEY, 0, 0, &hOpenKey );

                            if(ERROR_SUCCESS == lResult)

                            {

                                     lResult = RegSetValueEx(hOpenKey,DRIVER_USB_NAME,0,REG_SZ,(BYTE *)DRIVER_USB_VALUE_SERIAL,sizeof(DRIVER_USB_VALUE_SERIAL));

                            }


                   }

                   RegCloseKey( hOpenKey );

         }

}



[ 本帖最后由 Wince.Android 于 2013-10-15 10:25 编辑 ]
 
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
 

回复

854

帖子

0

TA的资源

五彩晶圆(中级)

板凳
 
http://msdn.microsoft.com/en-us/library/ms895481.aspx
看微软的这些注册表,收获也有那么一点。
 
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
 
 

回复

854

帖子

0

TA的资源

五彩晶圆(中级)

4
 

WinCE系统 USB RNDIS实现

作者:ARM-WinCE


好久不写博客了,这段时间实在太忙,和美国人,印度人一起做项目,时差是个大问题,沟通也占用了很多时间,发邮件,开电话会议成了家常便饭。不管怎样,我在博客的道路上也走了快2年了,我会继续坚持写下去,在我有时间的时候。不多废话了,今天说说RNDIS。


RNDIS是指Remote NDIS,基于USB实现RNDIS实际上就是TCP/IP over USB,就是在USB设备上跑TCP/IP,让USB设备看上去像一块网卡。



同样,在WinCE中实现USB RNDIS功能,首先具备以下条件:

1. 支持USB Client并且USB驱动已经OK。

2. 在PC上面安装Active Sync软件,该软件用于支持RNDIS驱动。


补充一下,我在这里不谈USB驱动,假设USB驱动已经存在,这里谈到的USB RNDIS的实现是指USB Client设备上面运行RNDIS。下面介绍一下具体步骤:


1. 选择USB Client RNDIS组件

在定制WinCE的时候,在Catalog Items View中选择”Device Drivers”->”USB Function”->”USB Function Clients”->”RNDIS Clients”,如图:


2. 更改USB Client的注册表配置

具体的不想详细说明了,相信看一下就知道了,如下:

[HKEY_LOCAL_MACHINE/Drivers/USB/FunctionDrivers]

   "DefaultClientDriver"="RNDIS"

[HKEY_LOCAL_MACHINE/Drivers/USB/FunctionDrivers/RNDIS]

   "UseActiveSyncIds"=dword:1

   "Dll"="rndisfn.dll"

   "FriendlyName"="Rndis"

   "idVendor"=dword:0162

   "Manufacturer"="Honeywell"

   "idProduct"=dword:0001

   "Product"="Honeywell RNDIS"

   "bcdDevice"=dword:0

  

[HKEY_LOCAL_MACHINE/Comm/RndisFn1/Parms/TcpIp]

   "DefaultGateway"=""

   "UseZeroBroadcast"=dword:0

   "IpAddress"="192.168.0.86"

   "Subnetmask"="255.255.255.0"

   "EnableDHCP"=dword:0

3. 重新编译WinCE

完成了上面的配置以后,重新编译WinCE,然后下载到板子上面运行。

4. 建立RNDIS连接

在WinCE运行以后,用USB线将PC和板子相连接,这个时候应该可以看到在PC上面识别出新的网卡设备,同时在板子上面也会出现一个网卡设备。分别在PC上和板子上面为新的网卡设置IP地址和子网掩码,保证在同一个网段就可以。然后可以彼此ping一下,只要是通的,就应该没问题了。



这里只是介绍了大致的思路。下周去Florida工作1-2个月,如果有时间,我也要继续更新我的博客。

原文地址 http://blog.csdn.net/nanjianhui/article/details/4555595

这个文章还是不错的。比较OK
 
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
 
 

回复

854

帖子

0

TA的资源

五彩晶圆(中级)

5
 
照着上面做,网卡图标是出现了。但是 在PC端提示连接受限制,有个感叹号
并且连接一段时间弹出 Activesync cannot connect to the windows mobile powered device ,难道这个RNDIS需要要activesync 来连接的?不是有网卡了吗?
 
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
 
 

回复

854

帖子

0

TA的资源

五彩晶圆(中级)

6
 

原地址:http://blog.chinaunix.net/uid-20620069-id-1913591.html

现在大多数WinCE设备都带有USB Device功能,Device也即设备,在PC看来,WinCE就是作为一个设备,可以表现为U盘,也可表现为网络设备(RNDIS),也可以做为串口(ActiveSync同步使用),也可作为modem。


1. 选择USB Client的组件。
   在Catalog Items View中选择”Device Drivers”->”USB Function”->”USB Function Clients”->”RNDIS Clients”,如图:


2. 注册表设置

[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers]
   "DefaultClientDriver"="Serial_class"
   ;"DefaultClientDriver"="RNDIS"
   ;"DefaultClientDriver"="Mass_Storage_Class"


; Serial Config
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Serial_Class]
   "Dll"="serialusbfn.dll"
   "DeviceName"="USBFNS1:"
   "Prefix"="COM"
   "IClass"="{CC5195AC-BA49-48a0-BE17-DF6D1B0173DD}"
   "idVendor"=dword:0547
   "Manufacturer"="Sozhou"
   "idProduct"=dword:2720
   "Product"="Sozhou Product"
   "bcdDevice"=dword:0
   "DeviceType"=dword:0


; RNDIS Config
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\RNDIS]
   "UseActiveSyncIds"=dword:1
   "Dll"="rndisfn.dll"
   "FriendlyName"="Rndis"
   "idVendor"=dword:0162
   "Manufacturer"="Sozhou"
   "idProduct"=dword:0001
   "Product"="Sozhou RNDIS"
   "bcdDevice"=dword:0
[HKEY_LOCAL_MACHINE\Comm\RndisFn1\Parms\TcpIp]
   "DefaultGateway"=""
   "UseZeroBroadcast"=dword:0
   "IpAddress"="192.168.0.12"
   "Subnetmask"="255.255.255.0"
   "EnableDHCP"=dword:0


; U Disk
[HKEY_LOCAL_MACHINE\Drivers\USB\FunctionDrivers\Mass_Storage_Class]
"Dll"="usbmsfn.dll" ;USB Client的驱动
"DeviceName"="DSK1:" ;被映射为U盘的存储设备的设备名
"DeviceName1"="DSK2:" ;更多的存储设备,比如SD卡
"FriendlyName"="Mass Storage" ;显示设备名
"idVendor"=dword:2310 ;Vendor ID,应该向USB组织申请
"idProduct"=dword:1234 ;Product ID,由厂商定义
"Manufacturer"="Sozhou" ;厂商名
"Product"="Sozhou Mass Storage" ;产品名
"bcdDevice"=dword:0 ;设备的版本号
"InterfaceSubClass"=dword:06 ;USB Host端通过该值来枚举设备,06h表示Mass Storage。
"InterfaceProtocol"=dword:50 ;USB设备所支持的传输协议,50h表示bulk-only。


3. 重新编译WinCE,下载运行




4. 基于USB Serial的串口通讯

   对于WinCE目标板来说,直接打开串口就可以,在我的系统里面支持多个串口,USB Serial是"COM5:",通过CreateFile打开就可以,然后通过WriteFile和ReadFile函数来发送和接收数据,和一般的串口通讯是一样的。
   对于PC来说,需要打开"wceusbsh001"设备,同样用CreateFile,这一点和普通的串口通讯略有区别,发送和接收数据同样用WriteFile和ReadFile,这里还是给个例子吧,搞清楚例子是PC端的串口通讯,如下:

#define USBSERIAL_NAME "\\\\.\\wceusbsh001"

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hSerial;
    DCB PortDCB;
    COMMTIMEOUTS CommTimeouts;
    unsigned char buf[64];
    DWORD i, num;
    BOOL SerialFlag;

    hSerial = CreateFile(_T(USBSERIAL_NAME), (GENERIC_READ | GENERIC_WRITE), 0, NULL, OPEN_EXISTING, 0, NULL);
    if (hSerial == NULL)
    {
        printf("Open Error.\r\n");
        return 1;
    }

    PortDCB.DCBlength = sizeof(DCB);
    GetCommState(hSerial, &PortDCB);
    PortDCB.BaudRate = 115200;
    PortDCB.ByteSize = 8;
    PortDCB.Parity = NOPARITY;
    PortDCB.StopBits = ONESTOPBIT;
    if (! SetCommState(hSerial, &PortDCB))
    {
       printf("Set COM Parameter Error.\r\n");
       CloseHandle(hSerial);
       return 1;
    }

    GetCommTimeouts(hSerial, &CommTimeouts);
    CommTimeouts.ReadIntervalTimeout = MAXDWORD;
    CommTimeouts.ReadTotalTimeoutMultiplier = 10;
    CommTimeouts.ReadTotalTimeoutConstant = 10;
    CommTimeouts.WriteTotalTimeoutMultiplier = 50;
    CommTimeouts.WriteTotalTimeoutConstant = 100;

    if (!SetCommTimeouts(hSerial, &CommTimeouts))
    {
        printf("Set COM timeout parameter error.\r\n");
        CloseHandle(hSerial);
        return 1;
    }
    // Write data

    for (i = 0; i < 10; i ++)
    {
        memset(buf, i, sizeof(buf));
        SerialFlag = WriteFile(hSerial, buf, sizeof(buf), &num, NULL);
        if (SerialFlag)
        {
            printf("Write %d bytes to COM.\r\n", num);
        }
        else
        {
            printf("Write COM Error.\r\n");
        }
        Sleep(1000);
    }

    // Receive Data

    while(1)
    {
        memset(buf, 0, sizeof(buf));
        SerialFlag = ReadFile(hSerial, buf, 16, &num, 0);
        if (SerialFlag)
        {
            if (num == 0)
            {
                printf("Read Successfully, but didn't read any data.\r\n");
            }
            else
            {
                printf("Read data: ");
                for (i = 0; i < 16; i ++)
                {
                    printf("0x%x, ", buf);
                }
                printf("\r\n");
            }
        }
        else
        {
            printf("Read COM Error.\r\n");
        }
        Sleep(1000);
    }

    CloseHandle(hSerial);

    return 0;
}

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

回复

854

帖子

0

TA的资源

五彩晶圆(中级)

7
 
我晕,终于明白了
这个wince 下的RNDIS 就是把wince 设备当做一个USB网卡,电脑通过这个USB 网卡上网,汗!
开始我以为wince 设备 利用电脑上网,反过来了。
这个就是和android手机的共享网络是一样的。
搞定,驱动也装上去了。
 
个人签名如果对linux,Android,wince 等嵌入式底层有兴趣的,请加这个QQ群吧,群号:27100460
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表