AI智能摘要
深入剖析华为Mate X5充电管理源码,从软件架构、目录组织到核心模块如电池与充电器管理,亮点涵盖充电模式协商、事件驱动通信、参数投票决策等机制。文章详细展现了多电池支持、故障安全保护、硬件抽象接口与充电流程,对华为Linux内核电源管理体系结构及流程进行了系统性解读,为技术研究和实践提供重要参考。
此摘要由AI分析文章内容生成,仅供参考。

作者亦在初学华为充电管理相关技术,拙见之处,恐有疏漏。若文章中有任何不足或谬误,恳请诸位不吝指教,于评论区留言斧正,感激不尽。

本文源代码取自华为官网开源代码中的华为Mate X5,位于Linux内核的kernel/drivers/hwpower/目录下。

软件架构

目录结构

  hwpower/
  ├── cc_accessory/              # 配件管理(无线光带等)
  ├── cc_adapter/                # 适配器检测与管理
  ├── cc_battery/                # 电池管理核心
  │   ├── battery_core.c         # 电池核心逻辑
  │   ├── battery_1s2p/          # 1串2并电池管理
  │   ├── battery_cccv/          # CC/CV充电控制
  │   ├── battery_charge_balance/# 电荷平衡
  │   ├── battery_fault/         # 电池故障检测
  │   ├── battery_model/         # 电池模型管理
  │   ├── battery_ocv/           # 开路电压管理
  │   ├── battery_soh/           # 电池健康度
  │   ├── battery_temp/          # 温度管理
  │   ├── battery_type_identify/ # 电池类型识别
  │   └── battery_ui_capacity/   # UI电量显示
  ├── cc_charger/                # 充电器管理
  │   ├── charge_manager.c       # 充电管理器
  │   ├── buck_charge/           # Buck充电模式
  │   ├── direct_charge/         # 直充模式(SCP/LVC)
  │   ├── hvdcp_charge/          # HVDCP快充
  │   ├── wireless_charge/       # 无线充电
  │   └── common/                # 公共接口
  ├── cc_common_module/          # 公共模块
  │   ├── power_event/           # 事件管理
  │   ├── power_vote/            # 投票机制
  │   ├── power_algorithm/       # 算法库
  │   ├── power_supply/          # 电源供应接口
  │   └── ...                    # 其他公共模块
  ├── cc_coul/                   # 电量计管理
  ├── cc_hardware_channel/       # 硬件通道
  ├── cc_hardware_ic/            # 硬件IC驱动
  ├── cc_isolation/              # 隔离保护
  └── cc_protocol/               # 充电协议

核心组件

电池管理核心 (cc_battery)

battery_core:电池系统的核心控制器,负责:

  • 电池状态监控(存在性、充电状态、健康度)

  • 温度补偿与NTC校准

  • 容量等级管理

  • 多电池系统支持(主/辅电池) 关键子模块:

  • battery_1s2p:1串2并电池拓扑管理

  • battery_cccv:恒流恒压充电算法

  • battery_charge_balance:串并联电池电荷平衡

  • battery_model:电池模型与参数管理

  • battery_soh:电池健康度计算与预测

充电器管理 (cc_charger)

charge_manager:充电系统的总调度器,负责:

  • 充电模式选择(Buck、直充、无线)

  • 充电状态机管理

  • 协议协商与适配器识别

  • 故障处理与安全保护 充电模式:

  • Buck Charge:传统降压充电,支持普通充电器

  • Direct Charge:直充模式,支持SCP/LVC快充

  • HVDCP:高电压快充协议

  • Wireless Charge:无线充电管理

公共模块 (cc_common_module)

power_event:事件驱动框架,定义了大量电源相关事件:

  • 连接/断开事件(USB、无线、OTG)

  • 充电状态事件(开始、停止、完成、故障)

  • 温度与保护事件

  • 协议协商事件 power_vote:投票决策机制,用于多客户端参数协商:

  • FCC(满充容量)投票

  • ICL(输入电流限制)投票

  • 电压与温度阈值投票

通信机制

事件通知机制

系统采用Linux内核的notifier机制实现组件间通信:

  // 事件类型定义(超过200种事件)
  enum power_event_ne_type {
    POWER_NE_USB_CONNECT,          // USB连接
    POWER_NE_USB_DISCONNECT,       // USB断开
    POWER_NE_CHARGING_START,       // 充电开始
    POWER_NE_CHARGING_STOP,        // 充电停止
    POWER_NE_DC_LVC_CHARGING,      // LVC直充
    POWER_NE_DC_SC_CHARGING,       // SC直充
    // ... 其他事件
  };

  // 事件通知接口
  int power_event_bnc_notify(unsigned int bnt_type,
                          unsigned int event_type,
                          void *data);

投票决策机制

系统采用客户端投票机制进行参数决策:

// 投票客户端定义
enum vote_client_type {
  VOTE_CLIENT_THERMAL,      // 温控客户端
  VOTE_CLIENT_USER,         // 用户配置
  VOTE_CLIENT_JEITA,        // JEITA温度规范
  VOTE_CLIENT_BASP,         // 电池保护
  VOTE_CLIENT_DC,          // 直充模块
  VOTE_CLIENT_CABLE,        // 线缆检测
  VOTE_CLIENT_ADAPTER,      // 适配器能力
  // ... 其他客户端
};

// 投票表结构
struct vote_table {
  int type;                 // 投票类型
  const char *name;         // 客户端名称
  int value;                // 投票值
  bool enabled;             // 是否启用
};

硬件抽象接口

// 电量计接口
struct coul_interface_ops {
  int (*is_coul_ready)(void *dev_data);
  int (*is_battery_exist)(void *dev_data);
  int (*get_battery_capacity)(void *dev_data);
  int (*get_battery_temperature)(void *dev_data);
  int (*get_battery_voltage)(void *dev_data);
  int (*get_battery_current)(void *dev_data);
  // ... 其他操作
};

// 充电IC接口
struct buck_charge_ic_ops {
  int (*set_charge_current)(void *dev_data, int value);
  int (*set_input_current)(void *dev_data, int value);
  int (*set_charge_voltage)(void *dev_data, int value);
  int (*set_terminal_current)(void *dev_data, int value);
  // ... 其他操作
};

工作流程

充电启动流程

适配器插入检测
↓
协议握手(PD/SCP/FCP/UFCS)
↓
充电模式选择(投票决策)
↓
参数配置(电流/电压/温度)
↓
充电状态监控
↓
故障检测与保护

事件处理流程

硬件中断触发(连接/断开/故障)
↓
驱动层事件生成
↓
事件系统分发
↓
订阅者处理
↓
状态更新与反馈

投票决策流程

客户端提出参数需求
↓
投票系统收集所有客户端意见
↓
根据优先级和规则进行决策
↓
应用最终参数到硬件
↓
监控效果并动态调整

总结

华为 hwpower 充电框架是一个分层、模块化、高度解耦的充电管理系统,采用插件化设计,支持多种充电协议和充电模式。

核心设计理念

  1. 分层架构: 应用层 → 框架层 → 驱动层 → 硬件层

  2. 模块化: 每个功能独立模块,可插拔

  3. 接口抽象: 通过 ops 结构体和接口层解耦

  4. 事件驱动: 基于事件通知链的异步通信

  5. 投票仲裁: 多客户端参数协商机制