当前位置: 首页 > news >正文

Linux WIFI 驱动实验

目录

  • WIFI 驱动添加与编译
    • 向Linux 内核添加WIFI 驱动
    • 配置Linux 内核
    • 编译WIFI 驱动
    • 驱动加载测试
  • wireless tools 工具移植与测试
    • wireless tools 移植
    • wireless tools 工具测试
  • wpa_supplicant 移植
    • openssl 移植
    • libnl 库移植
    • wpa_supplicant 移植
  • WIFI 联网测试
    • RTL8188 USB WIFI 联网测试
    • RTL8189 SDIO WIFI 联网测试

WIFI 的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候
很多设备存在布线困难的情况,此时WIFI 就是一个不错的选择。正点原子I.MX6U-ALPHA 开
发板支持USB 和SDIO 这两种接口的WIFI,本章我们就来学习一下如何在I.MX6U-ALPHA 开
发板上使用USB 和SDIO 这两种WIFI。

WIFI 驱动添加与编译

正点原子的I.MX6U-ALPHA 开发板目前支持两种接口的WIFI:USB 和SDIO,其中USB WIFI 使用的芯片为RTL8188EUS 或RTL8188CUS,SDIO 接口的WIFI 使用芯片为RTL8189FS,
也叫做RTL8189FTV。这两个都是realtek 公司出品的WIFI 芯片。WIFI 驱动不需要我们编写,
因为realtek 公司提供了WIFI 驱动源码,因此我们只需要将WIFI 驱动源码添加到Linux 内核
中,然后通过图形化界面配置,选择将其编译成模块即可。
正点原子I.MX6U-ALPHA开发板默认会赠送一个RTL8188EUS/CUS USB WIFI,如图70.1.1
所示:
在这里插入图片描述
另外,正点原子还有一款采用RTL8189FTV 芯片的SDIO WIFI,如图70.1.2 所示:
在这里插入图片描述

向Linux 内核添加WIFI 驱动

1、rtl81xx 驱动文件浏览
WIFI 驱动源码已经放到了开发板光盘中,路径为:1、例程源码->5、模块驱动源码->1、
RTL8XXX WIFI 驱动源码-> realtek。realtek 目录下就存放着RTL8188EUS 和RTL8189FS 这两
个芯片的驱动源码,如图70.1.1.1 所示:
图70.1.1.1 rtl8xxx WIFI 驱动

其中rtl8188EUS 下存放着RTL8188EUS 驱动,RTL8189FS 存放着RTL8189FS/FTV 的驱动
文件,rtl8192CU 下存放着RTL8188CUS 和RTL8192CU 的驱动,注意!正点原子ALPHA 开发
板赠送的USB WIFI 模块分为RTL8188EUS 和RTL8188CUS 两种,这两种USB WIFI 驱动是不一样的!Kconfig 文件是WIFI 驱动的配置界面文档,这样可以通过Linux 内核图形化配置界面
来选择是否编译WIFI 驱动,Kconfig 文件内容如下所示:

示例代码70.1.1.1 Kconfig 文件内容
1 menuconfig REALTEK_WIFI
2 tristate "Realtek wifi"
3
4 if REALTEK_WIFI
5
6 choice
7 prompt "select wifi type"
8 default RTL8189FS
9
10 config RTL8189FS
11 depends on REALTEK_WIFI
12 tristate "rtl8189fs/ftv sdio wifi"
13
14 config RTL8188EUS
15 depends on REALTEK_WIFI
16 tristate "rtl8188eus usb wifi"
17
18 config RTL8192CU
19 depends on REALTEK_WIFI
20 tristate "Realtek 8192C USB WiFi"
21
22 endchoice
23 endif

Makefile 文件内容如下所示

示例代码70.1.1.2 Makefile 文件内容
1 obj-$(CONFIG_RTL8188EUS) += rtl8188EUS/
2 obj-$(CONFIG_RTL8189FS) += rtl8189FS/
3 obj-$(CONFIG_RTL8192CU) += rtl8192CU/

2、删除linux 内核自带的RTL8192CU 驱动
本教程所使用的linux 内核已经自带了RTL8192CU/8188CUS 驱动,但是经过测试,linux
内核自带的驱动不稳定!因此不建议大家使用。最好使用图70.1.1.1 中我们提供的rtl8192CU 驱
动。在编译之前要先将内核自带的驱动屏蔽掉,否则可能导致编译出错,方法很简单。打开
drivers/net/wireless/rtlwifi/Kconfig,找到下面所示内容然后删除掉:

示例代码70.1.1.3 drivers/net/wireless/rtlwifi/Kconfig 文件内容
1 config RTL8192CU
2 tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter"
3 depends on USB
4 select RTLWIFI
5 select RTLWIFI_USB
6 select RTL8192C_COMMON
7 ---help---
8 This is the driver for Realtek RTL8192CU/RTL8188CU 802.11n USB
9 wireless network adapters.
10
11 If you choose to build it as a module, it will be called rtl8192cu

将示例代码70.1.1.2 中的1~11 行内容从drivers/net/wireless/rtlwifi/Kconfig 中删除掉。
继续打开drivers/net/wireless/rtlwifi/Makefile,找到下面这样:

示例代码70.1.1.4 drivers/net/wireless/rtlwifi/Makefile 文件内容
1 obj-$(CONFIG_RTL8192CU) += rtl8192cu/

将示例代码70.1.1.3 中这一行从drivers/net/wireless/rtlwifi/Makefile 中屏蔽掉,至此,linux
内核自带的RTL8192CU/8188CU 驱动就屏蔽掉了。
3、将rtl81xx 驱动添加到Linux 内核中
将realtek 整个目录拷贝到ubuntu 下Linux 内核源码中的drivers/net/wireless 目录下,此目
录下存放着所有WIFI 驱动文件。拷贝完成以后此目录如图70.1.1.1 所示:
在这里插入图片描述
图70.1.1.1 中框选出来的就是我们刚刚拷贝进来的realtek 目录。
4、修改drivers/net/wireless/Kconfig
打开drivers/net/wireless/Kconfig,在里面加入下面这一行内容:

source "drivers/net/wireless/realtek/Kconfig"

添加完以后的Kconfig 文件内容如下所示:

示例代码70.1.1.5 drivers/net/wireless/Kconfig 文件内容
1 #
2 # Wireless LAN device configuration
3 #
4
5 menuconfig WLAN
......
286 source "drivers/net/wireless/rsi/Kconfig"
287 source "drivers/net/wireless/realtek/Kconfig"
286
289 endif # WLAN

第287 行就是添加到drivers/net/wireless/Kconfig 中的内容,这样WIFI 驱动的配置界面才
会出现在Linux 内核配置界面上。

5、修改drivers/net/wireless/Makefile
打开drivers/net/wireless/Makefile,在里面加入下面一行内容:

obj-y += realtek/

修改完以后的Makefile 文件内容如下所示:

示例代码70.1.1.6 drivers/net/wireless/Makefile 文件内容
1 #
2 # Makefile for the Linux Wireless network device drivers.
3 #
4
5 obj-$(CONFIG_IPW2100) += ipw2x00/
......
62 obj-$(CONFIG_CW1200) += cw1200/
63 obj-$(CONFIG_RSI_91X) += rsi/
64
65 obj-y += realtek/

第65 行,编译realtek 中的内容,至此,Linux 内核要修改的内容就全部完成了。

配置Linux 内核

在编译RTL8188 和RTL8189 驱动之前需要先配置Linux 内核。
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

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

配置完如图70.1.2.1 所示:
在这里插入图片描述
3、配置支持IEEE 802.11
配置路径如下:

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

配置完如图70.1.2.2 所示:
在这里插入图片描述
配置好以后重新编译一下Linux 内核,得到新的zImage,后面使用新编译出来的zImage 启
动系统。

编译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

配置结果如图70.1.3.1 所示:
在这里插入图片描述
图70.1.3.1 中的配置界面就是我们添加进去的WIFI 配置界面,选中“rtl8189fs/ftv sdio wifi”、
“rtl8188eus usb wifi”和“Realtek 8192C USB WiFi”,将其编译为模块。执行如下命令编译模
块:

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

编译完成以后就会在rtl8188EUS、rtl8189FS 和rtl8192CU 文件夹下分别生成8188eu.ko、
8189fs.ko 和8192cu.ko 这三个.ko 文件,结果如图70.1.3.2 所示:
在这里插入图片描述
图70.1.3.2 中的8188eu.ko、8189fs.ko 和8192cu.ko 就是我们需要的RTL8188EUS、
RTL8189FS 和RTL8188CUS/8192CU 的驱动模块文件,将这三个文件拷贝到

rootfs/lib/modules/4.1.15 目录中,命令如下:

sudo cp 8189fs.ko /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/ -rf
sudo cp 8188eu.ko /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/ -rf
sudo cp 8192cu.ko /home/zuozhongkai/linux/nfs/rootfs/lib/modules/4.1.15/ -rf

因为我们重新配置过Linux 内核,因此也需要使用新的zImage 启动,将新编译出来的zImage
镜像文件拷贝到Ubuntu 中的tftpboot 目录下,命令如下:

cp arch/arm/boot/zImage /home/zuozhongkai/linux/tftpboot/ -f

然后重启开发板!!!

驱动加载测试

1、RTL8188 USB WIFI 驱动测试
重启以后我们试着加载一下8188eu.ko、8189fs.ko 和8192cu.ko 这三个驱动文件,首先测试
一下RTL8188 的驱动文件,将RTL8188 WIFI 模块插到开发板的USB HOST 接口上。进入到目
录lib/modules/4.1.15 中,输入如下命令加载8188eu.ko 这个驱动模块:

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

如果驱动加载成功的话如图70.1.4.1 所示:
图70.1.4.1 RTL8188 驱动加载成功

输入“ifconfig -a”命令,查看wlanX(X=0….n)网卡是否存在,一般都是wlan0,除非板子
上有多个WIFI 模块在工作,结果如图70.1.4.2 所示:
在这里插入图片描述
从图70.1.4.2 中可以看出,当前开发板有一个叫做“wlan0”的网卡,这个就是RTL8188 对
应的网卡。
2、RTL8189 SDIO WIFI 驱动测试
测试完RTL8188 以后,再来测试一下RTL8189 这个SDIO WIFI,因为I.MX6U-ALPHA 开
发板的SDIO WIFI 接口与SD 卡公用一个SDIO 接口。因此SD 卡和SDIO WIFI 只能二选其一,
一次只能一个工作,所以测试RTL8189 SDIO WIFI 的时候需要拔插SD 卡。SDIO WIFI 接口原
理图如图70.1.4.3 所示:
在这里插入图片描述
测试开始之前要先将SD 卡拔出,然后将RTL8189 SDIO WIFI 模块插入到SDIO WIFI 座子
上,如图70.1.4.4 所示:
在这里插入图片描述
SDIO WIFI 与开发板连接好以后就可以测试了,输入如下命令加载8189fs.ko 这个驱动模
块:

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

如果驱动加载成功的话如图70.1.4.5 所示:
在这里插入图片描述
从70.1.4.5 可以看出,RTL8189 SDIO WIFI 驱动加载成功,同样使用“ifconfig -a”命令查
看一下是否有wlanX(X=0…n)网卡存在,如果有的话就说明RTL8189 SDIO WIFI 驱动工作正常。
不管是RTL8188 USB WIFI 还是RTL8189 SDIO WIFI,驱动测试都工作正常,但是我们得
能联网啊,不能联网的话要他有什么用呢?WIFI 要想联网,需要移植一些其他第三方组件,否
则无法连接路由器,接下来我们就移植这些第三方组件。

wireless tools 工具移植与测试

wireless tools 移植

wireless tools 是操作WIFI 的工具集合,包括一下工具:
①、iwconfig:设置无线网络相关参数。
②、iwlist:扫描当前无线网络信息,获取WIFI 热点。
③、iwspy:获取每个节点链接的质量。
④、iwpriv:操作WirelessExtensions 特定驱动。
⑤、ifrename:基于各种静态标准命名接口。
我们最常用的就是iwlist 和iwconfig 这两个工具,首先获取到相应的源码包,这里我们已
经放到了开发板光盘中,路径为:1、例程源码-》7、第三方库源码-》iwlist_for_visteon-master.tar.bz2。
将iwlist_for_visteon-master.tar.bz2 拷贝到Ubuntu 中前面创建的tool 目录下,拷贝完成以后将其
解压,生成iwlist_for_visteon-master 文件夹。进入到iwlist_for_visteon-master 文件夹里面,打开
Makefile 文件,修改Makefile 中的CC、AR 和RANLIB 这三个变量,修改后的值如图70.2.1.1
所示:
在这里插入图片描述
图70.2.1.1 中CC、AR 和RANLIB 这三个变量为所使用的编译器工具,将其改为我们所使
用的arm-linux-gnueabihf-xxx 工具即可。修改完成以后就可以使用如下命令编译:

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/zuozhongkai/linux/nfs/rootfs/usr/bin/ -f
sudo cp libiw.so.29 /home/zuozhongkai/linux/nfs/rootfs/usr/lib/ -f

拷贝完成以后可以测试iwlist 是否工作正常。

wireless tools 工具测试

这里我们主要测试一下iwlist 工具,要测试iwlist 工具,先测试一下iwlist 工具能不能工作,
输入iwlist 命令,如果输出图70.2.2.1 所示信息就表明iwlist 工具工作正常。
在这里插入图片描述
正式测试iwlist 之前得先让WIFI 模块工作起来。RTL8188 或RTL8189 都可以,以RTL8188 USB WIFI 为例,先将RTL8188 WIFI 模块插到开发板的USB HOST 接口上,然后加载RTL8188
驱动模块8188eu.ko,驱动加载成功以后在打开wlan0 网卡,命令如下:

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

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

iwlist wlan0 scan

上述命令就会搜索当前环境下的所有WIFI 热点,然后将这些热点的信息信息答应出来,
包括MAC 地址、ESSID(WIFI 名字)、频率、速率,信号质量等等,如图70.2.2.2 所示:
在这里插入图片描述
在扫描到的所有热点信息中找到自己要连接的WIFI 热点,比如我要连接到“ZZK”这个热
点上,这个WIFI 热点信息如图70.2.2.3 所示:
在这里插入图片描述
可以看出,“ZZK”这个热点信息已经被扫描到了,因此可以连接。要想连接到指定的WIFI
热点上就需要用到wpa_supplicant 工具,所以接下来就是移植此工具。

wpa_supplicant 移植

openssl 移植

wpa_supplicant 依赖于openssl,因此需要先移植openssl,openssl 源码已经放到了开发板光
盘中,路径为:1、例程源码-》7、第三方库源码-》openssl-1.1.1d.tar.gz。将openssl 源码压缩包
拷贝到Ubuntu 中前面创建的tool 目录下,然后使用如下命令将其解压:

tar -vxzf openssl-1.1.1d.tar.gz

解压完成以后就会生成一个名为openssl-1.1.1d 的目录,然后在新建一个名为“openssl”的
文件夹,用于存放openssl 的编译结果。进入到解压出来的openssl-1.1.1d 目录中,然后执行如
下命令进行配置:

./Configure linux-armv4 shared no-asm --prefix=/home/zuozhongkai/linux/IMX6ULL/tool/openssl CROSS_COMPILE=arm-linux-gnueabihf-

上述配置中“linux-armv4”表示32 位ARM 凭条,并没有“linux-armv7”这个选项。
CROSS_COMPILE 用于指定交叉编译器。配置成功以后会生成Makefile,输入如下命令进行编
译:

make
make install

编译安装完成以后的openssl 目录内容如图70.3.1.1 所示:
在这里插入图片描述
将图70.3.1.1 中的lib 目录是我们需要的,将lib 目录下的libcrypto 和libssl 库拷贝到开发
板根文件系统中的/usr/lib 目录下,命令如下:

sudo cp libcrypto.so* /home/zuozhongkai/linux/nfs/rootfs/lib/ -af
sudo cp libssl.so* /home/zuozhongkai/linux/nfs/rootfs/lib/ -af

libnl 库移植

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

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

wpa_supplicant 也依赖于libnl,因此还需要移植一下libnl 库,libnl 源码已经放到了开发板
光盘中,路径为:1、例程源码-》7、第三方库源码-》libnl-3.2.23.tar.gz。将libnl 源码压缩包拷
贝到Ubuntu 中前面创建的tool 目录下,然后使用如下命令将其解压:

tar -vxzf libnl-3.2.23.tar.gz

得到解压完成以后会得到libnl-3.2.23 文件夹,然后在新建一个名为“libnl”的文件夹,用
于存放libnl 的编译结果。进入到libnl-3.2.23 文件夹中,然后执行如下命令进行配置:

./configure --host=arm-linux-gnueabihf --prefix=/home/zuozhongkai/linux/IMX6ULL/tool/libnl/

–host 用于指定交叉编译器的前缀,这里设置为“arm-linux-gnueabihf”,–prefix 用于指定编
译结果存放目录,这里肯定要设置为我们刚刚创建的libnl 文件夹。配置完成以后就可以执行如
下命令对libnl 库进行编译、安装:

make -j12 //编译
make install //安装

编译安装完成以后的libnl 目录如图70.3.2.1 所示:

我们需要图70.3.2.1 中lib 目录下的libnl 库文件,将lib 目录下的所有文件拷贝到开发板根
文件系统的/usr/lib 目录下,命令如下所示:

sudo cp lib/* /home/zuozhongkai/linux/nfs/rootfs/usr/lib/ -rf

wpa_supplicant 移植

接下来移植wpa_supplicant,wpa_supplicant 源码我们已经放到了开发板光盘中,路径为:
1、例程源码->7、第三方库源码->wpa_supplicant-2.7.tar.gz,将wpa_supplicant-2.7.tar.gz 拷贝到
Ubuntu 中,输入如下命令进行解压:

tar -vxzf wpa_supplicant-2.7.tar.gz

解压完成以后会得到wpa_supplicant-2.7 文件夹,进入到此文件夹中,wpa_supplicant-2.7 目
录内容如图70.3.3.1 所示:
在这里插入图片描述

进入到图70.3.3.1 中的wpa_supplicant 目录下,然后进行配置,wpa_supplicant 的配置比较
特殊,需要将wpa_supplicant 下的defconfig 文件拷贝一份并重命名为.config,命令如下:

cd wpa_supplicant/
cp defconfig .config

完成以后打开.config 文件,在里面指定交叉编译器、openssl、libnl 库和头文件路径,设置
如下:

示例代码70.3.3.1 .config 文件需要添加的内容
1 CC = arm-linux-gnueabihf-gcc
2
3 #openssl库和头文件路径
4 CFLAGS += -I/home/zuozhongkai/linux/IMX6ULL/tool/openssl/include
5 LIBS += -L/home/zuozhongkai/linux/IMX6ULL/tool/openssl/lib -lssl-lcrypto
6
7 #libnl库和头文件路径
8 CFLAGS += -I/home/zuozhongkai/linux/IMX6ULL/tool/libnl/include/libnl3
9 LIBS += -L/home/zuozhongkai/linux/IMX6ULL/tool/libnl/lib

CC 变量用于指定交叉编译器,这里就是arm-linux-gnueabihf-gcc,CFLAGS 指定需要使用
的库头文件路径,LIBS 指定需要用到的库路径。编译wap_supplicant 的时候需要用到openssl 和
libnl 库,所以示例代码70.3.3.1 中指定了这两个的库路径和头文件路径。上述内容在.config 中
的位置见图70.3.3.2:
在这里插入图片描述
.config 文件配置好以后就可以编译wpa_supplicant 了,使用如下命令编译:

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

首先我们使用export 指定了libnl 库的pkgconfig 路径,环境变量PKG_CONFIG_PATH 保
存着pkgconfig 包路径。在tool/libnl/lib/下有个名为“pkgconfig”的目录,如图70.3.3.3 所示:
在这里插入图片描述
编译wpa_supplicant 的时候是需要指定libnl 的pkgconfig 路径,否则会提示“libnl-3.0”或
者“libnl-3.0.pc”找不到等错误。编译完成以后就会在本目录下生成wpa_supplicant 和wpa_cli
这两个软件,如图70.3.3.3 所示:
在这里插入图片描述
将图70.3.3.3 中的wpa_cli 和wpa_supplicant 这两个文件拷贝到开发板根文件系统的/usr/bin
目录中,命令如下:

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

拷贝完成以后重启开发板!输入“wpa_supplicant -v”命令查看一下wpa_supplicant 版本号,
如果wpa_supplicant 工作正常的话就会打印出版本号,如图70.3.3.4 所示:
在这里插入图片描述
从图70.3.3.4 可以看出,wpa_supplicant 的版本号输出正常,说明wpa_supplicant 移植成
功,接下来就是使用wpa_supplicant 将开发板的WIFI 链接到路由器上,实现WIFI 上网功能。

WIFI 联网测试

不管是USB WIFI 还是SDIO WIFI,联网的操作步骤如下所示:
①、插上WIFI 模块,如果是板子集成的就不需要这一步。如果是SDIO WIFI 的话确保WIFI
所使用的SDIO 接口没有插其他的模块,比如SD 卡,防止其他模块对SDIO WIFI 造成影响。
②、加载RTL8188 或者RTL8189 驱动模块。
③、使用ifconfig 命令打开对应的无线网卡,比如wlan0 或wlan1……
④、无线网卡打开以后使用iwlist 命令扫描一下当前环境下的WIFI 热点,一来测试一下
WIFI 工作是否正常。二来检查一下自己要连接的WIFI 热点能不能扫描到,扫描不到的话肯定
就没法连接了。
当上述步骤确认无误以后就可以使用wpa_supplicant 来将WIFI 连接到指定的热点上,实现
联网功能。

RTL8188 USB WIFI 联网测试

注意!RTL8188EUS 请使用8188eu.ko 驱动,RTL8188CUS 请使用8192cu.ko 驱动!
首先测试一下RTL8188 USB WIFI 联网测试,确保RTL8188 能扫描出要连接的WIFI 热点,
比如我要连接“ZZK”这个WIFI,iwlist 扫描到的此WIFI 热点信息如图70.4.1.1 所示:
在这里插入图片描述
要连接的WIFI 热点扫描到以后就可以连接了,先在开发板根文件系统的/etc 目录下创建一
个名为“wpa_supplicant.conf”的配置文件,此文件用于配置要连接的WIFI 热点以及WIFI 秘
密,比如我要连接到“ZZK”这个热点上,因此wpa_supplicant.conf 文件内容如下所示:

示例代码70.4.1.1 wpa_supplicant.conf 文件内容
1 ctrl_interface=/var/run/wpa_supplicant
2 ap_scan=1
3 network={
4 ssid="ZZK"
5 psk="xxxxxxxx"
6 }

第4 行,ssid 是要连接的WIFI 热点名字,这里我要连接的是“ZZK”这个WIFI 热点。
第5 行,psk 就是要连接的WIFI 热点密码,根据自己的实际情况填写即可。
注意,wpa_supplicant.conf 文件对于格式要求比较严格,“=”前后一定不能有空格,也不要
用TAB 键来缩进,比如第4 行和5 行的缩进应该采用空格,否则的话会出现wpa_supplicant.conf
文件解析错误!最重要的一点!wpa_supplicant.conf 文件内容要自己手动输入,不要偷懒复制粘
贴!!!
wpa_supplicant.conf 文件编写好以后再在开发板根文件系统下创建一个
“/var/run/wpa_supplicant”目录,wpa_supplicant 工具要用到此目录!命令如下:

mkdir /var/run/wpa_supplicant -p

一切准备好以后就可以使用wpa_supplicant 工具让RTL8188 USB WIFI 连接到热点上,输
入如下命令:

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

当RTL8188 连接上WIFI 热点以后会输出如图70.4.1.2 所示的信息:
图70.4.1.2 连接成功

从图70.4.1.2 可以看出,当RTL8188 连接到WIFI 热点上以后会输出“wlan0: CTRL-EVENT-
CONNECTED”字样。接下来就是最后一步了,设置wlan0 的IP 地址,这里使用udhcpc 命令
从路由器申请IP 地址,输入如下命令:

udhcpc -i wlan0 //从路由器获取IP 地址

IP 地址获取成功以后会输出如图70.4.2.2 所示信息:
在这里插入图片描述
从图70.4.2.2 可以看出,wlan0 的IP 地址获取成功,IP 地址为192.168.1.126。可以输入如
下命令查看一下wlan0 网卡的详细信息:

ifconfig wlan0

结果如图70.4.2.3 所示:
在这里插入图片描述
可以通过电脑ping 一下wlan0 的192.168.1.126 这个IP 地址,如果能ping 通就说明RTL8188 USB WIFI 工作正常。也可以直接在开发板上使用wlan0 来ping 一下百度网站,输入如下命令:

ping -I 192.168.1.126 www.baidu.com

-I 是指定执行ping 操作的网卡IP 地址,我们要使用wlan0 去ping 百度网站,因此要通过
“-I”指定wlan0 的IP 地址。如果WIFI 工作正常的话就可以ping 通百度网站,如图70.4.2.4
所示:
在这里插入图片描述
至此RTL8188 USB WIFI 我们就完全驱动起来了,大家就可以使用WIFI 来进行网络通信
了。

RTL8189 SDIO WIFI 联网测试

RLT8189 SDIO WIFI 的测试和RTL8188 USB WIFI 的测试方法基本一致,如果插了SD 卡
的话先将SD 卡从I.MX6U-ALPHA 开发板上拔出,因为I.MX6U-ALPHA 开发板的SD 卡和
SDIO WIFI 公用一个SDIO 接口。插入RTL8189 SDIO WIFI 模块,然后加载RTL8189 驱动,并
且打开对应的wlan0(如果只有RTL8189 一个WIFI 的话)网卡,使用iwlist 命令搜索要连接的
WIFI 热点是否存在,如果存在的话就可以连接了。

RTL8189 SDIO WIFI 同样使用wpa_supplicant 来完成热点连接工作,因此同样需要创建
/etc/wpa_supplicant.conf 文件,具体过程参考70.4.1 小节。一切准备就绪以后输入如下命令来完
成WIFI 热点连接:

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

注意红色字体,使用RTL8189 的话应该使用“-Dnl80211”,这里不要填错了!WIFI 热点连
接成功以后会输出如图70.4.2.1 所示信息:
图70.4.2.1 RTL8189 SDIO WIFI 连接成功

使用udhcpc 命令获取IP 地址,命令如下:

udhcpc -i wlan0

IP 地址获取过程如图70.4.2.2 所示:
在这里插入图片描述
从图70.4.2.2 可以看出,wlan0 的IP 地址为192.168.1.118,大家可以使用“ifconfig wlan0”
查看一下wlan0 网卡的详细信息。可以通过电脑ping 一下192.168.1.118 测试WIFI 是否工作正
常,或者在开发板上使用wlan0 网卡ping 一下百度网址来测试一下WIFI 工作是否正常,输入
如下命令:

ping -I 192.168.1.118 www.baidu.com

如果ping 成功的话结果如图70.4.2.3 所示:
在这里插入图片描述
至此,如何在I.MX6U-ALPHA 开发板上使用WIFI 就全部讲解完了,包括USB WIFI 和
SDIO WIFI。其实不管是在I.MX6U 上,还是在其他的SOC 上,USB WIFI 和SDIO WIFI 的驱动都是类似的,大家可以参考本章教程讲RTL8188、RTL8189 这两款WIFI 的驱动移植到芯片或者开发板上。

相关文章:

Linux WIFI 驱动实验

目录WIFI 驱动添加与编译向Linux 内核添加WIFI 驱动配置Linux 内核编译WIFI 驱动驱动加载测试wireless tools 工具移植与测试wireless tools 移植wireless tools 工具测试wpa_supplicant 移植openssl 移植libnl 库移植wpa_supplicant 移植WIFI 联网测试RTL8188 USB WIFI 联网测…...

UART驱动情景分析-write

一、write过程分析 App写&#xff1a; 使用行规程来写数据最终存入uart_state->xmit的buffer里 硬件发送&#xff1a; 使用硬件驱动中uart_ops->start_tx开始发送具体的发送方式有两种&#xff1a;通过DMA、通过中断 中断方式&#xff1a; 方法1&#xff1a;直接使能tx …...

Metasploit入门到高级【第四章】

来自公粽号&#xff1a;Kali与编程预计更新第一章&#xff1a;Metasploit 简介 Metasploit 是什么Metasploit 的历史和发展Metasploit 的组成部分 第二章&#xff1a;Kali Linux 入门 Kali Linux 简介Kali Linux 安装和配置常用命令和工具介绍 第三章&#xff1a;Metasploi…...

java 继承super

在java继承中&#xff0c;如果子类继承父类&#xff0c;在子类中要给用构造器给父类的属性赋值&#xff0c;需要用到 super 举例&#xff0c;Son类继承Father 类&#xff0c;便于理解 在 new Son(String name, int age) 传入name&#xff0c;和age的值 将会调用Son这个构造器…...

Java学习笔记——多态

2.1 概述 引入 多态是继封装、继承之后&#xff0c;面向对象的第三大特征。 生活中&#xff0c;比如跑的动作&#xff0c;小猫&#xff0c;小狗和大象&#xff0c;跑起来都是不一样的。再比如飞的动作&#xff0c;昆虫、鸟类和飞机&#xff0c;飞起来是不一样的。可见&#x…...

Python处理JSON数据

Python和JSON JavaScript Object Notation (JSON) 是一种轻量级的数据交换格式&#xff0c;通常用于Web应用程序之间的数据交换。JSON的设计使得它非常易于人和机器阅读和编写。JSON数据格式与Python数据结构非常相似&#xff0c;因此Python中提供了一个json模块&#xff0c;用…...

JVM信息查询命令

1、查询jar包运行进程 jps #通过jps命令找出jar的进程IDps -ef|grep xxxx #通过包名找出进程ID2、查询JVM的堆信息 jmap -heap pid #通过jmap命令查询堆信息rootd57bff9f-c8nvn:/apps# jmap -heap 6 Picked up JAVA_TOOL_OPTIONS: -Xloggc:/data/tsf_apm/monitor/jvm…...

redis 面试题

&#x1f355; redis 面试题常规问题什么是 Redis&#xff1f;为什么要使用 Redis&#xff1f;Redis 一般有哪些使用场景&#xff1f;Redis 为什么快&#xff1f;数据类型和数据结构Redis有哪些数据类型&#xff1f;常用操作和应用Bitmaps (位图) | 二进制计数与过滤计数器记录…...

SpringCloud微服务技术栈.黑马跟学(十二)

SpringCloud微服务技术栈.黑马跟学 十二今日目标服务异步通信-高级篇1.消息可靠性1.1.生产者消息确认1.1.1.修改配置1.1.2.定义Return回调1.1.3.定义ConfirmCallback1.2.消息持久化1.2.1.交换机持久化1.2.2.队列持久化1.2.3.消息持久化1.3.消费者消息确认1.3.1.演示none模式1.3…...

HashMap集合存储学生对象并遍历

需求&#xff1a;创建一个HashMap集合&#xff0c;键是学生对象&#xff08;Student&#xff09;,值是居住地。存储多个键值对元素&#xff0c;并遍历。 要求保证键的唯一性&#xff1a;如果学生对象的成员变量值相同&#xff0c;我们就认为是同一个对象 思路&#xff1a; 定义…...

“提效”|教你用ChatGPT玩数据

ChatGPT与数据分析&#xff08;二&#xff09; 上文给简单聊了一下为什么ChatGPT不能取代数据分析师&#xff0c;本文我们来深入感受一下如何让GPT帮助数据分析师“提效”。 场景一&#xff1a;SQL取数 背景&#xff1a;多数数据分析师都要用SQL语言从数据库中提取数据&#x…...

https://app.hackthebox.com/machines/Inject

https://app.hackthebox.com/machines/Inject Ref&#xff1a; 1.https://blog.csdn.net/qq_58869808/article/details/129505388 2.https://blog.csdn.net/m0_73998094/article/details/129474782 info collecting ┌──(kwkl㉿kwkl)-[~/HODL/htb/Inject] └─$ nmap -A …...

Java Web 实战 15 - 计算机网络之网络编程套接字

文章目录一 . 网络编程中的基本概念1.1 网络编程1.2 客户端(client) / 服务器(server)1.3 请求(request) / 响应(response)1.4 客户端和服务器之间的交互数据1.4.1 一问一答1.4.2 多问一答1.4.3 一问多答1.4.4 多问多答二 . socket 套接字2.1 UDP 的 Socket API2.1.1 引子2.1.2…...

基于pdf2docx模块Python实现批量将PDF转Word文档(安装+完整代码教程)

PDF文件是一种常见的文档格式&#xff0c;但是在编辑和修改时不太方便&#xff0c;因为PDF本质上是一种静态的文档格式。因此&#xff0c;有时候我们需要将PDF文件转换成Word格式&#xff0c;以便更好地编辑和修改文档。在本篇文章中&#xff0c;我们将介绍如何使用Python实现P…...

3.21~3.22

识编程语言中的&#xff0c;局部变量&#xff0c;全局变量&#xff0c;以及变量生存周期&#xff0c;整形&#xff0c;浮点型数据的内存表示&#xff0c;od的内存窗口的使用 先看一个代码样例 #include<windows.h> #include<stdio.h>#pragma warning(disable:499…...

Chromium 改造实录:增加 MPEG TS 格式支持

在《选择最新 Chromium&#xff0c;支持 H264 / H265》一文中&#xff0c;记录了我通过升级 Chromium 版本解决了 H264 / H265 视频支持难题。然而难题接踵而至&#xff0c;这次的难题是 MPEG TS 流的支持。MPEG2-TS 传输流广泛应用于数字电视广播系统&#xff0c;所以是一个不…...

性能优化之-事件代理

js中的事件委托或是事件代理简单理解 事件委托也叫事件代理&#xff0c;“事件代理”即是把原本需要绑定在子元素的响应事件&#xff08;click、keydown…&#xff09;委托给父元素&#xff0c;让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。 概述&#x…...

MSDS 即化学品安全说明书

MSDS 即化学品安全说明书&#xff0c;亦可译为化学品安全技术说明书或化学品安全数据说明书&#xff0c;是化学品生产商和进口商用来阐明化学品的理化特性&#xff08;如PH值&#xff0c;闪点&#xff0c;易燃度&#xff0c;反应活性等&#xff09;以及对使用者的健康&#xff…...

真人手办没法实现网购?我有一个好办法!

记得以前在网上看到过一个冷笑话式的问答&#xff0c;问的是中国最早的手办是什么&#xff0c;有网友回答是秦始皇兵马俑&#xff0c;这个抖机灵式的回答简直妙得让人会心一笑。 你接触过手办吗&#xff1f; 提到手办&#xff0c;大家第一时间想到的&#xff0c;肯定都会是各…...

2019湖南省大学生程序设计竞赛题解(D)

D-Modulo Nine 很妙的类似区间dp&#xff0c; 我自己是想不到&#xff0c;本题解题思路来自学长的博客&#xff1a; 长沙橘子猫 题意 有一个长度为 nnn 的序列&#xff0c;你可以给每个位置填 0∼90\sim90∼9 的一个数&#xff0c;有 mmm 个限制&#xff0c;每个限制 [li,ri…...

【开发】中间件——RocketMQ

分布式消息系统 RocketMQ概念&#xff0c;用途&#xff0c;特性安装RocketMQ掌握RocketMQ的api使用对producer、consumer进行详解了解RocketMQ的存储特点 简介及相关概念JavaAPISpringBoot整合RocketMQ消息的顺序收发消息系统的事务、存储、重试策略消息系统的集群 RocketMQ R…...

36 UnitTest框架 - 参数化

目录 一、参数化环境准备 1、方式一&#xff1a;在终端&#xff08;cmd&#xff09;安装parameterized 2、方式二&#xff1a;在Pycharm中安装parameterized 二、参数化 1、什么事参数化&#xff1f; 2、参数化引入案例 &#xff08;1&#xff09;需求 &#xff08;2&a…...

Qt源码阅读(四) 事件循环

事件系统 文章为本人理解&#xff0c;如有理解不到位之处&#xff0c;烦请各位指正。 文章目录事件系统什么是事件循环&#xff1f;事件是如何产生的&#xff1f;sendEventpostEvent事件是如何处理的&#xff1f;事件循环是怎么遍历的&#xff1f;事件过滤器event夹带私货时间Q…...

银行数字化转型导师坚鹏:银行数字化领导力提升之道

银行数字化领导力提升之道 ——融合中西智慧&#xff0c;践行知行合一思想&#xff0c;实现知行果合一 课程背景&#xff1a; 很多银行存在以下问题&#xff1a;不知道如何领导数字员工&#xff1f;不清楚银行数字化领导力模型的内涵&#xff1f;不知道如何开展银行数字化…...

Vue2 -- 自定义单选内容的单选框组件

自定义单选内容的单选框组件 之前做的一个项目&#xff0c;在项目中有一个关于人员权限分配的功能&#xff0c;给人员指定各个模块的权限信息&#xff0c;分为 write 可写权限read 可读权限none 没有权限 项目要求画面中只显示 W R 两个按钮控制指定权限信息&#xff0c;都不…...

让PyTorch训练速度更快,你需要掌握这17种方法

掌握这 17 种方法&#xff0c;用最省力的方式&#xff0c;加速你的 Pytorch 深度学习训练。近日&#xff0c;Reddit 上一个帖子热度爆表。主题内容是关于怎样加速 PyTorch 训练。原文作者是来自苏黎世联邦理工学院的计算机科学硕士生 LORENZ KUHN&#xff0c;文章向我们介绍了在…...

LeetCode-309. 最佳买卖股票时机含冷冻期

目录题目思路动态规划题目来源 309. 最佳买卖股票时机含冷冻期 题目思路 每天最多只可能有三种状态中的一种 0表示当前处于买入状态(持有股票) 1表示当前处于卖出状态(不持有股票) 2表示当前处于冷冻状态 设dp[i][j]表示i - 1天状态为j时所拥有的最大现金 dp[i][0] Math.ma…...

AUTOSAR知识点Com(七):CANSM初认知

目录 1、概述 2、CanSM主要做什么 2.1、CAN控制器状态管理 2.2、CAN收发器状态管理 2.3、Busoff检测 1、概述 CANSM&#xff08;Controller Area Network State Manager&#xff09;是AUTOSAR&#xff08;Automotive Open System Architecture&#xff09;标准中的一个模块…...

递归:斐波那契数列、递归实现指数型枚举、递归实现排列型枚举

递归&#xff1a;O(2^n) 调用自己 例题及代码模板&#xff1a; 斐波那契数列 输入一个整数 n &#xff0c;求斐波那契数列的第 n 项。 假定从 0 开始&#xff0c;第 0 项为 0。 数据范围 0≤n≤39 样例 输入整数 n5 返回 5 #include <iostream> #include <cstring&g…...

oracle模糊查询时字段内容包含下划线的解决办法

最近项目中遇到一个关于模糊查询问题。表tabA中的字段name的值有下划线的情况&#xff0c;在模糊查询时发现查询的记录不对。 表的结构 表名&#xff1a;tabA id name sex 1 test_601 1 2 test_602 2 3 test16 1 4 t…...