整體邏輯:設備充電速度的判斷
系統通過讀取充電器的最大電流(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 節點 -> ChargingVoltagedouble 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.5Astatic 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 閾值,判斷是快充/慢充/普通