我目前正致力于Seowon SWU-3220A WiMAX USB调制解调器的内核模式USB驱动程序。它是一个复杂的设备(插入后它在系统中显示为USB CDROM,驱动程序需要将其切换到调制解调器模式)。我的问题是我的驱动程序中的probe()函数永远不会被调用。我认为这是因为操作系统使用标准的USB大容量存储驱动程序而不是我自己的驱动程序。
我将驱动程序初始化如下:
#define GDM7213_VENDOR_ID 0x1076
#define GDM7213_PRODUCT_ID 0x7f40
static struct usb_device_id gdm7213_table [] = {
{ USB_DEVICE(GDM7213_VENDOR_ID, GDM7213_PRODUCT_ID) },
{ }
};
MODULE_DEVICE_TABLE(usb, gdm7213_table);
static struct usb_driver gdm7213_driver = {
.name = "gdm7213",
.probe = gdm7213_probe,
.disconnect = gdm7213_disconnect,
.suspend = gdm7213_suspend,
.resume = gdm7213_resume,
.pre_reset = gdm7213_pre_reset,
.post_reset = gdm7213_post_reset,
.id_table = gdm7213_table,
};
static int gdm7213_probe(struct usb_interface *interface, const struct usb_device_id *id)
{
printk(KERN_INFO "GDM7213 gdm7213_probe()\n");
return 0;
}
static int __init gdm7213_init_module(void)
{
int result;
printk(KERN_INFO "GDM7213 init_module()\n");
result = usb_register(&gdm7213_driver);
if (result)
err("usb_register failed. Error number %d", result);
return result;
}
static void __exit gdm7213_cleanup_module(void)
{
printk(KERN_INFO "GDM7213 cleanup_module()\n");
usb_deregister(&gdm7213_driver);
}
module_init(gdm7213_init_module);
module_exit(gdm7213_cleanup_module);
有人能告诉我哪里有错误或建议任何解决方法吗?
答案 0 :(得分:6)
如果是USB大容量存储驱动程序在您有机会之前窃取它,您可能希望将具有该驱动程序的设备的VID / PID列入黑名单。
既然你提到它是一个USB WiMAX适配器,我会猜测它会在Windows上展示一个包含驱动程序的USB大容量存储设备。如果是这种情况,那么最好使用USB Modeswitch,它已经为3G调制解调器处理了这个问题。通常,设备需要一些魔术字节(通常实际上是SCSI弹出命令)来说服它们停止作为大容量存储设备并成为真正的调制解调器。 (通常也有不同的PID)。
即使您的设备无法通过现有的USB Modeswitch规则来说明显示真实设备而不是驱动程序,解决问题比使用内核破解更合适。
使用USB Modeswitch执行此操作与您的建议相比具有许多优势: