日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android系统充电系统介绍-预防手机充电爆炸

發(fā)布時間:2023/12/20 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android系统充电系统介绍-预防手机充电爆炸 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、鋰電池介紹

鋰離子電池由日本索尼公司于1990年最先開發(fā)成功。它是把鋰離子嵌入碳(石油焦炭和石墨)中形成負極(傳統(tǒng)鋰電池用鋰或鋰合金作負極)。正極材料常用LixCoO2 ,也用 LixNiO2?,和LixMnO4 ,電解液用LiPF6+二乙烯碳酸酯(EC)+二甲基碳酸酯(DMC)。

石油焦炭和石墨作負極材料無毒,且資源充足,鋰離子嵌入碳中,克服了鋰的高活性,解決了傳統(tǒng)鋰電池存在的安全問題,正極LixCoO2在充、放電性能和壽命上均能達到較高水平,使成本降低,總之鋰離子電池的綜合性能提高了。預(yù)計21世紀鋰離子電池將會占有很大的市場。

鋰離子二次電池充、放電時的反應(yīng)式為LiCoO2+C=Li1-xCoO2+LixC?

上圖是鋰電池容量和電壓的對比圖,可以看到當容量為0%時,電壓最大,容量為100%時,電壓最小,容量指的是電池還可以裝下多少電量的意思。

過放:鋰電池如果電壓低于一定的門限,是不能夠還原的,就假設(shè),你有一個手機,放著幾個月一直沒有充電,如果電池電芯沒有過放保護,那你的手機想再次充電就不行了。

過充:電池爆炸,大部分因為過充引起的,電芯做的不好,鋰電池已經(jīng)充滿電了,沒有做好門限保護,導(dǎo)致爆炸,但是爆炸的原因不只是這個,比如充電器短路,手機內(nèi)部短路。

2、Android電池管理框架

問題:

有時候我們發(fā)現(xiàn)我電量50%掉到30%用了一個小時,但是同樣的使用方法20%到關(guān)機,可能只用了半個小時,這就是涉及電池曲線或者電量器的問題

電池曲線:
有點低成本手機,或者平板電腦,沒有電量器,就只能用ADC的值通過自己的算法來調(diào)整電池百分比,如果這個電池曲線調(diào)整的不好,就會出現(xiàn)上述問題。

電量器:
電量器也是用來計算電量的,但是有個芯片專門做這個事情,理論肯定比上面沒有電量器的效果好

Android電池整體框架

2.1. Kernel 層

本層屬于電池的驅(qū)動部分,負責與硬件進行交互,當電池電量信息發(fā)生變化時,生成相應(yīng)的uevent,上報給用戶層。

主要相關(guān)代碼路徑:

2.2. Healthd守護進程

本層在Android中屬于Native層,healthd中運行一個系統(tǒng)服務(wù)batteryproperties,負責監(jiān)聽Kernel中上報的uevent,對電池電量進行實時監(jiān)控。

主要相關(guān)代碼路徑:

2.3. BatteryService系統(tǒng)服務(wù)

本層提供了C++/Java兩套接口來訪問batteryproperties系統(tǒng)服務(wù)。?
本層的系統(tǒng)服務(wù)battery使用Java代碼寫成,運行在fwk的中SystemServer進程。?
該系統(tǒng)服務(wù)的主要作用是:監(jiān)聽batteryproperties服務(wù)中的電池信息變化消息,并將該消息以系統(tǒng)廣播的形式轉(zhuǎn)發(fā)至Android系統(tǒng)中各處。

主要相關(guān)代碼路徑:

\frameworks\native\services\batteryservice\IBatteryPropertiesRegistrar.cpp \frameworks\native\services\batteryservice\IBatteryPropertiesListener.cpp \frameworks\native\services\batteryservice\BatteryProperties.cpp \frameworks\base\core\java\android\os\IBatteryPropertiesRegistrar.aidl \frameworks\base\core\java\android\os\IBatteryPropertiesListener.aidl \frameworks\base\core\java\android\os\BatteryProperties.java \frameworks\base\services\core\java\com\android\server\BatteryService.java

2.4. SystemUI 應(yīng)用

該部分屬于電量上報的最后的環(huán)節(jié)。其主要工作是:監(jiān)聽系統(tǒng)廣播Intent.ACTION_BATTERY_CHANGED,并對UI作出相應(yīng)更新。

主要相關(guān)代碼路徑

\frameworks\base\packages\SystemUI\src\com\android\systemui\power\PowerUI.java

3、u-boot到kernel關(guān)機充電流程

Android充電有很多場景,關(guān)機充電是比較重要的一個需要了解的。

開機流程:

充電檢測開機流程:

u-boot代碼:

在u-boot里面,我們很多時候需要把一些信息傳給kernel,目前用到的方法是command_line,

開機方式也是這樣的。u-boot代碼如下代碼如下,kernel解析部分代碼請到init/main.c下面去找

以后抽個文章專門說明下

510?#ifdef?CONFIG_RK_SDCARD_BOOT_EN 511?????if?(StorageSDCardUpdateMode())?{?/*?sdcard?undate?*/ 512?????????snprintf(command_line,?sizeof(command_line), 513?????????????????"%s?%s",?command_line,?"sdfwupdate"); 514?????} 515?#endif 516? 517?#ifdef?CONFIG_RK_UMS_BOOT_EN 518?????if?(StorageUMSUpdateMode())?{?/*?ums?update?*/ 519?????????snprintf(command_line,?sizeof(command_line), 520?????????????????"%s?%s",?command_line,?"usbfwupdate"); 521?????} 522?#endif 523? 524?#ifdef?CONFIG_POWER_RK818 525?????if?(is_rk81x_fg_init()?!=?0)?{ 526?????????snprintf(command_line,?sizeof(command_line), 527?????????????????"%s?%s",?command_line,?"loader_charged"); 528?????} 529?#endif 530?????if?(charge)?{ 531?????????snprintf(command_line,?sizeof(command_line), 532?????????????????"%s?%s",?command_line,?"androidboot.mode=charger"); 533?????} 534? 535?#if?defined(CONFIG_LCD)?&&?defined(CONFIG_RK_FB_DDREND) 536?????/* 537??????*?uboot?fb?commandline:?uboot_logo=<size>@<address>[:<offset>] 538??????*?size?-?fb?size,?address?-?fb?address,?offset?-?kernel?bmp?logo?offset. 539??????*?offset?is?optional,?depend?on?resource?image?has?kernel_logo.bmp. 540??????*/ 541?????if?(g_logo_on_state?!=?0)?{ 542?????????snprintf(command_line,?sizeof(command_line), 543?????????????????"%s?uboot_logo=0x%08x@0x%08lx",?command_line,?CONFIG_RK_LCD_SIZE,?gd->fb_base); 544?#if?defined(CONFIG_KERNEL_LOGO) 545?????????if?(g_rk_fb_size?!=?-1) 546?????????????snprintf(command_line,?sizeof(command_line), 547?????????????????????"%s:0x%08x",?command_line,?g_rk_fb_size); 548?#endif?/*?CONFIG_KERNEL_LOGO?*/ 549?????} 550?#endif?/*?CONFIG_RK_FB_DDREND?*/ 551? 552?#if?defined(CONFIG_RK_DEVICEINFO) 553?????if?(g_is_devinfo_load) 554?????????snprintf(command_line,?sizeof(command_line), 555??????????????"%s?stb_devinfo=0x%08x@0x%08x", 556??????????????command_line,?SZ_8K,?CONFIG_RKHDMI_PARAM_ADDR); 557?#endif?/*?CONFIG_RK_DEVICEINFO*/ 558? 559?????snprintf(command_line,?sizeof(command_line), "./common/cmd_bootrk.c"?709L,?19309C????????

4、充電電流

電池充電有幾個階段

在軟件上需要根據(jù)電池廠家的的不同階段來給設(shè)置充電電流大小。

舉個栗子:

我們用USB先連接PC機給手機充電,這時候適配器不是DC模式,充電電流如果設(shè)置過大,就會導(dǎo)致PC藍屏。

而不同的電源適配器,D+ D- 的狀態(tài)不同,被識別的狀態(tài)也不一樣,流程也會不同。

之前做的一個功能是,在恒壓充電下,為了提高充電速度,我每間隔50ma提高充電電流,同時去檢查電池兩端的電壓大小,如果電壓降低到一定程度,就不會再增加充電電流。

5、kernel充電曲線代碼

上面提到的問題,如果沒有電量器的情況下,我們需要用數(shù)組來計算電池百分比,貼上這部分代碼給大家看看,這部分代碼可以適用于很多地方。

static struct batt_vol_cal batt_table[BATT_NUM] = {{3400,3520},{3610,3715},{3672,3790},{3705,3825},{3734,3841},{3764,3864},{3808,3930},{3845,3997},{3964,4047},{4034,4144},{4120,4200}, }; static?int?rk29_adc_battery_voltage_to_capacity(struct?rk29_adc_battery_data?*bat,?int?BatVoltage) {int?i?=?0;int?capacity?=?0;struct?batt_vol_cal?*p;p?=?batt_table;if?(rk29_adc_battery_get_charge_level(bat)){??//chargeif(BatVoltage?>=?(p[BATT_NUM?-?1].charge_vol)){capacity?=?100;}???else{if(BatVoltage?<=?(p[0].charge_vol)){capacity?=?0;}else{for(i?=?0;?i?<?BATT_NUM?-?1;?i++){if(((p[i].charge_vol)?<=?BatVoltage)?&&?(BatVoltage?<?(p[i+1].charge_vol))){capacity?=??i?*?10?+?((BatVoltage?-?p[i].charge_vol)?*?10)?/?(p[i+1].charge_vol-?p[i].charge_vol);break;}}}??}}else{??//dischargeif(BatVoltage?>=?(p[BATT_NUM?-?1].dis_charge_vol)){capacity?=?100;}???else{if(BatVoltage?<=?(p[0].dis_charge_vol)){capacity?=?0;}else{for(i?=?0;?i?<?BATT_NUM?-?1;?i++){if(((p[i].dis_charge_vol)?<=?BatVoltage)?&&?(BatVoltage?<?(p[i+1].dis_charge_vol))){capacity?=???i?*?10?+?((BatVoltage?-?p[i].dis_charge_vol)?*?10)?/?(p[i+1].dis_charge_vol-?p[i].dis_charge_vol);?;break;}}}??}}return?capacity; }static?void?rk29_adc_battery_capacity_samples(struct?rk29_adc_battery_data?*bat) {int?capacity?=?0;struct?rk29_adc_battery_platform_data?*pdata?=?bat->pdata;//充放電狀態(tài)變化后,Buffer填滿之前,不更新if?(bat->bat_status_cnt?<?NUM_VOLTAGE_SAMPLE)??{bat->gBatCapacityDisChargeCnt?=?0;bat->gBatCapacityChargeCnt????=?0;return;}capacity?=?rk29_adc_battery_voltage_to_capacity(bat,?bat->bat_voltage);if?(rk29_adc_battery_get_charge_level(bat)){if?(capacity?>?bat->bat_capacity){//實際采樣到的容量比顯示的容量大,逐級上升if?(++(bat->gBatCapacityDisChargeCnt)?>=?NUM_CHARGE_MIN_SAMPLE){bat->gBatCapacityDisChargeCnt??=?0;if?(bat->bat_capacity?<?99){bat->bat_capacity++;bat->bat_change??=?1;}}bat->gBatCapacityChargeCnt?=?0;}else{??//???實際的容量比采樣比?顯示的容量小bat->gBatCapacityDisChargeCnt?=?0;(bat->gBatCapacityChargeCnt)++;if?(pdata->charge_ok_pin?!=?INVALID_GPIO){if?(gpio_get_value(pdata->charge_ok_pin)?==?pdata->charge_ok_level){//檢測到電池充滿標志,同時長時間內(nèi)充電電壓無變化,開始啟動計時充電,快速上升容量if?(bat->gBatCapacityChargeCnt?>=?NUM_CHARGE_MIN_SAMPLE){bat->gBatCapacityChargeCnt?=?0;if?(bat->bat_capacity?<?99){bat->bat_capacity++;bat->bat_change??=?1;}}}else{ #if?0????????????????????if?(capacity?>?capacitytmp){//過程中如果電壓有增長,定時器復(fù)位,防止定時器模擬充電比實際充電快gBatCapacityChargeCnt?=?0;}else?if?(/*bat->bat_capacity?>=?85)?&&*/?(gBatCapacityChargeCnt?>?NUM_CHARGE_MAX_SAMPLE)){gBatCapacityChargeCnt?=?(NUM_CHARGE_MAX_SAMPLE?-?NUM_CHARGE_MID_SAMPLE);if?(bat->bat_capacity?<?99){bat->bat_capacity++;bat->bat_change??=?1;}}} #else????????????//??防止電池老化后出現(xiàn)沖不滿的情況,if?(capacity?>?bat->capacitytmp){//過程中如果電壓有增長,定時器復(fù)位,防止定時器模擬充電比實際充電快bat->gBatCapacityChargeCnt?=?0;}else{if?((bat->bat_capacity?>=?85)?&&((bat->gBatCapacityChargeCnt)?>?NUM_CHARGE_MAX_SAMPLE)){bat->gBatCapacityChargeCnt?=?(NUM_CHARGE_MAX_SAMPLE?-?NUM_CHARGE_MID_SAMPLE);if?(bat->bat_capacity?<?99){bat->bat_capacity++;bat->bat_change??=?1;}}}} #endif}else{//沒有充電滿檢測腳,長時間內(nèi)電壓無變化,定時器模擬充電if?(capacity?>?bat->capacitytmp){//過程中如果電壓有增長,定時器復(fù)位,防止定時器模擬充電比實際充電快bat->gBatCapacityChargeCnt?=?0;}else{if?((bat->bat_capacity?>=?85)?&&(bat->gBatCapacityChargeCnt?>?NUM_CHARGE_MAX_SAMPLE)){bat->gBatCapacityChargeCnt?=?(NUM_CHARGE_MAX_SAMPLE?-?NUM_CHARGE_MID_SAMPLE);if?(bat->bat_capacity?<?99){bat->bat_capacity++;bat->bat_change??=?1;}}}}????????????}}????else{???//放電時,只允許電壓下降if?(capacity?<?bat->bat_capacity){if?(++(bat->gBatCapacityDisChargeCnt)?>=?NUM_DISCHARGE_MIN_SAMPLE){bat->gBatCapacityDisChargeCnt?=?0;if?(bat->bat_capacity?>?0){bat->bat_capacity--?;bat->bat_change??=?1;}}}else{bat->gBatCapacityDisChargeCnt?=?0;}bat->gBatCapacityChargeCnt?=?0;}bat->capacitytmp?=?capacity; }???

好了今天就這么多,具體問題還是要具體分析去看代碼

推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

嵌入式Linux

微信掃描二維碼,關(guān)注我的公眾號

總結(jié)

以上是生活随笔為你收集整理的Android系统充电系统介绍-预防手机充电爆炸的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。