Files
chrg/docs/2026-07-30-source-cc-close-protocol-switch.md
T
wrh d9a8c359c0 refactor(chrg_north): 重构北向通信处理逻辑,增加配置版本校验机制
1.  apps/chrg/applications/thread/chrg_comm.c: 新增通道配置版本递增逻辑,避免旧回码干扰新配置
2.  apps/chrg/applications/thread/chrg_north.h: 更新config_version注释,补充用途说明
3.  apps/chrg/applications/thread/chrg_north.c: 重构帧头解析函数,新增缓冲区操作辅助函数和通道切换复位逻辑
4.  apps/chrg/applications/thread/chrg_roll_nor.c:
    - 新增超时、重发等宏定义
    - 重构协议设置函数,增加返回值处理
    - 新增回码匹配校验、邮箱清理、等待响应等辅助函数
    - 重构自动请求逻辑,增加重试和配置版本校验
    - 简化线程入口处理逻辑,统一回码释放流程
5.  apps/chrg/codex_build.log: 记录本次编译的代码尺寸变化
2026-08-05 09:15:39 +08:00

102 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Source CC_CLOSE 协议切换修改说明
## 修改目标
修正 Source 北向协议板的命令顺序,避免在 CC 保持 Attached 时直接重配
`0xD0`。多通道同时切换时采用共享等待屏障,使保护时间并行发生,不按
通道串行累计。
## 本轮实施步骤
### 第一步:统一状态命名
断开 CC 的命令状态命名为 `IDX_SET_SOURCE_CC_CLOSE`,等待状态命名为
`IDX_WAIT_SOURCE_CC_CLOSE`。`CC_CLOSE` 固定发送 `0x17=0x03`,不覆盖
COM 保存的目标 `CC_Set`。
### 第二步:调整停止态启动顺序
Source 从停止状态启动以及 Sink 切换为 Source 时,不发送 `CC_CLOSE`,
直接按以下顺序执行:
```text
IDX_SET_SOURCE_PD
-> IDX_WAIT_SOURCE_PROTOCOL
-> IDX_SET_SOURCE_CC_SET
-> IDX_GET_SOURCE_VC
```
即先设置协议,收到 `0xD0` ACK 并完成保护等待后,再连接目标 CC。
### 第三步:识别必须断开 CC 的切换
COM 参数生效时,满足以下任一条件进入 `CC_CLOSE`:
- 新协议为 PD/PPS 或 PD3.1/AVS,并且协议或 CC 线与上次不同。
- 上次协议为 PD/PPS 或 PD3.1/AVS,本次切换为非 PD 协议。
其它协议配置变化从 `IDX_SET_SOURCE_PD` 开始。标准协议仅改变电压、电流
时直接更新功率板,不重复下发 `0xD0`。
### 第四步:执行 CC_CLOSE 命令链
COM先确定北向`sub`,协议或CC发生变化时进入
`SOURCE_WORK_PROTOCOL_SWITCH`,不在COM中调用发送函数。北向轮询线程
执行该Source工作状态,负责向南向功率板写入0V;标准协议还会在同一批
命令中依次写模式和电流。提交成功后清零`set_volt`并进入
`SOURCE_WORK_WAIT`,随后按已经选定的`sub`继续执行。
需要断开 CC 的通道按以下顺序执行:
```text
IDX_SET_SOURCE_CC_CLOSE 发送 0x17=0x03
-> IDX_WAIT_SOURCE_CC_CLOSE 等待共享保护时间
-> IDX_SET_SOURCE_PD 发送 0xD0
-> IDX_WAIT_SOURCE_PROTOCOL 等待协议 ACK 后保护时间
-> IDX_SET_SOURCE_CC_SET 发送 0x17=目标 CC
-> IDX_GET_SOURCE_VC 恢复 0x20 查询
```
每条设置命令仍需收到角色、命令、长度和 CRC 均正确的回码后才能推进
`sub`;错误回码继续沿用现有丢弃和有限重发逻辑。
### 第五步:多通道共享 CC_CLOSE 等待
使用 `pending_mask` 和 `acked_mask` 管理本轮参与切换的 Source 通道。
所有已登记通道都收到 `0x17` ACK 后,只启动一次 300 ms 保护等待。
一个通道和四个通道的保护等待本身均为 300 ms;四通道只额外产生必要的
命令收发时间,不会累计为四次 300 ms。
### 第六步:握手稳定确认(本轮不修改)
本轮不增加“连续两次 `0x20` 电压稳定后才进入 RUNNING”的新逻辑,继续
使用现有 `chrg_source_parse()` 电压误差和重试规则。
### 第七步:配置覆盖保护
继续使用 `config_version` 防止 COM 新配置被旧回码推进。停止、角色切换
或不再需要 `CC_CLOSE` 时,会把通道移出共享等待屏障,避免残留状态影响
下一次启动。
### 第八步:完整失败恢复(本轮不修改)
本轮不增加握手总超时、再次 detach、整套流程最多重试两轮以及故障上报。
单条北向命令仍使用现有的三次发送机制。完整恢复流程待单独验证后实施。
## 时间参数
| 参数 | 当前值 | 说明 |
|---|---:|---|
| `SOURCE_CC_CLOSE_WAIT_MS` | 300 ms | 从本轮最后一个有效 `CC_CLOSE` ACK 开始 |
| `SOURCE_PROTOCOL_WAIT_MS` | 100 ms | 每通道收到 `0xD0` ACK 后并行等待 |
| `NORTH_RESPONSE_TIMEOUT_MS` | 50 ms | 单次北向回码等待 |
| `NORTH_REQUEST_MAX_RETRIES` | 2 | 首次发送外最多重发两次 |
## 建议验证顺序
1. 单通道停止态启动 PD,确认发送顺序为 `D0 -> 17(目标CC) -> 20`。
2. 单通道 PD 改协议或 CC,确认顺序为 `17(03) -> 等待 -> D0 -> 17(目标CC) -> 20`。
3. 单通道 PD 切换 QC/FCP/标准,确认切换前先发送 `17(03)`。
4. 四通道连续生效,确认四路 `17(03)` 均回码后共享一次约 300 ms 等待。
5. 连续执行 20 至 30 轮协议切换,检查是否仍出现 Source 芯片 PD 状态异常。