3G网卡在WINCE6识别为Mass Storage!

min_sd   2009-12-20 09:02 楼主
在营业厅购买了一块EVDO的网卡,准备在WINCE6上开发驱动,但是我发现,当将其插入WINCE6设备之后,其加载的驱动为Mass Storage。

我使用自己开发的驱动,加载后,我将USB接口信息输出,也只能看到一个Mass Storage接口。

这样一来,我怎么才能驱动Modem接口呢!



WinXP上:未装驱动时,将网卡连接到电脑,电脑上会多出一个虚拟光驱,里面装了一些驱动和软件文件。这个时候,我用USB TRACE工具查看了一下接口信息,只有一个移动存储设备接口。
ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x02
Open Pipes:              3

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:   Interrupt
wMaxPacketSize:     0x0010 (16)
bInterval:            0x80

Endpoint Descriptor:
bEndpointAddress:     0x82
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

安装驱动后,在设备管理器中,多出了一个Modem和多个串口。这个时候我再次使用USB trace工具,这次就能产看到所有的接口信息,包括Modem口,其他串口设备,和存储接口。
ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed:     Full
Device Address:       0x01
Open Pipes:              7

Endpoint Descriptor:
bEndpointAddress:     0x81
Transfer Type:   Interrupt
wMaxPacketSize:     0x0010 (16)
bInterval:            0x80

Endpoint Descriptor:
bEndpointAddress:     0x82
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x02
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x85
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x05
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x83
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00

Endpoint Descriptor:
bEndpointAddress:     0x04
Transfer Type:        Bulk
wMaxPacketSize:     0x0040 (64)
bInterval:            0x00


仔细对比就可以发现,两次查看的是同一个设备,但是看到的信息却不一样。


希望大家能够帮帮忙。感激不尽

回复评论 (19)

顶下,MARK
点赞  2009-12-20 10:03
驱动的关系?
点赞  2009-12-20 12:53
这个跟驱动有什么关系呢,为什么驱动安装前后,获取到的USB interface信息会不同呢。
点赞  2009-12-20 14:15
怎么没有人帮忙啊,顶上去继续啊

点赞  2009-12-20 19:33

6楼 au 

usbswitch没做吗
点赞  2009-12-21 09:09
这个问题好啊 顶一个
点赞  2009-12-21 09:12
USBswitch好像只有linux下有这个代码,我看了一下,也不是很明白,不知道该怎么搞,wince下该怎么做呢???

我在XP上抓了一些信息,分析了一下,也不是很明白。

首先我在电脑上使用USBtrace工具,选中了一个HUB,因为等会儿我会将CDMA网卡插入这个HUB,我试过想直接抓这个USB端口下的数据,但是没有设备是不能选中的,因此选HUB来抓信息,不知道USB主机通过HUB到设备的数据是否是透明传输,如果是,那么那些信息就是直接发送到CDMA网卡。那么应该就可以通过这些信息来分析,到底在XP下,这个网卡驱动发送了哪些控制数据!


还有就是我发现有一条控制指令的requestType 是02H,在标准的USB设备请求中我没有看到这个控制指令。他发送的数据部分是01H 00H

我在想,他是否就是使用这条指令完成了Modem的Switch。

不知道有没有人做过这方面的驱动,希望大家能帮帮忙。

谢谢了
点赞  2009-12-22 21:24
补充一下,在USBSwitch中找到如下代码:


  1. int switchHuaweiMode () {
  2.         int ret;

  3.         SHOW_PROGRESS("Sending Huawei control message ...\n");
  4.         ret = usb_control_msg(devh, USB_TYPE_STANDARD + USB_RECIP_DEVICE, USB_REQ_SET_FEATURE, 00000001, 0, buffer, 0, 1000);
  5.         if (ret != 0) {
  6.                 fprintf(stderr, "Error: sending Huawei control message failed (error %d). Aborting.\n\n", ret);
  7.                 exit(1);
  8.         } else
  9.                 SHOW_PROGRESS(" OK, Huawei control message sent\n");
  10. }

  11. int switchSierraMode () {
  12.         int ret;

  13.         SHOW_PROGRESS("Trying to send Sierra control message\n");
  14.         ret = usb_control_msg(devh, 0x40, 0x0b, 00000001, 0, buffer, 0, 1000);
  15.         if (ret != 0) {
  16.                 fprintf(stderr, "Error: sending Sierra control message failed (error %d). Aborting.\n\n", ret);
  17.             exit(1);
  18.         } else
  19.                 SHOW_PROGRESS(" OK, Sierra control message sent\n");
  20. }

  21. int switchSonyMode () {

  22.         int i, found, ret;
  23.         detachDriver();

  24.         if (CheckSuccess) {
  25.                 printf("Note: CheckSuccess pointless with Sony mode, disabling\n");
  26.                 CheckSuccess = 0;
  27.         }

  28.         SHOW_PROGRESS("Trying to send Sony control message\n");
  29.         ret = usb_control_msg(devh, 0xc0, 0x11, 2, 0, buffer, 3, 100);
  30.         if (ret < 0) {
  31.                 fprintf(stderr, "Error: sending Sony control message failed (error %d). Aborting.\n\n", ret);
  32.                 exit(1);
  33.         } else
  34.                 SHOW_PROGRESS(" OK, control message sent, waiting for device to return ...\n");

  35.         usb_close(devh);

  36.         i=0;
  37.         dev = NULL;
  38.         while ( dev == NULL && i < 30 ) {
  39.                 if ( i > 5 ) {
  40.                         usb_find_busses();
  41.                         usb_find_devices();
  42.                         dev = search_devices(&found, DefaultVendor, DefaultProduct, TargetClass);
  43.                 }
  44.                 if ( dev != NULL )
  45.                         break;
  46.                 sleep(1);
  47.                 if (show_progress) {
  48.                         printf("#");
  49.                         fflush(stdout);
  50.                 }
  51.                 i++;
  52.         }
  53.         SHOW_PROGRESS("\n After %d seconds:",i);
  54.         if ( dev != NULL ) {
  55.                 SHOW_PROGRESS(" device came back, proceeding\n");
  56.                 devh = NULL;
  57.                 devh = usb_open( dev );
  58.                 if (devh == NULL) {
  59.                         fprintf(stderr, "Error: could not get handle on device\n");
  60.                         return 0;
  61.                 }
  62.         } else {
  63.                 SHOW_PROGRESS(" device still gone, cancelling\n");
  64.                 return 0;
  65.         }

  66.         sleep(1);

  67. //        switchAltSetting();
  68. //        sleep(1);

  69.         SHOW_PROGRESS("Sending Sony control message again ...\n");
  70.         ret = usb_control_msg(devh, 0xc0, 0x11, 2, 0, buffer, 3, 100);
  71.         if (ret < 0) {
  72.                 fprintf(stderr, "Error: sending Sony control message (2) failed (error %d)\n", ret);
  73.                 return 0;
  74.         } else {
  75.                 SHOW_PROGRESS(" OK, control message sent\n");
  76.                 return 1;
  77.         }

  78.         Interface=8;
  79.         AltSetting=2;
  80. }

  81. // Detach driver either as the main action or as preparation for other modes
  82. int detachDriver() {
  83.         int ret;

  84. #ifndef LIBUSB_HAS_GET_DRIVER_NP
  85.         printf(" Cant't do driver detection and detaching on this platform.\n");
  86.         return 2;
  87. #endif

  88.         SHOW_PROGRESS("Looking for active driver ...\n");
  89.         ret = usb_get_driver_np(devh, Interface, buffer, BUF_SIZE);
  90.         if (ret != 0) {
  91.                 SHOW_PROGRESS(" No driver found. Either detached before or never attached\n");
  92.                 return 1;
  93.         }
  94.         SHOW_PROGRESS(" OK, driver found ("%s")\n", buffer);
  95.         if (DetachStorageOnly && strcmp(buffer,"usb-storage")) {
  96.                 SHOW_PROGRESS(" Driver is not usb-storage, leaving it alone\n");
  97.                 return 1;
  98.         }

  99. #ifndef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
  100.         SHOW_PROGRESS(" Can't do driver detaching on this platform\n");
  101.         return 2;
  102. #endif


  103.         ret = usb_detach_kernel_driver_np(devh, Interface);
  104.         if (ret == 0) {
  105.                 SHOW_PROGRESS(" OK, driver "%s" detached\n", buffer);
  106. //                usb_clear_halt(devh, MessageEndpoint);
  107. //                usb_clear_halt(devh, ResponseEndpoint);
  108.         } else
  109.                 SHOW_PROGRESS(" Driver "%s" detach failed with error %d. Trying to continue\n", buffer, ret);
  110.         return 1;
  111. }




不知道是否是使用这个来完成的,如果转换到wince应该怎么写这句话,是应该使用IssueControlTransfer向端点0发送一个指令吗???
点赞  2009-12-22 21:28
Come ON

怎么样才能把
usb_control_msg(devh, USB_TYPE_STANDARD + USB_RECIP_DEVICE, USB_REQ_SET_FEATURE, 00000001, 0, buffer, 0, 1000);
转换为wince下的IssueControlTransfer或者IssueVendorTransfer

感谢了
点赞  2009-12-23 17:44
你好:
  so927  我现在和你情况一样,想与你一起解这个问题。
现在不知道你搞定没有呢
点赞  2009-12-23 22:18
引用: 引用 10 楼 hangbing0203 的回复:
你好:
? so927? 我现在和你情况一样,想与你一起解这个问题。
现在不知道你搞定没有呢


加我QQ:463316948
点赞  2009-12-24 11:08
帮帮忙啊,各位!、、、


点赞  2009-12-25 10:34
是不是把驱动程序直接保存在mass storage里面。就不用带光盘了。
点赞  2009-12-25 13:31
是的,XP和LINUX的驱动程序在网卡里面直接就有了,

点赞  2009-12-25 14:18
我的 联通3G上网卡,插在笔记本上就是显示个u盘的,估计这样正常的。
点赞  2009-12-25 17:15
是的,插入笔记本电脑(XP系统),首先显示的是一个U盘,安装U盘里面的驱动之后,就会出现一个modem了,在WINCE上怎么实现这个modem的interface呢?
点赞  2009-12-25 22:39
我是做上网卡开发的,这个是易驱功能,网卡先插上的时候为光驱设备,自动安装驱动,然后驱动安装好后会自动弹出,接下来会枚举为modem和usbcom。做的更好一点的是当在xp上已经安装过驱动后,再插上网卡,就不会出现光驱了,直接出modem和usbvcom接口。
  你在wince下把光驱先弹出,然后加载usbserial驱动就可以了。
点赞  2009-12-25 22:58
但是我根据对应的PID和VID已经加载了我自己写的USB驱动,在我的驱动里面,只能获取到USB的存储器接口,也就是光驱的interface,这个是我应该怎么做呢。

我怎么能弹出这个光驱呢???
应该发送什么指令吧。
点赞  2009-12-25 23:03
没有进展啊,
点赞  2009-12-27 16:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复