微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > MTK6572平台待机电池电量长时间待机电池电量不变,唤醒后电池电量快速下降。

MTK6572平台待机电池电量长时间待机电池电量不变,唤醒后电池电量快速下降。

时间:10-02 整理:3721RD 点击:
mtk6572平台待机电池电量长时间待机电池电量不变,唤醒后电池电量快速下降。
按MTK的FAQ修改也一样现像。

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. }

复制代码

这个是MTK的FAQ上面的东西。我加过没有用处。你们加了后有用吗?

  if(1)//(hw_ocv_after_sleep <= g_hw_ocv_before_sleep)
你看到这个没?
改成这样就行了。
我们也是打LOG看到的,这个if 是跑不进去的。让他跑进去就可以了。

谢谢蒋总!

11:18:57
孙迪财 2015/11/14 11:18:57
蒋总,问下。你电池电量不更的问题,是一点都不更新还是更新很慢啊
11:19:32
光辉岁月 2015/11/14 11:19:32
一点都不更新
孙迪财 2015/11/14 11:20:55
按你那样改了之后就正常了?
光辉岁月 2015/11/14 11:21:19
是的
11:23:02
孙迪财 2015/11/14 11:23:02
我看代码,不是在插SIM的情况下。modem会定时唤醒系统嘛。这样电池不是会更新吗?
光辉岁月 2015/11/14 11:23:27
我当时没有测SIM卡
光辉岁月 2015/11/14 11:23:47
没有试有没有SIM卡,反正是没有SIM卡时测试的
11:26:57
孙迪财 2015/11/14 11:26:57
哦,我这插SIM电池电量更新也有问题。

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

网站地图

Top