int board_charging(void)
{
	enum charge_level_t charger;
	uint16_t batt_soc = 0;
	int ret;

	charger = charger_detect();

	ret = init_batt();
	
	if (ret && charger == CHARGE_DISABLE) {
		printf("failed to init battery: %d\n", ret);
		return ret;
	}

	ret = max17042_soc(&batt_soc);

	if (ret && charger == CHARGE_DISABLE) {
		printf("failed to read initial SOC: %d\n", ret);
		return ret;
	}

	if (batt_soc < SOC_THRESH_MIN) {
		display_image(IMAGE_CHARGE_NEEDED, batt_soc);
		if (ret) {
			printf("No battery detected, emergency charging!\n");
		}

		charge_loop(&batt_soc, ret ? 1 : 0);

		if (batt_soc < SOC_THRESH_MIN) {
			// Uh-oh, we exited the charge loop
			// before we passed the minimum
			// In this case we should power down
			if (batt_soc >= SOC_THRESH_DISPLAY_MIN) {
				display_image(IMAGE_CHARGE_NEEDED, batt_soc);
				udelay(1000 * 1000 * 2);
			}

			twl6030_power_off();
		}
	}

	/* Reconfigure MPU DPLL clock as it might have been set */
	/* to conservative values in x-loader, only do this in the
	 case where we are actually going to boot */
	set_mpu_dpll_max_opp();

	display_image(IMAGE_BOOT, batt_soc);
	printf("SOC %hu%%, booting.\n", batt_soc);
	return ret;
}
void bmt_hdlr(void)
{
	 u8 adc_volt_level=0;
	LDO_IN_Volt=(u8)(AD_var.wADValue[ADC_CHARGER_CH]>>8);
#ifdef BAT_UART_DEBUG
   	my_printf(" --->bmt_hdlr :LDO_IN_Volt  %x \r\n",(u16)LDO_IN_Volt);
#endif

#ifdef CHARGER_DETECTION_THREAD_ENABLE

	if(charger_detect()){
#ifdef BAT_CHARGER_IND_HLDR
		bat_charger_ind_hldr();
#endif
		return;
	}
#endif	
#ifdef BAT_CHARGER_IND_HLDR
	bat_charger_ind_hldr_end();
#endif
	for(adc_volt_level =0; adc_volt_level<(sizeof(adc_bat_volt));adc_volt_level++){

		if(LDO_IN_Volt<=adc_bat_volt[adc_volt_level]){
			batt_level = adc_volt_level;
#ifdef BAT_LOW_LEVEL_HLDR
			bat_low_level_hldr(adc_volt_level);
#endif			
			break;
		}
	}
#ifdef BAT_UART_DEBUG
    	my_printf(" --->bmt_hdlr :batt_level  %x \r\n",(u16)(batt_level));
#endif
	disp_bat_icon_buf();

}
static void charge_loop(uint16_t *batt_soc, int emergency_charge)
{
	enum charge_level_t charge_level, charge_level_new;
	int tick = 0;
	uint16_t voltage = 0;
	u8 pwron;
	int microvolts, ret;
	int action = READ_BATTERY; // initially we wan't to read the battery status

	charge_level = charger_detect();
	charger_enable(charge_level, emergency_charge);
	// and we wan't to display a charge status image
	display_image_charging(*batt_soc, charge_level);

	while ((*batt_soc < SOC_THRESH_MIN || emergency_charge) &&
			charge_level != CHARGE_DISABLE) {	
		if (action & READ_BATTERY) {
			ret = max17042_soc(batt_soc);
		
			if (ret) {
				printf("Failed to read battery capacity, reason: %d\n", ret);
				if (!emergency_charge) {
					break;
				}
			}

			ret = max17042_voltage(&voltage);

			if (ret) {
				printf("Failed to read battery voltage, reason: %d\n", ret);

				if (!emergency_charge) {
					break;
				}
			}
		
			microvolts = voltage*625;
			printf("Charging... %hu%% (%d uV)\n", *batt_soc, microvolts);

			// If microvolts isn't 0 then we can talk to the gas gauge
			// and we no longer need to emergency charge
			emergency_charge = (microvolts <= 0);

			charge_level_new = charger_detect();

			if (charge_level != charge_level_new) {
				// to avoid re-writing the GPIOs all the time
				charge_level = charge_level_new;
				charger_enable(charge_level, emergency_charge);
			}
		}

		if (action & UPDATE_DISPLAY) {
			pwron = 0;
			if (twl6030_hw_status(&pwron)) {
				printf("Failed to read twl6030 hw_status\n");
			}

			// if button is pressed turn on screen
			if ((pwron & STS_PWRON) != STS_PWRON) {
				display_image_charging(*batt_soc, charge_level);
			} else if (lcd_is_on) {
				// if not turn off screen
				lcd_disable();
				lcd_is_on = 0;
			}
		}

		// each tick is 200 ms
		udelay(1000 * 200);
		++tick; // tick will overflow in approx. 4971 days
		action = get_charge_action(tick);
	}

	if (charge_level != CHARGE_DISABLE) {
		charger_enable(CHARGE_DISABLE, emergency_charge);
	}
}