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热点:
-
添加
/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
-
运行
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 &