Wi-Fi 低功耗

概述

IEEE 802.11 规范中定义的 Wi-Fi STA 省电模式包括以下关键特性:

  • 在未发送或接收数据时,进入休眠状态。

  • 定期唤醒以接收 AP 的 Beacon 帧。

  • 利用 Beacon 中的 TIM(Traffic Indication Map, 流量指示映射)进行数据管理。

站点休眠期间无法接收任何数据帧,因此 AP 需缓存待传数据帧,STA 需周期性唤醒检测信标帧。

Wi-Fi 省电模式的时序图如下:

../../_images/wifi_timeline_of_power_saving.svg

基于上述标准 IEEE 802.11 省电机制,Ameba 系列 SoC 提供了三种 Wi-Fi 省电模式:

模式

全称

描述

IPS

非活动省电模式

在未连接时实现完全断电状态

LPS

传统省电模式

在 Wi-Fi 连接状态下,在活跃和休眠状态之间切换,并定期打开或关闭收发器以实现省电

WoWLAN

无线局域网唤醒

允许 SoC 系统在保持 Wi-Fi 连接的同时进入睡眠模式

  • 系统可通过单播数据包、广播/组播数据包(可选)以及 AP 断连事件被唤醒

非活动省电模式(IPS)

非活动省电模式(Inactive Power Save,IPS)专为 Wi-Fi 未连接状态所设计,允许在没有网络连接时进入睡眠的状态,从而显著的延长电池续航的时间。

IPS 一般有两种睡眠层级:

  • Wi-Fi 完全断电,此时处于最大程度的 Wi-Fi 省电状态。

  • 电源门控(Power Gating)模式,以求可以更快速的退出 IPS。

编程接口

Ameba Wi-Fi 通过 wifi_set_ips_internal() 函数及一组相关参数,来实现对 IPS 行为的控制。IPS 控制流程如下图所示:

../../_images/ips_flow.svg
RTL8721Dx:

参数

类型

取值

描述

默认值

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

ips_ctrl_by_usr

wifi_set_ips_internal

行为

0

0

Y

动态开关 IPS 机制

  • 默认关闭 IPS

0

1

Y

关闭 IPS 机制

0

X

N

关闭 IPS 机制

1

0

Y

动态开关 IPS 机制

  • 默认使能 IPS

1

1

Y

动态进退 IPS 模式

  • 调用 wifi_set_ips_inetrnal() 可以快速退出 IPS 模式。

1

X

N

使能 IPS 机制

  • 系统通过周期性监测 Wi-Fi 状态决定是否进入预设的省电等级。

传统省电模式(LPS)

传统省电模式(Legacy Power Save,LPS)的核心思想是允许客户端在 Wi-Fi 连接状态且不存在无线数据传输的情况下进入睡眠状态,此时接入点(Access Point)为其缓存下行数据从而达到节省功耗的目的。

LPS 模式下,客户端需要周期性唤醒来接收 AP 的信标帧,并通过解析信标帧中流量指示图 (Traffic Indication Map) 元素获知是否存在自己的数据等待接收,若存在则保持清醒继续和 AP 进行数据交互。

../../_images/lps.svg

参数

类型

取值

描述

默认值

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 的睡眠与唤醒协同流程如下图所示:

../../_images/rtos_ipc_wowlan.svg
  • NP:运行 Wi-Fi 驱动,负责维持连接、解析收包、判断是否需要唤醒 AP。

  • AP:运行应用程序与协议栈(如 lwIP),处理业务逻辑。

WoWLAN 进入流程

  1. 应用侧通过以下两种方式释放 OS wakelock 进入 WoWLAN 模式:

    • 执行 AT+TICKPS=R 命令

      AT+TICKPS=TYPE,PG     # 可选,设置睡眠类型为 PG(默认)或 CG
      AT+TICKPS=R           # 释放 OS wakelock,允许系统进入睡眠
      
    • 调用 pmu_release_wakelock()

  2. AP 由 Active 进入 Idle,在空闲任务中通过 wakelock 检查。

  3. AP 向 NP 发送 tickless IPC 消息,随后进入 WFE 等待。

  4. NP 收到 IPC 消息后关闭 AP 的时钟(AP CG)并释放自身的 wakelock。

  5. NP 由 Active 进入 Idle 后进入睡眠;若睡眠类型为 PG,则 PMC 同时关闭 AP 的电源。

  6. 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 等)

收到广播/组播数据包

可通过参数 wowlan_rx_bcmc_dis 开关此类唤醒

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

    说明

    wifi_set_lps_listen_interval()

    设置 Beacon 监听间隔(单位 102.4ms)

    wifi_set_wowlan_rx_broadcast()

    开启 / 关闭 WoWLAN 下广播 / 组播帧唤醒

    wifi_set_wowlan_ipv6_wake()

    开启 / 关闭 WoWLAN 下 IPv6 报文唤醒

    wifi_set_broadcast_port_wakeup_white_list()

    设置 TCP/UDP 广播包的端口白名单(最多 6 个),
    仅白名单内端口的广播包才唤醒,其余丢弃;
    未调用时不过滤端口。