View on GitHub

Joker -> Doc

电池温度客制化

参考文档: Android 8.0 MTK平台 电池高低温提醒客制化

系统开机的时候,会调用充电入口函数BAT_thread()去初始化一些相关参数,获取电量,检测cpu温度和电池温度

路径: kernel-3.18/drivers/power/mediatek/battery_common.c

void BAT_thread(void)
{
    //第一次调用时,battery_meter_initilized 为false,表示没初始化
    static kal_bool battery_meter_initilized = KAL_FALSE;
    这里省略部分源码,只关注我们需要的代码流程
    mt_battery_thermal_check();//cup温度检测
    mt_battery_notify_check();//电池温度检测
}

unsigned int g_BatteryNotifyCode = 0x0000;
unsigned int g_BN_TestMode = 0x0000;
void mt_battery_notify_check(void)
{
    g_BatteryNotifyCode = 0x0000;

    if (g_BN_TestMode == 0x0000) {  /* for normal case */
        battery_log(BAT_LOG_FULL, "[BATTERY] mt_battery_notify_check\n");
        //充电电压检测(充电器插入的时候会抬高电压)
        mt_battery_notify_VCharger_check();
        //电池温度检测
        mt_battery_notify_VBatTemp_check();
        //充电电流检测
        mt_battery_notify_ICharging_check();
        //电池电压检测
        mt_battery_notify_VBat_check();
        //总体充电时间检测
        mt_battery_notify_TotalChargingTime_check();
    } else {        /* for UI test */
        //用于测试提醒功能
        mt_battery_notify_UI_test();
    }
}

主要关注 mt_battery_notify_VBatTemp_check

static void mt_battery_notify_VBatTemp_check(void)
{
#if defined(BATTERY_NOTIFY_CASE_0002_VBATTEMP)
    //如果电池温度>=60度
    if (BMT_status.temperature >= batt_cust_data.max_charge_temperature) {
        g_BatteryNotifyCode |= 0x0002;//设置提醒码为0x0002
        //打印log
        battery_log(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too high)\n",
                BMT_status.temperature);
    }
#if defined(CONFIG_MTK_JEITA_STANDARD_SUPPORT)
    //如果电池温度<0度
    else if (BMT_status.temperature < TEMP_NEG_10_THRESHOLD) {
        g_BatteryNotifyCode |= 0x0020;//设置提醒码为0x0020
        battery_log(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too low)\n",
                BMT_status.temperature);
    }
#else
#ifdef BAT_LOW_TEMP_PROTECT_ENABLE
     //如果电池温度<0度
    else if (BMT_status.temperature < MIN_CHARGE_TEMPERATURE) {
        g_BatteryNotifyCode |= 0x0020;//设置提醒码为0x0020
        battery_log(BAT_LOG_CRTI, "[BATTERY] bat_temp(%d) out of range(too low)\n",
                BMT_status.temperature);
    }
#endif
#endif

    battery_log(BAT_LOG_FULL, "[BATTERY] BATTERY_NOTIFY_CASE_0002_VBATTEMP (%x)\n",
            g_BatteryNotifyCode);

#endif
}

宏定义路径: kernel-3.18/drivers/misc/mediatek/include/mt-plat/mt6580/include/mach/mt_charging.h

BMT_status.temperature:电池温度
batt_cust_data.max_charge_temperature:最大充电温度,默认50度

#define MAX_CHARGE_TEMPERATURE  50
#define MIN_CHARGE_TEMPERATURE  0
g_BatteryNotifyCode |= 0x0002;//设置提醒码为0x0002 高温提醒码
g_BatteryNotifyCode |= 0x0020;//设置提醒码为0x0020 低温提醒码