Linux USB驱动程序探针()问题

Eug*_*sev 3 linux usb driver linux-device-driver linux-kernel

我目前正在为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);
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我哪里有错误或建议任何解决方法?

Fle*_*exo 6

如果是USB大容量存储驱动程序在您有机会之前窃取它,您可能希望将具有该驱动程序的设备的VID/PID列入黑名单.

既然你提到它是一个USB WiMAX适配器,我将会有一个疯狂的猜测,虽然它提出了一个USB大容量存储设备,在Windows上包含一个驱动程序.如果是这种情况,你最好使用USB Modeswitch,它已经为3G调制解调器处理了这个问题.通常,设备需要一些魔术字节(通常实际上是SCSI弹出命令)来说服它们停止作为大容量存储设备并成为真正的调制解调器.(通常也有不同的PID).

即使您的设备无法被说服显示真实设备而不是现有USB Modeswitch规则之一的驱动程序,解决问题比使用内核破解更合适.

使用USB Modeswitch执行此操作与您提出的建议相比具有许多优势:

  1. 保持模块化的一切:
    1. 您的驱动程序只需要关心设备的WiMAX和一个VID ​​/ PID
    2. 大容量存储驱动程序不需要关心疯狂的设备 - 它只是插入和拔出设备.对大量存储驱动程序讲授这些设备中的每一个都不合适,您的设备似乎不是特殊情况.
    3. 关于设备分裂个性的知识仅与USB模式开关有关,USB模式开关仅用于解决此问题.
  2. 它不会破坏设备的USB大容量存储方面 - 用户可能希望在某些原因下在Linux下查看Windows驱动程序,将此设备列入黑名单会使其变得不可能.如果您最终使用Linux下的Windows驱动程序附带的某些固件,这可能很重要.
  3. 它遵循现有设置,并将您的更改保留在模块的本地.如果您想在主线内核中获取驱动程序,这可能非常重要.