WHC Wi-Fi 低功耗
WHC 低功耗介绍
当 Host 处于空闲状态时,可通过待机模式降低功耗。其核心交互流程如下图所示:
低功耗模式下 Device 和 Host 的交互主要分为 3 部分:
Device Wowlan Cmd
Host 可以通过中断或者基于 CUST_PATH 发送消息触发 Device 进入低功耗状态:
触发类型 |
接口类型 |
描述 |
|---|---|---|
CUST_PATH |
ALL |
通过 CUST_PATH 发送定制化指令 |
RPWM INT |
SDIO |
由 SDIO 特定中断触发 |
Other INT |
ALL |
通过触发GPIO通用外部中断, 兼容性高 |
CUST_PATH
具体实现可参考 slim host demo 中, tickps 指令。
RPWM INT
Ameba SDK 在 host suspend 时会自动触发 RPWM 中断,通知 device 进入低功耗模式。实现函数: whc_sdio_host_rpwm_notify 。
Other INT
若需要通过其他中断,比如 GPIO,实现可以参考:RPWM INT 。
Host wake Device
Host 根据需求选择中断类型,取决于 Device 的低功耗模式(CG/PG):
中断类型 |
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 。
Other INT
若需要通过其他中断,比如 GPIO,实现可以参考:RPWM INT
Device wake Host
Device 通过中断唤醒 Host,其方式取决于 Host 的硬件支持:
中断类型 |
描述 |
|---|---|
SDIO INT |
标准数据包触发,无需额外代码适配 |
Other INT |
通过触发GPIO等中断,兼容性强 |
WHC 低功耗 API
API 头文件
component/wifi/whc/whc_dev/whc_dev_powersave.h
whc_host_linux/app/whc_host_app_api.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: 用户输入的指令字符串 |
返回值 |
无 |
void whc_dev_tickps_cmd(struct whc_dev_ps_cmd *ps_cmd)
{
uint8_t subtype = ps_cmd->type;
whc_dev_ps_set_tickps_cmd(subtype);
return;
}
项目 |
描述 |
|---|---|
功能 |
解析主机指令whc_dev_ps_cmd字段内容 |
参数 |
ps_cmd: 包含指令类型的结构体 |
返回值 |
无 |
void whc_dev_ps_set_tickps_cmd(u8 subtype)
{
if (subtype == WHC_CMD_TICKPS_R) {
/* dev enter low power mode after release lock */
pmu_release_wakelock(PMU_OS);
pmu_release_wakelock(PMU_WHC_WIFI);
} else if (subtype == WHC_CMD_TICKPS_A) {
pmu_acquire_wakelock(PMU_OS);
pmu_acquire_wakelock(PMU_WHC_WIFI);
} else if (subtype == WHC_CMD_TICKPS_TYPE_PG) {
/* set sleep type to pg */
pmu_set_sleep_type(SLEEP_PG);
} else if (subtype == WHC_CMD_TICKPS_TYPE_CG) {
/* set sleep type to cg */
pmu_set_sleep_type(SLEEP_CG);
}
项目 |
描述 |
|---|---|
功能 |
解析主机指令并配置 PMU 低功耗状态 |
参数 |
subtype: 主机指令类型 |
返回值 |
无 |
void whc_dev_ps_resume_cb(void)
{
/* acquire wakelock to prevent dev enter low power mode */
whc_dev_ps_set_tickps_cmd(WHC_CMD_TICKPS_A);
#if defined (CONFIG_FW_DRIVER_COEXIST) && CONFIG_FW_DRIVER_COEXIST
extern void wifi_hal_system_resume_wlan(void);
/* resume wlan */
wifi_hal_system_resume_wlan();
#endif
}
项目 |
描述 |
|---|---|
功能 |
device端的唤醒后的恢复函数 |
参数 |
无 |
返回值 |
无 |
WHC 低功耗操作流程
设置 device 的 sleep type ,可以参考 slim host demo 中 tickps 指令。
查询无线物理接口名称(观察输出中的 "phy" 字段):
rfkill list。启用任意数据包唤醒功能:
sudo iw phy <phyname> wowlan enable any(需替换实际 phyname)。验证 WoWLAN 配置状态:
sudo iw phy wowlan show。触发系统挂起(内存休眠状态)
echo mem | sudo tee /sys/power/state。
备注
执行 rmmod 后 phyname 可能变为 phy1/phyN,每次重启无线模块需重新执行步骤 1-3