两个相同VID PID的不同设备加载同一个KO文件中的不同驱动
问题:Realtek两个不同芯片的USB-TO-ETHERNET,PID VID都同为:8152。因为客户手中已经有一部分老的产品了,目前停产,新的产品使用不同的芯片。
需求:USB-TO-ETHERNET只是我们的外围设备的一部分,所以要求不管客户使用哪一个设备接进来,都能和主机搭配工作。
解决方案概述:
1,这是USB设备,所以通用USB接口标准会读取其设备描述。找出两种设备的关键不同点,我们的情况是:新旧设备的bNumConfigurations值不同,一个是1,另一个是2。
2,将驱动名统一为8152,跟据bNumConfigurations不同,加载不同的函数即可;
过程和代码:
1,先将新设备的驱动加入到kernel中,并确认新的驱动配新的设备可以工作。老的设备就不用说了,因为已经在工作中。
2,PIDVID加载时,只认一个驱动的名字。我这里设为“rtl8152”,所以驱动入口也只有一个。
static struct usb_driver rtl8152_driver = {
.name= MODULENAME,
.probe= rtl8152_probe,
.disconnect= rtl8152_disconnect,
.id_table= rtl8152_table,
.suspend= rtl8152_suspend,
.resume= rtl8152_resume
};
static int __init usb_rtl8152_init(void)
{
returnusb_register(&rtl8152_driver);
}
static void __exit usb_rtl8152_exit(void)
{
usb_deregister(&rtl8152_driver);
}
接下来要区分不同的设备执行不同的函数了。
贴代码最实际:
static int rtl8152_probe(structusb_interface *intf,
const struct usb_device_id *id)
{
structusb_device *udev = interface_to_usbdev(intf);
rtl8152_t*tp;
structnet_device *netdev;
usb_driver_set_configuration(udev,1);