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

JasonBUG 2009-12-20 09:02:18
在营业厅购买了一块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


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


希望大家能够帮帮忙。感激不尽
...全文
459 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
JasonBUG 2009-12-27
  • 打赏
  • 举报
回复
没有进展啊,
JasonBUG 2009-12-25
  • 打赏
  • 举报
回复
但是我根据对应的PID和VID已经加载了我自己写的USB驱动,在我的驱动里面,只能获取到USB的存储器接口,也就是光驱的interface,这个是我应该怎么做呢。

我怎么能弹出这个光驱呢???
应该发送什么指令吧。
hall919 2009-12-25
  • 打赏
  • 举报
回复
我是做上网卡开发的,这个是易驱功能,网卡先插上的时候为光驱设备,自动安装驱动,然后驱动安装好后会自动弹出,接下来会枚举为modem和usbcom。做的更好一点的是当在xp上已经安装过驱动后,再插上网卡,就不会出现光驱了,直接出modem和usbvcom接口。
你在wince下把光驱先弹出,然后加载usbserial驱动就可以了。
JasonBUG 2009-12-25
  • 打赏
  • 举报
回复
是的,插入笔记本电脑(XP系统),首先显示的是一个U盘,安装U盘里面的驱动之后,就会出现一个modem了,在WINCE上怎么实现这个modem的interface呢?
JasonBUG 2009-12-25
  • 打赏
  • 举报
回复
帮帮忙啊,各位!、、、


gooogleman 2009-12-25
  • 打赏
  • 举报
回复
我的 联通3G上网卡,插在笔记本上就是显示个u盘的,估计这样正常的。
JasonBUG 2009-12-25
  • 打赏
  • 举报
回复
是的,XP和LINUX的驱动程序在网卡里面直接就有了,

lin0119 2009-12-25
  • 打赏
  • 举报
回复
是不是把驱动程序直接保存在mass storage里面。就不用带光盘了。
JasonBUG 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hangbing0203 的回复:]
你好:
  so927  我现在和你情况一样,想与你一起解这个问题。
现在不知道你搞定没有呢
[/Quote]

加我QQ:463316948
hangbing0203 2009-12-23
  • 打赏
  • 举报
回复
你好:
so927 我现在和你情况一样,想与你一起解这个问题。
现在不知道你搞定没有呢
JasonBUG 2009-12-23
  • 打赏
  • 举报
回复
Come ON

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

感谢了
JasonBUG 2009-12-22
  • 打赏
  • 举报
回复
补充一下,在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发送一个指令吗???
JasonBUG 2009-12-22
  • 打赏
  • 举报
回复
USBswitch好像只有linux下有这个代码,我看了一下,也不是很明白,不知道该怎么搞,wince下该怎么做呢???

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

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


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

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

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

谢谢了
mabugang 2009-12-21
  • 打赏
  • 举报
回复
这个问题好啊 顶一个
suwyhoho 2009-12-21
  • 打赏
  • 举报
回复
usbswitch没做吗
博说医械研发 2009-12-20
  • 打赏
  • 举报
回复
驱动的关系?
kyzf 2009-12-20
  • 打赏
  • 举报
回复
顶下,MARK
JasonBUG 2009-12-20
  • 打赏
  • 举报
回复
怎么没有人帮忙啊,顶上去继续啊

JasonBUG 2009-12-20
  • 打赏
  • 举报
回复
这个跟驱动有什么关系呢,为什么驱动安装前后,获取到的USB interface信息会不同呢。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧