登录
  • 人们都希望被别人需要 却往往事与愿违
  • 想得到你从未拥有过的东西, 就必须做你从未做过的事情。

绿联 AX900 CM763 无线网卡 (AIC8800 芯片) 在 Ubuntu上的驱动

Linux Benny小土豆 82次浏览 5760字 0个评论
文章目录[显示]

由于最近要做一些libvips的性能优化,必须要在一台物理机器且带NVIDIA GPU的机器上运行。Windows上用libvips很痛苦,于是就给自己家的二手捡垃圾PC装上了 Ubuntu 24.04

安装好之后,自然是没有无线网卡驱动的,我的无线网卡是捡垃圾的UGREEN AX900 CM763,还好从官网搜到了驱动 https://www.lulian.cn/download/154.html

本来以为,编译驱动什么的就是个10分钟的小事情,make && make install && modeprobe xxxx

但是这次没想到,一晚上都没了……🫠

编译驱动

根据官方的pdf说明

bash install_setup.sh
cd drivers/aic8800
make
make install

modprobe cfg80211
modprobe aic_load_fw
modprobe aic8800_fdrv

理论上就应该能看到无线设备了!

但是……2025年,我猜你很可能遇到……

could not insert 'aic_load_fw': Key was rejected by service

说明你启用了安全启动,要么禁用安全启动(小心你的Windows可能启动不了),要么自己创建一份key 然后 enroll

给驱动增加签名

由于开启了安全启动,内核默认会拒绝加载没有签名的ko文件,所以我们要自己创建key,导入,然后去签名ko

创建MOK

sudo apt install mokutil
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=WiFi/"
mokutil --import MOK.der

之后会让你输入个密码,然后reboot重启系统,会看到这样类似蓝色的界面

绿联 AX900 CM763 无线网卡 (AIC8800 芯片) 在 Ubuntu上的驱动

Enroll后,继续启动进入系统,输入 mokutil --list-enrolled 看是否能够看到创建的issuer信息,如果能够看到,那就可以了

编译模块并签名

总之无论如何,肯定已经编译出来了两个ko文件,并且key已经enroll了

那么就要签名,让内核能够加载这个模块,要注意两个内核模块都要签名哦,路径自己改改

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 \
~/Desktop/MOK.priv \
~/Desktop/MOK.der \
aic8800_fdrv/aic8800_fdrv.ko

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 \
~/Desktop/MOK.priv \
~/Desktop/MOK.der \
aic_load_fw/aic_load_fw.ko

签名成功,可以用modinfo确认一下

modinfo aic8800_fdrv/aic8800_fdrv.ko | grep signer
modinfo aic_load_fw/aic_load_fw.ko | grep signer

有输出内容,能够看到签名信息,就说明正确了

此时就可以make install了,一定不要忘记了这步

加载内核模块

modprobe cfg80211
modprobe aic_load_fw
modprobe aic8800_fdrv

然后lsmod看看呢?

lsmod | grep aic
aic8800_fdrv 696320 0
cfg80211 1433600 1 aic8800_fdrv
aic_load_fw 90112 1 aic8800_fdrv

然而你ifconfig还是可能,看不到无线网卡,插拔也看不到😂

dmesg 说firmware failed to open

看看dmesg

dmesg | grep -i aic

你会惊喜的发现

[ 1.233597] usb 5-2: Product: AIC Wlan
[ 1.233599] usb 5-2: Manufacturer: aicsemi
[ 3.930973] aic_load_fw: loading out-of-tree module taints kernel.
[ 3.932153] aic_bluetooth_mod_init
[ 3.932158] AICWFDBG(LOGINFO) aicwf_prealloc_init enter
[ 3.937597] AICWFDBG(LOGINFO) pre alloc rxbuff list len: 1000
[ 3.937638] AICWFDBG(LOGINFO) aicwf_usb_probe vid:0xA69C pid:0x8D80 icl:0x0 isc:0x0 ipr:0x0
[ 3.937644] AICWFDBG(LOGINFO) aicloadfw_chipmatch USE AIC8800D80
[ 3.937648] Aic high speed USB device detected
[ 3.938438] aic_load_firmware :firmware path = /lib/firmware/aic8800D80/fmacfw_8800d80_u02.bin
[ 3.938734] aic_load_firmware: fmacfw_8800d80_u02.bin file failed to open
[ 3.938742] aicwf_bus_deinit
[ 4.439093] usb_err:<aicwf_usb_rx_submit_all_urb,234>: bus is not up=0
[ 4.439118] usb_err:<aicwf_usb_rx_submit_all_urb,234>: bus is not up=0

又惊喜又意外是不是,还需要一个firmware,还好他的压缩包里有,全给复制进去

file aic8800_linux_driver/fw/aic8800D80/fmacfw_8800d80_u02.bin
# 输出为 aic8800_linux_driver/fw/aic8800D80/fmacfw_8800d80_u02.bin: data

sudo mkdir -p /lib/firmware/aic8800D80
cp aic8800_linux_driver/fw/aic8800D80/* /lib/firmware/aic8800D80/

重新加载内核模块,这次应该可以了吧?

sudo modprobe -r aic8800_fdrv
sudo modprobe -r aic_load_fw
sudo modprobe aic_load_fw
sudo modprobe aic8800_fdrv

dmesg wrong size of firmware file

尽管上一步我们已经modeprobe了,但是dmesg中看到……

[ 591.951845] usbcore: registered new interface driver aic8800_fdrv
[ 0.458630] Spectre V2 : Enabling Speculation Barrier for firmware calls
[ 0.640535] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored
[ 0.667872] acpi PNP0A08:00: [Firmware Info]: ECAM [mem 0xf0000000-0xf7ffffff] for domain 0000 [bus 00-7f] only partially covers this bridge
[ 3.621969] systemd[1]: Mounting snap-firmware\x2dupdater-167.mount - Mount unit for firmware-updater, revision 167...
[ 3.636882] systemd[1]: Mounted snap-firmware\x2dupdater-167.mount - Mount unit for firmware-updater, revision 167.
[ 3.938438] aic_load_firmware :firmware path = /lib/firmware/aic8800D80/fmacfw_8800d80_u02.bin
[ 3.938734] aic_load_firmware: fmacfw_8800d80_u02.bin file failed to open
[ 3.938740] wrong size of firmware file
[ 4.334041] nouveau 0000:0b:00.0: pmu: firmware unavailable

啊这?虽然我不懂代码,但是看起来这些的没问题啊,<=0 嘛
绿联 AX900 CM763 无线网卡 (AIC8800 芯片) 在 Ubuntu上的驱动

更新下 initramfs 应该就好了

sudo update-initramfs -u

然后重启系统,然后继续……

sudo modprobe -r aic8800_fdrv
sudo modprobe -r aic_load_fw

sudo modprobe aic_load_fw
sudo modprobe aic8800_fdrv

继续重新加载内核模块

但是此时,好像Wi-Fi还没出啦啊?

更改设备模式

lsusb可以看到

Bus 005 Device 003: ID a69c:5724 aicsemi Aic MSC

然后如果你细心打开过文件管理器,或者 df 了一次,还会发现

/dev/sdb1 3808 3195 613 84% /media/benny/UGREENs

甚至是如果你仔细看了上面的dmesg high speed USB device detected

[ 3.937644] AICWFDBG(LOGINFO) aicloadfw_chipmatch USE AIC8800D80
[ 3.937648] Aic high speed USB device detected
[ 3.938438] aic_load_firmware :firmware path = /lib/firmware/aic8800D80/fmacfw_8800d80_u02.bin
[ 3.938734] aic_load_firmware: fmacfw_8800d80_u02.bin file failed to open

系统把这个识别成了U盘😂 记得在Windows下使用也是直接多了个U盘,里面有个setup.exe

只不过这个设备不是用的 usb_modeswitch,而是udev,并且其实在install_setup.sh中已经提示了

驱动源代码中搜索可以看到如下内容

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

那么创建一个文件 /etc/udev/rules.d/99-aic-udisk.rules

加入如下内容(或者你想加了上面三行,也行)

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

然后运行如下两条命令

sudo udevadm control --reload-rules
sudo udevadm trigger

重新插拔网卡,并lsusb

root@vips:~# lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)
Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. Hub
Bus 001 Device 004: ID 1c4f:0043 SiGma Micro USB Keyboard
Bus 001 Device 005: ID 10c4:0005 Silicon Labs USB OPTICAL MOUSE
Bus 001 Device 011: ID 368b:8d88 AICSemi AIC 8800D80

wlx6c1ff7557a1b: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 6c:1f:f7:aa:aa:aa  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

哦吼,出现了 🙃真不容易,不愧是开源拖拉机😂 赶紧备份一下整个分区……🫠

但是你以为这就完了吗?没有……

固定内核版本

由于不是dkms,如果某一天一个apt upgrade,然后升级了内核,那么就会发现,咦,我Wi-Fi呢?所以我们要固定一下内核版本,避免出现这种问题

sudo apt-mark hold linux-image-$(uname -r) \
linux-headers-$(uname -r) \
linux-modules-$(uname -r) \
linux-modules-extra-$(uname -r)

🤣 怎么感觉好像工作量全部在配置环境上了

🤔 要是使用 Windows + VM + 直通GPU会不会好一点?总之😂 太痛苦了,没想到竟然被一个无线网卡硬控了4个小时


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/aic8800-ubuntu.html
喜欢 (0)
分享:-)
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)