LISA PM 双核 GPIO 唤醒示例
源码位置: samples/subsys/lisa_pm/auto_light_sleep/gpio_wakeup 查看源码
功能说明
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_pm的after_wake回调中显式销毁并重新初始化,恢复 GPIO 配置。
仅 GPIOB_00..GPIOB_09 可作 ARCS PMU GPIO 唤醒源。
硬件连接
GPIOB_9 / PB9:连接低电平有效按键,配置为 pull-up,按下拉低。
若使用外部按键,请确保未按下时为高电平、按下时拉低;进入 sleep 前 PB9 不能保持低电平,否则会立即唤醒。
关键配置
配置 |
说明 |
|---|---|
|
AP/CP 两侧都启用 lisa_pm 框架,并自动选择 HAL PM/VRTC 模块 |
|
CP 侧作为 PM primary,lisa_pm CMake 自动导出 |
|
AP 侧作为 PM peer/proxy,lisa_pm CMake 自动导出 |
|
CP 侧声明 AP/CP runtime 双核 PM 模式 |
|
AP/CP 都启用 IPC,使 PM 底层进入双核路径;IPC master/slave 角色由 Kconfig choice 自动选择,本示例不再显式配置 |
|
启用 lisa_device 框架 |
|
启用 lisa_gpio 设备驱动 |
|
启用 GPIOB 设备与 GPIOB wakeup_ops |
|
启用 |
|
双核模式 AP 是运行中对端核心,不能睡眠前关闭 AP 子系统 |
|
外部无 BUCK 供电时关闭 LDOCORE tune |
|
外部无 BUCK 供电时启用 LDOVMEM tune |
编译
重要提示:编译前需要先确认当前示例支持的目标板型,然后将板型标识传给 -DBOARD。请按以下方式选择:
确认示例限制:查看当前示例
README中的硬件连接和注意事项,确认是否限定板型。参考示例配置:查看相关示例目录下的
sample.yaml,确认支持的板型。填写板型标识: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 固件 |
|
|
CP 固件 |
|
|
./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);
注意事项
GPIOB_9运行态由lisa_gpiob_pinmux()配置为普通 GPIO;进入浅睡眠前保留 GPIO controller 和 AON wake 配置,唤醒后先切回ACTIVE,再由lisa_device_destroy()/lisa_device_reinit()重新执行 GPIO init 与 pinmux。pull-up 按键 +
LEVEL_LOW要求进入 sleep 前 PB9 为高电平;如果 PB9 已经为低,PMU 会在入睡瞬间满足唤醒条件。本示例不调用
lisa_wifi_init(),因此进入低功耗不依赖lisa_pm_wifi_set_ps_mode()。如果将本示例合入已初始化 WiFi 的工程,必须在 WiFi 初始化完成后先配置 WiFi PS,再设置AUTO_LIGHT_SLEEP。after_wake回调中不得在lisa_device_destroy()和lisa_device_reinit()之间调用任何 device API;完成 reinit 和 GPIO input 配置后,下一轮low_power会重新 enable AON GPIO wake。GPIO 驱动会保留
lisa_gpio_configure_wakeup()的触发条件缓存;唤醒后的 reinit 不需要重复配置触发条件。两份固件必须一起烧录;只烧 CP 或只烧 AP 都不能完整验证 PM 双核协同。