Wi-Fi 低功耗
概述
IEEE 802.11 规范中定义的 Wi-Fi STA 省电模式包括以下关键特性:
在未发送或接收数据时,进入休眠状态。
定期唤醒以接收 AP 的 Beacon 帧。
利用 Beacon 中的 TIM(Traffic Indication Map, 流量指示映射)进行数据管理。
站点休眠期间无法接收任何数据帧,因此 AP 需缓存待传数据帧,STA 需周期性唤醒检测信标帧。
Wi-Fi 省电模式的时序图如下:
基于上述标准 IEEE 802.11 省电机制,Ameba 系列 SoC 提供了三种 Wi-Fi 省电模式:
模式 |
全称 |
描述 |
|---|---|---|
IPS |
非活动省电模式 |
在未连接时实现完全断电状态 |
LPS |
传统省电模式 |
在 Wi-Fi 连接状态下,在活跃和休眠状态之间切换,并定期打开或关闭收发器以实现省电 |
WoWLAN |
无线局域网唤醒 |
允许 SoC 系统在保持 Wi-Fi 连接的同时进入睡眠模式
|
非活动省电模式(IPS)
非活动省电模式(Inactive Power Save,IPS)专为 Wi-Fi 未连接状态所设计,允许在没有网络连接时进入睡眠的状态,从而显著的延长电池续航的时间。
IPS 一般有两种睡眠层级:
Wi-Fi 完全断电,此时处于最大程度的 Wi-Fi 省电状态。
电源门控(Power Gating)模式,以求可以更快速的退出 IPS。
编程接口
Ameba Wi-Fi 通过 wifi_set_ips_internal() 函数及一组相关参数,来实现对 IPS 行为的控制。IPS 控制流程如下图所示:
参数 |
类型 |
取值 |
描述 |
默认值 |
|---|---|---|---|---|
ips_enable |
u8 |
0/1 |
关闭/使能 IPS |
1 |
ips_level |
u8 |
RTW_IPS_WIFI_OFF |
IPS 状态下 Wi-Fi 断电 |
RTW_IPS_WIFI_OFF |
RTW_IPS_WIFI_PG |
IPS 状态下 Wi-Fi 进入 PG 模式 |
|||
ips_ctrl_by_usr |
u8 |
0 |
结合 API 控制开关 IPS 机制 |
0 |
1 |
结合 API 控制进退 IPS 模式 |
参数 |
类型 |
取值 |
描述 |
默认值 |
|---|---|---|---|---|
ips_enable |
u8 |
0/1 |
关闭/使能 IPS |
1 |
ips_level |
u8 |
RTW_IPS_WIFI_OFF |
IPS 状态下 Wi-Fi 断电 |
RTW_IPS_WIFI_OFF |
RTW_IPS_WIFI_PG |
不支持 |
|||
ips_ctrl_by_usr |
u8 |
0 |
结合 API 控制开关 IPS 机制 |
0 |
1 |
结合 API 控制进退 IPS 模式 |
参数 |
类型 |
取值 |
描述 |
默认值 |
|---|---|---|---|---|
ips_enable |
u8 |
0/1 |
关闭/使能 IPS |
1 |
ips_level |
u8 |
RTW_IPS_WIFI_OFF |
IPS 状态下 Wi-Fi 断电 |
RTW_IPS_WIFI_OFF |
RTW_IPS_WIFI_PG |
不支持 |
|||
ips_ctrl_by_usr |
u8 |
0 |
结合 API 控制开关 IPS 机制 |
0 |
1 |
结合 API 控制进退 IPS 模式 |
参数 |
类型 |
取值 |
描述 |
默认值 |
|---|---|---|---|---|
ips_enable |
u8 |
0/1 |
关闭/使能 IPS |
1 |
ips_level |
u8 |
RTW_IPS_WIFI_OFF |
IPS 状态下 Wi-Fi 断电 |
RTW_IPS_WIFI_OFF |
RTW_IPS_WIFI_PG |
不支持 |
|||
ips_ctrl_by_usr |
u8 |
0 |
结合 API 控制开关 IPS 机制 |
0 |
1 |
结合 API 控制进退 IPS 模式 |
参数 |
类型 |
取值 |
描述 |
默认值 |
|---|---|---|---|---|
ips_enable |
u8 |
0/1 |
关闭/使能 IPS |
1 |
ips_level |
u8 |
RTW_IPS_WIFI_OFF |
IPS 状态下 Wi-Fi 断电 |
RTW_IPS_WIFI_OFF |
RTW_IPS_WIFI_PG |
不支持 |
|||
ips_ctrl_by_usr |
u8 |
0 |
结合 API 控制开关 IPS 机制 |
0 |
1 |
结合 API 控制进退 IPS 模式 |
参数 |
类型 |
取值 |
描述 |
默认值 |
|---|---|---|---|---|
ips_enable |
u8 |
0/1 |
关闭/使能 IPS |
1 |
ips_level |
u8 |
RTW_IPS_WIFI_OFF |
IPS 状态下 Wi-Fi 断电 |
RTW_IPS_WIFI_OFF |
RTW_IPS_WIFI_PG |
不支持 |
|||
ips_ctrl_by_usr |
u8 |
0 |
结合 API 控制开关 IPS 机制 |
0 |
1 |
结合 API 控制进退 IPS 模式 |
参数 |
类型 |
取值 |
描述 |
默认值 |
|---|---|---|---|---|
ips_enable |
u8 |
0/1 |
关闭/使能 IPS |
1 |
ips_level |
u8 |
RTW_IPS_WIFI_OFF |
IPS 状态下 Wi-Fi 断电 |
RTW_IPS_WIFI_OFF |
RTW_IPS_WIFI_PG |
不支持 |
|||
ips_ctrl_by_usr |
u8 |
0 |
结合 API 控制开关 IPS 机制 |
0 |
1 |
结合 API 控制进退 IPS 模式 |
参数 |
类型 |
取值 |
描述 |
默认值 |
|---|---|---|---|---|
ips_enable |
u8 |
0/1 |
关闭/使能 IPS |
1 |
ips_level |
u8 |
RTW_IPS_WIFI_OFF |
IPS 状态下 Wi-Fi 断电 |
RTW_IPS_WIFI_OFF |
RTW_IPS_WIFI_PG |
不支持 |
|||
ips_ctrl_by_usr |
u8 |
0 |
结合 API 控制开关 IPS 机制 |
0 |
1 |
结合 API 控制进退 IPS 模式 |
不同的组合方式功能参见如下表格:
ips_enable |
ips_ctrl_by_usr |
wifi_set_ips_internal |
行为 |
|---|---|---|---|
0 |
0 |
Y |
动态开关 IPS 机制
|
0 |
1 |
Y |
关闭 IPS 机制 |
0 |
X |
N |
关闭 IPS 机制 |
1 |
0 |
Y |
动态开关 IPS 机制
|
1 |
1 |
Y |
动态进退 IPS 模式
|
1 |
X |
N |
使能 IPS 机制
|
传统省电模式(LPS)
传统省电模式(Legacy Power Save,LPS)的核心思想是允许客户端在 Wi-Fi 连接状态且不存在无线数据传输的情况下进入睡眠状态,此时接入点(Access Point)为其缓存下行数据从而达到节省功耗的目的。
LPS 模式下,客户端需要周期性唤醒来接收 AP 的信标帧,并通过解析信标帧中流量指示图 (Traffic Indication Map) 元素获知是否存在自己的数据等待接收,若存在则保持清醒继续和 AP 进行数据交互。
参数 |
类型 |
取值 |
描述 |
默认值 |
|---|---|---|---|---|
lps_enable |
u8 |
0 / 1 |
关闭/使能 LPS |
1 |
lps_listen_interval |
u8 |
0 |
每个目标信标传输时间(Target Beacon Transmission Time)都唤醒来接收信标帧 |
0 |
> 0 |
配置接收信标帧的间隔,单位:102.4ms(TBTT 间隔) |
无线局域网唤醒模式(WoWLAN)
无线局域网唤醒模式(Wake on Wireless LAN,WoWLAN)下系统空闲时整个 SoC 进入 低功耗睡眠模式 ,同时由 Wi-Fi 维持已建立的连接。 WoWLAN 建立在 LPS 之上,复用与 传统省电模式(LPS) 完全相同的信标监听机制,二者的区别在于:
LPS:仅 Wi-Fi 的 RF 在 beacon 间隙进入睡眠;
WoWLAN:在此基础上让整个 SoC 关电/关时钟 ,Wi-Fi 子系统大部分模块(RF、BB 及部分 MAC )被关电/关时钟,仅少量逻辑运行在 32K 时钟上。
WoWLAN 整体流程
在双核(AP + NP)架构上,WoWLAN 的睡眠与唤醒协同流程如下图所示:
NP:运行 Wi-Fi 驱动,负责维持连接、解析收包、判断是否需要唤醒 AP。
AP:运行应用程序与协议栈(如 lwIP),处理业务逻辑。
WoWLAN 进入流程
应用侧通过以下两种方式释放 OS wakelock 进入 WoWLAN 模式:
执行
AT+TICKPS=R命令AT+TICKPS=TYPE,PG # 可选,设置睡眠类型为 PG(默认)或 CG AT+TICKPS=R # 释放 OS wakelock,允许系统进入睡眠
调用
pmu_release_wakelock()
AP 由 Active 进入 Idle,在空闲任务中通过 wakelock 检查。
AP 向 NP 发送 tickless IPC 消息,随后进入 WFE 等待。
NP 收到 IPC 消息后关闭 AP 的时钟(AP CG)并释放自身的 wakelock。
NP 由 Active 进入 Idle 后进入睡眠;若睡眠类型为 PG,则 PMC 同时关闭 AP 的电源。
Wi-Fi 按配置周期性醒来接收 Beacon,从而维持 Wi-Fi 连接。
WoWLAN 唤醒流程
Wi-Fi 唤醒
SDK 默认配置 Wi-Fi 中断 WIFI_FISR_FESR_IRQ 为 NP 的唤醒源。系统睡眠期间,Wi-Fi 收包中断触发后 NP 恢复运行,解析收到的报文并判断是否需要唤醒 AP:
若 不需要 (例如仅是可由 Wi-Fi 自行处理的报文),NP 处理完后重新进入睡眠, AP 保持睡眠不受影响 。
若 需要,NP 恢复 AP 和 Wi-Fi 驱动。AP 恢复后通过 IPC 中断获知唤醒原因为 Wi-Fi,继续处理业务。
能够唤醒 AP 和 Wi-Fi 驱动的原因分为以下几类:
类别 |
说明 |
|---|---|
Wi-Fi 决定断线 |
连续丢失 Beacon 后发送 Null Data 探测 AP 连续无 ACK,判定断线唤醒重连 |
链路断开帧 |
收到 AP 下发的 Deauth / Disassoc 帧 |
收到单播数据包 |
收到单播数据 / 管理帧(TCP、UDP、ICMP、ARP、EAPOL-Key、 Action 等) |
收到广播/组播数据包 |
可通过参数 |
AP 唤醒
可为 AP 单独配置唤醒源,如 GPIO、AON Timer,配置方式参见 低功耗的开发者配置 。此类事件发生时,PMC 将首先唤醒 NP,再由 NP 恢复 AP 的时钟。
唤醒后 无需重新初始化协议栈,已建立的 TCP/UDP 连接与 socket 均保留,应用线程可直接收发数据。
WoWLAN 相关 API
静态配置
通过修改 Wi-Fi 用户配置文件 中函数
wifi_set_user_config()中的以下变量:参数
类型
取值
描述
lps_listen_interval
u8
>= 0
监听间隔:
0(默认):每个 TBTT 都醒来接收 Beacon;
>0:每 lps_listen_interval * 102.4ms 醒来接收一次 Beacon
wowlan_rx_bcmc_dis
u8
0 / 1
0(默认):允许广播 / 组播帧唤醒系统;
1:禁止广播 / 组播帧唤醒系统
lps_rx_unicast_pkt_timeout
u8
> 0
保持清醒等待 AP 发送首个缓存单播包的超时时间,单位 ms
动态配置
可在运行时调用如下 API:
API
说明
设置 Beacon 监听间隔(单位 102.4ms)
wifi_set_wowlan_rx_broadcast()开启 / 关闭 WoWLAN 下广播 / 组播帧唤醒
wifi_set_wowlan_ipv6_wake()开启 / 关闭 WoWLAN 下 IPv6 报文唤醒
设置 TCP/UDP 广播包的端口白名单(最多 6 个),仅白名单内端口的广播包才唤醒,其余丢弃;未调用时不过滤端口。