Linux wifi 驅動移植適配流程詳解

基礎內容概要

  1. 將tplink wn725n 無線網卡驅動移植到ubuntu
  2. 將tplink wn725n 無線網卡驅動移植到Linux開發板(交叉編譯)
  3. 將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

  1. 需要確認RTL8188EU是否已經ubuntu內核支持。如果默認支持,用戶可能需要禁用現有的驅動或者更換其他未被支持的硬件。
    要移植,當然是不支持
  2. 使用已適配新內核的驅動分支
    驅動代碼拉取:
    git clone https://github.com/aircrack-ng/rtl8188eus
    在這里插入圖片描述
    在這里插入圖片描述
    切換分支
    在這里插入圖片描述
  3. 驅動編譯
    在這里插入圖片描述
    編譯后的文件:
    在這里插入圖片描述
  4. cfg80211驅動加載:
    在這里插入圖片描述
  5. 無線驅動拷貝
    sudo cp 8188eu.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/
    解決依賴:
    sudo depmod -a
    驅動加載
    sudo modprobe 8188eu
  6. 查看驅動:
    在這里插入圖片描述
  7. 驅動日志(dmesg -w):
    在這里插入圖片描述
    成功加載

將驅動移植到樹莓派(交叉編譯+移植適配)

  1. 安裝交叉編譯工具鏈:
    sudo apt update
    sudo apt install gcc-arm-linux-gnueabihf git bc make
  2. 獲取樹莓派內核源碼下載與開發板當前內核匹配的源碼(確保版本一致):
    查看樹莓派內核版本
    我下載的版本:git clone --depth=1 --branch rpi-6.6.y https://github.com/raspberrypi/linux
  3. 配置交叉編譯環境(相當需要注意
    export ARCH=arm
    export CROSS_COMPILE=arm-linux-gnueabihf-
    export KSRC=~/Desktop/shumeipai_1/linux # 替換為內核源碼路徑
  4. 查看環境變量
    在這里插入圖片描述
  5. 內核源碼編譯
    make -j4
    在這里插入圖片描述
    生成內核默認配置:
    在這里插入圖片描述
    繼續編譯
    在這里插入圖片描述
    發現使用的默認內核問題比較多,然后使用了專門用于樹莓派的默認配置文件
    生成內核默認配置:make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2835_defconfig
    在這里插入圖片描述
    再編譯:make -j4
    在這里插入圖片描述
    內核源碼編譯成功
  6. 驅動編譯
    在這里插入圖片描述
    接上圖
    在這里插入圖片描述
    原因分析
    這個錯誤是由于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
    在這里插入圖片描述
    接上圖
    在這里插入圖片描述編譯成功
  7. 再次編譯驅動:make -j4
    在這里插入圖片描述
    接上圖
    在這里插入圖片描述
    編譯成功,驅動已生成(8188eu.ko)

我還適配了另外一套的驅動源碼(交叉編譯),篇幅太多,如果需要,可以留言或者私聊提供

驅動鏈接:
git clone https://github.com/aircrack-ng/rtl8188eus
在這里插入圖片描述
里面包含了按照內核源碼api接口修改驅動代碼

將tplink wn725n 無線網卡驅動移植到Linux開發板,在開發板中編譯

  1. 使用前面已經交叉編譯的代碼,拷貝到開發板(代碼基本上不會再適配了)

  2. 編譯(make -j4)
    在這里插入圖片描述
    成功編譯

  3. 拷貝8188.ko驅動到
    sudo cp 8188eu.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/

  4. 驅動加載與查看驅動加載情況
    在這里插入圖片描述
    驅動成功加載

  5. 內核日志打印
    在這里插入圖片描述

驅動功能驗證

暫無硬件設備,后期分享,謝謝您的耐心閱讀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76224.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Day14 動態規劃(3)

一.746. 使用最小花費爬樓梯 FS記憶化搜索優化: const int N 1010;class Solution { public:int mem[N];int dfs(vector<int>& cost, int x){if(mem[x]) return mem[x];int sum 0;if(x 0 || x 1) return 0;else{sum min(dfs(cost, x - 1) cost[x - 1], dfs(c…

解鎖AI潛能:模型上下文協議(MCP)的革新與應用

解鎖AI潛能:模型上下文協議(MCP)的革新與應用 在人工智能發展的當下,大語言模型(LLM)正逐步滲透到各個領域。從智能客服快速響應客戶咨詢,到智能編程助手協助開發者高效編寫代碼,LLM展現出強大的能力。然而,隨著應用的深入會面臨一個問題:模型與數據之間的連接困境。…

windows與ubuntu雙硬盤雙系統安裝及啟動(全流程成功)

&#x1f451;主頁&#xff1a;吾名招財 &#x1f453;簡介&#xff1a;工科學碩&#xff0c;研究方向機器視覺&#xff0c;愛好較廣泛… ?&#x1f4ab;簽名&#xff1a;面朝大海&#xff0c;春暖花開&#xff01; windows與ubuntu雙硬盤雙系統安裝及啟動&#xff08;全流程成…

【學習筆記】計算機網絡(六)

第6章應用層 文章目錄 第6章應用層6.1 域名系統DNS6.1.1 域名系統概述6.1.2 互聯網的域名結構6.1.3 域名服務器域名服務器的分區管理DNS 域名服務器的層次結構域名服務器的可靠性域名解析過程-兩種查詢方式DNS 高速緩存機制 6.2 文件傳送協議6.2.1 FTP 概述6.2.2 FTP 的基本工作…

Python擴展知識詳解:lambda函數

目錄 前言 1 基本知識點 語法 特點 代碼示例 2 常見使用場景 1. 與高階函數配合使用 2. 作為排序鍵來使用 3. 立即調用函數 4. 在字典中使用 3 高級用法&#xff08;進階版&#xff09; 1. 多參數lambda 2. 設置默認參數 3. 嵌套lambda 注意事項 何時…

Android: Fragment 的使用指南

Android 中 Fragment 的使用指南 Fragment 是 Android 應用開發中的重要組件&#xff0c;它代表 Activity 中的一部分 UI 或行為&#xff0c;可以組合多個 Fragment 在一個 Activity 中構建多窗格 UI&#xff0c;并在不同 Activity 中重復使用某個 Fragment。 基本概念 Frag…

Vue React

Vue 的源碼主要分為以下幾個部分&#xff1a; 主要涉及 響應式、虛擬 DOM、組件系統、編譯器、運行時。 ├── packages/ │ ├── compiler-core/ # 編譯器核心 │ ├── compiler-sfc/ # 處理 .vue 單文件組件 │ ├── compiler-dom/ # 處理 DOM 相關…

項目實戰--權限列表

后端數據&#xff1a; 用表格實現權限列表 const dataSource [{key: 1,name: 胡彥斌,age: 32,address: 西湖區湖底公園1號,},{key: 2,name: 胡彥祖,age: 42,address: 西湖區湖底公園1號,}, ];const columns [{title: 姓名,dataIndex: name,key: name,},{title: 年齡,dataInd…

私有知識庫 Coco AI 實戰(一):Linux 平臺部署

Coco AI 是一個完全開源、跨平臺的統一搜索和生產力工具&#xff0c;能夠連接各種數據源&#xff0c;包括應用程序、文件、Google Drive、Notion、Yuque、Hugo 等&#xff0c;幫助用戶快速智能地訪問他們的信息。通過集成 DeepSeek 等大型模型&#xff0c;Coco AI 實現了智能個…

【大模型】微調一個大模型需要多少 GPU 顯存?

視頻鏈接&#xff1a;微調一個模型需要多少GPU顯存&#xff1f; up 主頁&#xff1a;AI老兵tags&#xff1a; #GPU顯存 #模型微調 #LoRA #QLoRA #參數計算 本集視頻詳細介紹了在模型微調過程中 GPU顯存需求的計算方法&#xff0c;包括全量微調和高效微調&#xff08;如 LoRA&am…

Lambda 表達式是什么以及如何使用

目錄 &#x1f4cc; Kotlin 的 Lambda 表達式詳解 &#x1f3af; 什么是 Lambda 表達式&#xff1f; &#x1f525; 1. Lambda 表達式的基本語法 ? 示例 1&#xff1a;Lambda 基本寫法 ? 示例 2&#xff1a;使用 it 關鍵字&#xff08;單參數簡化&#xff09; ? 示例 3…

全文 MLIR TOY -- Chapter2: 發出基本的 MLIR——把AST變成SSA的 MLIR Dialect IR

現在我們已經熟悉 Toy 語言和它的AST表示&#xff0c;現在讓我們看看 MLIR 是怎樣幫助編譯 Toy 源程序的。 簡介&#xff1a;多層中間表示 其他的編譯器&#xff0c;像 LLVM&#xff0c;是提供一個固定的預定義類型和指令&#xff08;通常是底層的像 RISC的指令&#xff09;。對…

一個判斷A股交易狀態的python腳本

最近在做股票數據相關的項目&#xff0c;需要用到判斷某一天某個時刻A股的狀態&#xff0c;比如休市&#xff0c;收盤&#xff0c;交易中等&#xff0c;發動腦筋想了一下&#xff0c;這個其實還是比較簡單的&#xff0c;這里我把實現方法分享給大家。 思路 當天是否休市 對于某…

LLaMA Factory微調后的大模型在vLLM框架中對齊對話模版

LLaMA Factory微調后的大模型Chat對話效果&#xff0c;與該模型使用vLLM推理架構中的對話效果&#xff0c;可能會出現不一致的情況。 下圖是LLaMA Factory中的Chat的對話 下圖是vLLM中的對話效果。 模型回答不穩定&#xff1a;有一半是對的&#xff0c;有一半是無關的。 1、未…

004 健身房個性化訓練計劃——金丹期(體態改善)

個人筆記使用。 01 肱骨前移 1.放松肩前束 2.放松肩后束 2.5kg啞鈴側展 泡沫軸上下滾 招財貓 肱二頭 02 溜肩 寬距的坐姿劃船 上頂

【已開源】UniApp+vue3跨端應用從0到1開發指南、uniapp+vue3模板應用

在跨端開發日益成為主流的今天&#xff0c;如何高效構建規范、可維護的企業級應用&#xff1f;本文以UniAppVue3* *TypeScript**為核心技術棧&#xff0c;手把手帶你從零搭建高標準的跨平臺項目。 通過本文&#xff0c;你將系統掌握&#xff1a; ? 環境配置&#xff1a;Node…

線程池設計

線程池實際上也是一個生產者消費者模型&#xff0c;線程池可以讓多個線程去任務隊列中取任務&#xff0c;執行任務&#xff0c;適用于需要大量的線程來完成任務且完成任務的時間較短。 #include "log.hpp" #include <mutex> #include <condition_variable&…

黑盒測試的正交實驗法

背景: 利用因果圖法、判定表法可以幫助我們對于輸入數據的組合情況進行用例設計&#xff0c;但當輸入數據的組合數量巨大時&#xff0c;由于不太可能覆蓋到每個輸入組合的測試情況&#xff0c;因果圖法或判定表法可能就不太適用了&#xff0c;可以采用正交實驗法、來合理地減少…

Linux內核編程

linux 系 統 在 2 4 4 0 上 的 啟 動 過 程 分 三個 階 段 u-boot的啟動 1.先分清寄存器的分類 RAM的分類 ROM的分類 Mini2440開發板的存 儲器配置 Mini2440開發板板載: 1. 64MB sdram; 2. 256MB nand-flash; 3. 2MB nor-flash; 4. s3c2440內部還有4KB iram; Mini2440的啟…

黑盒測試的判定表法(能對多條件依賴關系進行設計測試點)

定義: 判定表是分析和表達多邏輯條件下執行不同操作的工具。就是指把所有的輸入條件、所有可能采取的動作按表格列出來&#xff0c;每一種條件和動作的組合構成一條規則&#xff0c;也即一條用例。 1.判定表法的引用 等價類邊界值分析法主要關注單個輸入類條件的測試并未考慮…