static void rk2918_get_bat_status(struct rk2918_battery_data *bat) { static int stable = 0; rk2918_get_charge_status(); if((gBatChargeStatus == 1)) { if (gBatteryData->charge_ok_pin == INVALID_GPIO) { printk("dc_det_pin invalid!\n"); return; } if (gBatStatus == POWER_SUPPLY_STATUS_FULL) { return; } if ((gpio_get_value(gBatteryData->charge_ok_pin) == gBatteryData->charge_ok_level) && (gBatCapacity >= 80)) { gBatteryData->full_times++; stable = 0; if (gBatteryData->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) { gBatStatus = POWER_SUPPLY_STATUS_FULL; gBatStatusBack=POWER_SUPPLY_STATUS_FULL; gBatteryData->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1; } else { gBatStatus = POWER_SUPPLY_STATUS_CHARGING; } } else { if (gBatteryData->full_times>0) { stable++; if(stable >= NUM_STABLE_SAMPLE) { stable = 0; gBatteryData->full_times = 0; } } gBatStatus = POWER_SUPPLY_STATUS_CHARGING; } } else { stable = 0; gBatteryData->full_times = 0; gBatStatus = POWER_SUPPLY_STATUS_NOT_CHARGING; } }
static void rk2918_get_bat_status(struct rk2918_battery_data *bat) { dprint("func=%s, line=%d :\n", __func__, __LINE__); rk2918_get_charge_status(); if(gBatChargeStatus == 1) { if (gBatteryData->charge_ok_pin == INVALID_GPIO) { printk("dc_det_pin invalid!\n"); return; } if (gBatStatus == POWER_SUPPLY_STATUS_FULL) { return; } if ((gpio_get_value(gBatteryData->charge_ok_pin) == gBatteryData->charge_ok_level) && (gBatCapacity >= 80)) { gBatteryData->full_times++; if (gBatteryData->full_times >= NUM_CHARGE_FULL_DELAY_TIMES) { gBatStatus = POWER_SUPPLY_STATUS_FULL; gBatteryData->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1; } else { gBatStatus = POWER_SUPPLY_STATUS_CHARGING; } } else { gBatStatus = POWER_SUPPLY_STATUS_CHARGING; gBatteryData->full_times = 0; } } else { gBatteryData->full_times = 0; gBatStatus = POWER_SUPPLY_STATUS_NOT_CHARGING; } }
static void rk2918_low_battery_check(void) { int i; int tmp = 0; for (i = 0; i < 100; i++) { tmp += adc_sync_read(gBatteryData->client); mdelay(1); } tmp = tmp / 100; //gBatteryData->adc_val = tmp; //gBatVoltage = (tmp * BAT_2V5_VALUE * (BAT_PULL_UP_R + BAT_PULL_DOWN_R)) / (1024 * BAT_PULL_DOWN_R); //rk2918_get_charge_status(); //gBatCapacity = rk2918_get_bat_capacity_raw(gBatVoltage); rk2918_get_charge_status(); tmp = (tmp * BAT_2V5_VALUE * (BAT_PULL_UP_R + BAT_PULL_DOWN_R)) / (1024 * BAT_PULL_DOWN_R); if(RK29_ADC_CLI_ADD) tmp += RK29_ADC_CLI_VALUE; else tmp -= RK29_ADC_CLI_VALUE; gBatCapacity = rk2918_get_bat_capacity_raw(tmp); if (gBatCapacity == 0) gBatCapacity = 1; printk("rk2918_low_battery_check: gBatVoltage = %d, gBatCapacity = %d\n", gBatVoltage, gBatCapacity); if (gBatVoltage <= BATT_ZERO_VOL_VALUE + 50) { printk("low battery: powerdown\n"); gpio_direction_output(POWER_ON_PIN, GPIO_LOW); tmp = 0; while(1) { if(gpio_get_value(POWER_ON_PIN) == GPIO_HIGH) { gpio_set_value(POWER_ON_PIN,GPIO_LOW); } mdelay(5); if (++tmp > 50) break; } } gpio_direction_output(POWER_ON_PIN, GPIO_HIGH); }