WHC Wi-Fi 低功耗

WHC 低功耗介绍

当 Host 处于空闲状态时,可通过待机模式降低功耗。其核心交互流程如下图所示:

../../_images/fullmac_powersave.svg

低功耗模式下 Device 和 Host 的交互主要分为 3 部分:

Device Wowlan Cmd

Host 可以通过中断或者基于 CUST_PATH 发送消息触发 Device 进入低功耗状态:

../../_images/fullmac_powersavecmd.svg

触发类型

接口类型

描述

CUST_PATH

ALL

通过 CUST_PATH 发送定制化指令

RPWM INT

SDIO

由 SDIO 特定中断触发

Other INT

ALL

通过触发GPIO通用外部中断, 兼容性高

CUST_PATH

具体实现可参考 slim host demo 中, tickps 指令。

../../_images/fullmac_powersave_custpath.svg

RPWM INT

Ameba SDK 在 host suspend 时会自动触发 RPWM 中断,通知 device 进入低功耗模式。实现函数: whc_sdio_host_rpwm_notify

../../_images/fullmac_powersave_sleeprpwm.svg

Other INT

若需要通过其他中断,比如 GPIO,实现可以参考:RPWM INT

Host wake Device

Host 根据需求选择中断类型,取决于 Device 的低功耗模式(CG/PG):

../../_images/fullmac_powersave_hostwakedev.svg

中断类型

Device状态

接口类型

描述

CUST_PATH

Active

None

CUST_PATH只支持在Device Active下响应

RPWM INT

CG

SDIO

通过特定的SDIO中断触发RPWM中断

Other INT

CG/PG

ALL

通过触发GPIO等中断

RPWM INT

Ameba SDK 在 host resume 时会自动触发 RPWM 中断,将 Device 从 CG 状态唤醒。实现函数: whc_sdio_host_rpwm_notify

../../_images/fullmac_powersave_wakeprpwm.svg

Other INT

若需要通过其他中断,比如 GPIO,实现可以参考:RPWM INT

Device wake Host

Device 通过中断唤醒 Host,其方式取决于 Host 的硬件支持:

../../_images/fullmac_powersave_devwakehost.svg

中断类型

描述

SDIO INT

标准数据包触发,无需额外代码适配

Other INT

通过触发GPIO等中断,兼容性强

WHC 低功耗 API

API 头文件

component/wifi/whc/whc_dev/whc_dev_powersave.h

API 参考

void whc_host_set_ps_cmd(struct whc_dev_ps_cmd *pcmd, char *cmd_arg)
{
   if (strcmp(cmd_arg, "r") == 0) {
      pcmd->type = WHC_CMD_TICKPS_R;
   } else if (strcmp(cmd_arg, "a") == 0) {
      pcmd->type = WHC_CMD_TICKPS_A;
   } else if (strcmp(cmd_arg, "cg") == 0) {
      pcmd->type = WHC_CMD_TICKPS_TYPE_CG;
   } else if (strcmp(cmd_arg, "pg") == 0) {
      pcmd->type = WHC_CMD_TICKPS_TYPE_PG;
   }

   return;
}

项目

描述

功能

解析用户输入并填充低功耗指令结构体

参数

pcmd: 待填充的指令结构体指针,cmd_arg: 用户输入的指令字符串

返回值

WHC 低功耗操作流程

  1. 设置 device 的 sleep type ,可以参考 slim host demo 中 tickps 指令。

  2. 查询无线物理接口名称(观察输出中的 "phy" 字段): rfkill list

  3. 启用任意数据包唤醒功能: sudo iw phy <phyname> wowlan enable any (需替换实际 phyname)。

  4. 验证 WoWLAN 配置状态: sudo iw phy wowlan show

  5. 触发系统挂起(内存休眠状态) echo mem | sudo tee /sys/power/state

备注

执行 rmmod 后 phyname 可能变为 phy1/phyN,每次重启无线模块需重新执行步骤 1-3