/* Preference to WALL(DCIN) charger unit */ if (dc || vbus) {
bat->charger_type = DA9052_CHARGER;
/* If charging end flag is set and Charging current is greater * than charging end limit then battery is charging
*/ if ((chg_end & DA9052_STATUSB_CHGEND) != 0) {
ret = da9052_read_chg_current(bat, &chg_current); if (ret < 0) return ret;
ret = da9052_read_chgend_current(bat, &chg_end_current); if (ret < 0) return ret;
if (chg_current >= chg_end_current)
bat->status = POWER_SUPPLY_STATUS_CHARGING; else
bat->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
} else { /* If Charging end flag is cleared then battery is * charging
*/
bat->status = POWER_SUPPLY_STATUS_CHARGING;
}
} elseif (dcindet || vbusdet) {
bat->charger_type = DA9052_CHARGER;
bat->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
} else {
bat->charger_type = DA9052_NOCHARGER;
bat->status = POWER_SUPPLY_STATUS_DISCHARGING;
}
if (status != NULL)
*status = bat->status; return0;
}
staticint da9052_bat_read_volt(struct da9052_battery *bat, int *volt_mV)
{ int volt;
volt = da9052_adc_manual_read(bat->da9052, DA9052_ADC_MAN_MUXSEL_VBAT); if (volt < 0) return volt;
*volt_mV = volt_reg_to_mV(volt);
return0;
}
staticint da9052_bat_check_presence(struct da9052_battery *bat, int *illegal)
{ int bat_temp;
bat_temp = da9052_adc_read_temp(bat->da9052); if (bat_temp < 0) return bat_temp;
staticunsignedchar da9052_determine_vc_tbl_index(unsignedchar adc_temp)
{ int i;
if (adc_temp <= vc_tbl_ref[0]) return0;
if (adc_temp > vc_tbl_ref[DA9052_VC_TBL_REF_SZ - 1]) return DA9052_VC_TBL_REF_SZ - 1;
for (i = 0; i < DA9052_VC_TBL_REF_SZ - 1; i++) { if ((adc_temp > vc_tbl_ref[i]) &&
(adc_temp <= DA9052_MEAN(vc_tbl_ref[i], vc_tbl_ref[i + 1]))) return i; if ((adc_temp > DA9052_MEAN(vc_tbl_ref[i], vc_tbl_ref[i + 1]))
&& (adc_temp <= vc_tbl_ref[i])) return i + 1;
} /* * For some reason authors of the driver didn't presume that we can * end up here. It might be OK, but might be not, no one knows for * sure. Go check your battery, is it on fire?
*/
WARN_ON(1); return0;
}
staticint da9052_bat_read_capacity(struct da9052_battery *bat, int *capacity)
{ int adc_temp; int bat_voltage; int vbat_lower; int vbat_upper; int level_upper; int level_lower; int ret; int flag; int i = 0; int j;
ret = da9052_bat_read_volt(bat, &bat_voltage); if (ret < 0) return ret;
adc_temp = da9052_adc_read_temp(bat->da9052); if (adc_temp < 0) return adc_temp;
i = da9052_determine_vc_tbl_index(adc_temp);
if (bat_voltage >= vc_tbl[i][0][0]) {
*capacity = 100; return0;
} if (bat_voltage <= vc_tbl[i][DA9052_VC_TBL_SZ - 1][0]) {
*capacity = 0; return0;
}
flag = 0;
for (i = 0; i < ARRAY_SIZE(da9052_bat_irqs); i++) {
ret = da9052_request_irq(bat->da9052,
da9052_bat_irq_bits[i], da9052_bat_irqs[i],
da9052_bat_irq, bat);
if (ret != 0) {
dev_err(bat->da9052->dev, "DA9052 failed to request %s IRQ: %d\n",
da9052_bat_irqs[i], ret); goto err;
}
}
bat->psy = devm_power_supply_register(&pdev->dev, &psy_desc, &psy_cfg); if (IS_ERR(bat->psy)) {
ret = PTR_ERR(bat->psy); goto err;
}
platform_set_drvdata(pdev, bat); return0;
err: while (--i >= 0)
da9052_free_irq(bat->da9052, da9052_bat_irq_bits[i], bat);
MODULE_DESCRIPTION("DA9052 BAT Device Driver");
MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:da9052-bat");
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.15Bemerkung:
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-06-05)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.