低功耗核

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 始终保持运行;此测试通过不能证明系统挂起或深度睡眠唤醒可靠。

设备与属性

接口

说明

/dev/s31-lp

写入必须恰好为 4 字节;读取缓冲区至少为 4 字节,每次接收一个 32 位邮箱字

ready

是否已收到 READY 通知

last_message

最后收到的字

mailbox_stats

消息、确认及超时计数

tx_message

发送邮箱字

ping

启动或读取 PING/PONG 测试

sleep_test

启动或读取定时器测试

gpio_test

启动或读取 GPIO 测试

deep_sleep

读取深度睡眠标记或请求定时关机

这些属性属于已绑定的 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_lo、deadline_hi

一个以微秒为单位的相对时长,尽管字段名为 deadline

sleep_ticks_lo、sleep_ticks_hi

定时器启动 / 事务布防时的绝对 RTC 计数值

wake_ticks_lo、wake_ticks_hi

记录唤醒时的绝对 RTC 计数值

state、result

事务状态和协议结果码

wake_reason、wake_raw

唤醒源掩码及源特定的原始位

保持(MEM)路径中,固件在 OpenSBI 发布 HP_ASLEEP 后启动定时器,不会在 Linux 较早的设备挂起阶段消耗这段时长。参见定时器单位转换及保持路径的启动条件。

请求 CRC 覆盖 request_crc 前的字节;响应 CRC 覆盖 response_crc 前的字节,包括请求与结果字段。Linux 使用 crc32_le(~0U, data, length) ^ ~0U,并在 LP 发布响应期间重试快照读取。协议头文件是消息码、标志、状态与字段的权威定义;CRC 读取实现定义验证行为。

系统睡眠命令与验证边界见电源管理。