openwifi
openwifi: 基于SDR(软件定义无线电)的Linux mac80211兼容全栈IEEE802.11/Wi-Fi设计。
[下载镜像和快速开始] [Windows用户提示]
本仓库包含Linux驱动和软件。openwifi-hw仓库包含FPGA设计。您有责任遵守当地频谱法规或使用有线连接以避免潜在的无线干扰。
[项目文档] [应用说明] [视频] [出版物和如何引用] [邮件列表]
Openwifi代码采用双重许可。AGPLv3是开源许可。非开源和高级功能许可请联系Filip.Louagie@UGent.be。Openwifi项目还利用了一些第三方模块。用户有责任根据使用目的/用途检查并遵守这些模块的许可。您可以查看Analog Devices的示例说明了解这些复合许可条件。[如何贡献]。
特性:
- 802.11a/g/n [IEEE 802.11n (Wi-Fi 4)]
- 20MHz带宽;70 MHz到6 GHz频率范围
- 已测试模式:Ad-hoc;Station; AP,Monitor
- DCF (CSMA/CA) 低MAC层在FPGA中实现(实现10us SIFS)
- 802.11数据包注入和模糊测试
- CSI:信道状态信息、频偏、均衡器传输到计算机
- CSI模糊器:在WiFi发射机中创建人工信道响应
- CSI雷达:移动检测。联合雷达和通信
- [IQ捕获]:实时AGC、RSSI、IQ采样传输到计算机。[双天线版本]
- 可配置信道接入优先级参数:
- CCA阈值、接收器灵敏度等
- RTS/CTS、CTS-to-self的持续时间
- SIFS/DIFS/xIFS/时隙时间/CW等
- 基于MAC地址的时间切片(时间门控/调度的FPGA队列)
- 轻松更改带宽和频率:
- 亚GHz频段的802.11ah使用2MHz
- 5.9GHz的802.11p/车载使用10MHz
- 802.11ax正在开发中
性能(最佳情况:聚合/AMPDU开启):
- iperf:TCP 40~50Mbps;UDP 50Mbps
- EVM -38dB;MCS0灵敏度-92dBm;MCS7 -73dBm。(FMCOMMS2 2.4GHz;有线和OTA测试)
支持的SDR平台:
开发板名称 | 描述 | Vivado许可证 |
---|---|---|
zc706_fmcs2 | Xilinx ZC706开发板 + FMCOMMS2/3/4 | 需要 |
zed_fmcs2 | Xilinx zed开发板 + FMCOMMS2/3/4 | 不需要 |
adrv9364z7020 | ADRV9364-Z7020 + ADRV1CRR-BOB | 不需要 |
adrv9361z7035 | ADRV9361-Z7035 + ADRV1CRR-BOB/FMC | 需要 |
zc702_fmcs2 | Xilinx ZC702开发板 + FMCOMMS2/3/4 | 不需要 |
antsdr | MicroPhase 增强版ADALM-PLUTO [说明](https://github.com/open-sdr/openwifi/blob/master/kernel_boot/boards/antsdr/notes.md | 不需要 |
e310v2 | MicroPhase 新版antsdr [说明](https://github.com/open-sdr/openwifi/blob/master/kernel_boot/boards/e310v2/README.md | 不需要 |
antsdr_e200 | MicroPhase 增强版ADALM-PLUTO(更小/更便宜)[说明](https://github.com/open-sdr/openwifi/blob/master/kernel_boot/boards/antsdr_e200/README.md | 不需要 |
sdrpi | HexSDR 树莓派大小的SDR [说明](https://github.com/open-sdr/openwifi/blob/master/kernel_boot/boards/sdrpi/notes.md | 不需要 |
zcu102_fmcs2 | Xilinx ZCU102开发板 + FMCOMMS2/3/4 | 需要 |
neptunesdr | 低成本Zynq 7020 + AD9361开发板 | 不需要 |
- 如果您的新开发板不在列表中,请查看移植指南。
- 开发板名称用于识别openwifi-hw/boards/中的FPGA设计和openwifi-hw-img/boards中的FPGA镜像。
- 没有任何开发板?或者您更喜欢JTAG启动而不是SD卡?请查看我们的测试平台w-iLab.t教程。
[下载镜像和快速开始] [基本操作] [更新FPGA] [更新驱动程序] [更新sdrctl] [便捷访问等]
[从头构建openwifi Linux镜像] [11b特别说明] [移植指南] [项目文档] [应用说明]
下载镜像和快速开始
-
下载 openwifi 镜像,解压后烧录到 SD 卡(>=16GB)。完成后,SD 卡应有两个分区:BOOT 和 rootfs。可以使用 SD 卡工具软件(如 Ubuntu 中的 Startup Disk Creator)或 dd 命令刷写 SD 卡:
sudo dd bs=512 count=31116288 if=openwifi-xyz.img of=/dev/your_sdcard_dev (为确保 count 值正确,最好用 "fdisk -l img_filename" 检查 .img 文件的实际情况)
-
根据你的开发板型号,在电脑上正确配置 BOOT 分区中的文件:
- 将 BOOT/openwifi/board_name 中的文件复制到 BOOT 分区的根目录。
- 删除 rootfs/root/kernel_modules 目录(如果存在)。
- 删除 rootfs/etc/network/interfaces.new 目录(如果存在)。
-
将 SD 卡插入开发板。将开发板设置为从 SD 卡启动模式。连接天线。开机。
-
从你的电脑(电脑以太网 IP 应为 192.168.10.1)登录开发板,密码为 openwifi。
ssh root@192.168.10.122
-
如果登录失败,请查看已知问题
-
然后,运行 openwifi AP 和板载 Web 服务器
raspi-config --expand-rootfs (仅当 SD 卡 > 16GB 时需要。运行后重启) ./openwifi/setup_once.sh (重启开发板。新开发板只需运行一次) cd openwifi ./wgd.sh ./fosdem.sh (使用 "./wgd.sh 1" 可在 11n 基础上启用实验性的 AMPDU 聚合) (使用 "./fosdem-11ag.sh" 可强制使用 11a/g 模式)
注意 adrv9361z7035 在 5GHz 下发射功率极低。使用该开发板在 5GHz 下时请靠近!!!
-
当你的设备(手机/笔记本等)看到 "openwifi" SSID 后,连接它(如果没有自动获取到 192.168.13.* 的 IP,请查看已知问题。在设备上浏览 192.168.13.1,你应该能看到开发板上 Web 服务器托管的网页。
- 注 1:如果你的设备不支持 5GHz(ch44),请修改开发板上的 hostapd-openwifi.conf 并重新运行 fosdem.sh。
- 注 2:约 2 小时后,维特比解码器会停止(Xilinx 评估许可)。只需重新加载 FPGA(方法)或简单地重启开发板即可。(如果 "./sdrctl dev sdr0 get reg rx 20" 的输出始终相同,则表示解码器已停止)
-
要给 Wi-Fi 客户端提供互联网访问,请在电脑上配置路由/NAT:
sudo sysctl -w net.ipv4.ip_forward=1 sudo iptables -t nat -A POSTROUTING -o NICY -j MASQUERADE sudo ip route add 192.168.13.0/24 via 192.168.10.122 dev ethX
ethX 是连接开发板以太网的电脑网卡名。NICY 是连接互联网的电脑网卡名(Wi-Fi 或另一个以太网)。
如果需要,可以在 /etc/sysctl.conf 中取消注释 "net.ipv4.ip_forward=1" 以使 IP 转发在电脑上持久化。
-
要监控实时 CSI(芯片状态信息),如时间戳、频率偏移、信道状态、均衡器等,请参考 CSI 说明。
基本操作
该开发板实际上是一台 Linux/Ubuntu 计算机,运行 hostapd 通过 Wi-Fi 网络接口(NIC)提供 Wi-Fi AP 功能。该 NIC 由 openwifi-hw FPGA 设计实现。我们使用术语**"开发板上"表示命令应在 ssh 登录开发板后执行。"电脑上"**表示命令应在电脑上运行。
- 启动 openwifi NIC sdr0:
cd ~/openwifi && ./wgd.sh (使用 "./wgd.sh 1" 可启用实验性的 AMPDU 聚合)
- 使用 openwifi 作为客户端连接其他 AP(首先修改开发板上的 wpa-connect.conf):
route del default gw 192.168.10.1 wpa_supplicant -i sdr0 -c wpa-connect.conf & dhclient sdr0
- 在 ad-hoc 模式下使用 openwifi:请查看 sdr-ad-hoc-up.sh、sdr-ad-hoc-join.sh 和此应用说明。
- 在监听模式下使用 openwifi:请查看 monitor_ch.sh 和此应用说明。
- Linux 原生 Wi-Fi 工具/应用(iwconfig/ifconfig/iwlist/iw/hostapd/wpa_supplicant 等)可以像使用商业 Wi-Fi 芯片一样在 openwifi NIC 上运行。
- sdrctl 是一个专门用于访问 openwifi 驱动程序/FPGA 的工具,更多信息请查看项目文档。
更新 FPGA
由于预构建的 SD 卡镜像可能没有最新的错误修复/更新,建议始终将 user_space 目录中的最新文件复制到开发板上。然后按照此应用说明的快速开始部分更新 FPGA 和驱动程序。以下说明与之相同,但提供了额外的环境设置信息。
(查看驱动程序和 FPGA 动态重载应用说明以更好地理解如何在不重启/断电的情况下更新 FPGA 和驱动程序文件)
- 安装Vivado 2021.1。确保同时安装Vitis。你应该有这个目录:your_Xilinx_install_directory/Vitis(不是Vitis_HLS!)
- 如果没有安装Vitis,你可以通过在操作系统开始菜单的Xilinx程序组/菜单中运行"Xilinx Design Tools --> Add Design Tools for Devices 2021.1"来添加它。
- 设置环境变量(使用绝对路径):
export XILINX_DIR=你的Xilinx安装目录 (例如:export XILINX_DIR=/opt/Xilinx。Xilinx目录应包含如Downloads、Vitis等内容) export OPENWIFI_HW_IMG_DIR=你的openwifi-hw-img目录 (通过git clone获取open-sdr/openwifi-hw-img仓库的目录) export BOARD_NAME=你的板卡名称
- 从openwifi-hw-img中选择FPGA比特流,生成system_top.bit.bin并通过ssh通道传输到板上:
cd openwifi/user_space; ./boot_bin_gen.sh $XILINX_DIR $BOARD_NAME $OPENWIFI_HW_IMG_DIR/boards/$BOARD_NAME/sdk/system_top.xsa scp ./system_top.bit.bin root@192.168.10.122:openwifi/
- 现在system_top.bit.bin已经在板上的/root/openwifi/目录中。当从该目录运行wgd.sh时,它会发现FPGA镜像文件system_top.bit.bin并在加载驱动.ko文件之前加载它。
更新驱动
由于预构建的SD卡镜像可能没有最新的错误修复/更新,建议始终将user_space目录中的最新文件复制到板上。然后根据此应用说明的快速入门更新FPGA和驱动程序。以下说明执行相同的操作,并提供有关环境设置的额外信息。
(查看驱动程序和FPGA动态重载应用说明以更好地理解如何在不重启/断电的情况下更新FPGA和驱动程序文件)
-
准备Analog Devices Linux内核源代码(只需运行一次):
sudo apt install flex bison libssl-dev device-tree-compiler u-boot-tools -y cd openwifi/user_space; ./prepare_kernel.sh $XILINX_DIR ARCH_BIT (对于Zynq 7000,ARCH_BIT应为32,对于Zynq MPSoC,ARCH_BIT应为64)
-
编译最新的openwifi驱动程序
cd openwifi/driver; ./make_all.sh $XILINX_DIR ARCH_BIT (对于Zynq 7000,ARCH_BIT应为32,对于Zynq MPSoC,ARCH_BIT应为64) (超过上述两个参数的更多参数(最多5个)将被转换为pre_def.h中的"#define 参数"用于条件编译)
-
通过ssh通道将驱动程序文件复制到板上
cd openwifi/driver; scp `find ./ -name \*.ko` root@192.168.10.122:openwifi/
现在你可以在板上使用wgd.sh来加载新的openwifi驱动程序。如果同一目录中存在system_top.bit.bin,wgd.sh也会尝试重新加载FPGA镜像。 在驱动程序和FPGA动态重载应用说明中查找更多信息。
注意:如果在加载驱动程序时遇到符号或版本错误,可能是因为SD卡镜像中的内核太旧。在这种情况下,你需要将prepare_kernel.sh生成的Linux内核镜像(参见[更新驱动程序])放入SD卡的BOOT分区。内核镜像文件名:adi-linux/arch/arm/boot/uImage(32位);adi-linux-64/arch/arm64/boot/Image(64位)。
更新sdrctl
- 通过ssh通道将sdrctl源文件复制到板上
cd openwifi/user_space/sdrctl_src; scp `find ./ -name \*` root@192.168.10.122:openwifi/sdrctl_src/
- 在板上编译sdrctl:
cd ~/openwifi/sdrctl_src/ && make clean && make && cp sdrctl ../ && cd ..
便捷访问等
- 查看驱动程序和FPGA动态重载应用说明以了解更方便的方式更新FPGA和驱动程序文件,无需重启/断电。
- 板上FPGA和驱动程序更新脚本
- 在PC上设置ftp服务器,允许匿名访问并将ftp根目录更改为openwifi目录。
- 在板上:
./sdcard_boot_update.sh $BOARD_NAME (上述命令下载uImage、BOOT.BIN和devicetree.dtb,然后将它们复制到引导分区。记得断电重启) ./wgd.sh remote (上述命令下载驱动程序文件,并启动sdr0)
- 像访问磁盘一样访问板的磁盘/根文件系统:
- 在PC上:"文件管理器 --> 连接到服务器...",输入:sftp://root@192.168.10.122/root
- 输入密码"openwifi"
从头构建openwifi Linux镜像
- 关于最新的ADI Kuiper镜像,请查看kuiper.md
11b特别说明
Openwifi仅使用OFDM作为其调制方案,因此不向后兼容802.11b客户端或操作模式。这通常发生在信标传输、连接建立和稳健通信期间。
作为解决这个问题的方法,openwifi只能在与使用hostapd/wpa_supplicant用户空间程序实例化的AP/客户端通信时得到完全控制。
对于hostapd程序,可以使用配置命令(即supported_rates、basic_rates)抑制802.11b速率,并提供了一个示例配置文件(即hostapd-openwifi.conf)。这个方法的一个小缺点来自于fullMAC Wi-Fi卡,因为它们必须在设备驱动程序级别实现NL80211_TXRATE_LEGACY NetLink处理程序。
另一方面,客户端(商业Wi-Fi dongle/板)上的wpa_supplicant程序在2.4GHz频段中无法直接抑制802.11b速率,因此在连接openwifi(仅OFDM)时会出现问题。应在客户端使用打过补丁的wpa_supplicant。
sudo apt-get install libssl1.0-dev
cd openwifi/user_space; ./build_wpa_supplicant_wo11b.sh
移植指南
本节通过展示openwifi和Analog Devices参考设计之间的差异来解释移植工作。openwifi基于HDL参考设计的2021_r1版本。
- 在hdl/projects/fmcomms2/zc706打开fmcomms2 + zc706参考设计(请阅读Analog Devices帮助)
- 在openwifi-hw/boards/zc706_fmcs2打开openwifi设计zc706_fmcs2(请阅读openwifi-hw仓库)
- "打开块设计",你将看到openwifi和参考设计之间的差异。这些差异体现在"图表"和"地址编辑器"中。
- 连接到ARM总线的FPGA块的地址/中断应放置/对齐到设备树文件openwifi/kernel_boot/boards/zc706_fmcs2/devicetree.dts中。Linux在启动时会解析devicetree.dtb以了解所连接设备(在我们的情况下是FPGA块)的信息。
- 我们使用dtc命令将Analog Devices Linux镜像中的devicetree.dtb转换为devicetree.dts,然后根据我们对参考设计的添加/修改进行相应的修改。
- 请学习[从头构建openwifi Linux镜像]中的脚本,以了解我们如何生成devicetree.dtb、BOOT.BIN、Linux内核,并将它们组合在一起构建完整的SD卡镜像。
许可证
本项目作为开源项目提供,遵循AGPL 3.0或更高版本的条款。然而,某些元素采用GPL 2-0或更高版本和BSD 3许可证授权。有关准确信息,请查看各个文件。