低功耗核
esp32s31_lp remoteproc 驱动将固件加载到 LP SRAM,并通过硬件邮箱与 LP 核交换 32 位消息。常用固件名为 esp32s31/s31-lp-core.elf。启动和替换方法见 LP 固件开发。
检查启动与定时器
s31-lpctl status
s31-lpctl ping
s31-lpctl sleep-test 1000
收到 READY 后,status 包含 ready=1、最后一条消息及邮箱计数。ping 报告 ready 和 rtt_us;往返时间并不固定。sleep-test 接受 10–5000 ms,并设置 DRY_RUN,因此 Linux 保持运行。定时器测试成功时,result=0,且 wake_reason 包含定时器位(0x1)。参见测试处理与结果格式。
测试 GPIO 电平变化
CLI 接受 LP GPIO0–7、电平 low 或 high、上下拉 none、up 或 down,以及 10–5000 ms 的超时(默认 1000 ms)。选择板上可用的引脚,并在 ARM 执行时保持非有效电平。
测试 GPIO3 高电平唤醒时,先保持输入为低电平,在完成布防后、1 秒超时前将它驱动为高电平:
s31-lpctl gpio-test 3 high down 1000
测试低电平唤醒时,先保持高电平,再将它驱动为低电平:
s31-lpctl gpio-test 3 low up 1000
固件配置上下拉后会等待 100 微秒,使输入稳定;若输入已经处于有效电平,则以 S31_LP_SLEEP_ERR_WAKE_MASK 拒绝请求。DRY_RUN 同样执行此检查。因此,不能仅将内部上下拉设置为有效电平来完成测试;外部电路或绑带也可能改变初始电平。参见 ARM 验证。
GPIO3 测试成功时,result=0,wake_reason 包含 GPIO 位(0x2),raw 包含位 3(0x8)。超时意味着在指定时间内未完成有效的电平变化。Linux 始终保持运行;此测试通过不能证明系统挂起或深度睡眠唤醒可靠。
设备与属性
接口 |
说明 |
|---|---|
|
写入必须恰好为 4 字节;读取缓冲区至少为 4 字节,每次接收一个 32 位邮箱字 |
|
是否已收到 READY 通知 |
|
最后收到的字 |
|
消息、确认及超时计数 |
|
发送邮箱字 |
|
启动或读取 PING/PONG 测试 |
|
启动或读取定时器测试 |
|
启动或读取 GPIO 测试 |
|
读取深度睡眠标记或请求定时关机 |
这些属性属于已绑定的 LP 平台设备。固件选择与启停使用 remoteproc 的 firmware 和 state 属性。二进制读取可能阻塞等待消息;非阻塞读取在队列为空时返回 -EAGAIN。参见字符设备实现。
邮箱与共享控制块
命令字的高 16 位表示操作,低 16 位表示序列号。READY(0x53310001)和 WAKE(0x53310002)是固定通知。除 PING/PONG 和 STATUS 外,协议还包含以下睡眠操作:
操作 |
用途 |
|---|---|
PREPARE |
验证请求及所支持的唤醒配置 |
ARM |
为事务及唤醒源布防,包括检查 GPIO 当前为非有效电平 |
QUERY |
读取状态、结果、唤醒原因及时间戳 |
RECLAIM |
将已完成事务的控制权交还 Linux |
ABORT |
取消请求并解除唤醒源布防 |
共享块采用 ABI 版本 1,包含 28 个紧凑排列的 32 位字(112 字节),地址为 0x2E007C00。LP SRAM 的最后 1 KiB 为它保留。Linux 与 LP 固件包含同一个协议定义;当前 OpenSBI 的验证也与该版本和布局一致。
字段组 |
单位 / 含义 |
|---|---|
|
一个以微秒为单位的相对时长,尽管字段名为 deadline |
|
定时器启动 / 事务布防时的绝对 RTC 计数值 |
|
记录唤醒时的绝对 RTC 计数值 |
|
事务状态和协议结果码 |
|
唤醒源掩码及源特定的原始位 |
保持(MEM)路径中,固件在 OpenSBI 发布 HP_ASLEEP 后启动定时器,不会在 Linux 较早的设备挂起阶段消耗这段时长。参见定时器单位转换及保持路径的启动条件。
请求 CRC 覆盖 request_crc 前的字节;响应 CRC 覆盖 response_crc 前的字节,包括请求与结果字段。Linux 使用 crc32_le(~0U, data, length) ^ ~0U,并在 LP 发布响应期间重试快照读取。协议头文件是消息码、标志、状态与字段的权威定义;CRC 读取实现定义验证行为。
系统睡眠命令与验证边界见电源管理。