news 2026/4/26 13:54:33

从Type-C插拔到电量显示:拆解高通ADSP充电框架中TCPC、LPM、DPM的完整事件流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从Type-C插拔到电量显示:拆解高通ADSP充电框架中TCPC、LPM、DPM的完整事件流

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;

典型的状态迁移路径如下:

  1. Offline状态:初始状态,持续监测CC引脚
  2. Standby状态:检测到CC变化后进入
  3. Attached状态:确认连接有效后迁移
  4. 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中的事件分发器处理多种事件源:

事件来源典型事件类型处理方式
TCPCUSBPD_LPM_EVENT_ALERT解析Alert寄存器
定时器USBPD_LPM_EVENT_HKTIMER_TO处理超时任务
DPMUSBPD_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发起通知流程:

  1. 检查PAN(Port Association Number)状态
  2. 收集TCPM和PE模块的状态变更
  3. 通过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交互:

  1. PPM状态机处理本地策略决策

    • ppm_state_process_command_main:处理UCSI命令
    • ppm_state_ppm_wait_for_command_completion_main:等待AP确认
  2. 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.2SDP500mA
BC1.2CDP1.5A
Type-C1.5A1.5A
Type-C3A3A
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. 用户界面反馈闭环

充电状态的最终呈现涉及跨处理器协作:

  1. ADSP侧通过pmic_glink_send_notification发送通知
  2. AP侧接收并处理POWER_GLINK_NOTIFY_ID_TYPEC_EVENT
  3. 框架层更新PowerManagerService状态
  4. SystemUI接收广播更新图标

典型通知类型枚举:

enum power_glink_notify_id { POWER_GLINK_NOTIFY_ID_TYPEC_EVENT, // Type-C状态变化 POWER_GLINK_NOTIFY_ID_PD_EVENT, // PD协议事件 // ...其他通知类型 };

在实际项目中,调试这类跨模块交互时,建议采用分层验证法:从TCPC寄存器检查开始,逐步验证各层状态迁移,最后确认GLINK通道的数据完整性。这种系统化的分析方法能快速定位问题所在的模块层级。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 13:54:13

GetQzonehistory:3分钟学会永久备份你的QQ空间记忆宝库

GetQzonehistory:3分钟学会永久备份你的QQ空间记忆宝库 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否也曾担心那些记录青春岁月的QQ空间说说会随着时间而消失&#…

作者头像 李华
网站建设 2026/4/26 13:51:04

Agenst框架解析:从零构建生产级AI智能体工作流

1. 项目概述与核心价值最近在GitHub上看到一个名为“AugustineFulgur/Agenst”的项目,这个标题乍一看有点神秘,但点进去研究后,发现它触及了当前AI应用开发中一个非常核心且实际的痛点:如何高效、可靠地构建和管理基于大型语言模型…

作者头像 李华
网站建设 2026/4/26 13:50:04

基于VisionClaw与Gemini Live API构建实时AI眼镜助手:架构、部署与实战

1. 项目概述:打造你的实时AI眼镜助手 想象一下,你戴着智能眼镜走在街上,看到一家新开的咖啡馆,随口一问:“这家店评分怎么样?”眼镜里的AI不仅立刻“看到”了招牌,还能实时搜索并告诉你结果。或…

作者头像 李华
网站建设 2026/4/26 13:50:04

Obsidian Smart Connections:3分钟搭建你的AI智能笔记大脑

Obsidian Smart Connections:3分钟搭建你的AI智能笔记大脑 【免费下载链接】obsidian-smart-connections Chat with your notes & see links to related content with AI embeddings. Use local models or 100 via APIs like Claude, Gemini, ChatGPT & Lla…

作者头像 李华