ZYBO移植RTL8812au驱动实现WiFi热点

介绍

  • 此教程介绍了如何把ZYBO开发板变成一个无线路由器。
  • 使用的无线网卡为RTL8812au。

安装环境

  • 开发环境:Ubuntu16.04
  • 交叉编译器:arm-linux-gnueabihf-gcc
  • Linux内核版本:4.90
  • 开发平台:Zybo
  • 所需软件:Vivado2017.4

实验要求

  1. 交叉编译wireless-tools、openssl、libnl、hostapd以及无线网卡驱动RTL8812au
  2. 配置好开发板网桥等网络环境
  3. 正确使用hostapd开启无线路由器WiFi热点

先决条件

  1. 正确配置了Xilinx交叉编译环境
  2. 安装好了minicom
  3. 已经完成了Zybo的Linux移植

实验步骤

内核编译配置

内核配置文件

Networking support > Wireless
< > cfg80211 - wireless configuration API
[ ] nl80211 testmode command
[ ] enable developer warnings
[ ] cfg80211 certification onus
[
] enable powersave by default
[ ] use statically compiled regulatory rules database
[ ] cfg80211 wireless extensions compatibility
[ ] lib80211 debugging messages
<
> Generic IEEE 802.11 Networking Stack (mac80211)
[ ] Minstrel
[
] Minstrel 802.11n support
[ ] Minstrel 802.11ac support
Default rate control algorithm (Minstrel) —>
[ ] Enable mac80211 mesh networking (pre-802.11s) support
[ ] Enable LED triggers
[ ] Trace all mac80211 debug messages
[ ] Select mac80211 debugging features —-

也可直接加载.config文件,下载地址:git clone git@github.com:fangzr/xilinx-.git

常用命令

1
2
3
4
5
配置内核 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

编译内核 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

生成uimage文件 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make UIMAGE_LOADADDR=0x8000 uImage

文件系统

直接使用实验课提供的文件系统即可,已经安装了openssh、vim、kmod、wpa-supplicant等常用工具


交叉编译

Note:
Openssl、libnl的移植是为了hostapd工具的正常使用。

不要使用中文路径,以免出现不必要的错误。

wireless tools工具移植

介绍

Wireless tools for Linux是一个Linux命令行工具包,用来设置支持Linux Wireless Extension的无线设备。
| 命令 | 功能 |
|———-|——————————-|
| iwconfig | 设置基本无线参数 |
| iwlist | 扫描、列出频率,比特率,密钥等 |
| iwspy | 获取每个节点链接的质量 |
| iwpriv | 操作WirelessExtensions 特定驱动 |
| ifrename | 基于各种静态标准命名接口 |

编译步骤
  1. 进入wireless_tools.29目录
  2. 修改Makefile

vim Makefile

  1. 修改位置如下:
1
2
3
CC = arm-linux-gnueabihf-gcc
AR = arm-linux-gnueabihf-ar
RANLIB=arm-linux-gnueabihf-ranlib

Note:

  1. 确认 ~/.bashrc添加了一下内容
    export PATH=$PATH:/opt/Xilinx/SDK/2017.4/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/
    export CROSS_COMPILE=arm-linux-gnueabihf-
  2. 否则执行 source /opt/Xilinx/Vivado/2017.4/settings64.sh

  1. 输入make开始编译

  2. 将生成的工具ifrename, iwconfig, iwevent, iwgetid, iwlist, iwpriv, iwspy可执行文件拷贝到根文件系统目录/bin目录

  3. iwlib.so、libiw.so.29动态库文件放在开发板/lib文件夹
  4. 在开发板终端输入iwlist等命令查看是否移植成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@Zybo:~# iwlist                                                             
Usage: iwlist [interface] scanning [essid NNN] [last]
[interface] frequency
[interface] channel
[interface] bitrate
[interface] rate
[interface] encryption
[interface] keys
[interface] power
[interface] txpower
[interface] retry
[interface] ap
[interface] accesspoints
[interface] peers
[interface] event
[interface] auth
[interface] wpakeys
[interface] genie
[interface] modulation

openssl移植

介绍

在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连线者的身份。这个包广泛被应用在互联网的网页服务器上。 其主要库是以C语言所写成,实现了基本的加密功能,实现了SSL与TLS协议。

编译步骤(动态编译)

Note:
这一步遇到的error可能比较多,除了要按照步骤仔细修改Makefile,还要注意遇到问题Google解决方案。

  1. 解压压缩包,修改Makefile
  • 第61行下面修改的地方是
    1
    2
    3
    4
    5
    CROSS_COMPILE=arm-linux-gnueabihf-
    CC= $(CROSS_COMPILE)cc
    AR= $(CROSS_COMPILE)ar $(ARFLAGS) r
    RANLIB= $(CROSS_COMPILE)ranlib
    MAKEDEPPROG= gcc
  1. 在终端打开源码路径,执行./config no-asm shared --prefix=$(pwd)/install,这时候直接make会出错
  2. 再打开Makefile,去掉所有-m64
  3. 终端输入make开始编译,编译完成make install
  4. 出现perl错误,输入sudo rm /usr/bin/pod2man
  5. 再次make install,openssl交叉编译完成
  6. install/lib 目录下所有文件移到rootfs/lib下面
  7. 再把/install/bin目录下所有文件移到rootfs/bin下面
  8. 再把/install/include目录下所有文件移到rootfs/usr/include下面

Note:
rootfs指的是Zybo的文件系统路径,安装目录就在源码的install目录下面

Troubleshooting
问题 解决办法
POD document had syntax error 删除 pod2man 文件:sudo rm /usr/bin/pod2man

libnl的移植

ibnl是为了方便应用程序使用netlink接口而开发的一个库。这个库为原始netlink消息传递以及不同的netlink family专用接口提供了一个统一的接口。libnl3的API与libnl1.0的API并不兼容。如果您的应用程序不做相应调整,将可能导致不可用。

  • 版本:3.2.23
  • 下载:git clone git@github.com:fangzr/libnl.git
编译步骤
  1. 解压压缩包
  2. 打开命令行。执行./configure CC=arm-linux-gnueabihf-gcc --prefix=$(pwd)/install --host=arm-linux
  3. 执行 make &make install,安装目录就在源码的install目录下面
  4. /install路径下面生成的文件夹内容放在Zybo文件系统对应路径。
    e.g.include就应该放在rootfs/usr/include下面,可以搜索一下文件夹名称就可以找到目标路径在哪

hostapd的移植

  • 版本:2.6
  • 下载:git clone git@github.com:fangzr/hostapd.git
编译步骤
  1. 解压源码包,在此路径打开终端,将上面编译好的libnl路径加入环境变量
    export PKG_CONFIG_PATH=/.../libnl-3.2.23
  2. 进入hosdtapd-2.6/hostapd,执行cp defconfig .config
  3. 打开.config文件,完成以下修改:
  • 加入以下内容(‘…’根据自己libnl、openssl源码路径修改)

    1
    2
    3
    4
    5
    6
    7
    CC=arm-linux-gnueabihf-gcc		
    CFLAGS += -I/.../libnl-3.2.23/install/include/libnl3
    CFLAGS += -I/.../openssl-1.0.1g/install/include
    LIBS += -L/.../libnl-3.2.23/install/lib
    LDFLAGS += -L/.../libnl-3.2.23/install/lib
    LIBS += -L/.../openssl-1.0.1g/install/lib
    LDFLAGS += -L/.../openssl-1.0.1g/install/lib
  • CONFIG_LIBNL32=y注释去掉,使得hostapd编译自动寻找libnl3的库

  1. 保存.congfig,执行make开始编译
  2. 没有错误提示情况下,在源码路径可以找到hostapdhostapd_cli两个可执行文件,将它们全部复制到Zybo文件系统的/bin路径下面

RTL8812au驱动移植

  • 版本:4.3.20
  • 下载:git clone git@github.com:fangzr/rtl8812au.git
编译步骤
  1. 解压源码包,在此路径打开终端,修改Makefile两处地方,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #其余的Platform必须为n
    CONFIG_PLATFORM_GENERIC = y

    ifeq ($(CONFIG_PLATFORM_GENERIC), y)
    EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
    EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
    #SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/armv.*/arm/)
    ARCH :=arm
    CROSS_COMPILE :=arm-linux-gnueabihf-
    KVER := 4.90
    #这里填写你的内核源码路径
    KSRC := /.../linux-digilent
    MODULE_NAME :=wlan0
    endif
  2. make开始编译,编译完成后得到wlan0.ko文件

  3. wlan0.ko上传到文件系统某个文件夹待用

网络配置

把交叉编译得到的可执行文件、头文件、库文件都上传到开发板对应位置后,可以开始实现WiFi热点的最后一步。

  1. 加载RTL8812au驱动
    insmod /etc/wlan1.ko
    打印消息:

    1
    2
    3
    4
    5
    6
    7
    root@Zybo:~# insmod /etc/wlan0.ko                                               
    wlan0: loading out-of-tree module taints kernel.
    RTL871X: module init start
    RTL871X: rtl8812au v4.3.20_16317.20160108
    RTL871X: build time: Apr 28 2019 20:04:05
    usbcore: registered new interface driver rtl8812au
    RTL871X: module init ret=0
  2. 插上无线网卡,打印消息

    1
    2
    usb 1-1: new high-speed USB device number 3 using ci_hdrc                       
    RTL871X: rtw_ndev_init(wlan0) if1 mac_addr=00:0f:00:73:76:b3
  3. 编写hostapd配置文件
    vim /etc/hostapd.conf
    我们配置一个最简单的无线热点,不加密

    1
    2
    3
    4
    5
    6
    7
    interface=wlan0
    driver=nl80211
    ssid=WiFi_AP_Name
    channel=6
    hw_mode=g
    wpa=0
    bridge=br0

4.输入以下命令

1
2
3
4
5
ifconfig wlan0 up
brctl addbr br0
brctl addif br0 eth0
ifconfig br0 up
hostapd -dd /etc/hostapd.conf

此时你应该可以用手机连接热点了。

Note:

  • 设置WiFi密码、修改为5G频带直接修改hostapd.conf即可
  • 试着输入iwlist wlan0 scanning,可以使WiFi工作在STA模式

附录


minicom配置以及使用

Linux下的Minicom的功能与Windows下的超级终端功能相似,可以通过串口控制外部的硬件 设备.适于在linux通过超级终端对嵌入式设备行管理.同样也可以使用minicom对外置Modem进行控制

安装

终端下输入sudo apt install minicom

配置
  1. 终端下输入sudo minicom -s
  2. 键盘上下移动选择Serial port setup
  3. 按下ASerial Device改成/dev/ttyUSB1,回车保存
  4. 返回configuration,选择Save setup as dfl
  5. 按下Esc退出
使用
  1. 将开发板数据线连接电脑
  2. 终端下输入sudo minicom
  3. 看到打印消息即为正常使用
Troubleshooting
问题 解决办法
minicom: cannot open /dev/ttyUSB1: 没有那个文件或目录 检查开发板是否开启且连接正常
Device /dev/USB1 is locked minicom 进入/var/lock,删除lockfile
minicom键盘无法输入,仿佛界面卡住在某一条指令下面 1. Ctrl-A -> O -> Serial Port Setup -> Hardware flow control,Hardware flow应该为No 2.检查数据线是否松动

上传文件到文件系统

SSH的方式
电脑终端操作
Zybo终端操作
  1. 修改/etc/network/interfaces

    1
    2
    3
    4
    5
    6
    7
    # Wired or wireless interfaces
    auto eth0
    iface eth0 inet static
    address 192.168.100.102
    netmask 255.255.255.0
    gateway 192.168.100.1
    iface eth1 inet dhcp
  2. 重启网络
    /etc/init.d/networking restart

  3. udhcpd配置,必须让PC分配到同一个网络的ip地址
    输入vim /etc/udhcpd.conf写入以下内容保存,再输入udhcpd /etc/udhcpd.conf
1
2
3
4
5
6
7
8
9
10
11
start    192.168.100.101
end 192.168.100.254

interface eth0
#Examles
option subnet 255.255.255.0
opt router 192.168.100.1
opt wins 192.168.100.1
option dns 192.168.100.1
option domain local
option lease 864000

这时候PC应该已经可以建立连接了。在pc端输入ifconfig,可以观察到以太网口如下信息,注意到自动分配的ip地址为192.168.100.101

1
2
3
4
5
6
7
8
enp2s0    Link encap:以太网  硬件地址 9c:5c:8e:10:89:a9  
inet 地址:192.168.100.101 广播:192.168.100.255 掩码:255.255.255.0
inet6 地址: fe80::59ee:d5c1:d35d:fe98/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 跃点数:1
接收数据包:1640714 错误:0 丢弃:1 过载:0 帧数:0
发送数据包:921840 错误:0 丢弃:0 过载:0 载波:0
碰撞:0 发送队列长度:1000
接收字节:2111663333 (2.1 GB) 发送字节:142924645 (142.9 MB)

PC上传文件到Zybo

语法:scp 要上传的文件路径 root@目标主机ip:目标地址
example:

1
2
3
fangzr@fangzr-X555LB:~$ scp /home/fangzr/桌面/编译结果/交叉编译包/hostapd-2.6.tar.gz  root@192.168.100.102:/tmp/
root@192.168.100.102's password:
hostapd-2.6.tar.gz 100% 1780KB 1.7MB/s 00:00


直接通过SD读卡器修改
  • 这种方法比较SSH传输简单便捷,无需修改interface文件。因为Zybo连接外网还是要修改为dhcp
  1. 取出SD卡,插入读卡器
  2. 修改文件系统分区所有者以及权限
    example:

    1
    2
    sudo chown -R 非root用户名:非root用户名 SD卡文件系统路径
    sudo chmod 777 SD卡文件系统路径
  3. 直接复制粘贴文件即可,注意拔下SD卡前要选择弹出


下载Github源码

方法一

直接在仓库界面点击左面绿色按钮Clone or download然后下载ZIP压缩包

方法二(推荐)
  1. 注册github账户
  2. 上传本地ssh公钥(没有请先生成ssh公钥)
  3. 在要保存源码的文件路径下clone
    git clone git@github.com: ******

参考网址

  1. petalinux+usb wifi+驱动安装+工具使用
    https://blog.csdn.net/gdlituo/article/details/51789855

  2. 基于Zynq的RT3070 WIFI + hostapd 实现Wifi和WifiAP https://blog.csdn.net/chuhang_zhqr/article/details/52507185

  3. hostapd v2.6 交叉编译及测试
    https://blog.csdn.net/BHJ1119/article/details/80414989

  1. brctl 命令详解
    https://www.cnblogs.com/xieshengsen/p/5857415.html

  2. RT5572N WIFI AP 模式调试
    http://wiki.lemaker.org/RT5572N/zh-hans