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: 记录本次编译的代码尺寸变化
102 lines
4.1 KiB
Markdown
102 lines
4.1 KiB
Markdown
# 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 状态异常。
|