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.mzph.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.判定表法的引用 等价类边界值分析法主要关注单个输入类条件的测试并未考虑…