static void samsung_fake_bat_status_update(struct power_supply *bat_ps) { int old_level, old_temp, old_is_full; dev_dbg(dev, "%s ++\n", __func__); if (!samsung_fake_battery_initial) return; mutex_lock(&work_lock); old_temp = samsung_fake_bat_info.bat_info.batt_temp; old_level = samsung_fake_bat_info.bat_info.level; old_is_full = samsung_fake_bat_info.bat_info.batt_is_full; samsung_fake_bat_info.bat_info.batt_temp = samsung_get_bat_temp(bat_ps); samsung_fake_bat_info.bat_info.level = samsung_get_bat_level(bat_ps); samsung_fake_bat_info.bat_info.batt_vol = samsung_get_bat_vol(bat_ps); if (old_level != samsung_fake_bat_info.bat_info.level || old_temp != samsung_fake_bat_info.bat_info.batt_temp || old_is_full != samsung_fake_bat_info.bat_info.batt_is_full) { power_supply_changed(bat_ps); dev_dbg(dev, "%s : call power_supply_changed\n", __func__); } mutex_unlock(&work_lock); dev_dbg(dev, "%s --\n", __func__); }
static void mixtile_adc_bat_status_update(unsigned long unused) { charger_type_t source = CHARGER_BATTERY; int adc; int charge_change; //获取充电状态,并对比上次检测,充电状态是否改变 mixtile_adc_bat_info.bat_info.charging_source = samsung_get_charge_source(&source); if(last_charge_state == -1) last_charge_state = mixtile_adc_bat_info.bat_info.charging_source; if(last_charge_state == mixtile_adc_bat_info.bat_info.charging_source) charge_change = 0; else charge_change = 1; last_charge_state = mixtile_adc_bat_info.bat_info.charging_source; //判断是否忽略此次读数 adc = samsung_get_bat_adc(); if(last_adc_value == 0) last_adc_value = adc; else { // printk("%d %d", abs(last_adc_value-adc), charge_change); if((abs(last_adc_value-adc) >ADC_JITTER_VAL) && (charge_change==0)) return; } real_adc_value = adc; last_adc_value = adc; if(adc > ADC_MIN_VALUE) { //计算10次adc读数平均值 int i=0; if((adc_value[0] == 0) || (charge_change==1)) { for(i=0; i<10; i++) adc_value[i] = adc; } for(i=0; i<9; i++) { adc_value[i] = adc_value[i+1]; } adc_value[i] = adc; adc = 0; for(i=0; i<10; i++) adc += adc_value[i]; adc = adc/10; mixtile_adc_bat_info.bat_info.batt_temp = samsung_get_bat_temp(); mixtile_adc_bat_info.bat_info.batt_vol_adc = adc; mixtile_adc_bat_info.bat_info.level = samsung_get_bat_level(); mixtile_adc_bat_info.bat_info.batt_vol = samsung_get_bat_vol(); } if(mixtile_adc_bat_info.bat_info.level >= 100) mixtile_adc_bat_info.bat_info.batt_is_full = 1; else mixtile_adc_bat_info.bat_info.batt_is_full = 0; if(source == CHARGE_FULL) {//硬件检测到已充满 mixtile_adc_bat_info.bat_info.batt_is_full = 1; mixtile_adc_bat_info.bat_info.level = 100; } //Apollo + 充电时可休眠 // if (source == CHARGER_USB || source == CHARGER_AC) // wake_lock(&vbus_wake_lock); // else // wake_lock_timeout(&vbus_wake_lock, HZ / 2); //Apollo - power_supply_changed(&samsung_power_supplies[CHARGER_BATTERY]); // power_supply_changed(&s3c_power_supplies[CHARGER_USB]); // power_supply_changed(&s3c_power_supplies[CHARGER_AC]); printk("batt_vol_adc=%04d adc_read=%04d charge_change=%d\n", mixtile_adc_bat_info.bat_info.batt_vol_adc, real_adc_value, charge_change); }