Type-C充电事件全链路解析:从物理层到电量显示的架构设计
当我们将Type-C充电器插入手机时,系统在毫秒级别完成了从硬件检测到UI显示的复杂交互。这个看似简单的动作背后,隐藏着现代移动设备最精密的电源管理系统设计。本文将深入剖析高通ADSP充电框架中TCPC、LPM、DPM等核心模块的协作机制,还原一次完整充电事件的数据流向和状态变迁。
1. 物理层事件触发与TCPC状态机
Type-C接口的物理连接是整个充电流程的起点。TCPC(Type-C Port Controller)作为物理层控制器,负责监测CC(Configuration Channel)引脚状态变化和VBUS电压检测。当插头插入时,CC引脚阻抗变化会触发硬件中断,TCPC通过状态机模型处理这些底层事件。
在ADSP架构中,PmicTccStateMachine_Main_Thread作为TCPC主线程持续轮询以下关键事件类型:
typedef enum _USBPD_TCPC_EVENT_TYPE { USBPD_TCPC_EVENT_CABLE, // CC/Vbus电缆事件 USBPD_TCPC_EVENT_HARDRESET, // PD硬重置信号 USBPD_TCPC_EVENT_LPD, // 液体存在检测 // ...其他事件类型 } USBPD_TCPC_EVENT_TYPE;典型的状态迁移路径如下:
- Offline状态:初始状态,持续监测CC引脚
- Standby状态:检测到CC变化后进入
- Attached状态:确认连接有效后迁移
- PD协商状态:如果需要PD协议通信
关键判断逻辑体现在PmicTccStateMachineLevels_Offline_State_Main函数中:
if(cc_status_changed) { transition_to(PMICTCC_STATE_ID_STANDBY); } else if(pogopin_mode == BATTMNGR_POGOPIN_TYPEC_MODE) { check_direct_charging(snk_vbus_sts, g_typec_connect_status); }当事件处理完成后,TCPC通过Alert机制通知上层LPM模块:
PmicTccRegister_Send_Alert_Notification(BPD_LPM_EVENT_ALERT);2. 链路策略管理(LPM)的事件中继
LPM(Link Policy Manager)作为协议栈中间层,承担着承上启下的关键作用。其主要功能包括:
- 处理来自TCPC的硬件Alert事件
- 管理PD协议状态机
- 协调DPM的策略请求
2.1 事件分类处理
LPM通过lpm_mainloop中的事件分发器处理多种事件源:
| 事件来源 | 典型事件类型 | 处理方式 |
|---|---|---|
| TCPC | USBPD_LPM_EVENT_ALERT | 解析Alert寄存器 |
| 定时器 | USBPD_LPM_EVENT_HKTIMER_TO | 处理超时任务 |
| DPM | USBPD_LPM_EVENT_PM_REQUEST | 加入请求队列 |
核心事件处理函数lpm_process_event采用模块化设计:
switch(pInputEvent->EventHeader.EvtDest) { case USBPD_MODULE_LPM_PE: // 策略引擎事件 pe_state_run(pLpmCtx, pInputEvent); break; case USBPD_MODULE_LPM_PRL: // 协议层事件 prl_state_run(pLpmCtx, pInputEvent); break; // ...其他模块处理 }2.2 异步事件通知机制
当需要向上层通知状态变化时,LPM通过lpm_notify_dpm发起通知流程:
- 检查PAN(Port Association Number)状态
- 收集TCPM和PE模块的状态变更
- 通过
dpm_notify发送异步事件
graph TD A[LPM状态变更] --> B{是否启用PAN} B -->|是| C[设置bPANPending标志] B -->|否| D[立即调用lpm_async_event_update] D --> E[同步TCPM状态] E --> F[通知USBPD_DPM_EVENT_LPM_ASYNC_EVENT]3. 设备策略管理(DPM)的决策中枢
DPM(Device Policy Manager)作为充电架构的"大脑",负责整合各类信息并做出最终决策。其核心功能包括:
- 处理来自LPM的异步事件
- 管理端口电源分配策略
- 协调AP通信接口
3.1 事件队列管理
DPM采用多优先级事件队列机制,关键事件类型包括:
typedef enum _USBPD_DPM_EVENT_TYPE { USBPD_DPM_EVENT_LPM_ASYNC_EVENT, // LPM状态更新 USBPD_DPM_EVENT_OPM_COMMAND, // AP侧UCSI命令 USBPD_DPM_EVENT_BM_REQUEST, // 电池管理请求 // ...其他事件类型 } USBPD_DPM_EVENT_TYPE;事件处理流程采用状态机模式:
status = dpm_process_event(pDpmCtx, &evt_data_buffer); if(status != USBPDSTS_SUCCESS) { TraceError(USBC_DPM, "DPM process event failed: %d", status); }3.2 与AP的通信桥梁
DPM通过PPM(Port Policy Manager)和OPM(OS Policy Manager)与AP交互:
PPM状态机处理本地策略决策
ppm_state_process_command_main:处理UCSI命令ppm_state_ppm_wait_for_command_completion_main:等待AP确认
OPM接口通过GLINK传输数据
ppm_ucsi_mailbox_write:AP→ADSP方向ppm_ucsi_mailbox_read:ADSP→AP方向
关键数据结构示例:
typedef struct _USBPD_UCSI_DATA { USBPD_UCSI_CCI_DATA cci; // 32位命令状态 USBPD_UCSI_GENERIC_CONTROL_DATA control; // 64位控制字段 USBPD_UCSI_GENERIC_MESSAGE_DATA message_in; // 128位输入消息 // ...其他字段 } USBPD_UCSI_DATA;4. 电池管理(BM)的最终落地
当充电策略确定后,最终由BM(Battery Manager)模块执行具体的充电控制。其核心职责包括:
- 充电器类型检测
- 充电曲线管理
- 安全监控
4.1 充电检测流程
BM通过charger_detection_event_handler处理连接事件:
switch(event_type) { case CHARGER_EVENT_DETECTION_UPDATE: ssdev_get_plugin_state(); ssdev_detect_partner(); break; case CHARGER_EVENT_CONTRACT_UPDATE: update_charging_contract(); break; // ...其他事件 }充电器类型识别矩阵:
| 检测方式 | 类型 | 最大电流 |
|---|---|---|
| BC1.2 | SDP | 500mA |
| BC1.2 | CDP | 1.5A |
| Type-C | 1.5A | 1.5A |
| Type-C | 3A | 3A |
| PD协议 | PPS | 可编程 |
4.2 充电状态管理
BM主线程通过状态机管理充电全过程:
void BattMngrStateMachine_Main_Thread() { while(1) { Event = wait_for_events(); if(Event & BATTMNGR_DRV_CHARGER_CABLE_EVENT) { update_charge_current(); } // ...其他事件处理 } }关键安全机制包括:
- 温度监控(CONN_THERM传感器)
- 输入过压/欠压保护
- ESD(静电放电)防护
5. 用户界面反馈闭环
充电状态的最终呈现涉及跨处理器协作:
- ADSP侧通过
pmic_glink_send_notification发送通知 - AP侧接收并处理
POWER_GLINK_NOTIFY_ID_TYPEC_EVENT - 框架层更新PowerManagerService状态
- SystemUI接收广播更新图标
典型通知类型枚举:
enum power_glink_notify_id { POWER_GLINK_NOTIFY_ID_TYPEC_EVENT, // Type-C状态变化 POWER_GLINK_NOTIFY_ID_PD_EVENT, // PD协议事件 // ...其他通知类型 };在实际项目中,调试这类跨模块交互时,建议采用分层验证法:从TCPC寄存器检查开始,逐步验证各层状态迁移,最后确认GLINK通道的数据完整性。这种系统化的分析方法能快速定位问题所在的模块层级。