Linux USB驱动程序probe()问题
收藏

我目前正在为seowon swu-3220a wimax usb mode m开发内核模式usb驱动程序。这是一个复杂的设备(插入后,它在系统中显示为USB光盘,驱动程序需要将其切换到调制解调器模式)。我的问题是驱动程序中的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);

有人能告诉我哪里有虫子吗?有人能提出解决办法吗?


最佳答案:

如果是USB大容量存储驱动程序在你有机会之前偷了它,你可能想黑名单上的VID/PID设备与该驱动程序。
既然你提到它是一个usb wimax适配器,我会有一个疯狂的猜测,虽然它是一个usb大容量存储设备,其中包含一个驱动程序,它在windows上。如果是这样的话,您最好使用USB Modeswitch,它已经为3g调制解调器处理了这个问题。通常,这些设备需要一些魔法字节(通常是scsi弹出命令)来说服它们停止作为大容量存储设备,成为真正的调制解调器。(通常也有不同的PID)。
即使你的设备不能被说服用一个现有的USB MODESwitCH规则来显示真正的设备,而不是驱动程序,那么修复内核故障的问题更合适。
使用USB ModeSwitch进行此操作比您建议的有许多优点:
保持一切模块化:
你的驱动程序只需要关心wimax和设备的一个vid/pid
大容量存储驱动程序不需要关心疯狂的设备——它看起来就像是插上和拔下一个设备。教大容量存储驱动程序了解每一种此类设备是不合适的,您的设备似乎不是一个特例。
关于设备分割性的知识只与USB接口有关,它只存在于解决这个问题。
它不会破坏设备的USB大容量存储功能——用户可能出于某种原因想查看Linux下的Windows驱动程序,将该设备列入黑名单将使这一点变得不可能。如果您最终也使用Linux下Windows驱动程序附带的固件,这可能很重要。
它遵循现有的设置,并将您的更改保持在模块的本地。如果你想让你的驱动进入主线内核,这可能是很重要的。

    公众号
    关注公众号订阅更多技术干货!