Wi-Fi
概述
该芯片包含三个内核:
LP: 低功耗处理器,KM0 和 Wi-Fi 固件在其上运行。
NP: 网络处理器、KM4 和 Wi-Fi 驱动程序可以在它上面工作。
AP: 应用处理器 CA32 和 FullMAC 可以在它上面工作。FullMAC 驱动程序是 Linux 内核中的 cfg80211 和 FreeRTOS 中的 Wi-Fi Driver 之间的自适应驱动程序。
架构
FullMAC 是基于 CFG80211 接口的新型 Wi-Fi 驱动程序。所以它支持 wpa_supplicant、hostapd、iwconfig 等。驱动程序使用 IPC 消息将命令发送到 KM4 上的 IPC INIC 设备,并从 IPC INIC 设备接收事件。因此,FullMAC 驱动程序会将命令和结构从 CFG80211 转换为 IPC INIC 命令和数据类型,来自 IPC INIC 设备的事件也会转换为 CFG80211 格式并报告给 Linux 内核。
FullMAC 驱动程序中有两条 IPC 消息。一个是 API 消息,另一个是数据消息。API 消息用于发送命令或接收事件以管理 Wi-Fi。数据消息用于发送或接收 Wi-Fi 的数据帧。所以前者是低速,后者是高速。
配置
内核配置
在 project 的 build 目录下执行以下命令,打开 kernel 的配置。
bitbake virtual/kernel -c menuconfig
启用 Ameba IPC
Linux 中的 Wi-Fi 驱动程序是基于 Ameba IPC 的驱动程序,因此必须为 IPC 的驱动程序启用 Wi-Fi 驱动程序。当然,如果您选择 Fullmac for rtl8730e
为 yes
,则此选项已启用。
Device Drivers --->
<*> Drivers for Realtek --->
[*] Ameba IPC
启用 CFG80211
此配置是基于 cfg80211 的 Wi-Fi 驱动程序的基础,默认情况下处于启用状态。
[*] Networking support --->
-*- Wireless --->
<*> cfg80211 - wireless configuration API
[*] enable powersave by default
[*] support CRDA
[*] cfg80211 wireless extensions compatibility
启用 FullMAC 驱动程序
该配置用于在 Linux 内核中开启 Wi-Fi 驱动,默认开启。
Device Drivers --->
<*> Drivers for Realtek --->
<*> CFG80211 WiFi FULLMAC drivers --->
<*> Fullmac for rtl8730e
函数
Wi-Fi 驱动程序中只有两个端口,wlan0
和 wlan1
。wlan0
必须仅在工作站模式下工作,并且 wlan1
必须仅在接入点 (AP) 模式下工作。
Supplicant 和 Hostap
这是 NL80211 版本的驱动程序,支持 wpa_supplicant 和 hostapd。
站点模式
wpa_supplicant
wpa_supplicant 是一个跨平台的客户端程序,支持 WPA、WPA2 和 WPA3 (IEEE 802.11i)。它是用于客户端站点的 IEEE 802.1X/WPA 组件。该程序实现了与 WPA 认证服务器的密钥协商,控制无线驱动的漫游以及 IEEE 802.11 的认证/关联。
wpa_supplicant.conf
wpa_supplicant 的配置使用一个文本文件,该文件列出了所有可接受的网络和安全策略,包括预共享密钥。有关配置格式和支持的字段的详细信息,请参阅示例配置文件,文件可能位于 /etc/wifi
中。
该配置文件中的所有文件路径应使用完整(绝对路径,而不是相对于工作目录的路径),以便允许更改工作目录。如果 wpa_supplicant 在后台运行,这种情况可能会发生。
可以通过向 wpa_supplicant 发送 SIGHUP 信号(killall -HUP wpa_supplicant
)来重新加载配置文件的更改。同样,可以使用 wpa_cli 的 reconfigure 命令触发重新加载。
配置文件可以包含一个或多个网络块,例如,每个使用的 SSID 都对应一个网络块。wpa_supplicant 将根据配置文件中网络块的顺序、网络安全级别(优先选择 WPA/WPA2)和信号强度自动选择最佳网络。
下面的示例是两个网络配置示例:一个是家庭网络使用的 WPA-Personal(PSK),另一个是工作网络使用的 EAP-TLS 的 WPA-Enterprise。
# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel
#
# home network; allow all valid ciphers
update_config=1
wowlan_triggers=any
network={
ssid="home"
scan_ssid=1
key_mgmt=WPA-PSK
psk="very secret passphrase"
}
#
# work network; use EAP-TLS with WPA; allow only CCMP and TKIP ciphers
network={
ssid="work"
scan_ssid=1
key_mgmt=WPA-EAP
pairwise=CCMP TKIP
group=CCMP TKIP
eap=TLS
identity="user@example.com"
ca_cert="/etc/cert/ca.pem"
client_cert="/etc/cert/user.pem"
private_key="/etc/cert/user.prv"
private_key_passwd="password"
}
如果需要保存配置,应在 /etc/wifi/wpa_supplicant.conf
中添加 update_config=1
,或者使用命令 wpa_cli -i wlan0 set update_config 1
。
如果需要启用 wowlan 功能,应在 /etc/wifi/wpa_supplicant.conf
中添加 wowlan_triggers=any
,或者使用命令 wpa_cli -i wlan0 set wowlan_triggers any
。否则,客户端将在进入挂起状态时与 AP 断开连接。
执行 wpa_supplicant
以下命令可以在 nl80211 接口和 wlan0 端口上运行 wpa_supplicant。它将使用配置文件 /etc/wifi/wpa_supplicant.conf
并在后台运行。
wpa_supplicant -D nl80211 -i wlan0 -c /etc/wifi/wpa_supplicant.conf -B
更多细节,请参考 wpa_supplicant --help
或者 wpa_supplicant wiki 。
wpa_cli
wpa_cli 是一个用于与 wpa_supplicant 交互的基于文本的前端程序。它用于查询当前状态、更改配置、触发事件以及请求用户交互输入。
wpa_cli 可以显示当前的认证状态、选定的安全模式、dot11 和 dot1x MIB 等。此外,它还可以配置一些变量,如 EAPOL 状态机参数,并触发事件,如重新关联和 IEEE 802.1X 登出/登录。 wpa_cli 提供了一个用户界面,用于请求认证信息,如用户名和密码,如果这些信息未包含在配置中。可以使用它来实现一次性密码或通用令牌卡认证,其中认证基于质询-响应,并使用外部设备生成响应。
wpa_supplicant 的控制接口可以配置为允许非 root 用户访问(在配置文件中使用 ctrl_interface GROUP 参数)。这使得可以用普通用户账户运行 wpa_cli。
wpa_cli 支持两种模式:交互模式和命令行模式。两种模式使用相同的命令集,主要区别在于交互模式可以访问非请求消息(事件消息、用户名/密码请求)。
当不将命令作为命令行参数包含在内时, wpa_cli 会启动交互模式。此时,可以在 wpa_cli 提示符下输入命令。在命令行模式下,相同的命令被作为命令行参数输入给 wpa_cli。
更多细节请参考 wpa_cli 。
扫描
有两种基于 STA_WLAN 的扫描方式。
使用 iw 扫描
以下命令用于扫描 wlan0。
iw wlan0 scan
下图显示了上述命令的结果。它打印了扫描到的接入点的详细信息。

Scan with wpa_cli
以下命令用于扫描 wlan0 并获取扫描结果。
wpa_cli -i wlan0 scan
wpa_cli -i wlan0 scan_result
下图显示了上述命令的结果。它打印了扫描到的接入点的详细信息。

设置 ssid 与密码
以下命令用于在 wlan0 上设置 SSID 和密码。
wpa_cli -i wlan0
add_network
set_network <network_id> ssid "ssid"
set_network <network_id> psk "password"
如果接入点是隐藏的,则需要使用以下命令:
set_network <network_id> scan_ssid 1
或者,在隐藏接入点的 wpa_supplicant.conf
文件中添加 scan_ssid=1
。
下图展示了成功设置 SSID 为 MERCURY_1200_W6
和密码为 12345678
的过程。
备注
输入 wpa_cli -i wlan0
将进入 wpa_cli 的控制台,所有操作都将在 wlan0 上进行。使用 quit
命令可以退出 wpa_cli 的控制台。

连接
下面的命令用于启用网络并选择要连接的网络。
enable_network <network_id>
select_network <network_id>
备注
如果网络存储在 wpa_supplicant.conf
中,那么在运行 wpa_supplicant 后,WiFi 应自动连接到该网络。
连接到 WEP 接入点
wpa_supplicant
对于 WEP,可以使用以下命令配置 WEP SSID 并连接 WEP 接入点(AP)。
# Open WEP key connection (two-message auth; no WPA, no IEEE 802.1X)
set_network id key_mgmt NONE
set_network id wep_key0 "abcde" // ASCII 64bit
set_network id wep_key1 1234567890 // hex 64bit
set_network id wep_key2 "1234567890123" // ASCII 128bit
set_network id wep_tx_keyidx 0 // key id
# Shared WEP key connection (four-message auth; no WPA, no IEEE 802.1X)
set_network id key_mgmt NONE
set_network id wep_key0 "abcde" // ASCII 64bit
set_network id wep_key1 1234567890 // hex 64bit
set_network id wep_key2 "1234567890123" // ASCII 128bit
set_network id wep_tx_keyidx 0 // key id
set_network id auth_alg SHARED
另一方面,这些命令可以用 wpa_supplicant.conf
中的以下配置代替。
# Open WEP key connection (two-message auth; no WPA, no IEEE 802.1X)
network={
ssid="static-wep-test"
key_mgmt=NONE
wep_key0="abcde" #ASCII 64bit
wep_key1=1234567890 # hex 64bit
wep_key2="1234567890123" #ASCII 128bit
wep_tx_keyidx=0 #key id
priority=5
}
# Shared WEP key connection (four-message auth; no WPA, no IEEE 802.1X)
network={
ssid="static-wep-test"
key_mgmt=NONE
wep_key0="abcde" #ASCII 64bit
wep_key1=1234567890 # hex 64bit
wep_key2="1234567890123" #ASCII 128bit
wep_tx_keyidx=0 #key id
priority=5
auth_alg=SHARED
}
iwconfig
对于 WEP,可以使用以下命令连接 WEP 接入点(AP)。
iwconfig wlan0 key [id] hex //hex
iwconfig wlan0 key s:password [id] // ASCII
iwconfig wlan0 key [id] //choose psk id.
iwconfig wlan0 essid "ssid" //set ssid and connect
更多细节,请参考 iwconfig_8 。
使用 WPS 连接
对于 WPS,当接入点支持并启用相关功能时,可以使用以下命令。
备注
根据规范,WPS 不支持 WPA3 Wi-Fi 安全性。
WPS PBC
执行以下命令,并在两分钟内按下路由器上的按键,然后网络配置将从接入点接收并存储在 wpa_supplicant.conf
中。
wpa_cli -i wlan0 wps_pbc [BSSID]
备注
当有不止一个客户端或接入点处于 PBC 状态时,可能会失败。

WPS PIN - 客户端 PIN 码
执行以下命令,你将获得一个 PIN 码,或者在这个命令中使用指定的 PIN 值。在路由器中输入该 PIN 码,然后网络配置将从接入点接收并存储在 wpa_supplicant.conf
中。
wpa_cli -i wlan0 wps_pin <BSSID | any> [pin_number]
备注
在命令中使用的指定 PIN 码必须通过界面处理,以去除非数字字符,并可能需要验证校验位。可以使用以下命令进行这样的处理。
wpa_cli wps_check_pin <PIN>


WPS PIN - Router pin
启用路由器的 PIN 功能,并从网页界面或路由器上的标签获取 BSSID 或路由器的 PIN 值,使用以下命令连接接入点。
wpa_cli -i wlan0 wps_reg <BSSID > <AP PIN>

更多细节,请参考 WPS 。
断开与重连
以下命令用于断开网络连接。
disconnect
以下命令用于重新连接网络。
reconnect
下图显示了先断开网络 1,然后成功重新连接它的流程。

DHCP
dhcpcd wlan0
用于从 AP 的 DHCP 服务器获取 IP 地址。下图显示了运行 DHCP 客户端并获取 IP 192.168.1.101
的示例。

SoftAP 模式
hostapd
hostapd(主机接入点守护进程)是一种用户空间守护进程软件,使网络接口卡能够充当接入点和认证服务器。
hostapd.conf
hostapd.conf
是 hostapd 的配置文件,通常存储在 /etc
目录中。它包含 SoftAP 的参数。
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
ctrl_interface=/var/run/hostapd
hw_mode=g
channel=1
ssid=sqb_test
beacon_int=100
dtim_period=1
max_num_sta=20
rts_threshold=2347
fragm_threshold=2346
ieee80211n=1
erp_send_reauth_start=1
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa_passphrase=12345678
上面的文件是 hostapd.conf
的一个示例,它设置了 SSID 为 sqb_test
和密码为 12345678
。有关更多详细信息,请参考 hostapd wiki 。
执行 hostapd
以下命令可以在后台运行 hostapd,并在 wlan1 上启动 softap。
hostapd /etc/hostapd.conf -B -i wlan1
下图显示了成功启动 softap。

备注
无论是 wlan0 还是 wlan1 都可以作为 softap 运行。如果一个端口作为 softap 工作,而另一个作为站点工作,则 WiFi 正在以并发模式运行。
DHCP 服务器
流程如下所示。
ifconfig wlan1 192.168.43.1
udhcpd -S /etc/udhcpd.conf
测试
环境
站点测试环境
备注
AP: 支持 11 a/b/g/n 的带有 WiFi AP 的路由器。
PC: 一台通过以太网线连接到 AP 的 LAN 端口的电脑。
DUT: 用于测试的设备应为 Ameba 智能板。它将通过无线连接到 AP,并通过串口线连接到电脑。
电脑可以通过串口线的控制台来控制被测设备(DUT)。
Softap 测试环境

备注
PC: 一台配备支持 11 a/b/g/n 的 WiFi 网卡的电脑。
DUT: 用于测试的设备应为 Ameba 智能板。它将通过无线和串口线连接到电脑。
电脑可以通过串口线的控制台来控制被测设备(DUT)。
Ping 测试
系统中的 ping
是 Linux 的经典 ping 工具,使用 ping -h
可以获取帮助信息。下图显示了对 192.168.39.2
的 ping 操作,没有出现数据包丢失。

吞吐量测试
该系统支持使用 iperf3
来测试 Wi-Fi 的吞吐量,而 iperf3
是 Linux 中的经典工具。可以使用 iperf3 -h
获取帮助信息。
# To run as a server, UPD or TCP:
iperf3 -s -i 1
# To run as a client of TCP:
iperf3 -c ip_of_server -i 1 -t count
# To run as a client of UDP:
iperf3 -c ip_of_server -i 1 -t count -u -b bandwidth
备注
ip_of_server 是服务器的 IP 地址。
计数的单位是秒。
带宽的单位应为 K、M 或 G。官方 Windows 版本的 iperf3 二进制文件存在一些错误,所以带宽应设置为 WiFi 实际带宽的限制。

TP for TCP TX

TP for TCP RX

TP for UDP TX

TP for UDP RX
DNS 测试
以下命令可以将 AP_IP 添加为 Linux 的 DNS 服务器。
echo "nameserver AP_IP" >> /etc/resolv.conf
下图展示了 ping www.baidu.com 的结果。

IP 转发
以下命令可以设置转发。连接到 SoftAP 的 DUT 可以 ping 通过 wlan0 连接的 AP。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Adb shell
如果要使用 adb 功能,则应在开发板上执行 usb.sh adb
以初始化 USB adb 功能。然后在 PC 上输入 adb shell 以连接到开发板。
下图显示成功连接开发板并进入 adb shell
。

调试
请参考 Trace Tool 的章节。