前言:鲁班猫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
可以看到,
- 正常工作的产品都经历依次重新枚举的过程,并且产品的PID和VID都发生了变化。
- Mercury虽然也重新枚举了,PID 和VID也发生变化了,却无法正常工作。
- 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驱动安装过程,不是产品评测,不偏不倚。