前言
学习Linux驱动的途中不可避免的要使用网络工具,但是目前热门的Linux驱动教程,比如正点原子的,还在使用 iwlist 等老旧工具,于是写下这篇文章记录如何移植一些基础且较新(这里的新是相比于 iwlist 等工具)的网络工具。
值的注意的是,阅读下文之前,建议先配置好Linux网络驱动。如果你是按照正点原子的开发板与USB网卡进行学习的,可以参考下面两个文章:
移植 iw
iw依赖libnl库,因此我们要先移植 libnl。这里建议移植较为新的 libnl ,避免后面编译 iw 时出现版本不兼容的问题。
具体的安装方法如下:
# 从libnl仓库拉取源码并转到3.7版本的分支
~$ git clone https://github.com/thom311/libnl
~$ mv libnl libnl-3.7
~$ mkdir libnl
~$ cd libnl-3.7
~/libnl-3.7$ git checkout -b develop libnl3_7_0
# 编译 libnl
# 这里的交叉编译工具链需要根据对应的平台自行更改
# 我对应的平台为 aarch64
~/libnl-3.7$ ./autogen.sh
~/libnl-3.7$ ./configure \
--host=arm-none-linux-gnueabihf \
--prefix=$HOME/libnl \
CC=arm-none-linux-gnueabihf-gcc
~/libnl-3.7$ make -j$(nproc)
~/libnl-3.7$ make install
# 复制编译出来的库到根文件系统下的 /usr/lib/
# 这里也是根据实际情况修改路径
~/libnl-3.7$ cd ~/libnl/
~/libnl$ cp lib/* ../linux/nfs/rootfs/usr/lib/ -rf
然后开始编译 iw。
具体的安装方法如下:
~/libnl$ cd ~
# 获取 iw-6.7 的tarball,然后解压获取源码
~$ wget 'https://git.kernel.org/pub/scm/linux/kernel/git/jberg/iw.git/snapshot/iw-6.7.tar.gz'
~$ tar -vxf iw-6.7.tar.gz
~$ cd iw-6.7
# 开始编译
# 这里全局环境变量中的路径也要根据实际情况修改
~/iw-6.7$ export PKG_CONFIG_PATH=$HOME/libnl/lib/pkgconfig:$PKG_CONFIG_PATH
~/iw-6.7$ make CC=arm-none-linux-gnueabihf-gcc -j$(nproc)
# 如果你选择的libnl和iw版本与我的不一样,编译过程可能会中产生如下的错误
# implicit declaration of function ‘nla_put_s32’
# 这个是一般是你的 libnl 版本过低了,建议安装较新的 libnl
# 复制编译出的 iw 工具到根文件系统下的 /usr/bin/
~/iw-6.7$ cp iw ../linux/nfs/rootfs/usr/bin/
最后可以使用 ip link set wlan0 up 或者 ifconfig wlan0 up 开启无线接口,然后执行 iw list 、 iw dev 与 iw dev wlan0 scan 等命令进行测试。
移植 wpa_supplicant
wpa_supplicant 依赖于 openssl,因此需要先移植 openssl。
具体的安装方法如下:
# 获取 openssl-1.1.1t 的tarball,然后解压获取源码
~$ wget 'https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1t/openssl-1.1.1t.tar.gz'
~$ mkdir openssl
~$ cd openssl-1.1.1t
# 开始编译
~/openssl-1.1.1t$ ./Configure linux-armv4 shared no-asm \
--prefix=$HOME/openssl \
CROSS_COMPILE=arm-none-linux-gnueabihf-
~/openssl-1.1.1t$ make -j$(nproc)
~/openssl-1.1.1t$ install
# 复制编译出来的库到根文件系统下的 /usr/lib/
# 这里也是根据实际情况修改路径
~/openssl-1.1.1t$ cd ../openssl/lib
~/openssl$ cp libcrypto.so* ../linux/nfs/rootfs/usr/lib/ -af
~/openssl$ cp libssl.so* ../linux/nfs/rootfs/usr/lib/ -af
然后编译 wpa_supplicant。
具体的安装方法如下:
~/openssl$ cd ~
# 获取 wpa_supplicant-2.10 的tarball,然后解压获取源码
~$ wget 'https://w1.fi/releases/wpa_supplicant-2.10.tar.gz'
~$ tar -vxf wpa_supplicant-2.10.tar.gz
~$ mkdir wpa_supplicant
~$ cd wpa_supplicant-2.10/wpa_supplicant
# 配置 .config
~/wpa_supplicant-2.10/wpa_supplicant$ cp defconfig .config
~/wpa_supplicant-2.10/wpa_supplicant$ vim .config
vim 需要在 .config 中添加与修改如下的部分:
# 配置交叉编译工具
CC=arm-none-linux-gnueabihf-gcc
# 配置 openssl 的路径
CFLAGS += -I$(HOME)/openssl/include
LIBS += -L$(HOME)/openssl/lib -lssl -lcrypto
# 配置 libnl 的路径
CFLAGS += -I$(HOME)/libnl/include/libnl3
LIBS += -L$(HOME)/libnl/lib
# 注释掉下面两行
CONFIG_CTRL_IFACE_DBUS_NEW=y
CONFIG_CTRL_IFACE_DBUS_INTRO=y
配置完成后执行如下的命令即可:
# 开始编译
# 这里全局环境变量中的路径也要根据实际情况修改
~/wpa_supplicant-2.10/wpa_supplicant$ export PKG_CONFIG_PATH=$HOME/libnl/lib/pkgconfig:$PKG_CONFIG_PATH
~/wpa_supplicant-2.10/wpa_supplicant$ make -j$(nproc)
# 复制编译出的 wpa_cli 与 wpa_supplicant 工具到根文件系统下的 /usr/bin/
~/wpa_supplicant-2.10/wpa_supplicant$ cp wpa_cli wpa_supplicant ../linux/nfs/rootfs/usr/bin/
最后可以使用 wpa_supplicant -v等命令进行测试。
总结
总而言之,还是那些老套路,先拉取代码,然后配置.config,最后 make 编译,没有什么很难的地方。成功安装上面提到的工具之后,便能愉快的网上冲浪了。
参考文件
- 编译iw工具
- linux下WIFI模块使用:IW工具交叉编译以及配置
- linux下WIFI模块使用:wpa_supplicant工具交叉编译以及配置
- WiFi交叉编译全流程(wpa_supplicant及hostapd)
- Linux开发学习记录(4):如何愉快(?)地交叉编译
- Linux RTL8188EUS Wifi驱动调试
- 正点原子I.MAX6ULL kernel6.6移植遇到的问题