fuzidage
专注嵌入式、linux驱动 、arm裸机研究

导航

 

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/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 库拷贝到开发板中去即可。

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/xxxxxx/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/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

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 &
posted on 2024-07-12 16:00  fuzidage  阅读(519)  评论(0编辑  收藏  举报