记录移植无线网卡驱动遇到的各种问题:
从官网上下载8821的驱动源码
复制一份上面的CONFIG_PLATFORM_ARM_RK2818,改成3588,然后选项改成y,并把autodetect关掉。
找到CONFIG_PLATFORM_ARM_RK2818,复制一份,改成RK3588,然后把交叉编译工具链、内核目录改好
make编译成.ko内核模块
出现问题
问了AI回复如下,仔细看了一下网卡驱动的README,发现它是提供monitor的版本,于是我重新下了一个普通版的
普通版的链接如下:
https://github.com/brektrou/rtl8821CU
这里边依然有一些问题:
下面这俩函数过时了,没有在一个命名空间内,在当前目录通过如下命令,可以定位到哪个源文件使用了这个函数,最终找到是osdep_service.c。
grep -r "kernel_read" .
只需要在该源文件加上,下面的声明,明确告诉内核:“我这个驱动程序需要访问文件系统内部命名空间中的符号”。这样,modpost 阶段就不会再报错了
MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver);
make,编译出.ko文件,拷贝到板端
板端实验,在加载ko前,不管插不插网卡,都是四个节点。
加载网卡驱动,在用ifconfig看,依然是四个,需要找出问题。
查看内核日志,可以看到,驱动加载正常,但是usb网卡被识别成usb设备了
使用命令进行模式切换
sudo usb_modeswitch -KW -v 0bda -p 1a2b
然后再lsusb,可以看到它的id变成了0bda:c820,和内核源码进行比对,如果有的话,就是对的。
且后面也写了NIC(Network Interface Card),已经识别成功。
再次ifconfig,已经多了一个节点。
测试:如果要给新的节点分配ip,记得要绕开同一网段,因为如果是同一个网段,手动设置的 IP 地址与系统中已有的默认路由规则可能会产生冲突,导致ssh失效。
sudo ifconfig enx0826ae302ae0 down
sudo ifconfig enx0826ae302ae0 192.168.1.100 netmask 255.255.255.0
sudo route add -net 192.168.1.0 netmask 255.255.255.0 dev enx0826ae302ae0
但是实际测试不能这么做,按照以下步骤进行:
第一步1.检查物理状态和驱动:
首先,确认系统已经识别了你的无线网卡。
lsusb | grep -i network
如下图所示,虽然没有network字样,但是有NIC,证明系统已经识别了无线网卡:
第二步:扫描附近的Wi-Fi网络,这是测试无线网卡射频功能是否正常的关键。需要使用 iwlist 或 nmcli 工具。
(找到自己的节点名,我一开始用ifconfig看以为是enx0826ea…,结果是上一次这是旧的、无效的接口名,看状态为"down"可以知道。输出如下,已经找到网络,证明无线网卡使用正常。)
# 先确保接口已UP
sudo ip link set enx0826ae302ae0 up
# 扫描
sudo iwlist enx0826ae302ae0 scan | grep ESSID
第三步:连接网络。
# 查看可用的Wi-Fi列表(更友好的方式)
nmcli device wifi list# 连接到你的Wi-Fi网络(将 MyWiFi 和 your_password 替换成你的实际名称和密码)
nmcli device wifi connect "MyWiFi" password "your_password"
用第一条命令命名能发现wifi,但是用第二条连接的时候却说没有找到ssid。需找到问题。看一下是不是被软屏蔽了。
# 检查无线接口的射频状态(是否被软屏蔽)
sudo rfkill list# 如果显示软屏蔽(soft blocked: yes),请解除屏蔽
sudo rfkill unblock wifi
可以看到确实是被软屏蔽了。
解决办法:
# 解除所有无线接口的软屏蔽
sudo rfkill unblock all
#再次检查
sudo rfkill list
所有的都变成no了
重新启用无线网口:
#重新启用无线网口:
sudo ip link set enxbcfd0c4f2669 up
#重新扫描:
nmcli device wifi list
新问题:找得到wifi,但是连不上。解决:重启wifi,重新up网卡sudo ip link set enxbcfd0c4f2669 up
又有一个问题:
尝试解决
从内核日志可以看出,驱动 rtl8821cu 成功识别了USB网卡,它最初创建了一个名为 wlan1 的标准无线网络接口。但是,系统随后强制将这个接口的名称从 wlan1 重命名(renamed) 为了 enxbcfd0c4f2669。
这是由 systemd 的 predictable network interface names(可预测的网络接口名称) 策略导致的。该系统策略旨在根据固件、拓扑和MAC地址为接口分配稳定的名称,以防止接口名(如 wlan0, wlan1)在每次启动时发生变化。它给无线设备命名的规则就是 wlx<MAC地址>,而有线设备是 enx<MAC地址>。
问题的核心是: 这个策略错误地将您的无线网卡识别并命名为了一个有线网卡的格式 (enx…),这导致 iw 等工具无法正确识别它为无线设备。
解决方案:禁用这个“可预测”的命名规则
我们需要告诉系统:“不要给这个特定的网卡重命名,就用驱动创建的名字(wlan1)”。
方法:创建链接文件(推荐,永久有效)
这是最正规的解决方法。我们创建一个 udev 规则来覆盖系统的默认重命名行为。
找出您网卡的MAC地址。从名称 enxbcfd0c4f2669 可以看出,它就是 bcfd0c4f2669(即 BC:FD:0C:4F:26:69)。
创建udev规则
sudo vim /etc/udev/rules.d/70-disable-rename-usb-wifi.rules
在文件中输入SUBSYSTEM==“net”, ACTION==“add”, ATTR{address}==“bcfd0c4f2669”, NAME=“wlan1”。
然后再输入下面命令。实测无效。
sudo udevadm control --reload-rules
sudo udevadm trigger
是不是网络安全协议的原因呢?今天是第二天,该问题仍未解决。