Linux驱动开发|WiFi驱动

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_WIFI
	tristate "Realtek wifi"

if REALTEK_WIFI

choice
	prompt "select wifi type"
	default RTL8189FS

config RTL8189FS
	depends on REALTEK_WIFI
	tristate "rtl8189fs/ftv sdio wifi"

config RTL8188EUS
	depends on REALTEK_WIFI
	tristate "rtl8188eus usb wifi"

config RTL8192CU
	depends on REALTEK_WIFI
	tristate "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

Linux驱动开发|WiFi驱动_第1张图片

  • 执行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 模块

驱动加载成功,如下图所示:
Linux驱动开发|WiFi驱动_第2张图片
输入“ifconfig -a”命令,查看 wlanX(X=0….n)网卡是否存在
Linux驱动开发|WiFi驱动_第3张图片

二、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 这三个变量

Linux驱动开发|WiFi驱动_第4张图片

  • 修改完成以后使用如下命令编译
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 工作正常

Linux驱动开发|WiFi驱动_第5张图片

加载 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

Linux驱动开发|WiFi驱动_第6张图片

.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 热点后会输出如下图所示的信息
    Linux驱动开发|WiFi驱动_第7张图片
  • 设置 wlan0 的 IP 地址,使用 udhcpc 命令从路由器申请 IP 地址,IP 地址获取成功以后会输出如下图所示的信息
udhcpc -i wlan0 	//从路由器获取 IP 地址

Linux驱动开发|WiFi驱动_第8张图片

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

你可能感兴趣的:(Linux驱动开发,驱动开发,linux,wifi)