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;
	}
}
示例#3
0
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;
}
示例#6
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);
}
示例#7
0
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);
}				
示例#12
0
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)