LISA PM 双核 GPIO 唤醒示例

功能说明

  • AP 核 (remote/):作为 PM 双核对端,冷启动时引导 CP,随后初始化 lisa_pm 并保持 AP 上下文保活。

  • CP 核 (src/):不初始化 WiFi,通过 shell 命令直接进入 AUTO_LIGHT_SLEEP

  • GPIOB_9 唤醒:PB9 配置为输入上拉,PMU wakeup 触发条件为 LISA_GPIO_WAKEUP_LEVEL_LOW

  • 设备生命周期:GPIOB 作为浅睡眠唤醒源,执行 low_power 前保持设备和唤醒配置;唤醒后在 lisa_pmafter_wake 回调中显式销毁并重新初始化,恢复 GPIO 配置。

GPIOB_00..GPIOB_09 可作 ARCS PMU GPIO 唤醒源。

硬件连接

  • GPIOB_9 / PB9:连接低电平有效按键,配置为 pull-up,按下拉低。

  • 若使用外部按键,请确保未按下时为高电平、按下时拉低;进入 sleep 前 PB9 不能保持低电平,否则会立即唤醒。

关键配置

配置

说明

CONFIG_LISA_PM=y

AP/CP 两侧都启用 lisa_pm 框架,并自动选择 HAL PM/VRTC 模块

CONFIG_LISA_PM_CORE_PRIMARY=y

CP 侧作为 PM primary,lisa_pm CMake 自动导出 PM_CORE_PRIMARY=1CFG_VRTC=1

CONFIG_LISA_PM_CORE_PRIMARY=n

AP 侧作为 PM peer/proxy,lisa_pm CMake 自动导出 PM_CORE_PRIMARY=0CFG_VRTC_PROXY=1

CONFIG_LISA_PM_DUAL_CORE=y

CP 侧声明 AP/CP runtime 双核 PM 模式

CONFIG_ARCS_HAL_IPC=y

AP/CP 都启用 IPC,使 PM 底层进入双核路径;IPC master/slave 角色由 Kconfig choice 自动选择,本示例不再显式配置

CONFIG_LISA_DEVICE=y

启用 lisa_device 框架

CONFIG_LISA_GPIO_DEVICE=y

启用 lisa_gpio 设备驱动

CONFIG_LISA_GPIOB=y

启用 GPIOB 设备与 GPIOB wakeup_ops

CONFIG_LISA_SHELL=y

启用 low_power 命令,通过串口主动请求休眠

CONFIG_ARCS_HAL_PM_CLOSE_AP=n

双核模式 AP 是运行中对端核心,不能睡眠前关闭 AP 子系统

CONFIG_ARCS_HAL_WCND_WIFI_PS_LDOCORE_TUNE=n

外部无 BUCK 供电时关闭 LDOCORE tune

CONFIG_ARCS_HAL_WCND_WIFI_PS_LDOVMEM_TUNE=y

外部无 BUCK 供电时启用 LDOVMEM tune

编译

重要提示:编译前需要先确认当前示例支持的目标板型,然后将板型标识传给 -DBOARD。请按以下方式选择:

  1. 确认示例限制:查看当前示例 README 中的硬件连接和注意事项,确认是否限定板型。

  2. 参考示例配置:查看相关示例目录下的 sample.yaml,确认支持的板型。

  3. 填写板型标识:SDK 内置板型的标识为 boards/ 下的目录名。例如实际使用的板型目录为 boards/<板型名称>/,则编译参数填写为 -DBOARD=<板型名称>

在 SDK 根目录执行编译,并将命令中的 <示例路径><板型名称> 替换为实际值。

Linux 使用 build.sh

# 通用命令
./build.sh -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

Windows PowerShell 使用 build.ps1

# 通用命令
.\build.ps1 -C -S samples/<示例路径> -DBOARD=<板型名称>

# 示例:使用 arcs_evb 开发板
.\build.ps1 -C -S samples/<示例路径> -DBOARD=arcs_evb

Note

确保已安装对应平台的工具链和 ListenAI 开发工具包。Windows 环境请先执行 .\env.ps1 或直接使用 .\build.ps1 自动加载环境。

注意事项-DBOARD 填写的是板型标识,不是芯片系列名称。如果示例有板型专用配置或额外编译参数,以示例 README 中的说明为准。

也可以在 SDK 根目录直接执行:

./build.sh -C -S samples/subsys/lisa_pm/gpio_wakeup -DBOARD=arcs_evb

烧录

本工程产出两份固件,必须同时烧到 flash:

固件

路径

烧录地址

AP 固件

build/remote/ap.bin

0x0

CP 固件

build/arcs.bin

0x100000

./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 \
    0x0       build/remote/ap.bin \
    0x100000  build/arcs.bin \
    -C arcs

预期输出

CP 启动并完成 GPIO 唤醒源配置后,在 shell 中执行:

low_power

AP 侧关键日志:

=== lisa_pm dual_core gpio_wakeup AP ===
boot cp from flash: 0x30100000
AP lisa_pm init ok
AP ctx alive: counter=1 checksum=0x...

CP 侧关键日志:

=== lisa_pm dual_core gpio_wakeup CP ===
GPIOB_9 configured as LEVEL_LOW wakeup source
entering AUTO_LIGHT_SLEEP (wake GPIOB_9)
after_wake cause=4
gpiob destroyed after wake
gpiob restored after wake

失败判据:

AP CTX CHECK FAILED
gpiob reinit failed after wake
assert
backtrace
exception
fault

核心 API

lisa_gpio_configure(gpiob, 9, LISA_GPIO_INPUT | LISA_GPIO_PULL_UP);
lisa_gpio_configure_wakeup(gpiob, 9, LISA_GPIO_WAKEUP_LEVEL_LOW);
lisa_device_wakeup_enable(gpiob, true);
lisa_pm_sleep_callback_register(&pm_cb);
lisa_pm_set_system_policy(LISA_PM_SYSTEM_POLICY_AUTO_LIGHT_SLEEP);

/* after_wake:先保持系统 ACTIVE,再重建浅睡眠中掉电的普通 GPIO IP */
lisa_pm_set_system_policy(LISA_PM_SYSTEM_POLICY_ACTIVE);
lisa_device_destroy(gpiob);
lisa_device_reinit(gpiob);
lisa_gpio_configure(gpiob, 9, LISA_GPIO_INPUT | LISA_GPIO_PULL_UP);

注意事项

  1. GPIOB_9 运行态由 lisa_gpiob_pinmux() 配置为普通 GPIO;进入浅睡眠前保留 GPIO controller 和 AON wake 配置,唤醒后先切回 ACTIVE,再由 lisa_device_destroy() / lisa_device_reinit() 重新执行 GPIO init 与 pinmux。

  2. pull-up 按键 + LEVEL_LOW 要求进入 sleep 前 PB9 为高电平;如果 PB9 已经为低,PMU 会在入睡瞬间满足唤醒条件。

  3. 本示例不调用 lisa_wifi_init(),因此进入低功耗不依赖 lisa_pm_wifi_set_ps_mode()。如果将本示例合入已初始化 WiFi 的工程,必须在 WiFi 初始化完成后先配置 WiFi PS,再设置 AUTO_LIGHT_SLEEP

  4. after_wake 回调中不得在 lisa_device_destroy()lisa_device_reinit() 之间调用任何 device API;完成 reinit 和 GPIO input 配置后,下一轮 low_power 会重新 enable AON GPIO wake。

  5. GPIO 驱动会保留 lisa_gpio_configure_wakeup() 的触发条件缓存;唤醒后的 reinit 不需要重复配置触发条件。

  6. 两份固件必须一起烧录;只烧 CP 或只烧 AP 都不能完整验证 PM 双核协同。