两个相同VID PID的不同设备加载同一个KO文件中的不同驱动

针对Realtek两款PID VID均为8152的不同USB-TO-ETHERNET芯片,通过识别设备的bNumConfigurations值实现驱动的差异化加载。在驱动程序中,根据bNumConfigurations判断设备类型,执行相应的新旧设备驱动函数,确保无论使用哪款设备,都能正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个相同VID PID的不同设备加载同一个KO文件中的不同驱动

 

问题Realtek两个不同芯片的USB-TO-ETHERNETPID VID都同为:8152。因为客户手中已经有一部分老的产品了,目前停产,新的产品使用不同的芯片。

 

需求USB-TO-ETHERNET只是我们的外围设备的一部分,所以要求不管客户使用哪一个设备接进来,都能和主机搭配工作。

 

解决方案概述

1,这是USB设备,所以通用USB接口标准会读取其设备描述。找出两种设备的关键不同点,我们的情况是:新旧设备的bNumConfigurations值不同,一个是1,另一个是2

2,将驱动名统一为8152,跟据bNumConfigurations不同,加载不同的函数即可;

 

过程和代码

1,先将新设备的驱动加入到kernel中,并确认新的驱动配新的设备可以工作。老的设备就不用说了,因为已经在工作中。

2PIDVID加载时,只认一个驱动的名字。我这里设为“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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值