Linux USB驱动probe()问题

标签 linux linux-kernel usb driver linux-device-driver

我目前正在为 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);

谁能告诉我错误在哪里或建议任何解决方法?

最佳答案

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

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

即使无法说服您的设备显示真实设备而不是具有现有 USB Modesswitch 规则之一的驱动程序,解决该问题比内核 hack 更合适。

使用 USB Modesswitch 比您建议的有很多优势:

  1. 保持一切模块化:
    1. 您的驱动程序只需关心设备的 WiMAX 和一个 VID/PID
    2. 大容量存储驱动程序不需要关心疯狂的设备——它只是看起来像插入和拔出设备。向大容量存储驱动程序教授这些设备中的每一个都是不合适的,您的设备似乎不是特例。
    3. 关于设备人格 split 的知识只与USB Modesswitch有关,USB Modesswitch的存在只是为了解决这个问题。
  2. 它不会破坏设备的 USB 大容量存储方面 - 用户可能出于某种原因希望在 Linux 下查看 Windows 驱动程序,将此设备列入黑名单将使这成为不可能。如果您最终也在 Linux 下使用 Windows 驱动程序附带的某些固件,这可能很重要。
  3. 它遵循现有设置并将您的更改保留在您的模块本地。如果您想在主线内核中获取您的驱动程序,这可能很重要。

关于Linux USB驱动probe()问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7579944/

相关文章:

linux - 建议 : USB Monitoring Programming

javascript - 使用 USB 线从 Beacon 读取/写入数据

android - 如何将我的应用程序从 Eclipse 加载到我的 Android 手机而不是 AVD

python - 如何强制 str 更正 pygame.mixer (Python) 的类型?

ios - 在 Linux 中开发 iOS 应用程序的状态如何?

linux - Linux中多核处理器从实模式到保护模式的转变

linux - mmap() 使用进程虚拟内存布局的哪一部分?

linux-kernel - Linux内核如何在多核之间迁移进程?

linux - ssh 上的复杂命令

python - 无法在centos上安装python新版本2.7.8