Android设备 显示充电速度流程

整体逻辑:设备充电速度的判断

系统通过读取充电器的最大电流(Current)最大电压(Voltage),计算最大充电功率(Wattage),以此判断当前是慢充、普通充还是快充:

  • 如果 maxChargingWattage <= 0:返回 CHARGING_UNKNOWN,说明未插电或读取失败;

  • 如果 maxChargingWattage < slowThreshold:返回 CHARGING_SLOWLY

  • 如果 maxChargingWattage > fastThreshold:返回 CHARGING_FAST

  • 否则:返回 CHARGING_REGULAR


1. Framework 层判断逻辑

public final int getChargingSpeed(Context context) {
    final int slowThreshold = context.getResources().getInteger(R.integer.config_chargingSlowlyThreshold);
    final int fastThreshold = context.getResources().getInteger(getFastChargingThresholdResId());

    return maxChargingWattage <= 0 ? CHARGING_UNKNOWN :
           maxChargingWattage < slowThreshold ? CHARGING_SLOWLY :
           maxChargingWattage > fastThreshold ? CHARGING_FAST :
           CHARGING_REGULAR;
}
  • 根据从 HAL 层传来的 maxChargingWattage 判断充电速度;

  • 阈值由资源文件 config.xml 提供(如下所示):

<!-- config.xml -->
<integer name="config_chargingSlowlyThreshold">3000000</integer> <!-- 3W -->
<integer name="config_chargingFastThreshold">12000000</integer> <!-- 12W -->
<integer name="config_chargingFastThreshold_v2">21000000</integer> <!-- 21W (用于新设备) -->

2. 最大充电功率的计算逻辑

frameworks/base/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java

从 Intent 提取电流电压并计算功率

private static int calculateMaxChargingMicroWatt(Intent batteryChangedIntent) {
    final int maxChargingMicroAmp = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT, -1);
    int maxChargingMicroVolt = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_VOLTAGE, -1);

    return calculateMaxChargingMicroWatt(maxChargingMicroAmp, maxChargingMicroVolt);
}
  • 作用:batteryChangedIntent(电池广播 Intent)中读取两个字段:

    • EXTRA_MAX_CHARGING_CURRENT:最大充电电流,单位为 微安(µA)

    • EXTRA_MAX_CHARGING_VOLTAGE:最大充电电压,单位为 微伏(µV)

  • 若读取失败(无此字段),会返回默认值 -1

  • 然后调用重载的 calculateMaxChargingMicroWatt(int, int) 方法进行功率计算。

 根据电流电压计算功率

private static int calculateMaxChargingMicroWatt(int maxChargingMicroAmp, int maxChargingMicroVolt) {
    if (maxChargingMicroVolt <= 0) {
        maxChargingMicroVolt = DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT;
    }
    if (maxChargingMicroAmp > 0) {
        return (int) Math.round(maxChargingMicroAmp * 0.001 * maxChargingMicroVolt * 0.001); // 转换为 mA * mV = µW
    } else {
        return -1;
    }
}
  • 电压校验

    if (maxChargingMicroVolt <= 0)

    • 若未获取到有效电压(为0或负数),使用默认值 DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT(通常为 5000000,即 5V)。

  • 功率计算

    return (int) Math.round(maxChargingMicroAmp * 0.001 * maxChargingMicroVolt * 0.001);

    • 先将 µA 和 µV 转换成 mA 和 mV:

      • maxChargingMicroAmp * 0.001:µA ➝ mA

      • maxChargingMicroVolt * 0.001:µV ➝ mV

    • 计算公式:

      PuW=ImA×VmVP_{uW} = I_{mA} \times V_{mV}PuW​=ImA​×VmV​

      单位为微瓦(µW)

  • 返回无效值

    • 若电流无效(≤ 0),则返回 -1,表示无法计算有效功率。


3. 数据来源:HAL 层读取电流/电压

void BatteryMonitor::updateValues(void) {
    ...
    for (每个充电器 charger) {
        读取 charger 的 current_max 节点 -> ChargingCurrent
        读取 charger 的 voltage_max 节点 -> ChargingVoltage

        double power = (ChargingCurrent / 1_000_000.0) * (ChargingVoltage / 1_000_000.0);

        如果 power 比之前最大值大:
            保存该电流电压到 mHealthInfo
    }
}
  • HAL 遍历 /sys/class/power_supply/ 下的所有充电器节点;

  • 从每个 charger 的 current_maxvoltage_max 读取最大支持值;

  • 计算每个充电器功率并取最大值填入 mHealthInfo

  • mHealthInfo.maxChargingCurrentMicroampsmaxChargingVoltageMicrovolts 将最终传给 Framework 层。


4. Kernel 层提供节点值

#define NORMAL_CHARGING_CURR_UA 500000     // 普通 USB:500mA
#define FAST_CHARGING_CURR_UA   1500000    // 快充口:1.5A

static int mt6375_chg_get_property(...) {
    switch (psp) {
        case POWER_SUPPLY_PROP_CURRENT_MAX:
            if (type == USB) val->intval = NORMAL_CHARGING_CURR_UA;
            else if (type == USB_DCP) val->intval = FAST_CHARGING_CURR_UA;
            break;

        case POWER_SUPPLY_PROP_VOLTAGE_MAX:
            val->intval = vbus_global; // 动态返回当前 vbus 电压
            break;
    }
}
  • Kernel 驱动根据充电口类型(如 USB、USB_DCP)返回对应最大电流;

  • 电压通过变量 vbus_global 实时获取;

  • 这些值最终通过 power_supply 框架上传给 HAL 层读取。


 流程总结

[Kernel] 驱动读取 current_max & voltage_max 节点
     ↓
[HAL] BatteryMonitor 计算最大功率并存入 mHealthInfo
     ↓
[Framework] BatteryStatus 读取 Intent 中传来的最大 µA/µV,换算为 µW
     ↓
getChargingSpeed() 对比 config 阈值,判断是快充/慢充/普通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值