新的项目,手机充电的时候,systemui显示慢速充电。

通过电流计测量,充电电流为1.7A,电压5v,这个功率还挺高的,怎么就提示慢速充电了呢。

查看代码http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java

    protected String computePowerIndication() {if (mPowerCharged) {return mContext.getResources().getString(R.string.keyguard_charged);}final boolean hasChargingTime = mChargingTimeRemaining > 0;int chargingId;if (mPowerPluggedInWired) {switch (mChargingSpeed) {case BatteryStatus.CHARGING_FAST:chargingId = hasChargingTime? R.string.keyguard_indication_charging_time_fast: R.string.keyguard_plugged_in_charging_fast;break;case BatteryStatus.CHARGING_SLOWLY:chargingId = hasChargingTime? R.string.keyguard_indication_charging_time_slowly: R.string.keyguard_plugged_in_charging_slowly;break;default:chargingId = hasChargingTime? R.string.keyguard_indication_charging_time: R.string.keyguard_plugged_in;break;}} else {chargingId = hasChargingTime? R.string.keyguard_indication_charging_time_wireless: R.string.keyguard_plugged_in_wireless;}
mChargingSpeed = status.getChargingSpeed(mContext);

http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/packages/SettingsLib/src/com/android/settingslib/fuelgauge/BatteryStatus.java

    public final int getChargingSpeed(Context context) {final int slowThreshold = context.getResources().getInteger(R.integer.config_chargingSlowlyThreshold);final int fastThreshold = context.getResources().getInteger(R.integer.config_chargingFastThreshold);return maxChargingWattage <= 0 ? CHARGING_UNKNOWN :maxChargingWattage < slowThreshold ? CHARGING_SLOWLY :maxChargingWattage > fastThreshold ? CHARGING_FAST :CHARGING_REGULAR;}
    public BatteryStatus(Intent batteryChangedIntent) {status = batteryChangedIntent.getIntExtra(EXTRA_STATUS, BATTERY_STATUS_UNKNOWN);plugged = batteryChangedIntent.getIntExtra(EXTRA_PLUGGED, 0);level = batteryChangedIntent.getIntExtra(EXTRA_LEVEL, 0);health = batteryChangedIntent.getIntExtra(EXTRA_HEALTH, BATTERY_HEALTH_UNKNOWN);final int maxChargingMicroAmp = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_CURRENT,-1);int maxChargingMicroVolt = batteryChangedIntent.getIntExtra(EXTRA_MAX_CHARGING_VOLTAGE, -1);if (maxChargingMicroVolt <= 0) {maxChargingMicroVolt = DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT;}if (maxChargingMicroAmp > 0) {// Calculating muW = muA * muV / (10^6 mu^2 / mu); splitting up the divisor// to maintain precision equally on both factors.maxChargingWattage = (maxChargingMicroAmp / 1000)* (maxChargingMicroVolt / 1000);} else {maxChargingWattage = -1;}}

http://aospxref.com/android-11.0.0_r21/xref/frameworks/base/packages/SettingsLib/res/values/config.xml

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!--  Threshold in micro watts below which a charger is rated as "slow"; 1A @ 5V  -->
<integer name="config_chargingSlowlyThreshold">5000000</integer>
<!--  Threshold in micro watts above which a charger is rated as "fast"; 1.5A @ 5V   -->
<integer name="config_chargingFastThreshold">7500000</integer>
</resources>

也就是低于5w显示慢速充电,高于7.5w显示快速充电,大于5w而小于7.5w或者获取不到最大电流值显示正在充电。

当然分析的是Android原生代码,mtk应该对这一块作了定制,要下周到公司look下源码了。

有空再来分析已是1个月后,无奈。(前面的地址打不开了,换了一个源码的地址)

最大电流和最大电压的来源

https://www.androidos.net.cn/android/10.0.0_r6/xref/frameworks/base/services/core/java/com/android/server/BatteryService.java

intent.putExtra(BatteryManager.EXTRA_MAX_CHARGING_CURRENT, mHealthInfo.maxChargingCurrent);
intent.putExtra(BatteryManager.EXTRA_MAX_CHARGING_VOLTAGE, mHealthInfo.maxChargingVoltage);

最终到https://www.androidos.net.cn/android/10.0.0_r6/xref/system/core/healthd/BatteryMonitor.cpp,这块不好理解,可参考 https://blog.csdn.net/qq759981398/article/details/73155782

#define POWER_SUPPLY_SUBSYSTEM "power_supply"
#define POWER_SUPPLY_SYSFS_PATH "/sys/class/" POWER_SUPPLY_SUBSYSTEM
#define MILLION 1.0e6
#define DEFAULT_VBUS_VOLTAGE 5000000  //底层获取的电压是uV 电流是uAstatic void initBatteryProperties(BatteryProperties* props) {...props->maxChargingCurrent = 0;props->maxChargingVoltage = 0;...
}bool BatteryMonitor::update(void) {double MaxPower = 0;path.appendFormat("%s/%s/current_max", POWER_SUPPLY_SYSFS_PATH, mChargerNames[i].string());int ChargingCurrent =(access(path.string(), R_OK) == 0) ? getIntField(path) : 0;path.appendFormat("%s/%s/voltage_max", POWER_SUPPLY_SYSFS_PATH,mChargerNames[i].string());int ChargingVoltage =(access(path.string(), R_OK) == 0) ? getIntField(path) :DEFAULT_VBUS_VOLTAGE;double power = ((double)ChargingCurrent / MILLION) *((double)ChargingVoltage / MILLION);if (MaxPower < power) {props.maxChargingCurrent = ChargingCurrent;props.maxChargingVoltage = ChargingVoltage;MaxPower = power;}
}

再看下mChargerNames的定义

void BatteryMonitor::init(struct healthd_config *hc) {String8 path;char pval[PROPERTY_VALUE_MAX];mHealthdConfig = hc;std::unique_ptr<DIR, decltype(&closedir)> dir(opendir(POWER_SUPPLY_SYSFS_PATH), closedir);if (dir == NULL) {KLOG_ERROR(LOG_TAG, "Could not open %s\n", POWER_SUPPLY_SYSFS_PATH);} else {struct dirent* entry;while ((entry = readdir(dir.get()))) {const char* name = entry->d_name;std::vector<String8>::iterator itIgnoreName;path.appendFormat("%s/%s/type", POWER_SUPPLY_SYSFS_PATH, name);switch(readPowerSupplyType(path)) {case ANDROID_POWER_SUPPLY_TYPE_AC:case ANDROID_POWER_SUPPLY_TYPE_USB:case ANDROID_POWER_SUPPLY_TYPE_WIRELESS:path.clear();path.appendFormat("%s/%s/online", POWER_SUPPLY_SYSFS_PATH, name);if (access(path.string(), R_OK) == 0)mChargerNames.add(String8(name));break;
...
}

https://www.androidos.net.cn/android/10.0.0_r6/xref/system/core/healthd/include/healthd/BatteryMonitor.h

   enum PowerSupplyType {ANDROID_POWER_SUPPLY_TYPE_UNKNOWN = 0,ANDROID_POWER_SUPPLY_TYPE_AC,ANDROID_POWER_SUPPLY_TYPE_USB,ANDROID_POWER_SUPPLY_TYPE_WIRELESS,ANDROID_POWER_SUPPLY_TYPE_BATTERY};

遍历sys/class/power_supply里每一个文件夹,如果文件夹里有type节点(且值为1,2,3)皆且有online节点,则判定为mChargerNames

于是去查找该节点,刚好有一个/sys/class/power_supply/usb,看下获取电流电压的实现

static int mt_usb_get_property(struct power_supply *psy,enum power_supply_property psp, union power_supply_propval *val)
{struct mtk_charger_type *info;info = (struct mtk_charger_type *)power_supply_get_drvdata(psy);switch (psp) {case POWER_SUPPLY_PROP_ONLINE:if ((info->type == POWER_SUPPLY_USB_TYPE_SDP) ||(info->type == POWER_SUPPLY_USB_TYPE_CDP))val->intval = 1;elseval->intval = 0;break;case POWER_SUPPLY_PROP_CURRENT_MAX:val->intval = 500000;break;case POWER_SUPPLY_PROP_VOLTAGE_MAX:val->intval = 5000000;break;default:return -EINVAL;}return 0;
}

你说为什么这么奇怪,mtk原始的代码固定了。也就是5x0.5=2.5w,那当然显示慢速充电了。

再看下有如下代码

if (info->bc12_active) {info->usb_psy = power_supply_register(&pdev->dev,&info->usb_desc, &info->usb_cfg);
}

如果dtsi有配置bc12_active的值为1,才会跑到这段代码,该值默认是0,但我使用的工程对应该值为1,于是跑到了。

如果该值默认是0,那么将获取不到该节点,按上面的代码,默认电压是0A,默认电流是0A,提示语就会变成正在充电。

至于bc12_active配置0有没有问题,还要再考虑下。

今天再来看调试信息,发现符合条件的mChargerNames有两个,分别是mt6370_pmu_charger和mtk_charger_type
看下mt6370的获取电压和电流的方式

chg_data->psy_desc.type 不会是POWER_SUPPLY_TYPE_USB,val->intval不会赋值
static int mt6370_charger_get_property(struct power_supply *psy,enum power_supply_property psp,union power_supply_propval *val)
{int ret = 0;...case POWER_SUPPLY_PROP_CURRENT_MAX:if (chg_data->psy_desc.type == POWER_SUPPLY_TYPE_USB)val->intval = 500000;break;case POWER_SUPPLY_PROP_VOLTAGE_MAX:if (chg_data->psy_desc.type == POWER_SUPPLY_TYPE_USB)val->intval = 5000000;break;...return ret;
}

按如下修改把mChargerNames改成1个,系统就提示正在充电了。

-&mtk_gauge {
-    charger = <&mtk_charger_type>;
-};-&charger {
-    charger = <&mtk_charger_type>;
-};-&usb {
-    charger = <&mtk_charger_type>;
-}-&mtk_charger_type {
-       bc12_active = <1>;
-}+&mt6370_chg {
+    bc12_sel = <1>;
+};

Android手机提示正在慢速充电的解决方法相关推荐

  1. 一张壁纸使 Android 手机集体变砖,目前尚无解决方法

    近日,一名网友在 Twitter 上传了一张壁纸并表示该壁纸会使他的三星手机崩溃.此前已经有日历 Bug 导致三星手机集体崩溃的事情发生,而这一次三星手机再次中招.只因为使用了一张风景壁纸就能导致手机 ...

  2. 一张壁纸使 Android 手机集体变砖,目前尚无解决方法,移动应用开发

    一张壁纸使Android手机集体变砖,目前尚无解决方法 图为"肇事"的壁纸,大家不要轻易尝试! 而后,该用户又发布了一条推文表示,不止是三星的手机,他的 Google Pixel ...

  3. android手机com.google.process.gapps错误的解决方法

    android手机com.google.process.gapps错误的解决方法 参考文章: (1)android手机com.google.process.gapps错误的解决方法 (2)https: ...

  4. 手机进水开机android,手机进水了闪退的解决方法

    闪退,多指在移动设备中,在打开应用程序时出现的突然退出中断的情况.手机进水了闪退的解决方法,我们来看看. 手机应用闪退是怎么办? 手机闪退原因一.缓存垃圾太多 手机应用闪退是怎么回事 常见的修复方法介 ...

  5. oppo手机出现android什么坏了,OPPO手机提示“停止运行”怎么办 oppo停止运行的解决方法...

    智能机因丰富多彩的应用而深受大家的喜爱,正因为如此,"停止运行"问题是最令用户朋友们头痛的事儿.那么,为什么会导致"停止运行"呢?又该如何解决呢? OPPO停止 ...

  6. 内部存储空间不足_手机提示存储空间不足的原因和解决方法

    智能手机可以下载很多软件和APP,避免不了手机系统提示存储空间不足的现象,存储空间不足就意味着不能再下载和安装软件,要如何解决手机存储空间不足的现状呢?首先得要知道手机提示存储空间不足的原因有哪些?然 ...

  7. android自动删除su,Android手机提示“su二进制过旧”的解决办法

    症状:近两天,手机通知栏总有个"#SU 二进制文件过旧--更新SU 二进制文件",点击后,进入"SU 二进制文件更新程序"页面,内框显示"正在下载 m ...

  8. Android手机编程初学遇到的问题及解决方法

    对高手来讲不值一提,可是对我这个初学来讲却是因为这些问题费了老长时间,有的不是编程问题,但不注意也会浪费不少宝贵时间!随时遇到随时更新... 引入第三方类库的问题,开始引用后没什么问题,但发现了该类库 ...

  9. JavaScript使用 nullish coalescing operator(空值合并操作符??)导致部分Android手机打不开H5页面的解决方法

    目录 前言 空值合并操作符?? 解决方法 方法一 方法二 如何判断浏览器是否支持ES某一特性 支持

最新文章

  1. Unity3D在iOS下为啥不能更新的资料收集
  2. Spring中JdbcTemplate中使用RowMapper
  3. 多媒体容器格式概述①
  4. 编写时钟aplet程序java,编写时钟 Applet 程序
  5. UA MATH571B 试验设计 QE练习题1
  6. php 会议签到系统_人脸识别会议签到系统有哪些优点?
  7. 联想y50更换固态硬盘_旧笔记本电脑更换固态硬盘
  8. easyui菜单 java_EasyUI:主界面以及菜单功能
  9. 如何正确地使用#region指令
  10. Stata:面板数据模型的完整步骤(NPL与企业绿色创新)
  11. Flowable工作流引擎表用途整理
  12. 基于matlab的am调制与仿真,基于MATLAB的AM调制及解调系统仿真分解
  13. LaTex Introduction 基础介绍
  14. PyMol2.4安装教程
  15. 图片文字识别的方法有哪些?
  16. src refspec xxx does not match any 错误处理办法
  17. 线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则
  18. ios14测试版兼容软件,iOS14测试版抢先体验教程!你的iPhone可以更新吗?【附iOS14独有彩蛋】...
  19. AI研习丨专题:面向防疫的5G巡检机器人技术与应用
  20. 旅行社如何通过抖音短视频获客?

热门文章

  1. Oracle的SCN和LSN
  2. 关键字Implements与@Override
  3. LeetCode 289 Game of Life(生命游戏)(Array)
  4. 2022了,连续第15年的回顾展望
  5. 在政策推动及需求拉动下,我国充电桩行业发展现状及前景分析
  6. 城市管网监测系统,保障城市血管生命线!
  7. GMQ致力于为用户提供更多符合当代需求的应用
  8. 【被误解是不是表达者的宿命】
  9. 快播大屏幕作为快播的第一款硬件产品
  10. 基于SEER的区块链版赛亚麻将游戏Pre alpha版本内测啦!