网上365平台被黑提款-365外网足球-365体育平台网址

365体育平台网址

Android设备 显示充电速度流程

2025-07-31 11:24:04 作者 admin 阅读 6523
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 提供(如下所示):

3000000

12000000

21000000

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_max 和 voltage_max 读取最大支持值;

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

mHealthInfo.maxChargingCurrentMicroamps 和 maxChargingVoltageMicrovolts 将最终传给 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 阈值,判断是快充/慢充/普通

相关文章