Linux 编译绿联AIC8800无线网卡驱动

Linux 编译绿联AIC8800无线网卡驱动

下载源码

绿联的网卡是一个 USB 存储设备,里面存放了 Windows 的驱动程序。而 Linux 驱动需要下载源码编译

这里下载对应驱动,解压到一个文件夹

image-20250404123715512

编译

解压后有 Debian/Ubuntu 和其他 Linux 的编译文档,按照文档进行编译即可

编译可能遇到的问题

内核版本新,函数调用旧版本导致编译出错

image-20250404123938472

解决方案:

找到 linux-headers 中,该函数的定义。如图该函数定义在 /usr/lib/modules/6.12.21-1-lts/build/include/net/cfg80211.h 的8794行。查看定义:

1
grep -A 10 "void cfg80211_cac_event" /usr/lib/modules/6.12.21-1-lts/build/include/net/cfg80211.h

image-20250404124419329

再检查实际调用的格式,由输出看出该调用在aic8800_fdrv/rwnx_radar.c

1
grep -A 10 "cfg80211_cac_event" aic8800_fdrv/rwnx_radar.c

image-20250404124526121

可以看出少了一个 link_id 参数,可以手动补上 0

image-20250404124650877

重新编译即可

重复定义宏

image-20250404125013277

打开对应的文件,注释重复的宏即可

image-20250404125111430

使用驱动

插入网卡,运行 ip addr,应该显示新网卡设备, 如wlan1

image-20250404125645318

则已经可以使用

RDKx5 出现的问题

实际在 RDKx5 编译完成并安装后,插入网卡不能直接使用,经过排查有以下问题

  1. 编译后的网卡驱动模块与板载模块有冲突,导致没能加载内核模块
  2. 因为该网卡同时也是存储设备,RDKx5默认以存储设备加载,而不是网卡设备

内核模块冲突

image-20250404130153976

查看加载的内核模块,发现编译后的模块并未加载。尝试手动加载:

image-20250404130238982

发现是因为符号冲突,导致无法加载该模块

解决方案

屏蔽该模块,并重启

1
echo "blacklist aic8800_bsp" > /etc/modprobe.d/blacklist-aic8800_bsp.conf

重启后,再次检查模块,发现已经成功加载内核模块

image-20250404130627119

加载设备类型有错

识别到 usb 设备但是没有网卡设备

image-20250404130812156

查看 usb 设备类型,发现设备被加载成存储设备:、

image-20250404130914209

解决方案

添加 udev 规则,自动将设备类型改为网卡设备

首先确定网卡设备 id,如图为 a69c:5724

首先尝试手动修改设备模式

1
usb_modeswitch -v 0xa69c -p 0x5724 -M "5553424312345678000000000000061b000000020000000000000000000000"

如果执行后,查看有网卡设备,则可以继续,使之自动完成配置。

设置 usb modeswitch 配置

1
2
3
4
5
6
cat > "/etc/usb_modeswitch.d/a69c:5724" << EOF
# UGreen AIC8800 USB WiFi initial mode
TargetVendor=0xA69C
TargetProduct=0x5724
MessageContent="5553424312345678000000000000061b000000020000000000000000000000"
EOF

设置 udev 配置

1
2
3
4
5
6
cat > "/etc/udev/rules.d/99-ugreen_usb_aic8800.rules" << EOF
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="a69c", ATTR{idProduct}=="5724", RUN+="/usr/sbin/usb_modeswitch -v 0xa69c -p 0x5724 -c /etc/usb_modeswitch.d/a69c:5724"
EOF

udevadm control --reload-rules
udevadm trigger

重启后,重新插入网卡,可以发现能够正确识别设备,并连接网络

image-20250404131831557