首页 > 系统相关 >Linux下WIFI驱动使用

Linux下WIFI驱动使用

时间:2024-07-12 16:10:06浏览次数:15  
标签:Kconfig supplicant libnl WIFI wireless Linux 驱动 wpa

1 WIFI驱动编译初体验

一般WIFI有2种接口:USB 和 SDIO。例如USB WIFI 使用的芯片为RTL8188EUS或 RTL8188CUS,SDIO 接口的WIFI 使用芯片为 RTL8189FS,如下图:

image

image

RTL8189和RTL8188都是realtek 公司出品的 WIFI 芯片,WIFI芯片原厂一般会整包提供。

1.1 向 Linux 内核添加 WIFI 驱动

realtek提供的RTL81xxx驱动软件包如下:

image

打开Kconfig:

image

打开Makefile:

obj-$(CONFIG_RTL8188EUS) += rtl8188EUS/
obj-$(CONFIG_RTL8189FS) += rtl8189FS/
obj-$(CONFIG_RTL8192CU) += rtl8192CU/

1.1.1 linux内核自带的realtek WIFI驱动

cd linux/drivers/net/wireless; ls内容如下:可以看到很多的厂家wifi。

image

打开Kconfig菜单如下:

image

image

输入help打印如下:可以看到和Kconfig描述配置一致。

image

Kconfig中有一行:source drivers/net/wireless/rtlwifi/Kconfig

因此继续打开rtlwifi/Kconfig:

image

对应linux内核自带的realtek wifi驱动菜单如下:

image

1.1.2 修改realtek驱动编译

首先删除``drivers/net/wireless/Kconfig中的source drivers/net/wireless/rtlwifi/Kconfig这一行,同时删除drivers/net/wireless/rtlwifi`整个目录。

然后添加realtek提供的驱动软件包到drivers/net/wireless/目录下。打开rtlwifi/Kconfig,添加:

source drivers/net/wireless/realtek/Kconfig这一行。

#
# Wireless LAN device configuration
#
menuconfig WLAN
......
source "drivers/net/wireless/rsi/Kconfig"
source "drivers/net/wireless/realtek/Kconfig"
endif # WLAN

打开 drivers/net/wireless/Makefile:

......
obj-y += realtek/

1.1.3 使能WIFI依赖项

在编译 RTL8188 和 RTL8189 驱动之前需要先配置 Linux 内核,使能依赖项。

1.1.3.1 配置 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

1.1.3.2 配置支持 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

image

1.1.3.3 配置支持 IEEE 802.11

-> Networking support
	-> -*- Wireless
        -> [*] cfg80211 wireless extensions compatibility
        -> <*> Generic IEEE 802.11 Networking Stack (mac80211)

image

1.1.4 编译realtek WIFI驱动

添加realtek提供的驱动软件包后,输入make munuconfig,将3颗WIFI都编译成模块。

image

make modules -j12 //编译驱动模块

image

2 WIFI驱动测试

2.1 RTL8188 USB WIFI

插好usb wifi到USB host插槽。输入:

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

image

image

2.2 RTL8189 SDIO WIFI

注意一般sd卡是spi或者sdio接口与主机通信,那么这里RTL8189 和sd卡由于复用的同一组sdio,因此测试RTL8189需要拔出sd卡。SDIO WIFI 接口原 理图如下:

image

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

image

2.3 wireless tools

2.3.1 下载地址

https://hewlettpackard.github.io/wireless-tools/Tools.html

2.3.2 wireless tools 移植

wireless tools 是操作 WIFI 的工具集合,包括一下工具:

1. iwconfig:设置无线网络相关参数。
2. iwlist:扫描当前无线网络信息,获取 WIFI 热点。 
3. iwspy:获取每个节点链接的质量。 
4. iwpriv:操作 WirelessExtensions 特定驱动。 
5. ifrename:基于各种静态标准命名接口。

前面2个工具比较常用,拿到下载的工具包,我是用的wireless_tools.28.tar.gz.解压后修改Makfile工具链:

image

image

CROSS_COMPILE = arm-linux-gnueabihf-
CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)ar
RANLIB = $(CROSS_COMPILE)ranlib
make clean //先清理一下工程
make //编译

image

编译完成以后就会在当前目录下生成iwlist、iwconfig、iwspy、iwpriv、ifrename这 5 个工具,另外还有很重要的libiw.so.29这个库文件。将这 5 个工具拷贝到开发板根文件系统下的/usr/bin 目录中,将 libiw.so.29 这个库文件拷贝到开发板根文件系统下的/usr/lib 目录中。

2.3.3 wireless tools 测试

2.3.3.1 lwlist使用

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

image

iwlist wlan0 scan, 用来扫描搜索当前环境下的所有 WIFI 热点,然后将这些热点的信息信息答应出来, 包括 MAC 地址、ESSID(WIFI 名字)、频率、速率,信号质量。例如扫描到“ZZK”这个热点。

image

image

想连接到指定的 WIFI 热点上就需要用到 wpa_supplicant 工具。

2.4 wpa_supplicant

2.4.1 下载地址

https://www.linuxfromscratch.org/blfs/view/8.4-systemd/basicnet/wpa_supplicant.html

https://w1.fi/releases/

2.4.2 wpa_supplicant移植

2.4.2.1 openssl 移植

wpa_supplicant 依赖于 openssl。

https://www.openssl.org/source/

我下载的是openssl-1.1.1d.tar.gz

./Configure linux-armv4 shared no-asm --prefix=/media/cvitek/robin.lee/my_test/study/openedv/wpa_supplicant/openssl/ CROSS_COMPILE=arm-linux-gnueabihf-
make
make install

#“openssl-1.1.1比较老旧,linux-armv4”表示 32 位 ARM 凭条,并没有“linux-armv7”这个选项
cp 

make install后编译出的openssl文件很多, 我们将lib下的libcrypto 和 libssl 库拷贝到开发板中去即可。

image

image

2.4.2.2 libnl 库移植

wpa_supplicant 依赖于 libnl

编译libnl之前先安装 biosn 和 flex

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

https://www.infradead.org/~tgr/libnl/files/

我使用的版本为libnl-3.2.23.tar.gz。--prefix 用于指定编 译结果存放目录。--host 用于指定交叉编译器的前缀。

./configure --host=arm-linux-gnueabihf --prefix=/media/cvitek/robin.lee/my_test/study/openedv/wpa_supplicant/libnl/
make -j12
make install

image

libnl编译出的lib下的所有文件拷贝到开发板。

2.4.2.4 wpa_supplicant移植

tar xf wpa_supplicant-2.7.tar.gz
cd wpa_supplicant-2.7/wpa_supplicant/
cp defconfig .config  #wpa_supplicant 的配置比较特殊,需要将 wpa_supplicant 下的 defconfig 文件拷贝一份并重命名为.config

makefile会引用.config中的配置,Makefile引用.config如下:

image

修改.config, 添加下面几行,用来配置makefile,配置了wpa_supplicant要使用的库和头文件路径。

CC = arm-linux-gnueabihf-gcc
CFLAGS += -I/media/cvitek/robin.lee/my_test/study/openedv/wpa_supplicant/openssl/include
LIBS += -L/media/cvitek/robin.lee/my_test/study/openedv/wpa_supplicant/openssl/lib -lssl -lcrypto

CFLAGS += -I/media/cvitek/robin.lee/my_test/study/openedv/wpa_supplicant/libnl/include/libnl3
LIBS += -L/media/cvitek/robin.lee/my_test/study/openedv/wpa_supplicant/libnl/lib

编译 wpa_supplicant:编译前要export PKG_CONFIG_PATH, 指定 libnl 库pkgconfig包位置。

export PKG_CONFIG_PATH=/media/cvitek/robin.lee/my_test/study/openedv/wpa_supplicant/libnl/lib/pkgconfig:$PKG_CONFIG_PATH
make -j12

image

编译 wpa_supplicant 的时候是需要指定libnlpkgconfig 路径,否则会提示“libnl-3.0”或 者“libnl-3.0.pc”找不到等错误。

编译完后的软件如下:

image

拷贝到开发板看能否执行:

image

2.4.3 wpa_supplicant联网测试

2.4.3.1 RTL8188 USB WIFI 联网测试

modprobe 8188eu.ko //RTL8188EUS 模块加载 8188eu.ko 模块
  1. iwlist 扫描到SSID热点:
    image

  2. 添加/etc/wpa_supplicant.conf

    ctrl_interface=/var/run/wpa_supplicant
    ap_scan=1
    network={
      ssid="ZZK" //热点名字
      psk="xxxxxxxx" //热点密码
    }
    

    注意:wpa_supplicant.conf 文件对于格式要求比较严格,“=”前后一定不能有空格,也不要 用 TAB 键来缩进.

    然后创建/var/run/wpa_supplicant目录,因为wpa_supplicant要使用这个目录。

    mkdir /var/run/wpa_supplicant -p
    
  3. 运行

wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &

运行后就可以看到下面连接成功的打印了。
image

  1. 设置 wlan0 的 IP 地址

    udhcpc -i wlan0 //从路由器获取 IP 地址, or ifconfig 静态设置ip
    

image

image

假如我们的主机服务器和wlan0一个网段,就可以进行网络通信了。假如该网段路由有接外网可以ping一下百度如下:

image

2.4.3.2 RTL8189 SDIO WIFI 联网测试

这里sdio wifi上网流程和上一节一样。需要注意启动运行wpa_supplicant 要用”-Dnl80211”选项。

wpa_supplicant -Dnl80211 -c /etc/wpa_supplicant.conf -i wlan0 &

标签:Kconfig,supplicant,libnl,WIFI,wireless,Linux,驱动,wpa
From: https://www.cnblogs.com/fuzidage/p/18298571

相关文章

  • 环境部署之在 Linux 服务器上搭建和部署 Python 环境
    背景说明在企业工作中,自动化测试框架落地肯定会集成到Jenkins服务器上做持续集成测试,自动构建以及发送结果到邮箱,实现真正的无人值守测试。不过Jenkins搭建一般都会部署在公司的服务器上,不会在私人电脑里,而服务器大部分都是Linux操作系统的。如果要在Linux上的Jenkins服......
  • Linux捣鼓记录:debian配置自动补全、ll命令别名、配置sbin命令、jdk命令
    一、配置自动补全、ll命令别名配置在/etc/bash.bashrc,实现全局用户自动补全,ll命令别名sudonano/etc/bash.bashrc有一段类似下面的文字被注释,取消注释#enablebashcompletionininteractiveshellsif!shopt-oqposix;thenif[-f/usr/share/bash-completion/bas......
  • linux 路由基本命令的使用
    MarkdownExamplelinuxroute命令route命令可以显示或设置Linux内核中的路由表,主要是静态路由对于局域网中的Linux主机,要想访问Internet,需要将局域网的网关IP地址设置为这个主机的默认路由。在命令行中通过route命令添加的路由在网卡重启或机器重启后失效。可以......
  • 【linux命令】sar 监控服务器资源
    常用的参数CPU:sar-utn内存:sar-rtn磁盘:sar-dtn网络:sar-nDEVtn采样频率tn每隔t秒记录一次,共记录n次###############################################################sar[options][-A][-ofile]t[n]在命令行中,n和t两个参数组合起来定义采样间隔......
  • Vscode ssh远程连接Linux服务器登录时密码password无法输入
    问题最近在用Vscode远程连接Linux服务器时,在终端提示输入密码password的时候用键盘输入没有反应。以为是键盘坏了,然后尝试复制粘贴没有用。后来找到了原因以及解决方法,感谢原帖作者(原贴链接粘在下面)原因其实系统已经接受密码了,主要错觉是由于人们经常使用的系统的密码......
  • 【linux】nmon资源监控与定时任务
    原文:https://www.runoob.com/linux/linux-comm-crontab.htmlcrontab定时任务:【nmon监控稳定性场景】122、126406,14,22***root/home/nomouser/nmon-f-s20-c1620-m/home/nomouser123406,14,22***root/root/nmon-f-s20-c1620-m/root0*/8***......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线打开 word文件编辑留痕并显
    国产linux系统(银河麒麟,统信uos)使用PageOffice国产版在线打开pdf文件PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)芯片架构。查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的......
  • linux变更文件权限
    一、修改文件所属组群——chgrp修改文件所属组群很简单-chgrp命令,就是changegroup的缩写(我们可以利用这些来记忆命令)语法:chgrp组群文件名/目录举例:[root@redhat~]#groupaddgroupa[root@redhat~]#groupaddgroupb[root@redhat~]#useradd-ggroupazgz[roo......
  • 软件spi ST7789屏幕驱动stm32
    #include"st7789.h"voidST7789_GPIO_Init(void){ GPIO_InitTypeDefGPIO_InitStruct; __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull=GPIO_PULLUP; GPIO_InitStru......
  • 【Ubuntu】windows和Linux文件互传、共享
    【Ubuntu】windows和Linux文件互传、共享一、FTP、SAMBA、NFS简介FTP:FileTransferProtocol(文件传输协议)SAMBA:基于SMB(ServerMessageBlock服务器消息块)协议的软件实现NFS:NetworkFileSystem(网络文件系统)二、Linux共享文件给Linux2.1、scp命令具体命......