野火-鲁班猫2:五款USB Wifi

前言:鲁班猫2系统镜像为:lubancat-rk3568-debian10-xfce-full-20240510_update.img。

接上篇在鲁班猫2安装Tenda USB WIFI的驱动。我现在手头上有了5个厂商的30元以下的USB  WIFI:

  • Tenda:W311MI
  • EDUP:EP-AX300
  • COMFAST:CF-940AX
  • MERCURY:UX3
  • UGREEN:CM760

同样的AIC8800

每一家都提供了Linux设备驱动包。从驱动包的名称或者从deb包中提取的驱动源码可以知道他们都是基于AIC8800系列芯片。

不一样的结果

当我将后来买的四款USB  WIFI依次插入Tenda USB WIFI可以正常使用的鲁班猫2上时,分歧出现了。

  • EDUP和COMFAST正常工作,无线网卡设备正常出现。
  • MERCURY和UGREEN,没有看到任何无线网络设备。

该dmesg出场了

以下依次列举插入五款USB  WIFI之后的系统log。

1、Tenda

[  868.430156] usb 1-1.1: new high-speed USB device number 13 using ehci-platform
[  868.629461] usb 1-1.1: New USB device found, idVendor=a69c, idProduct=5721, bcdDevice= 2.00
[  868.629578] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  868.629613] usb 1-1.1: Product: Aic MSC
[  868.629648] usb 1-1.1: Manufacturer: aicsemi
[  868.629680] usb 1-1.1: SerialNumber: 20200203
[  868.632865] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[  868.636999] scsi host1: usb-storage 1-1.1:1.0
[  869.657723] scsi 1:0:0:0: Direct-Access     AIC      flash            1.0  PQ: 0 ANSI: 4
[  869.662517] sd 1:0:0:0: [sda] 7648 512-byte logical blocks: (3.92 MB/3.73 MiB)
[  869.663827] sd 1:0:0:0: [sda] Write Protect is on
[  869.663866] sd 1:0:0:0: [sda] Mode Sense: 03 00 80 00
[  869.664629] sd 1:0:0:0: [sda] No Caching mode page found
[  869.664658] sd 1:0:0:0: [sda] Assuming drive cache: write through
[  869.669939]  sda: sda1
[  869.676899] sd 1:0:0:0: [sda] Attached SCSI removable disk
[  870.573752] usb 1-1.1: reset high-speed USB device number 13 using ehci-platform
[  870.770479] usb 1-1.1: device firmware changed
[  870.770975] usb 1-1.1: USB disconnect, device number 13
[  870.783470] scsi 1:0:0:0: rejecting I/O to dead device
[  871.040206] usb 1-1.1: new high-speed USB device number 14 using ehci-platform
[  871.238096] usb 1-1.1: New USB device found, idVendor=2604, idProduct=0013, bcdDevice= 1.00
[  871.238131] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  871.238141] usb 1-1.1: Product: AIC8800DC
[  871.238149] usb 1-1.1: Manufacturer: AICSemi
[  871.238156] usb 1-1.1: SerialNumber: 20220127

2、COMFAST

[  619.597728] usb 1-1.1: new high-speed USB device number 9 using ehci-platform
[  619.797092] usb 1-1.1: New USB device found, idVendor=a69c, idProduct=5721, bcdDevice= 2.00
[  619.797213] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  619.797252] usb 1-1.1: Product: Aic MSC
[  619.797281] usb 1-1.1: Manufacturer: aicsemi
[  619.797309] usb 1-1.1: SerialNumber: 20200203
[  619.801217] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[  619.804492] scsi host1: usb-storage 1-1.1:1.0
[  620.834008] scsi 1:0:0:0: Direct-Access     AIC      flash            1.0  PQ: 0 ANSI: 4
[  620.839904] sd 1:0:0:0: [sda] 7648 512-byte logical blocks: (3.92 MB/3.73 MiB)
[  620.842144] sd 1:0:0:0: [sda] Write Protect is on
[  620.842256] sd 1:0:0:0: [sda] Mode Sense: 03 00 80 00
[  620.843519] sd 1:0:0:0: [sda] No Caching mode page found
[  620.843596] sd 1:0:0:0: [sda] Assuming drive cache: write through
[  620.855534]  sda: sda1
[  620.866402] sd 1:0:0:0: [sda] Attached SCSI removable disk
[  621.764542] usb 1-1.1: reset high-speed USB device number 9 using ehci-platform
[  621.961694] usb 1-1.1: device firmware changed
[  621.962818] usb 1-1.1: USB disconnect, device number 9
[  621.972247] scsi 1:0:0:0: rejecting I/O to dead device
[  622.231180] usb 1-1.1: new high-speed USB device number 10 using ehci-platform
[  622.430344] usb 1-1.1: New USB device found, idVendor=a69c, idProduct=88dc, bcdDevice= 1.00
[  622.430466] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  622.430502] usb 1-1.1: Product: AIC8800DC
[  622.430535] usb 1-1.1: Manufacturer: AICSemi
[  622.430565] usb 1-1.1: SerialNumber: 20220127
[  622.496758] aic_load_fw: loading out-of-tree module taints kernel.
[  622.502868] aic_bluetooth_mod_init 
[  622.503011] RELEASE DATE:2023_0207_1053 
[  622.503728] usbcore: registered new interface driver aic_load_fw

3、EDUP

[  763.726572] usb 1-1.1: new high-speed USB device number 11 using ehci-platform
[  763.925845] usb 1-1.1: New USB device found, idVendor=a69c, idProduct=5721, bcdDevice= 2.00
[  763.925968] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  763.926008] usb 1-1.1: Product: Aic MSC
[  763.926038] usb 1-1.1: Manufacturer: aicsemi
[  763.926065] usb 1-1.1: SerialNumber: 20200203
[  763.929757] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[  763.936753] scsi host1: usb-storage 1-1.1:1.0
[  764.957015] scsi 1:0:0:0: Direct-Access     AIC      flash            1.0  PQ: 0 ANSI: 4
[  764.960357] sd 1:0:0:0: [sda] 15840 512-byte logical blocks: (8.11 MB/7.73 MiB)
[  764.961235] sd 1:0:0:0: [sda] Write Protect is on
[  764.961260] sd 1:0:0:0: [sda] Mode Sense: 03 00 80 00
[  764.961991] sd 1:0:0:0: [sda] No Caching mode page found
[  764.962016] sd 1:0:0:0: [sda] Assuming drive cache: write through
[  764.970414]  sda: sda1
[  764.975409] sd 1:0:0:0: [sda] Attached SCSI removable disk
[  765.876287] usb 1-1.1: reset high-speed USB device number 11 using ehci-platform
[  766.076759] usb 1-1.1: device firmware changed
[  766.077759] usb 1-1.1: USB disconnect, device number 11
[  766.086319] scsi 1:0:0:0: rejecting I/O to dead device
[  766.359516] usb 1-1.1: new high-speed USB device number 12 using ehci-platform
[  766.560605] usb 1-1.1: New USB device found, idVendor=a69c, idProduct=88dc, bcdDevice= 1.00
[  766.560656] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  766.560668] usb 1-1.1: Product: AIC8800DC
[  766.560678] usb 1-1.1: Manufacturer: AICSemi
[  766.560687] usb 1-1.1: SerialNumber: 20220127

4、Mercury 

[  323.613751] usb 1-1.1: USB disconnect, device number 3
[  329.295253] usb 1-1.1: new high-speed USB device number 6 using ehci-platform
[  329.494336] usb 1-1.1: New USB device found, idVendor=a69c, idProduct=5721, bcdDevice= 2.00
[  329.494453] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  329.494492] usb 1-1.1: Product: Aic MSC
[  329.494524] usb 1-1.1: Manufacturer: aicsemi
[  329.494554] usb 1-1.1: SerialNumber: 20200203
[  329.498279] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[  329.506912] scsi host1: usb-storage 1-1.1:1.0
[  330.527654] scsi 1:0:0:0: Direct-Access     AIC      flash            1.0  PQ: 0 ANSI: 4
[  330.536825] sd 1:0:0:0: [sda] 7648 512-byte logical blocks: (3.92 MB/3.73 MiB)
[  330.543803] sd 1:0:0:0: [sda] Write Protect is on
[  330.543997] sd 1:0:0:0: [sda] Mode Sense: 03 00 80 00
[  330.546985] sd 1:0:0:0: [sda] No Caching mode page found
[  330.547444] sd 1:0:0:0: [sda] Assuming drive cache: write through
[  330.557168]  sda: sda1
[  330.566048] sd 1:0:0:0: [sda] Attached SCSI removable disk
[  331.491791] usb 1-1.1: reset high-speed USB device number 6 using ehci-platform
[  331.692434] usb 1-1.1: device firmware changed
[  331.693416] usb 1-1.1: USB disconnect, device number 6
[  331.702293] scsi 1:0:0:0: rejecting I/O to dead device
[  331.955320] usb 1-1.1: new high-speed USB device number 7 using ehci-platform
[  332.154467] usb 1-1.1: New USB device found, idVendor=2357, idProduct=0147, bcdDevice= 1.00
[  332.154591] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  332.154629] usb 1-1.1: Product: AIC8800DC
[  332.154659] usb 1-1.1: Manufacturer: AICSemi
[  332.154688] usb 1-1.1: SerialNumber: 20220127

5、UGREEN 

[  537.424188] usb 1-1.1: new high-speed USB device number 8 using ehci-platform
[  537.623463] usb 1-1.1: New USB device found, idVendor=a69c, idProduct=5722, bcdDevice= 2.00
[  537.623588] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  537.623624] usb 1-1.1: Product: Aic MSC
[  537.623653] usb 1-1.1: Manufacturer: aicsemi
[  537.623681] usb 1-1.1: SerialNumber: 20200203
[  537.627420] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[  537.634154] scsi host1: usb-storage 1-1.1:1.0
[  538.643460] scsi 1:0:0:0: Direct-Access     AIC      flash            1.0  PQ: 0 ANSI: 4
[  538.651984] sd 1:0:0:0: [sda] 7648 512-byte logical blocks: (3.92 MB/3.73 MiB)
[  538.653389] sd 1:0:0:0: [sda] Write Protect is on
[  538.653465] sd 1:0:0:0: [sda] Mode Sense: 03 00 80 00
[  538.657820] sd 1:0:0:0: [sda] No Caching mode page found
[  538.657907] sd 1:0:0:0: [sda] Assuming drive cache: write through
[  538.673418]  sda: sda1
[  538.683074] sd 1:0:0:0: [sda] Attached SCSI removable disk

可以看到,

  1. 正常工作的产品都经历依次重新枚举的过程,并且产品的PID和VID都发生了变化。  
  2. Mercury虽然也重新枚举了,PID 和VID也发生变化了,却无法正常工作。
  3. Ugreen没有重新枚举,保持在大容量存储设备的状态,确实也无法工作。

继续挖掘log中的信息

1、USB rule

五个USB  WIFI在链接开发板中的初始PID/VID,Ugreen是A69C/5722,其他四个是A69C /5721。

在驱动安装包中其实可以看到有这样一个USB  rule文件aic.rule,会被复制到/etc/udev/rules.d/。

KERNEL=="sd*", ATTRS{idVendor}=="a69c", ATTRS{idProduct}=="5721",  SYMLINK+="aicudisk", RUN+="/usr/bin/eject /dev/%k"

现象变得合理了,只需要将5722对应的rule添加到aic.rule即可。后续实测结果与期望一致。

2、驱动匹配设备

Mercury的log中显示重新枚举之后,并没有触发驱动加载过程。以Tenda为例,正常的过程是这样的:

[  131.002661] usb 1-1.2: new high-speed USB device number 8 using ehci-platform
[  131.218375] usb 1-1.2: New USB device found, idVendor=2604, idProduct=0013, bcdDevice= 1.00
[  131.219287] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  131.219961] usb 1-1.2: Product: AIC8800DC
[  131.220345] usb 1-1.2: Manufacturer: AICSemi
[  131.220751] usb 1-1.2: SerialNumber: 20220127
[  131.224272] AICWFDBG(LOGINFO)	aicwf_usb_chipmatch USE AIC8800DW
[  131.224864] AICWFDBG(LOGINFO)	aicwf_parse_usb endpoints = 4
[  131.225358] AICWFDBG(LOGERROR)	Number of interfaces: 1 not supported
[  131.226090] 8800dw
[  131.226299] AICWFDBG(LOGINFO)	Aic high speed USB device detected
[  131.226847] AICWFDBG(LOGINFO)	aicwf_usb_alloc_rx_urb AICWF_USB_RX_URBS:200 
[  131.227690] AICWFDBG(LOGINFO)	aicwf_usb_alloc_tx_urb AICWF_USB_TX_URBS:200 

推断目前在开发板中安装的Tenda提供的USB  WIFI驱动中并没有包含友商的ID。由于每一家都提供了各自版本的驱动。如果我没猜错的话,对比各家的驱动源码是可以发现一些线索的。果然。Tenda提供的驱动代码中出现了以下语句:

static struct usb_device_id aicwf_usb_id_table[] = {
#ifndef CONFIG_USB_BT
    {USB_DEVICE(USB_VENDOR_ID_AIC, USB_PRODUCT_ID_AIC8800)},
#else
    {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_AIC, USB_PRODUCT_ID_AIC8801, 0xff, 0xff, 0xff)},
    {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_AIC, USB_PRODUCT_ID_AIC8800DC, 0xff, 0xff, 0xff)},
    {USB_DEVICE(USB_VENDOR_ID_AIC, USB_PRODUCT_ID_AIC8800DW)},
    {USB_DEVICE(USB_VENDOR_ID_AIC_V2, USB_PRODUCT_ID_AIC8800FC)},
    {USB_DEVICE(USB_VENDOR_ID_TENDA, USB_PRODUCT_ID_TENDA)},
    {USB_DEVICE(USB_VENDOR_ID_TENDA, USB_PRODUCT_ID_TENDA_U2)},

#endif
    {}
};

MODULE_DEVICE_TABLE(usb, aicwf_usb_id_table);
static int aicwf_usb_chipmatch(struct aic_usb_dev *usb_dev, u16_l vid, u16_l pid){

	if(pid == USB_PRODUCT_ID_AIC8801){
		usb_dev->chipid = PRODUCT_ID_AIC8801;
		AICWFDBG(LOGINFO, "%s USE AIC8801\r\n", __func__);
		return 0;
	}else if(pid == USB_PRODUCT_ID_AIC8800DC){
		usb_dev->chipid = PRODUCT_ID_AIC8800DC;
		AICWFDBG(LOGINFO, "%s USE AIC8800DC\r\n", __func__);
		return 0;
	}else if(pid == USB_PRODUCT_ID_AIC8800DW || pid == USB_PRODUCT_ID_TENDA
	 || pid == USB_PRODUCT_ID_TENDA_U2 || pid == USB_PRODUCT_ID_AIC8800FC){
        usb_dev->chipid = PRODUCT_ID_AIC8800DW;
		AICWFDBG(LOGINFO, "%s USE AIC8800DW\r\n", __func__);
        return 0;
    }else{
		return -1;
	}
}

在上述两处添加Mercury和UGreen的PID和VID信息(如下),再次编译,安装,重启。

static struct usb_device_id aicwf_usb_id_table[] = {
#ifndef CONFIG_USB_BT
    {USB_DEVICE(USB_VENDOR_ID_AIC, USB_PRODUCT_ID_AIC8800)},
#else
    {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_AIC, USB_PRODUCT_ID_AIC8801, 0xff, 0xff, 0xff)},
    {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_AIC, USB_PRODUCT_ID_AIC8800DC, 0xff, 0xff, 0xff)},
    {USB_DEVICE(USB_VENDOR_ID_AIC, USB_PRODUCT_ID_AIC8800DW)},
    {USB_DEVICE(USB_VENDOR_ID_AIC_V2, USB_PRODUCT_ID_AIC8800FC)},
    {USB_DEVICE(USB_VENDOR_ID_TENDA, USB_PRODUCT_ID_TENDA)},
    {USB_DEVICE(USB_VENDOR_ID_TENDA, USB_PRODUCT_ID_TENDA_U2)},
    {USB_DEVICE(0xA69C, 0x88DE)},//Ugreen
    //{USB_DEVICE(0xA69C, 0x88DC)},//COMFAST
    {USB_DEVICE(0x2357, 0x0147)},//MERCURY
    //{USB_DEVICE(0xA69C, 0x88DC)},//EDUP

#endif
    {}
};

MODULE_DEVICE_TABLE(usb, aicwf_usb_id_table);
static int aicwf_usb_chipmatch(struct aic_usb_dev *usb_dev, u16_l vid, u16_l pid){

	if(pid == USB_PRODUCT_ID_AIC8801){
		usb_dev->chipid = PRODUCT_ID_AIC8801;
		AICWFDBG(LOGINFO, "%s USE AIC8801\r\n", __func__);
		return 0;
	}else if(pid == USB_PRODUCT_ID_AIC8800DC){
		usb_dev->chipid = PRODUCT_ID_AIC8800DC;
		AICWFDBG(LOGINFO, "%s USE AIC8800DC\r\n", __func__);
		return 0;
	}else if(pid == USB_PRODUCT_ID_AIC8800DW || pid == USB_PRODUCT_ID_TENDA
	 || pid == USB_PRODUCT_ID_TENDA_U2 || pid == USB_PRODUCT_ID_AIC8800FC
        || pid == 0x88DE || pid == 0x0147){
        usb_dev->chipid = PRODUCT_ID_AIC8800DW;
		AICWFDBG(LOGINFO, "%s USE AIC8800DW\r\n", __func__);
        return 0;
    }else{
		return -1;
	}
}

万能AIC8800驱动

五款USB  WIFI 就都可以使用了。

理论上只要是AIC8800系列芯片的USB  WIFI,通过修改上述USB rule文件和驱动源码中的PID 和VID信息,都可以正常加载驱动。

声明:本博客仅限讨论5家USB  WIFI linux驱动安装过程,不是产品评测,不偏不倚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值