微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > MT6582平台,手机待机后,电量的百分比不会更新?

MT6582平台,手机待机后,电量的百分比不会更新?

时间:10-02 整理:3721RD 点击:
就是待机几天,待机前是多少,待机后还是多少,而实际电池电压已经减小了。
正常在使用时,电池百分比是显示正常的。

MTK平台都有这个问题,需要修改休眠时的电量计算算法

具体怎么修改?

具体怎么修改啊?求教。

battery_meter.c 修改这个文件的resume函数,如下:

  1. static int battery_meter_resume(struct platform_device *dev)
  2. {
  3. #if defined(CONFIG_POWER_EXT)

  4. #elif defined(SOC_BY_SW_FG)
  5.         kal_int32 hw_ocv_after_sleep;
  6.         struct timespec xts, tom, rtc_time_after_sleep;
  7. //    kal_int32 sw_vbat;
  8. //    kal_int32 vbat_diff = 200;
  9.         get_xtime_and_monotonic_and_sleep_offset(&xts, &tom, &rtc_time_after_sleep);
  10.         _g_bat_sleep_total_time += rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec;
  11.         battery_xlog_printk(BAT_LOG_CRTI, "[battery_meter_resume] sleep time = %d, g_spm_timer = %d\n", _g_bat_sleep_total_time, g_spm_timer);

  12.         if (_g_bat_sleep_total_time < g_spm_timer) {
  13.                 return 0;
  14.         }

  15.         bat_spm_timeout = true;
  16.         battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &hw_ocv_after_sleep);   

  17.         //开始添加
  18.         int vol_bat1=0;
  19.         int HW_OCV1=0;
  20.         int D0=0;
  21.         int ret=0;
  22.         vol_bat1 = 15; //set avg times
  23.         ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_SENSE, &vol_bat1);
  24.         HW_OCV1 = vol_bat1 + mtk_imp_tracking(vol_bat1, 800, 5);//待机电流值80mA,可以根据客户情况,稍作调整
  25.         D0=fgauge_read_d_by_v(HW_OCV1);
  26.         battery_xlog_printk(BAT_LOG_CRTI, "[battery_meter_resume] vol_bat1=%d, HW_OCV1=%d\n", vol_bat1 ,HW_OCV1);
  27.         battery_xlog_printk(BAT_LOG_CRTI, "[battery_meter_resume] D0=%d,UI_SOC_TEMP=%d,be_ocv=(%d) \n", D0,100-D0,g_hw_ocv_before_sleep);
  28.         //结束添加

  29. #if 0   
  30.     sw_vbat = battery_meter_get_battery_voltage();
  31.    
  32.     bm_print(BM_LOG_CRTI, "HW_OCV=%d, SW_VBAT=%d\n", hw_ocv_after_sleep, sw_vbat);
  33.    
  34.     if(hw_ocv_after_sleep < sw_vbat)
  35.     {
  36.         bm_print(BM_LOG_CRTI, "Ignore HW_OCV : small than SW_VBAT\n");
  37.     }
  38.     else if( (hw_ocv_after_sleep - sw_vbat) > vbat_diff )
  39.     {
  40.         bm_print(BM_LOG_CRTI, "Ignore HW_OCV : diff > %d\n", vbat_diff);
  41.     }
  42.     else
  43. #endif        
  44.     {   
  45.         
  46.         
  47.             if(_g_bat_sleep_total_time > 3600)        //1hr
  48.             {
  49.                     if(1)//(hw_ocv_after_sleep <= g_hw_ocv_before_sleep)
  50.                     {
  51.                     /*
  52.                              gFG_DOD0 = fgauge_read_d_by_v(hw_ocv_after_sleep);
  53.                              oam_v_ocv_2 = oam_v_ocv_1 = hw_ocv_after_sleep;
  54.                              oam_car_1 = 0;
  55.                              oam_car_2 = 0; */

  56.                 //oam_d0 = fgauge_read_d_by_v(hw_ocv_after_sleep);
  57.                 oam_d0 = D0;
  58.                 oam_v_ocv_2 = oam_v_ocv_1 = HW_OCV1;
  59.                 oam_car_1 = 0;
  60.                 oam_car_2 = 0;
  61.                 if (BMT_status.UI_SOC>100-oam_d0)
  62.                 {
  63.                 BMT_status.UI_SOC=100-oam_d0;
  64.                 oam_d_5 = oam_d0;
  65.                 }
  66.                 //结束修改
  67.                        
  68.                     }
  69.                     else
  70.                     {
  71.                              oam_car_1 = oam_car_1 + (40* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh
  72.                          oam_car_2 = oam_car_2 + (40* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh       
  73.                     }
  74.             }
  75.             else
  76.             {
  77.                             oam_car_1 = oam_car_1 + (20* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh
  78.                             oam_car_2 = oam_car_2 + (20* (rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec)/3600); //0.1mAh       
  79.             }       

  80.         bm_print(BM_LOG_CRTI, "sleeptime=(%d)s, be_ocv=(%d), af_ocv=(%d), D0=(%d), car1=(%d), car2=(%d) \n",
  81.                     rtc_time_after_sleep.tv_sec - g_rtc_time_before_sleep.tv_sec, g_hw_ocv_before_sleep, hw_ocv_after_sleep,gFG_DOD0, oam_car_1, oam_car_2);
  82.     }
  83. #endif               
  84.     bm_print(BM_LOG_CRTI, "[battery_meter_resume]\n");
  85.     return 0;
  86. }

复制代码

你这是MT6580的修改方案吧

具体问题要看LOG

我在80平台也遇到了电量下降很快的问题(休眠后),一分钟降一个百分比。通过那样修改后编译个boot下载进去,还是会降的很快。难道是要全下吗。主要是uisoc和soc有时相差很大

:(:(

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top