Linux 编译绿联AIC8800无线网卡驱动
下载源码
绿联的网卡是一个 USB 存储设备,里面存放了 Windows 的驱动程序。而 Linux 驱动需要下载源码编译
从这里下载对应驱动,解压到一个文件夹

编译
解压后有 Debian/Ubuntu 和其他 Linux 的编译文档,按照文档进行编译即可
编译可能遇到的问题
内核版本新,函数调用旧版本导致编译出错

解决方案:
找到 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 |

再检查实际调用的格式,由输出看出该调用在aic8800_fdrv/rwnx_radar.c:
1 | grep -A 10 "cfg80211_cac_event" aic8800_fdrv/rwnx_radar.c |

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

重新编译即可
重复定义宏

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

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

则已经可以使用
RDKx5 出现的问题
实际在 RDKx5 编译完成并安装后,插入网卡不能直接使用,经过排查有以下问题
- 编译后的网卡驱动模块与板载模块有冲突,导致没能加载内核模块
- 因为该网卡同时也是存储设备,RDKx5默认以存储设备加载,而不是网卡设备
内核模块冲突

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

发现是因为符号冲突,导致无法加载该模块
解决方案
屏蔽该模块,并重启
1 | echo "blacklist aic8800_bsp" > /etc/modprobe.d/blacklist-aic8800_bsp.conf |
重启后,再次检查模块,发现已经成功加载内核模块

加载设备类型有错
识别到 usb 设备但是没有网卡设备

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

解决方案:
添加 udev 规则,自动将设备类型改为网卡设备
首先确定网卡设备 id,如图为 a69c:5724
首先尝试手动修改设备模式
1 | usb_modeswitch -v 0xa69c -p 0x5724 -M "5553424312345678000000000000061b000000020000000000000000000000" |
如果执行后,查看有网卡设备,则可以继续,使之自动完成配置。
设置 usb modeswitch 配置
1 | cat > "/etc/usb_modeswitch.d/a69c:5724" << EOF |
设置 udev 配置
1 | cat > "/etc/udev/rules.d/99-ugreen_usb_aic8800.rules" << EOF |
重启后,重新插入网卡,可以发现能够正确识别设备,并连接网络
