关闭MTK电池检测

来源:互联网 发布:淘宝swot分析 编辑:程序博客网 时间:2024/04/30 04:32
 

mtk电池温度检测

 1093人阅读 评论(0) 收藏 举报
 分类:
平台:mt6735+mt6328 Android版本:Android5.1

手机里面电池通常有4个引脚,即电池的+、-极,ID引脚、NTC引脚。id引脚用来识别电池的类型,例如是锂电池还是镍氢电池,不过现在手机上基本用的都是锂电池了。而NTC引脚主要用来测量电池温度的,还可以用来检测手机有没有按上电池,那么这里就来说明这两个功能。

1. 电池检测
在mt6735+mt6328平台方案中,电池的NTC引脚需要接到mt6328的BATON引脚上,preloader中的检测代码如下:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int hw_check_battery(void)  
  2. {  
  3.     #ifdef MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION  
  4.         print("ignore bat check !\n");  
  5.         return 1;  
  6.     #else  
  7.         #if CFG_EVB_PLATFORM  
  8.             print("ignore bat check\n");  
  9.             return 1;  
  10.         #else  
  11.             U32 val=0;  
  12.             U32 ret_val;  
  13.   
  14.             ret_val=pmic_config_interface( (U32)(MT6328_VTREF_CON0),  
  15.                                      (U32)(1),  
  16.                                      (U32)(MT6328_PMIC_RG_TREF_EN_MASK),  
  17.                                      (U32)(MT6328_PMIC_RG_TREF_EN_SHIFT)  
  18.                                      );  
  19.   
  20.             ret_val=pmic_config_interface( (U32)(MT6328_VTREF_CON0),  
  21.                                      (U32)(1),  
  22.                                      (U32)(MT6328_PMIC_RG_TREF_ON_CTRL_MASK),  
  23.                                      (U32)(MT6328_PMIC_RG_TREF_ON_CTRL_SHIFT)  
  24.                                      );  
  25.   
  26.   
  27.   
  28.             mt6325_upmu_set_baton_tdet_en(1);  
  29.             mt6325_upmu_set_rg_baton_en(1);  
  30.             val = mt6325_upmu_get_rgs_baton_undet();  
  31.   
  32.             if(val==0)  
  33.             {  
  34.                 print("bat is exist\n");  
  35.                 return 1;  
  36.             }  
  37.             else  
  38.             {  
  39.                 print("bat NOT exist\n");  
  40.                 return 0;  
  41.             }  
  42.         #endif  
  43.     #endif  
  44. }  

也就是通过hw_check_battery()函数来检测的,如果电池存在返回1,否则返回0。注意这个检测是通过PMIC来完成的。

之前遇到过电路有设计NTC检测电路,但是机器接稳压电源不能开机问题,需要禁掉该功能,怎么办?把MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION这个打开就可以了,在preloader/custom/project/project.mk里面把MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION这个宏赋值为yes就可以开机了。

但是改呢不只改这一处,还需要在ProjectConfig.mk里和kernel的config文件一起修改,否则编译时会有警告信息,但对于系统启动是无大碍的。

2. 电池温度检测
电池的温度也是通过NTC引脚来测量的,但是如果在kernel中把CONFIG_MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION宏打开了之后,温度测量功能也禁掉了。

温度测量是通过battery_meter.c中的force_get_tbat()函数完成的。在cust_battery_meter.h中,如果定义了CONFIG_MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION宏,那么FIXED_TBAT_25宏也被定义了,force_get_tbat()直接返回一个固定值温度25度。

再来说电池温度测量。

温度测量等效电路如下:

其中10k是一个温敏电阻,随着温度的升高,阻值降低,一般电池厂商会提供一个温度与阻值的曲线图,通过测量baton的电压值计算出阻值,然后根据阻值计算出温度值,这就是温度测量的原理。

在mt6735+mt6328平台上,上拉参考电压为1.8v,通过计算可以得到在25下,baton电压值大概为0.669v。

再来看force_get_tbat()函数。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int force_get_tbat(kal_bool update)  
  2. {  
  3. #if defined(CONFIG_POWER_EXT) || defined(FIXED_TBAT_25)  
  4.     bm_print(BM_LOG_CRTI, "[force_get_tbat] fixed TBAT=25 t\n");  
  5.     return 25;  
  6. #else  
  7.     int bat_temperature_volt = 0;  
  8.     int bat_temperature_val = 0;  
  9.     static int pre_bat_temperature_val = -1;  
  10.     int fg_r_value = 0;  
  11.     kal_int32 fg_current_temp = 0;  
  12.     kal_bool fg_current_state = KAL_FALSE;  
  13.     int bat_temperature_volt_temp = 0;  
  14.     int ret = 0;  
  15.   
  16.     if (update == KAL_TRUE || pre_bat_temperature_val == -1) {  
  17.         /* Get V_BAT_Temperature */  
  18.         bat_temperature_volt = 2;  
  19.         ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_TEMP, &bat_temperature_volt);  
  20.   
  21.         if (bat_temperature_volt != 0) {  
  22. #if defined(SOC_BY_HW_FG)  
  23.             fg_r_value = get_r_fg_value();  
  24.   
  25.             ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT, &fg_current_temp);  
  26.             ret =  
  27.                 battery_meter_ctrl(BATTERY_METER_CMD_GET_HW_FG_CURRENT_SIGN, &fg_current_state);  
  28.             fg_current_temp = fg_current_temp / 10;  
  29.   
  30.             if (fg_current_state == KAL_TRUE) {  
  31.                 bat_temperature_volt_temp = bat_temperature_volt;  
  32.                 bat_temperature_volt =  
  33.                     bat_temperature_volt - ((fg_current_temp * fg_r_value) / 1000);  
  34.             } else {  
  35.                 bat_temperature_volt_temp = bat_temperature_volt;  
  36.                 bat_temperature_volt =  
  37.                     bat_temperature_volt + ((fg_current_temp * fg_r_value) / 1000);  
  38.             }  
  39. #endif  
  40.   
  41.             bat_temperature_val = BattVoltToTemp(bat_temperature_volt);  
  42.         }  
  43.   
  44.     bm_print(BM_LOG_CRTI, "[force_get_tbat] %d,%d,%d,%d,%d,%d\n",  
  45.          bat_temperature_volt_temp, bat_temperature_volt, fg_current_state, fg_current_temp,  
  46.          fg_r_value, bat_temperature_val);  
  47.         pre_bat_temperature_val = bat_temperature_val;  
  48.     } else {  
  49.         bat_temperature_val = pre_bat_temperature_val;  
  50.     }  
  51.     return bat_temperature_val;  
  52. #endif  
  53. }  
通过这里:
ret = battery_meter_ctrl(BATTERY_METER_CMD_GET_ADC_V_BAT_TEMP, &bat_temperature_volt);

得到adc取得的baton电压值,中间又做了一些转换,然后调用BattVoltToTemp()函数。
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int BattVoltToTemp(int dwVolt)  
  2. {  
  3.     kal_int64 TRes_temp;  
  4.     kal_int64 TRes;  
  5.     int sBaTTMP = -100;  
  6.   
  7.     /* TRes_temp = ((kal_int64)RBAT_PULL_UP_R*(kal_int64)dwVolt) / (RBAT_PULL_UP_VOLT-dwVolt); */  
  8.     /* TRes = (TRes_temp * (kal_int64)RBAT_PULL_DOWN_R)/((kal_int64)RBAT_PULL_DOWN_R - TRes_temp); */  
  9.   
  10.     TRes_temp = (RBAT_PULL_UP_R * (kal_int64) dwVolt);  
  11.     do_div(TRes_temp, (RBAT_PULL_UP_VOLT - dwVolt));  
  12.   
  13. #ifdef RBAT_PULL_DOWN_R  
  14.     TRes = (TRes_temp * RBAT_PULL_DOWN_R);  
  15.     do_div(TRes, abs(RBAT_PULL_DOWN_R - TRes_temp));  
  16. #else  
  17.     TRes = TRes_temp;  
  18. #endif  
  19.   
  20.     /* convert register to temperature */  
  21.     sBaTTMP = BattThermistorConverTemp((int)TRes);  
  22.   
  23.     return sBaTTMP;  
  24. }  
最后调用BattThermistorConverTemp()函数。
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int BattThermistorConverTemp(int Res)  
  2. {  
  3.     int i = 0;  
  4.     int RES1 = 0, RES2 = 0;  
  5.     int TBatt_Value = -200, TMP1 = 0, TMP2 = 0;  
  6.   
  7.     if (Res >= Batt_Temperature_Table[0].TemperatureR) {  
  8.         TBatt_Value = -20;  
  9.     } else if (Res <= Batt_Temperature_Table[16].TemperatureR) {  
  10.         TBatt_Value = 60;  
  11.     } else {  
  12.         RES1 = Batt_Temperature_Table[0].TemperatureR;  
  13.         TMP1 = Batt_Temperature_Table[0].BatteryTemp;  
  14.   
  15.         for (i = 0; i <= 16; i++) {  
  16.             if (Res >= Batt_Temperature_Table[i].TemperatureR) {  
  17.                 RES2 = Batt_Temperature_Table[i].TemperatureR;  
  18.                 TMP2 = Batt_Temperature_Table[i].BatteryTemp;  
  19.                 break;  
  20.             } else {  
  21.                 RES1 = Batt_Temperature_Table[i].TemperatureR;  
  22.                 TMP1 = Batt_Temperature_Table[i].BatteryTemp;  
  23.             }  
  24.         }  
  25.   
  26.         TBatt_Value = (((Res - RES2) * TMP1) + ((RES1 - Res) * TMP2)) / (RES1 - RES2);  
  27.     }  
  28.   
  29.     return TBatt_Value;  
  30. }  
在BattThermistorConverTemp()函数里,跟据cust_battery_meter_table.h中定义的Batt_Temperature_Table表格来计算出温度值,这个表格是需要客户自己定制的,一般根据电池厂商提供的温度与阻值的曲线图来做修改。

完。


 

MTK 平台memory(emmc)移植常见问题总结

 2025人阅读 评论(1) 收藏 举报
 分类:

目录(?)[+]

memory移植常见问题有:1、无法下载;2、下载后无法开机;

一、无法下载
MTK平台会有以下几种情况:在下载过程中经常出现enable Dram fail的错错误,遇到这种情况第一反应先format 一下memory,然后再down,如果format不行过着还是没法dwon的话,那么再做如下分析;

一旦出现此问题,需做确认以下三点:

1,必须用最新版本的flash tool下载;

2,memory是不是经过MTK验证过;

3,板子必须跑过ett测试,preloader里面的MDLmemorydevicelist)里面配置Dram timing必须是ett log输出的对应的Dram timing;

去确认后还是无法下载那么就做如下分析:

         a.软件原因(一般问题出在研发端):

           a1.EMI没有配置手机硬件本身用的memory信息,此问题一般在研发端下载未知的软件版本时候发生,具体可以check 此文件:Custom_MemoryDevice.h是否配置了硬件本身用的memorypart number;

2               a2.修改了emigen.pl或者修改其他preloader的某些文件,导致tool解析不出build出的preloader.binEMI参数,此类一般是preloader客制化问题引起的,可以咨询一下MTK;

        a3.DRAM 的时序timing有误,可以对比一下ETT测试输出的DRAM timing;


      b.硬件原因;

        b1.memory本身的问题,此时需要做交叉对比实验确定是memory问题,还是板子问题,若是memory问题,请找memoryvendor;

        b2.板子硬件有问题,此类问题一般是由于Memory周边的器件有贴错或者虚焊导致;需要拿到硬件分析;

二、下载后无法开机;

       抓取串口log进行分析

      1、我遇到的情况是温度过高强制断电,原因可能是在焊接memory的时候将板子搞得有点问题了。如下的log

       

[plain] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. [    4.864498].(4)[68:bat_thread_kthr][Power/BatMeter] [force_get_tbat] 0,108,0,0,0,60  
  2. [    4.865459].(4)[68:bat_thread_kthr][Power/BatMeter] [oam_run_inf] 4045, 4045, 4010, 2592, 2592, 135, 135, 2, 2, 1782, 60, 16  
  3. [    4.866864].(4)[68:bat_thread_kthr][Power/BatMeter] [oam_result_inf] 16, 16, 16, 16, 16, 0  
  4. [    4.867902].(4)[68:bat_thread_kthr][Power/Battery] AvgVbat=(4010),bat_vol=(4010),AvgI=(0),I=(0),VChr=(359),AvgT=(60),T=(60),pre_SOC=(84),SOC=(84),ZCV=(4044)  
  5. [    4.869657].(4)[68:bat_thread_kthr][Power/Battery] [Battery] Tbat(60)>=60, system need power down.  
  6. [    4.871358].(4)[68:bat_thread_kthr][Power/Battery] charging_set_power_off=0  
  7. [    4.872229].(4)[68:bat_thread_kthr]mt_power_off  
      电池温度过高,导致板子强制下电;。我们只需要验证一下memory时候Ok就可以了,所以我们可以先在代码中将温度检测关闭掉

     具体做法如下:kernel/drivers/power/battery_common.c文件修改

       -               if(BMT_status.temperature >= 60)
      +               if(0)//(BMT_status.temperature >= 60)

      编译重新down一下kerne看看是否OK;

      2、遇到如下log:

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. [    7.837171].(7)[191:thermal_manager]Power/battery_Thermal: reset, reset, reset!!!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*****************************************@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  
  2. [    7.839444]-(7)[191:thermal_manager]------------[ cut here ]------------  
  3. [    7.840299]-(7)[191:thermal_manager]kernel BUG at /home/qinzhonghua/MTK_Project/base_6592/6592/kernel/mediatek/platform/mt6592/kernel/drivers/thermal/mtk_ts_battery.c:394!  
  4. [    7.842208]-(7)[191:thermal_manager]Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM  
      将这一段找到对应的代码,mediatek/platform/mt6592/kernel/drivers/thermal/mtk_ts_battery.c,让代码跳过这一段代码,修改代码:

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. 529 int  mtktsbattery_register_cooler(void)  
  2. 530 {  
  3. 531     /* cooling devices */  
  4. 532     cl_dev_sysrst = mtk_thermal_cooling_device_register("mtktsbattery-sysrst", NULL,  
  5. 533         &mtktsbattery_cooling_sysrst_ops);  
  6. 534     return 0;  
  7. 535 }  
    修改为:

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. 529 int  mtktsbattery_register_cooler(void)  
  2. 530 {  
  3. 531     /* cooling devices */  
  4. 534     return 0;  
  5. 535 }  
    就可以正常的开机了。


      

                                  如果遇到其他情况再做补充,谢谢!


0 0
原创粉丝点击