基礎內容概要
- 將tplink wn725n 無線網卡驅動移植到ubuntu
- 將tplink wn725n 無線網卡驅動移植到Linux開發板(交叉編譯)
- 將tplink wn725n 無線網卡驅動移植到Linux開發板,在開發板中編譯
為什么還要包涵交叉編譯?
- 目標設備是ARM架構的,而開發者的開發機通常是x86的
- 資源限制也是一個因素,嵌入式設備通常資源有限,處理能力、內存和存儲空間都不如開發機,因此需要在更強大的開發機上進行交叉編譯,節省時間和資源
為什么還要分為兩個任務進行移植?
- 對比原cpu架構與跨cpu架構移植等區別
我為什么選擇了rtl8188eu,沒有選擇cu?
基礎概念明確(重要)
- 常見的硬件架構,比如x86、ARM、MIPS、RISC-V等
- 交叉編譯的核心是在一種平臺上生成另一種平臺的可執行代碼
差異可能來自兩方面:
跨架構:開發機與目標機的CPU架構不同(如x86 → ARM)。
跨操作系統:開發機與目標機的操作系統不同(如Linux → Windows)。 - 交叉編譯的典型場景
僅跨架構
示例:在x86 Linux電腦上編譯ARM Linux程序
工具鏈:arm-linux-gnueabi-gcc(針對ARM架構的Linux編譯器)
關鍵點:架構不同,但操作系統相同(均為Linux),需處理指令集和ABI差異
僅跨操作系統
示例:在Linux上編譯Windows程序
工具鏈:x86_64-w64-mingw32-gcc
關鍵點:架構相同(均為x86),但操作系統不同,需適配系統調用和庫
跨架構且跨操作系統
示例:在x86 macOS上編譯ARM Android程序
工具鏈:Android NDK中的aarch64-linux-android-gcc
關鍵點:需同時處理ARM指令集和Android系統庫
詳細點說,我們現在的交叉編譯移植的是跨架構的驅動移植
正文
將驅動移植到Ubuntu
- 需要確認RTL8188EU是否已經ubuntu內核支持。如果默認支持,用戶可能需要禁用現有的驅動或者更換其他未被支持的硬件。
要移植,當然是不支持 - 使用已適配新內核的驅動分支
驅動代碼拉取:
git clone https://github.com/aircrack-ng/rtl8188eus
切換分支
- 驅動編譯
編譯后的文件:
- cfg80211驅動加載:
- 無線驅動拷貝
sudo cp 8188eu.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/
解決依賴:
sudo depmod -a
驅動加載
sudo modprobe 8188eu - 查看驅動:
- 驅動日志(dmesg -w):
成功加載
將驅動移植到樹莓派(交叉編譯+移植適配)
- 安裝交叉編譯工具鏈:
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf git bc make - 獲取樹莓派內核源碼下載與開發板當前內核匹配的源碼(確保版本一致):
查看樹莓派內核版本
我下載的版本:git clone --depth=1 --branch rpi-6.6.y https://github.com/raspberrypi/linux - 配置交叉編譯環境(相當需要注意)
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export KSRC=~/Desktop/shumeipai_1/linux # 替換為內核源碼路徑 - 查看環境變量
- 內核源碼編譯
make -j4
生成內核默認配置:
繼續編譯
發現使用的默認內核問題比較多,然后使用了專門用于樹莓派的默認配置文件
生成內核默認配置:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2835_defconfig
再編譯:make -j4
內核源碼編譯成功 - 驅動編譯
接上圖
原因分析
這個錯誤是由于RTL8188EU 無線網卡驅動與當前內核版本不兼容導致的
解決思路
struct net_device 和 struct iw_handler_def 在內核的新版本中已經發生了變化,移除了 wireless_handlers、private、private_args 字段,導致驅動編譯失敗。
解決方案
直接注釋掉這些函數調用(這是所有的報錯修改,錯誤還是比較少的)
全部修改
繼續編譯:
原因分析
這個錯誤表明 modpost 階段發現 iwe_stream_add_event、wireless_send_event 和 iwe_stream_add_point 等符號未定義,說明 RTL8188EU 驅動依賴的無線網絡接口(Wireless Extensions)在內核中不存在
解決思路
在 menuconfig 中 啟用 Wireless Extensions
解決步驟
但是我并沒有在menuconfig中找到Wireless Extensions,但是在搜索中找到了
我發現,CONFIG_WIRELESS_EXT 未被任何驅動選中(所有 Selected by 項都是 [=n]),導致它默認關閉且無法在 menuconfig 中直接啟用
所以我們可以隨便開啟一個驅動,我開啟了hostap,以啟用Wireless Extensions:
再次查看menuconfig
退出保存,再次編譯內核源碼:make -j4
接上圖
編譯成功
- 再次編譯驅動:make -j4
接上圖
編譯成功,驅動已生成(8188eu.ko)
我還適配了另外一套的驅動源碼(交叉編譯),篇幅太多,如果需要,可以留言或者私聊提供
驅動鏈接:
git clone https://github.com/aircrack-ng/rtl8188eus
里面包含了按照內核源碼api接口修改驅動代碼
將tplink wn725n 無線網卡驅動移植到Linux開發板,在開發板中編譯
-
使用前面已經交叉編譯的代碼,拷貝到開發板(代碼基本上不會再適配了)
-
編譯(make -j4)
成功編譯 -
拷貝8188.ko驅動到
sudo cp 8188eu.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/ -
驅動加載與查看驅動加載情況
驅動成功加載 -
內核日志打印
驅動功能驗證
暫無硬件設備,后期分享,謝謝您的耐心閱讀