3G网卡在WINCE6识别为Mass Storage!
在营业厅购买了一块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
仔细对比就可以发现,两次查看的是同一个设备,但是看到的信息却不一样。
希望大家能够帮帮忙。感激不尽
这个跟驱动有什么关系呢,为什么驱动安装前后,获取到的USB interface信息会不同呢。
USBswitch好像只有linux下有这个代码,我看了一下,也不是很明白,不知道该怎么搞,wince下该怎么做呢???
我在XP上抓了一些信息,分析了一下,也不是很明白。
首先我在电脑上使用USBtrace工具,选中了一个HUB,因为等会儿我会将CDMA网卡插入这个HUB,我试过想直接抓这个USB端口下的数据,但是没有设备是不能选中的,因此选HUB来抓信息,不知道USB主机通过HUB到设备的数据是否是透明传输,如果是,那么那些信息就是直接发送到CDMA网卡。那么应该就可以通过这些信息来分析,到底在XP下,这个网卡驱动发送了哪些控制数据!
还有就是我发现有一条控制指令的requestType 是02H,在标准的USB设备请求中我没有看到这个控制指令。他发送的数据部分是01H 00H
我在想,他是否就是使用这条指令完成了Modem的Switch。
不知道有没有人做过这方面的驱动,希望大家能帮帮忙。
谢谢了
补充一下,在USBSwitch中找到如下代码:
- int switchHuaweiMode () {
- int ret;
- SHOW_PROGRESS("Sending Huawei control message ...\n");
- ret = usb_control_msg(devh, USB_TYPE_STANDARD + USB_RECIP_DEVICE, USB_REQ_SET_FEATURE, 00000001, 0, buffer, 0, 1000);
- if (ret != 0) {
- fprintf(stderr, "Error: sending Huawei control message failed (error %d). Aborting.\n\n", ret);
- exit(1);
- } else
- SHOW_PROGRESS(" OK, Huawei control message sent\n");
- }
- int switchSierraMode () {
- int ret;
- SHOW_PROGRESS("Trying to send Sierra control message\n");
- ret = usb_control_msg(devh, 0x40, 0x0b, 00000001, 0, buffer, 0, 1000);
- if (ret != 0) {
- fprintf(stderr, "Error: sending Sierra control message failed (error %d). Aborting.\n\n", ret);
- exit(1);
- } else
- SHOW_PROGRESS(" OK, Sierra control message sent\n");
- }
- int switchSonyMode () {
- int i, found, ret;
- detachDriver();
- if (CheckSuccess) {
- printf("Note: CheckSuccess pointless with Sony mode, disabling\n");
- CheckSuccess = 0;
- }
- SHOW_PROGRESS("Trying to send Sony control message\n");
- ret = usb_control_msg(devh, 0xc0, 0x11, 2, 0, buffer, 3, 100);
- if (ret < 0) {
- fprintf(stderr, "Error: sending Sony control message failed (error %d). Aborting.\n\n", ret);
- exit(1);
- } else
- SHOW_PROGRESS(" OK, control message sent, waiting for device to return ...\n");
- usb_close(devh);
- i=0;
- dev = NULL;
- while ( dev == NULL && i < 30 ) {
- if ( i > 5 ) {
- usb_find_busses();
- usb_find_devices();
- dev = search_devices(&found, DefaultVendor, DefaultProduct, TargetClass);
- }
- if ( dev != NULL )
- break;
- sleep(1);
- if (show_progress) {
- printf("#");
- fflush(stdout);
- }
- i++;
- }
- SHOW_PROGRESS("\n After %d seconds:",i);
- if ( dev != NULL ) {
- SHOW_PROGRESS(" device came back, proceeding\n");
- devh = NULL;
- devh = usb_open( dev );
- if (devh == NULL) {
- fprintf(stderr, "Error: could not get handle on device\n");
- return 0;
- }
- } else {
- SHOW_PROGRESS(" device still gone, cancelling\n");
- return 0;
- }
- sleep(1);
- // switchAltSetting();
- // sleep(1);
- SHOW_PROGRESS("Sending Sony control message again ...\n");
- ret = usb_control_msg(devh, 0xc0, 0x11, 2, 0, buffer, 3, 100);
- if (ret < 0) {
- fprintf(stderr, "Error: sending Sony control message (2) failed (error %d)\n", ret);
- return 0;
- } else {
- SHOW_PROGRESS(" OK, control message sent\n");
- return 1;
- }
- Interface=8;
- AltSetting=2;
- }
- // Detach driver either as the main action or as preparation for other modes
- int detachDriver() {
- int ret;
- #ifndef LIBUSB_HAS_GET_DRIVER_NP
- printf(" Cant't do driver detection and detaching on this platform.\n");
- return 2;
- #endif
- SHOW_PROGRESS("Looking for active driver ...\n");
- ret = usb_get_driver_np(devh, Interface, buffer, BUF_SIZE);
- if (ret != 0) {
- SHOW_PROGRESS(" No driver found. Either detached before or never attached\n");
- return 1;
- }
- SHOW_PROGRESS(" OK, driver found ("%s")\n", buffer);
- if (DetachStorageOnly && strcmp(buffer,"usb-storage")) {
- SHOW_PROGRESS(" Driver is not usb-storage, leaving it alone\n");
- return 1;
- }
- #ifndef LIBUSB_HAS_DETACH_KERNEL_DRIVER_NP
- SHOW_PROGRESS(" Can't do driver detaching on this platform\n");
- return 2;
- #endif
- ret = usb_detach_kernel_driver_np(devh, Interface);
- if (ret == 0) {
- SHOW_PROGRESS(" OK, driver "%s" detached\n", buffer);
- // usb_clear_halt(devh, MessageEndpoint);
- // usb_clear_halt(devh, ResponseEndpoint);
- } else
- SHOW_PROGRESS(" Driver "%s" detach failed with error %d. Trying to continue\n", buffer, ret);
- return 1;
- }
不知道是否是使用这个来完成的,如果转换到wince应该怎么写这句话,是应该使用IssueControlTransfer向端点0发送一个指令吗???
Come ON
怎么样才能把
usb_control_msg(devh, USB_TYPE_STANDARD + USB_RECIP_DEVICE, USB_REQ_SET_FEATURE, 00000001, 0, buffer, 0, 1000);
转换为wince下的IssueControlTransfer或者IssueVendorTransfer
感谢了
你好:
so927 我现在和你情况一样,想与你一起解这个问题。
现在不知道你搞定没有呢
引用: 引用 10 楼 hangbing0203 的回复:
你好:
? so927? 我现在和你情况一样,想与你一起解这个问题。
现在不知道你搞定没有呢
加我QQ:463316948
是不是把驱动程序直接保存在mass storage里面。就不用带光盘了。
是的,XP和LINUX的驱动程序在网卡里面直接就有了,
我的 联通3G上网卡,插在笔记本上就是显示个u盘的,估计这样正常的。
是的,插入笔记本电脑(XP系统),首先显示的是一个U盘,安装U盘里面的驱动之后,就会出现一个modem了,在WINCE上怎么实现这个modem的interface呢?
我是做上网卡开发的,这个是易驱功能,网卡先插上的时候为光驱设备,自动安装驱动,然后驱动安装好后会自动弹出,接下来会枚举为modem和usbcom。做的更好一点的是当在xp上已经安装过驱动后,再插上网卡,就不会出现光驱了,直接出modem和usbvcom接口。
你在wince下把光驱先弹出,然后加载usbserial驱动就可以了。
但是我根据对应的PID和VID已经加载了我自己写的USB驱动,在我的驱动里面,只能获取到USB的存储器接口,也就是光驱的interface,这个是我应该怎么做呢。
我怎么能弹出这个光驱呢???
应该发送什么指令吧。