Linux驱动开发|WiFi驱动

article/2025/10/13 0:00:33

WiFi驱动

一、WiFi驱动添加与编译

I.MX6U-ALPHA 开发板目前支持两种接口的 WIFI:USB 和 SDIO,其中 USB WIFI 使用的芯片为 RTL8188EUS 或 RTL8188CUS, SDIO 接口的 WIFI 使用的芯片为 RTL8189FS。这两个都是 realtek 公司出品的 WIFI 芯片。 realtek 公司已经提供了 WIFI 驱动源码,因此只需要将 WIFI 驱动源码添加 到 Linux 内核中,然后通过图形化界面配置,将其编译成模块即可

1.1 向内核添加 WIFI 驱动
  • rtl81xx 驱动文件: realtek 公司提供驱动文件 realtek 目录下存放着 RTL8188EUS 和 RTL8189FS 两个芯片的驱动源码
    在这里插入图片描述

Kconfig 是 WIFI 驱动的配置界面文档,这样可以通过 Linux 内核图形化配置界面来选择是否编译 WIFI 驱动, 文件内容如下所示

menuconfig REALTEK_WIFItristate "Realtek wifi"if REALTEK_WIFIchoiceprompt "select wifi type"default RTL8189FSconfig RTL8189FSdepends on REALTEK_WIFItristate "rtl8189fs/ftv sdio wifi"config RTL8188EUSdepends on REALTEK_WIFItristate "rtl8188eus usb wifi"config RTL8192CUdepends on REALTEK_WIFItristate "Realtek 8192C USB WiFi"endchoice
endif

Makefile 文件内容如下所示

obj-$(CONFIG_RTL8188EUS) += rtl8188EUS/
obj-$(CONFIG_RTL8189FS) += rtl8189FS/
obj-$(CONFIG_RTL8192CU) += rtl8192CU/
  • 删除内核自带的 RTL8192CU 驱动:内核自带了 RTL8192CU/8188CUS 驱动,但是测试后发现自带的驱动不稳定,因此将其屏蔽

打开 drivers/net/wireless/rtlwifi/Kconfig,找到下面所示内容然后删除掉:

config RTL8192CU
tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter"
depends on USB
select RTLWIFI
select RTLWIFI_USB
select RTL8192C_COMMON
---help---
This is the driver for Realtek RTL8192CU/RTL8188CU 802.11n USB
wireless network adapters.If you choose to build it as a module, it will be called rtl8192cu

打开 drivers/net/wireless/rtlwifi/Makefile,找到下面所示内容然后删除掉:

obj-$(CONFIG_RTL8192CU) += rtl8192cu/
  • 将 rtl81xx 驱动添加到 Linux 内核中:将 realtek 整个目录拷贝至内核源码中的 drivers/net/wireless 目录下
  • 修改 drivers/net/wireless/Kconfig:打开 Kconfig 文件,在末尾加入下面内容
source "drivers/net/wireless/realtek/Kconfig
  • 修改 drivers/net/wireless/Makefile:打开 Makefile 文件,在末尾加入下面内容
obj-y += realtek/
1.2 配置内核

在编译 RTL8188 和 RTL8189 驱动之前需要先配置 Linux 内核

  • 配置 USB 支持设备
-> Device Drivers-> <*> USB support-> <*> Support for Host-side USB-> <*> EHCI HCD (USB 2.0) support-> <*> OHCI HCD (USB 1.1) support-> <*> ChipIdea Highspeed Dual Role Controller-> [*] ChipIdea device controller-> [*] ChipIdea host controller
  • 配置支持 WIFI 设备
-> Device Drivers-> [*] Network device support-> [*] Wireless LAN-> <*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)-> [*] Support downloading firmware images with Host AP driver-> [*] Support for non-volatile firmware download
  • 配置支持 IEEE 802.11
-> Networking support-> -*- Wireless-> [*] cfg80211 wireless extensions compatibility-> <*> Generic IEEE 802.11 Networking Stack (mac80211)

配置好以后重新编译 Linux 内核,之后使用新的 zImage 启动系统

1.3 编译WiFi驱动
  • 执行make menuconfig命令,打开 Linux 内核配置界面,然后按照如下路径选择将 rtl81xx 驱动编译为模块:
-> Device Drivers-> Network device support (NETDEVICES [=y])-> Wireless LAN (WLAN [=y])-> Realtek wifi (REALTEK_WIFI [=m])-> rtl8189ftv sdio wifi-> rtl8188eus usb wifi-> Realtek 8192C USB WiFi

在这里插入图片描述

  • 执行make modules -j12命令,将上面选中的选项编译为模块
  • 编译完成后,rtl8188EUS、 rtl8189FS 和 rtl8192CU 文件夹下分别生成 8188eu.ko、8189fs.ko 和 8192cu.ko 三个.ko 文件,将这三个文件拷贝至开发板/lib/modules/4.1.15 目录下
1.4 驱动加载测试

将 RTL8188 WIFI 模块插到开发板的 USB HOST 接口上。进入到目录 lib/modules/4.1.15 中,输入如下命令加载驱动模块

depmod 				//第一次加载驱动的时候需要运行此命令
modprobe 8188eu.ko 	//RTL8188EUS 模块加载 8188eu.ko 模块
modprobe 8192cu.ko 	//RTL8188CUS 模块加载 8192cu.ko 模块

驱动加载成功,如下图所示:
在这里插入图片描述
输入“ifconfig -a”命令,查看 wlanX(X=0….n)网卡是否存在
在这里插入图片描述

二、wireless tools工具

驱动测试正常,但是 WiFi 要想联网,需要移植一些其他第三方组件,否则无法连接路由器,接下来我们就移植这些第三方组件

wireless tools 是操作 WIFI 的工具集合,包括以下工具:
①、 iwconfig:设置无线网络相关参数
②、 iwlist:扫描当前无线网络信息,获取 WIFI 热点
③、 iwspy:获取每个节点链接的质量
④、 iwpriv:操作 WirelessExtensions 特定驱动
⑤、 ifrename:基于各种静态标准命名接口

  • 将 iwlist_for_visteon-master.tar.bz2 源码拷贝到 Ubuntu 中创建的 tool 目录下
  • 解压后,进入该文件夹
tar -vxjf iwlist_for_visteon-master.tar.bz2
cd iwlist_for_visteon-master
  • 修改 Makefile 中的 CC、 AR 和 RANLIB 这三个变量

在这里插入图片描述

  • 修改完成以后使用如下命令编译
make clean 	//先清理一下工程
make 		//编译
  • 编译完成后会在当前目录下生成 iwlist、 iwconfig、 iwspy、 iwpriv、 ifrename 这 5 个工
    具,以及 libiw.so.29 库文件。将这 5 个工具拷贝到开发板根文件系统下的 /usr/bin 目录中,将 libiw.so.29 库文件拷贝到开发板根文件系统下的 /usr/lib 目录中,命令如下:
sudo cp iwlist iwconfig iwspy iwpriv ifrename /home/andyxi/linux/nfs/rootfs/usr/bin/ -f
sudo cp libiw.so.29 /home/andyxi/linux/nfs/rootfs/usr/lib/ -f
  • wireless tools 工具测试

输入 iwlist 命令,如果输出下图所示信息就表明 iwlist 工作正常

在这里插入图片描述

加载 RTL8188 驱动模块 8188eu.ko,驱动加载成功以后在打开 wlan0 网卡

modprobe 8188eu.ko 	//加载 RTL8188 驱动模块
ifconfig wlan0 up 	//打开 wlan0 网卡

wlan0 网卡打开后就可以使用 iwlist 命令查找当前环境下的 WIFI 热点信息,即无线路由器

iwlist wlan0 scan

要想连接到指定的 WIFI 热点上就需要用到 wpa_supplicant 工具,下面介绍如何移植此工具

三、wpa_supplicant工具

3.1 openssl 移植

wpa_supplicant 依赖于 openssl,因此需要先移植 openssl

在 tool 目录下新建 “openssl” 文件夹,用于存放 openssl 的编译结果

mkdir /home/andyxi/linux/tool/openssl

将 openssl 源码拷贝到 Ubuntu 中创建的 tool 目录下,然后将其解压

tar -vxzf openssl-1.1.1d.tar.gz

进入到解压出来的 openssl-1.1.1d 目录中,进行配置、编译和安装

./Configure linux-armv4 shared no-asm 
--prefix=/home/andyxi/linux/tool/openssl
CROSS_COMPILE=arm-linux-gnueabihf-	//配置成功后,会生成Makefile
make			//编译
make install	//安装

安装完成后,openssl 目录下会生成 lib 等5个文件夹,将 lib 目录下的 libcrypto 和 libssl 库拷贝到开发板根文件系统中的 /usr/lib 目录下

sudo cp libcrypto.so* /home/andyxi/linux/nfs/rootfs/lib/ -af
sudo cp libssl.so* /home/andyxi/linux/nfs/rootfs/lib/ -af
3.2 libnl 库移植

wpa_supplicant 也依赖于 libnl,因此还需要移植一下 libnl 库

编译 libnl 之前先安装 biosn 和 flex,命令如下:

sudo apt-get install bison
sudo apt-get install flex

在 tool 目录下新建 “libnl” 文件夹,用于存放 libnl 的编译结果

mkdir /home/andyxi/linux/tool/libnl

将 libnl 源码拷贝到 Ubuntu 中创建的 tool 目录下,然后将其解压

tar -vxzf libnl-3.2.23.tar.gz

进入到解压出来的 libnl-3.2.23 目录中,进行配置、编译和安装

./configure --host=arm-linux-gnueabihf 
--prefix=/home/andyxi/linux/tool/libnl/		//配置
make -j12		//编译
make install	//安装

安装完成后,libnl 目录下会生成 lib 等5个文件夹,将 lib 目录下的所有文件拷贝到开发板根文件系统中的 /usr/lib 目录下

sudo cp lib/* /home/andyxi/linux/nfs/rootfs/usr/lib/ -rf
3.3 wpa_supplicant 移植

将 wpa_supplicant 源码拷贝到 Ubuntu 中创建的 tool 目录下,然后将其解压

tar -vxzf wpa_supplicant-2.7.tar.gz

进入到解压出来的 wpa_supplicant-2.7 目录中,再进入wpa_supplicant 目录下,然后进行配置: 将 defconfig 文件拷贝一份并重命名为.config

cd wpa_supplicant/
cp defconfig .config

打开.config 文件,在里面指定交叉编译器、 openssl、 libnl 库和头文件路径,添加如下内容:

CC = arm-linux-gnueabihf-gcc#openssl 库和头文件路径
CFLAGS += -I/home/andyxi/linux/tool/openssl/include
LIBS += -L/home/andyxi/linux/tool/openssl/lib -lssl -lcrypto#libnl 库和头文件路径
CFLAGS += -I/home/andyxi/linux/tool/libnl/include/libnl3
LIBS += -L/home/andyxi/linux/tool/libnl/lib

在这里插入图片描述

.config 文件配置好以后就可以编译 wpa_supplicant 了

export PKG_CONFIG_PATH=/home/andyxi/linux/tool/libnl/lib/pkgconfig:$PKG_CONFIG_PATH 
//指定 libnl 库 pkgconfig 包位置
make -j12 //编译

编译完成以后就会在本目录下生成 wpa_supplicant 和 wpa_cli 这两个软件,将这两个软件拷贝至开发板根文件系统的 /usr/bin 目录中

sudo cp wpa_cli wpa_supplicant /home/andyxi/linux/nfs/rootfs/usr/bin/ -f

重启开发板,输入“wpa_supplicant -v” 命令查看版本号,正常的话就会打印出版本号

四、WiFi联网测试

联网步骤如下:

– 插上 WiFi 模块,如板子已经集成就忽略该步
– 加载 RTL8188 驱动模块
– 使用 ifconfig 命令打开对应的无线网卡,比如 wlan0 或 wlan1……
– 无线网卡打开以后使用 iwlist 命令扫描一下当前环境下的 WiFi 热点
– 使用 wpa_supplicant 将 WIFI 连接到指定的热点上,实现联网功能

  • 扫描到 WIFI 热点后就可以连接了,在开发板根文件系统的/etc 目录下创建一个名为“wpa_supplicant.conf”的配置文件,此文件用于配置要连接的 WiFi 热点以及秘密
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={ssid="xxxx"		//要连接的WIFI热点名字psk="xxxxxxxx"	//要连接的WIFI热点密码
}
//注意:wpa_supplicant.conf 文件对于格式要求比较严格
//“=”前后一定不能有空格,不可以用TAB键来缩进
//ssid和psk行的缩进要采用空格,而不是TAB建
  • 在开发板根文件系统下创建一个 “/var/run/wpa_supplicant” 目录
mkdir /var/run/wpa_supplicant -p
  • 输入以下命令,让 RTL8188 USB WIFI 连接到热点上
wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &
  • 连接上 WIFI 热点后会输出如下图所示的信息
    在这里插入图片描述
  • 设置 wlan0 的 IP 地址,使用 udhcpc 命令从路由器申请 IP 地址,IP 地址获取成功以后会输出如下图所示的信息
udhcpc -i wlan0 	//从路由器获取 IP 地址

在这里插入图片描述

  • 可以使用 ifconfig wlan0 命令查看一下 wlan0 网卡的详细信息
  • 最后通过 ping 命令来测试USB WIFI 是否工作正常
ping -I 192.168.1.126 www.baidu.com
//-I 是指定执行ping操作的网卡IP地址

http://chatgpt.dhexx.cn/article/mUxJLcyQ.shtml

相关文章

驱动开发:配置Visual Studio驱动开发环境

在正式开始驱动开发之前&#xff0c;需要自行搭建驱动开发的必要环境&#xff0c;首先我们需要安装Visual Studio 2013这款功能强大的程序开发工具&#xff0c;在课件内请双击ISO文件并运行内部的vs_ultimate.exe安装包&#xff0c;Visual Studio的安装非常的简单&#xff0c;您…

DDD领域驱动开发

文章目录 DDD&#xff08;Domain Driving Design&#xff09;领域驱动开发1、微服务设计为什么选择DDD1、架构对比2、微服务的问题3、战略设计&#xff08;业务层面-业务架构&#xff09;4、战术设计&#xff08;技术层面-系统架构&#xff09;&#xff1a;5、DDD和微服务 2、领…

Linux驱动开发|USB驱动

USB驱动 USB接口很复杂&#xff0c;不同的设备器协议也不同&#xff0c;因此本文仅介绍如何使能Linux内核自带的USB驱动&#xff0c;不涉及USB驱动开发 一、USB接口简介 1.1 USB介绍 USB&#xff08;Universal Serial Bus&#xff09;&#xff0c;即通用串行总线。由英特尔…

window10+vs2022配置window驱动开发环境

测试模式 开发的驱动程序没有官方数字签名&#xff0c;只能在测试模式下加载。 命令行键入以下命令&#xff0c;重启电脑后桌面右下角出现测试模式字样&#xff0c;说明进入了测试模式 bcdedit /set testsigning on 命令行键入以下命令&#xff0c;重启电脑后桌面右下角没有了测…

win10驱动开发——驱动签名

win1803开始直接禁用驱动强制签名的方式不行了 1.设置环境 bcdedit -set NOINTEGRITYCHECKS ON bcdedit -set TESTSIGNING ON bcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS2.配置环境变量 找到makecert.exe文件位置如【C:\Program Files (x86)\Windows Kits\10\bin\1…

Windows 10 驱动开发 及 驱动签名

记录下在公司开发驱动的一些注意事项, 驱动当前仅针对win10x64. 常识: 最早的驱动开发sdk是 ntddk, 类似于用户层的win32 api, 后面为了增加对pnp(Plug-and-Play, 即插即用)的支持, 迭代为 wdm. 后面因为wdm开发过于繁琐, 微软发布了 WDF 框架, 类似于 用户层的 …

Linux——驱动开发

一、驱动开发概述 1.1 驱动形式 驱动代码的形式一般可分为build-in和module两种形式&#xff0c;build-in是在编译linux同时将pcie的驱动代码编译到内核中&#xff0c;启动的时候就载入该驱动代码&#xff1b;module是在linux启动完成后通过终端输入命令insmod/remod进行载入…

Windows 驱动开发 新手入门(一)

Windows 驱动开发 新手入门&#xff08;一&#xff09; 引言驱动介绍Win10 WDK 建立一个驱动项目建立MyDriver.cpp理论知识驱动入口派遣函数 MajorFunctionDevice和SymbolicLinkDeviceExtensionIRP 引言 首先祝朋友们新年快乐&#xff0c;然后呢&#xff0c;因为无聊&#xff…

驱动开发学习

驱动 1、驱动开发环境 完成系统移植的三步&#xff1a;u-boot启动引导程序、内核镜像、文件系统&#xff0c;u-boot启动引导程序最好固化到开发板上&#xff0c;内核镜像通过tftp服务从ubuntu下载&#xff0c;文件系统通过nfs服务从ubuntu共享到开发板&#xff0c;开发板启动…

Linux设备驱动开发详解

Linux设备驱动开发详解 Linux设备驱动开发详解Linux设备驱动开发Linux设备驱动开发详解1. linux设备驱动概述及开发环境搭建2. 驱动设计的硬件基础3. linux内核及内核编程4. linux内核模块5. linux文件系统与设备文件6. 字符设备驱动7. linux设备驱动中的并发控制8. linux设备驱…

QT部件基类——QWidget与QDialog

一、默认基类 QT提供的默认部件基类包括QMainWindow、QWidget、和QDialog这三种&#xff0c;这三个部件基类也是用的最多的。 QWidget类是所有部件对象的基类&#xff0c;被称为基础窗口部件&#xff0c;继承关系详看QWidget类关系图。QWidget提供自我绘制和处理用户输入等基本…

qt 中 qwidget 嵌入 qml

以上是效果图&#xff0c; 整个窗口是 qml 窗口 核心代码 #ifndef WIDGETANCHOR_H #define WIDGETANCHOR_H#include <QObject> #include <QQuickItem> #include <QWidget> #include <QQmlApplicationEngine> #include <QQmlContext>class WgtAn…

QWidget尺寸限定

1、控件只能在最小和最大之间进行调整&#xff0c;不能超过范围。 ①直接宽高同时设置 window.setMinimumSize(200, 200)&#xff1b; window.setMaximumSize(500, 500) app QApplication(sys.argv)window QWidget()window.setWindowTitle("最小最大窗口")windo…

QWidget居中显示

须知 以下函数只要继承QWidget都可以使用.例如 QDialog, QPushButton( -v- 一个居中的”引爆按钮”)关于坐标问题: qt窗口坐标原点是在”左上角”的. 如图, (x2, y2)是我窗口的分辨率的一半无论目前我的窗口在什么位置,我只要把窗口原点设置为(x1, y1)就行了.所以目前我要获得…

QWidget事件消息

1、用户操作界面时会产生特定的事件消息。 API&#xff1a;显示和关闭事件、移动事件、调整大小、鼠标事件、键盘事件、焦点事件、拖拽事件、绘制事件、改变事件、右键菜单、输入法。 应用场景&#xff1a;当一个控件被触发了一个特定的行为时&#xff0c;就会调用特定的方法…

QWidget的isHidden和isVisible

文章目录 问题的出现QWidget的show()函数QWidget的isVisible和isHidden源码追溯 QWidget的isHidden和isVisible 问题的出现 最近在写代码的时候&#xff0c;出现了一个问题&#xff0c;我新建了两个类&#xff0c;分别是Chapter2和ConsecutiveCurtain // ConsecutiveCurta…

QWidget鼠标操作

1、设置鼠标形状&#xff1a;鼠标放置在不同控件上&#xff08;有不同功能时&#xff09;鼠标的形状是不一样的。 鼠标跟踪&#xff1a;鼠标在某一个控件上移动&#xff0c;则会向对应的控件对象发送一个消息&#xff0c;去调用具体的某一个方法&#xff0c;可以在方法里面监听…

QWidget旋转方法

参考链接&#xff1a;https://stackoverflow.com/questions/43388464/rotate-whole-qwidget-by-angle 说明&#xff1a; 本文实现方法本质是使用QGraphics三件套&#xff0c;即View、Scene、Item&#xff0c;将QWidget控件作为Item显示&#xff0c;从而实现角度控制的目的&…

QWidget设置背景图及圆角

在Qt开发过程中&#xff0c;QWidget是经常作为主窗体的父窗口&#xff0c;有时我们需要对主窗口设置背景&#xff0c;设置圆角以达到美观的效果&#xff0c;通常的有以下三种方法&#xff1a;qss, QPalette设置以及paintEvent绘制。下面介绍这三种方法。 背景设置介绍 方法一&a…

QWidget之adjustSize

from PyQt5.Qt import * import sys# 创建一个应用程序对象 app QApplication(sys.argv)window QWidget()label QLabel(window) label.setText(学无止境) label.move(100, 100) label.setStyleSheet(background-color:gray)def changeCao():tmp label.text()学无止境label.…