1 WIFI驱动编译初体验
一般WIFI有2种接口:USB 和 SDIO。例如USB WIFI 使用的芯片为RTL8188EUS或 RTL8188CUS,SDIO 接口的WIFI 使用芯片为 RTL8189FS,如下图:


RTL8189和RTL8188都是realtek 公司出品的 WIFI 芯片,WIFI芯片原厂一般会整包提供。
1.1 向 Linux 内核添加 WIFI 驱动
realtek提供的RTL81xxx驱动软件包如下:

打开Kconfig:

打开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。

打开Kconfig菜单如下:


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

Kconfig中有一行:source drivers/net/wireless/rtlwifi/Kconfig
因此继续打开rtlwifi/Kconfig:

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

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

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

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

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

2 WIFI驱动测试
2.1 RTL8188 USB WIFI
插好usb wifi到USB host插槽。输入:
depmod //第一次加载驱动的时候需要运行此命令
modprobe 8188eu.ko //RTL8188EUS 模块加载 8188eu.ko 模块
modprobe 8192cu.ko //RTL8188CUS 模块加载 8192cu.ko 模块


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

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

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工具链:


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

编译完成以后就会在当前目录下生成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

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


想连接到指定的 WIFI 热点上就需要用到 wpa_supplicant 工具。
2.4 wpa_supplicant
2.4.1 下载地址
https://www.linuxfromscratch.org/blfs/view/8.4-systemd/basicnet/wpa_supplicant.html
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/xxxxxx/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 库拷贝到开发板中去即可。


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/xxxxxx/robin.lee/my_test/study/openedv/wpa_supplicant/libnl/
make -j12
make install

将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如下:

修改.config, 添加下面几行,用来配置makefile,配置了wpa_supplicant要使用的库和头文件路径。
CC = arm-linux-gnueabihf-gcc
CFLAGS += -I/media/xxxxxx/robin.lee/my_test/study/openedv/wpa_supplicant/openssl/include
LIBS += -L/media/xxxxxx/robin.lee/my_test/study/openedv/wpa_supplicant/openssl/lib -lssl -lcrypto
CFLAGS += -I/media/xxxxxx/robin.lee/my_test/study/openedv/wpa_supplicant/libnl/include/libnl3
LIBS += -L/media/xxxxxx/robin.lee/my_test/study/openedv/wpa_supplicant/libnl/lib
编译 wpa_supplicant:编译前要export PKG_CONFIG_PATH, 指定 libnl 库pkgconfig包位置。
export PKG_CONFIG_PATH=/media/xxxxxx/robin.lee/my_test/study/openedv/wpa_supplicant/libnl/lib/pkgconfig:$PKG_CONFIG_PATH
make -j12

编译 wpa_supplicant 的时候是需要指定libnl的 pkgconfig 路径,否则会提示“libnl-3.0”或 者“libnl-3.0.pc”找不到等错误。
编译完后的软件如下:

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

2.4.3 wpa_supplicant联网测试
2.4.3.1 RTL8188 USB WIFI 联网测试
modprobe 8188eu.ko //RTL8188EUS 模块加载 8188eu.ko 模块
-
用
iwlist扫描到SSID热点:
![image]()
-
添加
/etc/wpa_supplicant.confctrl_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 -
运行
wpa_supplicant -D wext -c /etc/wpa_supplicant.conf -i wlan0 &
运行后就可以看到下面连接成功的打印了。

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


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

2.4.3.2 RTL8189 SDIO WIFI 联网测试
这里sdio wifi上网流程和上一节一样。需要注意启动运行wpa_supplicant 要用”-Dnl80211”选项。
wpa_supplicant -Dnl80211 -c /etc/wpa_supplicant.conf -i wlan0 &

浙公网安备 33010602011771号