PMU_STATUS BAT_ConstantCurrentModeAction(void) { battery_log(BAT_LOG_CRTI, "[BATTERY] CC mode charge, timer=%d on %d !!\n\r", BMT_status.CC_charging_time, BMT_status.total_charging_time); BMT_status.PRE_charging_time = 0; BMT_status.CC_charging_time += BAT_TASK_PERIOD; BMT_status.TOPOFF_charging_time = 0; BMT_status.total_charging_time += BAT_TASK_PERIOD; ulc_cv_charging_current_flag = KAL_FALSE; ulc_cv_charging_current = g_temp_CC_value; if (BMT_status.bat_vol > v_cc2topoff_threshold) { BMT_status.bat_charging_state = CHR_TOP_OFF; } #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)//defined(MTK_LINEAR_CHARGER_NO_DISCHARGE) // no disable charging#else #else { kal_bool charging_enable = KAL_FALSE; /* Charging 9s and discharging 1s : start */ battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable); msleep(1000); } #endif charging_current_calibration(); pchr_turn_on_charging(); return PMU_STATUS_OK; }
PMU_STATUS BAT_PreChargeModeAction(void) { battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] Pre-CC mode charge, timer=%ld on %ld !!\n\r", BMT_status.PRE_charging_time, BMT_status.total_charging_time); BMT_status.PRE_charging_time += BAT_TASK_PERIOD; BMT_status.CC_charging_time = 0; BMT_status.TOPOFF_charging_time = 0; BMT_status.total_charging_time += BAT_TASK_PERIOD; /* Enable charger */ pchr_turn_on_charging(); if (BMT_status.UI_SOC == 100) { BMT_status.bat_charging_state = CHR_BATFULL; BMT_status.bat_full = KAL_TRUE; g_charging_full_reset_bat_meter = KAL_TRUE; } else if ( BMT_status.bat_vol > V_PRE2CC_THRES ) { BMT_status.bat_charging_state = CHR_CC; } return PMU_STATUS_OK; }
PMU_STATUS BAT_TopOffModeAction(void) { kal_uint32 charging_enable = KAL_FALSE; #ifdef HIGH_BATTERY_VOLTAGE_SUPPORT kal_uint32 cv_voltage = 4350; #else kal_uint32 cv_voltage = 4200; #endif battery_log(BAT_LOG_CRTI, "[BATTERY] Top Off mode charge, timer=%d on %d !!\n\r", BMT_status.TOPOFF_charging_time, BMT_status.total_charging_time); BMT_status.PRE_charging_time = 0; BMT_status.CC_charging_time = 0; BMT_status.TOPOFF_charging_time += BAT_TASK_PERIOD; BMT_status.total_charging_time += BAT_TASK_PERIOD; if(BMT_status.bat_vol > (cv_voltage-CV_CHECK_DELAT_FOR_BANDGAP)) { /* CV - 0.08V */ pchr_sw_cv_charing_current_check(); } pchr_turn_on_charging(); if ((BMT_status.TOPOFF_charging_time >= MAX_CV_CHARGING_TIME) || (charging_full_check() == KAL_TRUE)) { BMT_status.bat_charging_state = CHR_BATFULL; BMT_status.bat_full = KAL_TRUE; g_charging_full_reset_bat_meter = KAL_TRUE; /* Disable charging */ battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable); } return PMU_STATUS_OK; }
PMU_STATUS BAT_TopOffModeAction(void) { kal_uint32 charging_enable = KAL_FALSE; battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] Top Off mode charge, timer=%ld on %ld !!\n\r", BMT_status.TOPOFF_charging_time, BMT_status.total_charging_time); BMT_status.PRE_charging_time = 0; BMT_status.CC_charging_time = 0; BMT_status.TOPOFF_charging_time += BAT_TASK_PERIOD; BMT_status.total_charging_time += BAT_TASK_PERIOD; pchr_turn_on_charging(); if ((BMT_status.TOPOFF_charging_time >= MAX_CV_CHARGING_TIME) || (charging_full_check() == KAL_TRUE) ) { BMT_status.bat_charging_state = CHR_BATFULL; BMT_status.bat_full = KAL_TRUE; g_charging_full_reset_bat_meter = KAL_TRUE; /* Disable charging */ battery_charging_control(CHARGING_CMD_ENABLE,&charging_enable); } return PMU_STATUS_OK; }
PMU_STATUS BAT_ConstantCurrentModeAction(void) { kal_bool charging_enable = KAL_FALSE; battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] CC mode charge, timer=%ld on %ld !!\n\r", BMT_status.CC_charging_time, BMT_status.total_charging_time); BMT_status.PRE_charging_time = 0; BMT_status.CC_charging_time += BAT_TASK_PERIOD; BMT_status.TOPOFF_charging_time = 0; BMT_status.total_charging_time += BAT_TASK_PERIOD; if ( BMT_status.bat_vol > v_cc2topoff_threshold ) { BMT_status.bat_charging_state = CHR_TOP_OFF; } /*Charging 9s and discharging 1s : start*/ battery_charging_control(CHARGING_CMD_ENABLE,&charging_enable); msleep(1000); charging_current_calibration(); pchr_turn_on_charging(); return PMU_STATUS_OK; }
PMU_STATUS BAT_PreChargeModeAction(void) { kal_bool charging_enable = KAL_FALSE; battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] Pre-CC mode charge, timer=%ld on %ld !!\n\r", BMT_status.PRE_charging_time, BMT_status.total_charging_time); BMT_status.PRE_charging_time += BAT_TASK_PERIOD; BMT_status.CC_charging_time = 0; BMT_status.TOPOFF_charging_time = 0; BMT_status.total_charging_time += BAT_TASK_PERIOD; if (BMT_status.UI_SOC == 100) { BMT_status.bat_charging_state = CHR_BATFULL; BMT_status.bat_full = KAL_TRUE; g_charging_full_reset_bat_meter = KAL_TRUE; } else if(BMT_status.bat_vol > V_PRE2CC_THRES) { BMT_status.bat_charging_state = CHR_CC; } /*Charging 9s and discharging 1s : start*/ battery_charging_control(CHARGING_CMD_ENABLE,&charging_enable); msleep(1000); charging_current_calibration(); pchr_turn_on_charging(); return PMU_STATUS_OK; }
kal_uint32 set_bat_charging_current_limit(int current_limit) { battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] set_bat_charging_current_limit (%d)\r\n", current_limit); if (current_limit != -1) { g_bcct_flag = 1; g_bcct_value = current_limit; if (current_limit < 70) g_temp_CC_value = CHARGE_CURRENT_0_00_MA; else if (current_limit < 200) g_temp_CC_value = CHARGE_CURRENT_70_00_MA; else if (current_limit < 300) g_temp_CC_value = CHARGE_CURRENT_200_00_MA; else if (current_limit < 400) g_temp_CC_value = CHARGE_CURRENT_300_00_MA; else if (current_limit < 450) g_temp_CC_value = CHARGE_CURRENT_400_00_MA; else if (current_limit < 550) g_temp_CC_value = CHARGE_CURRENT_450_00_MA; else if (current_limit < 650) g_temp_CC_value = CHARGE_CURRENT_550_00_MA; else if (current_limit < 700) g_temp_CC_value = CHARGE_CURRENT_650_00_MA; else if (current_limit < 800) g_temp_CC_value = CHARGE_CURRENT_700_00_MA; else if (current_limit < 900) g_temp_CC_value = CHARGE_CURRENT_800_00_MA; else if (current_limit < 1000) g_temp_CC_value = CHARGE_CURRENT_900_00_MA; else if (current_limit < 1100) g_temp_CC_value = CHARGE_CURRENT_1000_00_MA; else if (current_limit < 1200) g_temp_CC_value = CHARGE_CURRENT_1100_00_MA; else if (current_limit < 1300) g_temp_CC_value = CHARGE_CURRENT_1200_00_MA; else if (current_limit < 1400) g_temp_CC_value = CHARGE_CURRENT_1300_00_MA; else if (current_limit < 1500) g_temp_CC_value = CHARGE_CURRENT_1400_00_MA; else if (current_limit < 1600) g_temp_CC_value = CHARGE_CURRENT_1500_00_MA; else if (current_limit == 1600) g_temp_CC_value = CHARGE_CURRENT_1600_00_MA; else g_temp_CC_value = CHARGE_CURRENT_450_00_MA; } else { /* change to default current setting */ g_bcct_flag = 0; } /* wake_up_bat(); */ pchr_turn_on_charging(); return g_bcct_flag; }
void mt65xx_bat_init(void) { kal_int32 bat_vol; // Low Battery Safety Booting #if defined(SWCHR_POWER_PATH) bat_vol = get_i_sense_volt(1); #else bat_vol = get_bat_sense_volt(1); #endif pchr_turn_on_charging(KAL_TRUE); dprintf(CRITICAL, "[mt65xx_bat_init] check VBAT=%d mV with %d mV\n", bat_vol, BATTERY_LOWVOL_THRESOLD); if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && (mt6325_upmu_get_pwrkey_deb()==0) ) { dprintf(CRITICAL, "[mt65xx_bat_init] KPOC+PWRKEY => change boot mode\n"); g_boot_reason_change = true; } rtc_boot_check(false); #ifndef MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION #ifndef MTK_BATLOWV_NO_PANEL_ON_EARLY if (bat_vol < BATTERY_LOWVOL_THRESOLD) #else if (is_low_battery(bat_vol)) #endif { if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && upmu_is_chr_det() == KAL_TRUE) { dprintf(CRITICAL, "[%s] Kernel Low Battery Power Off Charging Mode\n", __func__); g_boot_mode = LOW_POWER_OFF_CHARGING_BOOT; #if defined(SWCHR_POWER_PATH) check_bat_protect_status(); #endif return; } else { dprintf(CRITICAL, "[BATTERY] battery voltage(%dmV) <= CLV ! Can not Boot Linux Kernel !! \n\r",bat_vol); #ifndef NO_POWER_OFF mt6575_power_off(); #endif while(1) { dprintf(CRITICAL, "If you see the log, please check with RTC power off API\n\r"); } } } #endif return; }
//enter this function when low battery with charger void check_bat_protect_status() { kal_int32 bat_val = 0; #if defined(SWCHR_POWER_PATH) bat_val = get_i_sense_volt(5); #else bat_val = get_bat_sense_volt(5); #endif dprintf(CRITICAL, "[%s]: check VBAT=%d mV with %d mV, start charging... \n", __FUNCTION__, bat_val, BATTERY_LOWVOL_THRESOLD); if (bat_val < BATTERY_LOWVOL_THRESOLD) mt65xx_leds_brightness_set(MT65XX_LED_TYPE_RED, LED_FULL); while (bat_val < BATTERY_LOWVOL_THRESOLD) { mtk_wdt_restart(); if(upmu_is_chr_det() == KAL_FALSE) { dprintf(CRITICAL, "[BATTERY] No Charger, Power OFF !\n"); mt6575_power_off(); while(1); } pchr_turn_on_charging(KAL_TRUE); mdelay(5000); #if defined(SWCHR_POWER_PATH) pchr_turn_on_charging(KAL_FALSE); mdelay(100); bat_val = get_i_sense_volt(5); #else bat_val = get_bat_sense_volt(5); #endif } dprintf(CRITICAL, "[%s]: check VBAT=%d mV with %d mV, stop charging... \n", __FUNCTION__, bat_val, BATTERY_LOWVOL_THRESOLD); }
void mt65xx_bat_init(void) { kal_int32 bat_vol; // Low Battery Safety Booting bat_vol = get_bat_sense_volt(1); #ifdef MTK_BQ24196_SUPPORT bat_vol = get_i_sense_volt(5); #endif dprintf(INFO, "[mt65xx_bat_init] check VBAT=%d mV with %d mV\n", bat_vol, BATTERY_LOWVOL_THRESOLD); pchr_turn_on_charging(); if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && (upmu_get_pwrkey_deb()==0) ) { dprintf(INFO, "[mt65xx_bat_init] KPOC+PWRKEY => change boot mode\n"); g_boot_reason_change = true; } rtc_boot_check(false); #ifndef MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION //if (bat_vol < BATTERY_LOWVOL_THRESOLD) if (is_low_battery(bat_vol)) { if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && upmu_is_chr_det() == KAL_TRUE) { dprintf(INFO, "[%s] Kernel Low Battery Power Off Charging Mode\n", __func__); g_boot_mode = LOW_POWER_OFF_CHARGING_BOOT; return; } else { dprintf(INFO, "[BATTERY] battery voltage(%dmV) <= CLV ! Can not Boot Linux Kernel !! \n\r",bat_vol); #ifndef NO_POWER_OFF mt6575_power_off(); #endif while(1) { dprintf(INFO, "If you see the log, please check with RTC power off API\n\r"); } } } #endif return; }
PMU_STATUS BAT_ConstantCurrentModeAction(void) { battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] CC mode charge, timer=%ld on %ld !!\n\r", BMT_status.CC_charging_time, BMT_status.total_charging_time); BMT_status.PRE_charging_time = 0; BMT_status.CC_charging_time += BAT_TASK_PERIOD; BMT_status.TOPOFF_charging_time = 0; BMT_status.total_charging_time += BAT_TASK_PERIOD; /* Enable charger */ pchr_turn_on_charging(); if(charging_full_check() == KAL_TRUE) { BMT_status.bat_charging_state = CHR_BATFULL; BMT_status.bat_full = KAL_TRUE; g_charging_full_reset_bat_meter = KAL_TRUE; } return PMU_STATUS_OK; }
PMU_STATUS BAT_PreChargeModeAction(void) { battery_log(BAT_LOG_CRTI, "[BATTERY] Pre-CC mode charge, timer=%d on %d !!\n\r", BMT_status.PRE_charging_time, BMT_status.total_charging_time); BMT_status.PRE_charging_time += BAT_TASK_PERIOD; BMT_status.CC_charging_time = 0; BMT_status.TOPOFF_charging_time = 0; BMT_status.total_charging_time += BAT_TASK_PERIOD; select_charging_curret(); ulc_cv_charging_current = g_temp_CC_value; ulc_cv_charging_current_flag = KAL_FALSE; if (BMT_status.UI_SOC == 100) { BMT_status.bat_charging_state = CHR_BATFULL; BMT_status.bat_full = KAL_TRUE; g_charging_full_reset_bat_meter = KAL_TRUE; } else if (BMT_status.bat_vol > batt_cust_data.v_pre2cc_thres) { BMT_status.bat_charging_state = CHR_CC; } #if defined(CONFIG_MTK_PUMP_EXPRESS_SUPPORT)//defined(MTK_LINEAR_CHARGER_NO_DISCHARGE) // no disable charging #else { kal_bool charging_enable = KAL_FALSE; /*Charging 9s and discharging 1s : start */ battery_charging_control(CHARGING_CMD_ENABLE, &charging_enable); msleep(1000); } #endif charging_current_calibration(); pchr_turn_on_charging(); return PMU_STATUS_OK; }
//extern int BattVoltToTemp(int dwVolt); void mt65xx_bat_init(void) { kal_int32 bat_vol; kal_int32 bat_tempture; kal_int32 bat_temp; #ifdef MTK_IPO_POWERPATH_SUPPORT CHARGER_TYPE CHR_Type_num = CHARGER_UNKNOWN; #endif // Low Battery Safety Booting bat_vol = get_bat_sense_volt(1); bat_tempture = get_tbat_volt(1); bat_temp=BattVoltToTemp(bat_tempture); printf("the bat_vol is %d,the bat_tempture is %d,the bat_temp is %d\n",bat_vol,bat_tempture,bat_temp); #if defined(MTK_BQ24196_SUPPORT) ||defined(MTK_BQ24296_SUPPORT) bat_vol = get_i_sense_volt(5); #endif printf("[mt65xx_bat_init] check VBAT=%d mV with %d mV\n", bat_vol, BATTERY_LOWVOL_THRESOLD); pchr_turn_on_charging(); if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && (upmu_get_pwrkey_deb()==0) ) { printf("[mt65xx_bat_init] KPOC+PWRKEY => change boot mode\n"); g_boot_reason_change = true; } rtc_boot_check(false); #ifndef MTK_DISABLE_POWER_ON_OFF_VOLTAGE_LIMITATION //if (bat_vol < BATTERY_LOWVOL_THRESOLD) if (is_low_battery(bat_vol)) { if(g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT && upmu_is_chr_det() == KAL_TRUE) { printf("[%s] Kernel Low Battery Power Off Charging Mode\n", __func__); g_boot_mode = LOW_POWER_OFF_CHARGING_BOOT; return; } #ifdef BULMA_PROJECT else if((META_BOOT == g_boot_mode) ||(ADVMETA_BOOT == g_boot_mode)) { printf("Enter Meta Mode emw\n\r"); } #endif else { #ifdef MTK_IPO_POWERPATH_SUPPORT //boot linux kernel because of supporting powerpath and using standard AC charger if(upmu_is_chr_det() == KAL_TRUE) { charging_get_charger_type(&CHR_Type_num); if(STANDARD_CHARGER == CHR_Type_num) { return; } } #endif printf("[BATTERY] battery voltage(%dmV) <= CLV ! Can not Boot Linux Kernel !! \n\r",bat_vol); #ifndef NO_POWER_OFF mt6575_power_off(); #endif while(1) { printf("If you see the log, please check with RTC power off API\n\r"); } } } if(is_high_bat_tempature(bat_temp)) { printf("[BATTERY] battery tempature(%dmV) <= CLV ! Can not Boot Linux Kernel !! \n\r",bat_tempture); #ifndef NO_POWER_OFF mt6575_power_off(); #endif while(1) { printf("If you see the log, please check with RTC power off API\n\r"); } } #endif return; }