微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > hw_ocv的更新和获取方法

hw_ocv的更新和获取方法

时间:10-02 整理:3721RD 点击:

hw_ocv的更新和获取方法

电量计算过程中,旧gauge算法和GM2.0都会经常用到hw_ocv的值,那到底hw_ocv如何获取?hw_ocv又是何时更新?

1.hw_ocv何时更新:
hw_ocv表示电池的开路电压,我们的做法是让硬件在合适的时间点通过ADC获取电池电压的值保存到对应的寄存器,在需要用到hw_ocv的值时才会通过软件读寄存器的值,并不会像去读电池CV电压一样通过一个ADC通道实时读取和更新,hw_ocv对应寄存器的值


复制代码


在如下两个时间点会得到更新:
(1)手机第一次上电时会更新一次,即 AV(LDO)信号起来后2~3mS内会更新一次;
(2)手机休眠唤醒过程会更新一次,即SRCLKEN(26MHz时钟)信号从0->1时更新一次。

2.旧gauge算法获取hw_ocv的方法:
直接通过下面这个回调函数接口,调到Battery_meter_hal.c里面对应接口读取寄存器的值。
1388 ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &gFG_voltage);

3.GM2.0获取hw_ocv的方法:
从battery_meter_hal.c对应接口读取到寄存器的值后,通过netlink将hw_ocv的值传到GM2.0上层daemon。

/kernel-3.10/drivers/power/mediatek/battery_meter_fg_20.c

  1. void bmd_ctrl_cmd_fROM_user(void *nl_data, struct fgd_nl_msg_t
  2. *ret_msg)
  3. {

  4. switch (msg->fgd_cmd) {

  5. case FG_DAEMON_CMD_GET_HW_OCV:
  6. {
  7. kal_int32 voltage = 0;

  8. battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_OCV, &voltage);

  9. ret_msg->fgd_data_len += sizeof(voltage);
  10. meMCPy(ret_msg->fgd_data, &voltage, sizeof(voltage));
  11. //bm_print(BM_LOG_CRTI, " ret_msg->fgd_data_len %d\n",ret_msg-
  12. >fgd_data_len);
  13. bm_print(BM_LOG_CRTI, "[fg_res] voltage = %d\n",voltage);
  14. gFG_hwocv = voltage;
  15. }
  16. break;

复制代码


4.battery_meter_hal.c里面对应的接口函数如下:
定义宏值SWCHR_POWER_PATH选择不同的通道,分别对应硬件BATSENS & ISENSE两个
PIN的电压。
/kernel-3.10/drivers/misc/mediatek/power/mt6735/battery_meter_hal.c

  1. int get_hw_ocv(void)
  2. {
  3. #if defined(CONFIG_POWER_EXT)
  4. return 4001;
  5. bm_print(BM_LOG_CRTI, "[get_hw_ocv] TBD\n");
  6. #else
  7. kal_int32 adc_result_reg=0;
  8. kal_int32 adc_result=0;
  9. kal_int32 r_val_temp=3; //MT6325 use 2, old chip use 4

  10. #if defined(SWCHR_POWER_PATH)
  11. adc_result_reg =
  12. pMIC_get_register_value(PMIC_AUXADC_ADC_OUT_WAKEUP_SWCHR);//mt6325_upmu_ge
  13. t_rg_adc_out_wakeup_swchr();
  14. adc_result =
  15. (adc_result_reg*r_val_temp*VOLTAGE_FULL_RANGE)/ADC_PRECISE;
  16. bm_print(BM_LOG_CRTI, "[oam] get_hw_ocv (swchr) : adc_result_reg=%d,
  17. adc_result=%d\n",
  18. adc_result_reg, adc_result);
  19. #else
  20. adc_result_reg =
  21. pmic_get_register_value(PMIC_AUXADC_ADC_OUT_WAKEUP_PCHR);//mt6325_upmu_get
  22. _rg_adc_out_wakeup_pchr();
  23. adc_result =
  24. (adc_result_reg*r_val_temp*VOLTAGE_FULL_RANGE)/ADC_PRECISE;
  25. bm_print(BM_LOG_CRTI, "[oam] get_hw_ocv (pchr) : adc_result_reg=%d,
  26. adc_result=%d\n",
  27. adc_result_reg, adc_result);
  28. #endif

  29. adc_result += g_hw_ocv_tune_value;
  30. return adc_result;
  31. #endif
  32. }

复制代码



感谢分享!

学习!

感谢小编分享

感谢分享!

dingdingding

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

网站地图

Top