static kal_bool mtk_ta_retry_increase(void) { int real_v_chrA; int real_v_chrB; kal_bool retransmit = KAL_TRUE; kal_uint32 retransmit_count=0; do { real_v_chrA = battery_meter_get_charger_voltage(); mtk_ta_increase(); //increase TA voltage to 7V real_v_chrB = battery_meter_get_charger_voltage(); if(real_v_chrB - real_v_chrA >= 1000) { /* 1.0V */ retransmit = KAL_FALSE; } else { retransmit_count++; battery_xlog_printk(BAT_LOG_CRTI, "mtk_ta_detector(): retransmit_count =%d, chrA=%d, chrB=%d\n", retransmit_count, real_v_chrA, real_v_chrB); } if((retransmit_count == 3) || (BMT_status.charger_exist == KAL_FALSE)) { retransmit = KAL_FALSE; } } while((retransmit == KAL_TRUE) && (ta_cable_out_occur == KAL_FALSE)); battery_xlog_printk(BAT_LOG_CRTI, "mtk_ta_retry_increase() real_v_chrA=%d, real_v_chrB=%d, retry=%d\n", real_v_chrA, real_v_chrB,retransmit_count); if(retransmit_count == 3) return KAL_FALSE; else return KAL_TRUE; }
static void mtk_ta_vchr_select(int i,int ta_v_chr_candidate[], int ta_charging_current_candidate[], int *max_charging_current, int *max_charging_current_i) { int current_vchr; kal_bool retransmit = KAL_TRUE; kal_uint32 retransmit_count=0; current_vchr = battery_meter_get_charger_voltage(); if(ta_current_level != 5000 && current_vchr >= 4900) { /* pattern error before, so reset vchr to 5V */ battery_log(BAT_LOG_CRTI, "mtk_ta_vchr_select() : curr_VChr=%d, ta_current_level=%d\n",current_vchr,ta_current_level); mtk_ta_reset_vchr(); } do { mtk_tuning_voltage(ta_current_level, ta_v_chr_candidate[i]); current_vchr = battery_meter_get_charger_voltage(); if((abs(current_vchr - ta_current_level) > 300) && (ta_cable_out_occur == KAL_FALSE)) { /* variation > 0.3V, error occur */ retransmit_count++; battery_log(BAT_LOG_CRTI, "mtk_ta_vchr_select(): retransmit_count =%d, cur_chr=%d, ta_current_level=%d\n", retransmit_count, current_vchr, ta_current_level); mtk_ta_reset_vchr(); } else { retransmit = KAL_FALSE; } if((retransmit_count == 2) || (ta_cable_out_occur == KAL_TRUE)) { retransmit = KAL_FALSE; } } while((retransmit == KAL_TRUE) && (ta_cable_out_occur == KAL_FALSE)); battery_charging_control(CHARGING_CMD_SET_CURRENT,&ta_charging_current); //1.5A battery_log(BAT_LOG_CRTI, "mtk_ta_vchr_select() : use 1.5A for select max current\n"); msleep(900); // over 800ms to avoid interference pattern ta_charging_current_candidate[i] = battery_meter_get_charging_current_imm(); /* we hope to choose the less VChr if the current difference between 2 step is not large, so we add weighting for different VChr step */ if(i == 1) ta_charging_current_candidate[i] += 100; // weighting, plus 120mA for Vbat+0.4V else if(i == 2) ta_charging_current_candidate[i] += 50; // weighting, plug 60mA for Vbat+0.6V if(ta_charging_current_candidate[i] > *max_charging_current) { *max_charging_current = ta_charging_current_candidate[i]; *max_charging_current_i = i; } }
static void mtk_ta_detector(void) { int real_v_chrB = 0; battery_xlog_printk(BAT_LOG_CRTI, "mtk_ta_detector() start\n"); ta_v_chr_org = battery_meter_get_charger_voltage(); mtk_ta_retry_increase(); real_v_chrB = battery_meter_get_charger_voltage(); if(real_v_chrB - ta_v_chr_org >= 1000) is_ta_connect = KAL_TRUE; else is_ta_connect = KAL_FALSE; battery_xlog_printk(BAT_LOG_CRTI, "mtk_ta_detector() end, is_ta_connect=%d\n",is_ta_connect); }
static void mtk_tuning_voltage(int curr_level, int target_level) { int is_increase = 0; int exec_level = 0; CHR_CURRENT_ENUM chr_current = CHARGE_CURRENT_70_00_MA; /* if(BMT_status.charger_exist == KAL_TRUE) */ if(ta_cable_out_occur == KAL_FALSE) { battery_log(BAT_LOG_CRTI, "mtk_tuning_voltage() start\n"); if(curr_level >= target_level) { exec_level = (curr_level-target_level)/200; is_increase = 0; } else { exec_level = (target_level-curr_level)/200; is_increase = 1; } if(exec_level == 0) { /* curr_level == target_level */ battery_charging_control(CHARGING_CMD_SET_CURRENT,&chr_current); msleep(50); // for VChr reading to check error occur or not } battery_log(BAT_LOG_CRTI, "mtk_tuning_voltage() before : ta_current_level=%d, real_v_chr=%d, is_ta_connect=%d, is_increase=%d, exec_level=%d\n", ta_current_level, battery_meter_get_charger_voltage(), is_ta_connect, is_increase, exec_level); while((exec_level > 0) && (ta_cable_out_occur == KAL_FALSE)) { if(is_increase == 1) mtk_ta_increase(); else mtk_ta_decrease(); battery_log(BAT_LOG_CRTI, "mtk_tuning_voltage() after ta_current_level=%d, real_v_chr=%d, is_ta_connect=%d, is_increase=%d, exec_level=%d\n", ta_current_level, battery_meter_get_charger_voltage(), is_ta_connect, is_increase, exec_level); exec_level--; } battery_log(BAT_LOG_CRTI, "mtk_tuning_voltage() end\n"); } else { ta_check_chr_type = KAL_TRUE; //is_ta_connect = KAL_FALSE; battery_log(BAT_LOG_CRTI, "mtk_tuning_voltage(), Cable Out\n"); } }
static int get_charger_volt(int times) { if(g_bat_init_flag != 0) { return battery_meter_get_charger_voltage(); } return 0; }
static void battery_pump_express_algorithm_start(void) { kal_int32 charger_vol; kal_uint32 charging_enable = KAL_FALSE; mutex_lock(&ta_mutex); wake_lock(&TA_charger_suspend_lock); if(KAL_TRUE == is_ta_connect) { /* check cable impedance */ charger_vol = battery_meter_get_charger_voltage(); if(KAL_FALSE == ta_vchr_tuning) { mtk_ta_retry_increase(); //increase TA voltage to 9V charger_vol = battery_meter_get_charger_voltage(); ta_vchr_tuning = KAL_TRUE; } else if(BMT_status.SOC > TA_STOP_BATTERY_SOC) { //disable charging, avoid Iterm issue battery_charging_control(CHARGING_CMD_ENABLE,&charging_enable); mtk_ta_reset_vchr(); //decrease TA voltage to 5V charger_vol = battery_meter_get_charger_voltage(); if(abs(charger_vol - ta_v_chr_org) <= 1000) // 1.0V is_ta_connect = KAL_FALSE; battery_xlog_printk(BAT_LOG_CRTI, "Stop battery_pump_express_algorithm, SOC=%d is_ta_connect =%d, TA_STOP_BATTERY_SOC: %d\n", BMT_status.SOC, is_ta_connect, TA_STOP_BATTERY_SOC); } battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] check cable impedance, VA(%d) VB(%d) delta(%d).\n", ta_v_chr_org, charger_vol, charger_vol - ta_v_chr_org); battery_xlog_printk(BAT_LOG_CRTI, "mtk_ta_algorithm() end\n"); } else { battery_xlog_printk(BAT_LOG_CRTI, "It's not a TA charger, bypass TA algorithm\n"); } wake_unlock(&TA_charger_suspend_lock); mutex_unlock(&ta_mutex); }
static bool mtk_is_charger_4_vol(void) { int vol = battery_meter_get_charger_voltage(); mtk_xhci_mtk_log("voltage(%d)\n", vol); #if defined(CONFIG_USBIF_COMPLIANCE) || defined(CONFIG_MTK_EVB_BOARD) return false ; #else return (vol > 4000) ? true : false; #endif }
int ta_get_charger_voltage(void) { int voltage=0; int i; for(i=0;i<10;i++) { voltage=voltage+battery_meter_get_charger_voltage(); } return voltage/10; }
static void mtk_ta_detector(void) { int real_v_chrA; int real_v_chrB; kal_bool retransmit = KAL_TRUE; kal_uint32 retransmit_count=0; battery_log(BAT_LOG_CRTI, "mtk_ta_detector() start\n"); do { real_v_chrA = battery_meter_get_charger_voltage(); mtk_ta_decrease(); mtk_ta_decrease(); real_v_chrB = battery_meter_get_charger_voltage(); if(real_v_chrA - real_v_chrB >= 300) { /* 0.3V */ retransmit = KAL_FALSE; is_ta_connect = KAL_TRUE; } else { retransmit_count++; battery_log(BAT_LOG_CRTI, "mtk_ta_detector(): retransmit_count =%d, chrA=%d, chrB=%d\n", retransmit_count, real_v_chrA, real_v_chrB); mtk_ta_reset_vchr(); } if((retransmit_count == 3) || (BMT_status.charger_exist == KAL_FALSE)) { retransmit = KAL_FALSE; is_ta_connect = KAL_FALSE; } } while((retransmit == KAL_TRUE) && (ta_cable_out_occur == KAL_FALSE)); battery_log(BAT_LOG_CRTI, "mtk_ta_detector() ta_current_level=%d, real_v_chrA=%d, real_v_chrB=%d, is_ta_connect=%d\n", ta_current_level, real_v_chrA, real_v_chrB,is_ta_connect); battery_log(BAT_LOG_CRTI, "mtk_ta_detector() end, retry_count=%d, ta_cable_out_occur=%d \n",retransmit_count,ta_cable_out_occur); }
static void set_ta_charging_current(void) { int real_v_chrA = 0; real_v_chrA = battery_meter_get_charger_voltage(); battery_xlog_printk(BAT_LOG_CRTI, "set_ta_charging_current, chrA=%d, chrB=%d\n", ta_v_chr_org, real_v_chrA); if((real_v_chrA - ta_v_chr_org) > 3000) { g_temp_input_CC_value = TA_AC_9V_INPUT_CURRENT; //TA = 9V g_temp_CC_value = TA_AC_CHARGING_CURRENT; } else if((real_v_chrA - ta_v_chr_org) > 1000) { g_temp_input_CC_value = TA_AC_7V_INPUT_CURRENT; //TA = 7V g_temp_CC_value = TA_AC_CHARGING_CURRENT; } }
static void mtk_ta_BJT_check(void) { int curr_vbat = 0; int curr_current = 0; int vchr = 0; int watt = 0; int i=0,cnt=0; for(i=0;i<3;i++) { vchr = battery_meter_get_charger_voltage(); curr_vbat = battery_meter_get_battery_voltage(KAL_TRUE); curr_current = battery_meter_get_charging_current_imm(); watt = ((vchr - curr_vbat)*curr_current); battery_log(BAT_LOG_CRTI, "mtk_ta_BJT_check() vchr=%d, vbat=%d, current=%d, Watt=%d, ta_current_level=%d\n", vchr,curr_vbat,curr_current,watt, ta_current_level); if(watt > BJT_LIMIT)//1.2W { cnt++; } else { break; } msleep(200); } if(cnt>=3) { is_ta_connect = KAL_FALSE; } battery_log(BAT_LOG_CRTI, "mtk_ta_BJT_check() vchr=%d, vbat=%d, current=%d, Watt=%d, ta_current_level=%d cnt=%d\n", vchr,curr_vbat,curr_current,watt, ta_current_level,cnt); }
void select_charging_curret(void) { #ifdef MEIZU_M71 kal_uint32 charger_voltage = 0, sum_voltage = 0; int i; #endif if (g_ftm_battery_flag) { battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] FTM charging : %d\r\n", charging_level_data[0]); g_temp_CC_value = charging_level_data[0]; if(g_temp_CC_value == CHARGE_CURRENT_450_00_MA) { g_temp_input_CC_value = CHARGE_CURRENT_500_00_MA; } else { g_temp_input_CC_value = CHARGE_CURRENT_MAX; #ifdef MEIZU_M71 g_temp_CC_value = STANDARD_CHARGER_CURRENT; #else g_temp_CC_value = AC_CHARGER_CURRENT; #endif battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] set_ac_current \r\n"); } } else { if ( BMT_status.charger_type == STANDARD_HOST ) { #ifdef CONFIG_USB_IF { g_temp_input_CC_value = CHARGE_CURRENT_MAX; if (g_usb_state == USB_SUSPEND) { g_temp_CC_value = USB_CHARGER_CURRENT_SUSPEND; } else if (g_usb_state == USB_UNCONFIGURED) { g_temp_CC_value = USB_CHARGER_CURRENT_UNCONFIGURED; } else if (g_usb_state == USB_CONFIGURED) { g_temp_CC_value = USB_CHARGER_CURRENT_CONFIGURED; } else { g_temp_CC_value = USB_CHARGER_CURRENT_UNCONFIGURED; } battery_xlog_printk(BAT_LOG_CRTI, "[BATTERY] STANDARD_HOST CC mode charging : %d on %d state\r\n", g_temp_CC_value, g_usb_state); } #else { g_temp_input_CC_value = USB_CHARGER_CURRENT; g_temp_CC_value = USB_CHARGER_CURRENT; } #endif } else if (BMT_status.charger_type == NONSTANDARD_CHARGER) { g_temp_input_CC_value = NON_STD_AC_CHARGER_CURRENT; g_temp_CC_value = NON_STD_AC_CHARGER_CURRENT; } #ifdef MEIZU_M71 #ifdef MEIZU_M79 else if (BMT_status.charger_type == MEIZU_2_0A_CHARGER) { g_temp_input_CC_value = MEIZU_2_0A_CHARGER_CURRENT; g_temp_CC_value = MEIZU_2_0A_CHARGER_CURRENT; } else if (BMT_status.charger_type == STANDARD_CHARGER) { g_temp_input_CC_value = MEIZU_1_5A_CHARGER_CURRENT; g_temp_CC_value = MEIZU_1_5A_CHARGER_CURRENT; battery_charging_control(CHARGING_CMD_SET_CURRENT,&g_temp_CC_value); msleep(100); for (i=0; i<5; i++) { battery_meter_get_battery_voltage(TRUE); charger_voltage = battery_meter_get_charger_voltage(); sum_voltage += charger_voltage; msleep(10); } charger_voltage = sum_voltage / 5; if (charger_voltage <= CHARGER_CURRENT_1_2A_THRESHOLD) { g_temp_CC_value = STANDARD_CHARGER_CURRENT; } else { g_temp_CC_value = MEIZU_1_5A_CHARGER_CURRENT; g_temp_input_CC_value = MEIZU_1_5A_CHARGER_CURRENT ; } } else if (BMT_status.charger_type == CHARGING_HOST) { g_temp_input_CC_value = CHARGING_HOST_CHARGER_CURRENT; g_temp_CC_value = CHARGING_HOST_CHARGER_CURRENT; } else if (BMT_status.charger_type == APPLE_CHARGER) { g_temp_input_CC_value = APPLE_2_1A_CHARGER_CURRENT; g_temp_CC_value = APPLE_2_1A_CHARGER_CURRENT; battery_charging_control(CHARGING_CMD_SET_CURRENT,&g_temp_CC_value); msleep(100); for (i=0; i<5; i++) { charger_voltage = battery_meter_get_charger_voltage(); sum_voltage += charger_voltage; msleep(10); } charger_voltage = sum_voltage / 5; if (charger_voltage < CHARGER_CURRENT_1_2A_THRESHOLD) { g_temp_CC_value = APPLE_1_0A_CHARGER_CURRENT; } else { g_temp_CC_value = APPLE_2_1A_CHARGER_CURRENT; g_temp_input_CC_value = APPLE_2_1A_CHARGER_CURRENT ; } } else if (BMT_status.charger_type == U200_CHARGER) { g_temp_input_CC_value = U200_1A_CHARGER_CURRENT; g_temp_CC_value = U200_1A_CHARGER_CURRENT; } else { g_temp_input_CC_value = USB_CHARGER_CURRENT; g_temp_CC_value = USB_CHARGER_CURRENT; } #else else if (BMT_status.charger_type == MEIZU_2_0A_CHARGER) { g_temp_input_CC_value = MEIZU_2_0A_CHARGER_CURRENT; g_temp_CC_value = MEIZU_2_0A_CHARGER_CURRENT; } else if (BMT_status.charger_type == STANDARD_CHARGER) { g_temp_input_CC_value = MEIZU_2_0A_CHARGER_CURRENT; g_temp_CC_value = MEIZU_2_0A_CHARGER_CURRENT; battery_charging_control(CHARGING_CMD_SET_CURRENT,&g_temp_CC_value); msleep(100); for (i=0; i<5; i++) { battery_meter_get_battery_voltage(TRUE); charger_voltage = battery_meter_get_charger_voltage(); sum_voltage += charger_voltage; msleep(10); } charger_voltage = sum_voltage / 5; if(mz_get_hw_version() >= 20) charger_voltage -= 15 ; if(mz_get_operator_type() == 1) charger_voltage += 30 ; //for china mobile if (charger_voltage <= CHARGER_CURRENT_1A_THRESHOLD) { g_temp_CC_value = STANDARD_CHARGER_CURRENT; } else if (charger_voltage <= CHARGER_CURRENT_1_2A_THRESHOLD){ g_temp_CC_value = MEIZU_1_5A_CHARGER_CURRENT; } else { g_temp_CC_value = MEIZU_2_0A_CHARGER_CURRENT; g_temp_input_CC_value = CHARGE_CURRENT_2000_00_MA ; } } else if (BMT_status.charger_type == CHARGING_HOST) { g_temp_input_CC_value = CHARGING_HOST_CHARGER_CURRENT; g_temp_CC_value = CHARGING_HOST_CHARGER_CURRENT; } else if (BMT_status.charger_type == APPLE_CHARGER) { g_temp_input_CC_value = APPLE_2_1A_CHARGER_CURRENT; g_temp_CC_value = APPLE_2_1A_CHARGER_CURRENT; battery_charging_control(CHARGING_CMD_SET_CURRENT,&g_temp_CC_value); msleep(100); for (i=0; i<5; i++) { charger_voltage = battery_meter_get_charger_voltage(); sum_voltage += charger_voltage; msleep(10); } charger_voltage = sum_voltage / 5; if(mz_get_hw_version() >= 20) charger_voltage -= 15 ; if(mz_get_operator_type() == 1) charger_voltage += 30 ; //for china mobile charger_voltage += 5 ; if (charger_voltage < CHARGER_CURRENT_1A_THRESHOLD) { g_temp_CC_value = APPLE_1_0A_CHARGER_CURRENT; } else { g_temp_CC_value = APPLE_2_1A_CHARGER_CURRENT; g_temp_input_CC_value = CHARGE_CURRENT_2000_00_MA ; } } else if (BMT_status.charger_type == U200_CHARGER) { g_temp_input_CC_value = U200_1A_CHARGER_CURRENT; g_temp_CC_value = U200_1A_CHARGER_CURRENT; } else { g_temp_input_CC_value = USB_CHARGER_CURRENT; g_temp_CC_value = USB_CHARGER_CURRENT; } #endif #else else if (BMT_status.charger_type == STANDARD_CHARGER)