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); } }