記錄移植無線網卡驅動遇到的各種問題:
從官網上下載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
是不是網絡安全協議的原因呢?今天是第二天,該問題仍未解決。