Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/i2c Add AXP803 current and maximum battery capacity ...



details:   https://anonhg.NetBSD.org/src/rev/2a4fc23449f2
branches:  trunk
changeset: 445818:2a4fc23449f2
user:      jakllsch <jakllsch%NetBSD.org@localhost>
date:      Tue Nov 13 19:06:05 2018 +0000

description:
Add AXP803 current and maximum battery capacity sensors

diffstat:

 sys/dev/i2c/axppmic.c |  53 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 51 insertions(+), 2 deletions(-)

diffs (102 lines):

diff -r 2203d95b7449 -r 2a4fc23449f2 sys/dev/i2c/axppmic.c
--- a/sys/dev/i2c/axppmic.c     Tue Nov 13 18:48:25 2018 +0000
+++ b/sys/dev/i2c/axppmic.c     Tue Nov 13 19:06:05 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: axppmic.c,v 1.15 2018/11/13 18:27:32 jakllsch Exp $ */
+/* $NetBSD: axppmic.c,v 1.16 2018/11/13 19:06:05 jakllsch Exp $ */
 
 /*-
  * Copyright (c) 2014-2018 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.15 2018/11/13 18:27:32 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: axppmic.c,v 1.16 2018/11/13 19:06:05 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -83,6 +83,17 @@
 #define         AXP_BATT_CAP_VALID     __BIT(7)
 #define         AXP_BATT_CAP_PERCENT   __BITS(6,0)
 
+#define        AXP_BATT_MAX_CAP_HI_REG 0xe0
+#define         AXP_BATT_MAX_CAP_VALID __BIT(7)
+#define        AXP_BATT_MAX_CAP_LO_REG 0xe1
+
+#define        AXP_BATT_COULOMB_HI_REG 0xe2
+#define         AXP_BATT_COULOMB_VALID __BIT(7)
+#define        AXP_BATT_COULOMB_LO_REG 0xe3
+
+#define        AXP_COULOMB_RAW(_hi, _lo)       \
+       (((u_int)(_hi & ~__BIT(7)) << 8) | (_lo))
+
 #define        AXP_BATT_CAP_WARN_REG   0xe6
 #define         AXP_BATT_CAP_WARN_LV1  __BITS(7,4)
 #define         AXP_BATT_CAP_WARN_LV2  __BITS(3,0)
@@ -229,6 +240,8 @@
        AXP_SENSOR_BATT_CHARGE_CURRENT,
        AXP_SENSOR_BATT_DISCHARGE_CURRENT,
        AXP_SENSOR_BATT_CAPACITY_PERCENT,
+       AXP_SENSOR_BATT_MAXIMUM_CAPACITY,
+       AXP_SENSOR_BATT_CURRENT_CAPACITY,
        AXP_NSENSORS
 };
 
@@ -274,6 +287,8 @@
        .batsense_step = 1100,
        .charge_step = 1000,
        .discharge_step = 1000,
+       .maxcap_step = 1456,
+       .coulomb_step = 1456,
        .poklirq = AXPPMIC_IRQ(5, __BIT(3)),
        .acinirq = AXPPMIC_IRQ(1, __BITS(6,5)),
        .vbusirq = AXPPMIC_IRQ(1, __BITS(3,2)),
@@ -495,6 +510,22 @@
                        e->value_cur = AXP_ADC_RAW(hi, lo) * c->discharge_step;
                }
                break;
+       case AXP_SENSOR_BATT_MAXIMUM_CAPACITY:
+               if (battery_present &&
+                   axppmic_read(sc->sc_i2c, sc->sc_addr, AXP_BATT_MAX_CAP_HI_REG, &hi, flags) == 0 &&
+                   axppmic_read(sc->sc_i2c, sc->sc_addr, AXP_BATT_MAX_CAP_LO_REG, &lo, flags) == 0) {
+                       e->state = (hi & AXP_BATT_MAX_CAP_VALID) ? ENVSYS_SVALID : ENVSYS_SINVALID;
+                       e->value_cur = AXP_COULOMB_RAW(hi, lo) * c->maxcap_step;
+               }
+               break;
+       case AXP_SENSOR_BATT_CURRENT_CAPACITY:
+               if (battery_present &&
+                   axppmic_read(sc->sc_i2c, sc->sc_addr, AXP_BATT_COULOMB_HI_REG, &hi, flags) == 0 &&
+                   axppmic_read(sc->sc_i2c, sc->sc_addr, AXP_BATT_COULOMB_LO_REG, &lo, flags) == 0) {
+                       e->state = (hi & AXP_BATT_COULOMB_VALID) ? ENVSYS_SVALID : ENVSYS_SINVALID;
+                       e->value_cur = AXP_COULOMB_RAW(hi, lo) * c->coulomb_step;
+               }
+               break;
        }
 }
 
@@ -653,6 +684,24 @@
                strlcpy(e->desc, "battery percent", sizeof(e->desc));
                sysmon_envsys_sensor_attach(sc->sc_sme, e);
        }
+
+       if (c->maxcap_step) {
+               e = &sc->sc_sensor[AXP_SENSOR_BATT_MAXIMUM_CAPACITY];
+               e->private = AXP_SENSOR_BATT_MAXIMUM_CAPACITY;
+               e->units = ENVSYS_SAMPHOUR;
+               e->state = ENVSYS_SINVALID;
+               strlcpy(e->desc, "battery maximum capacity", sizeof(e->desc));
+               sysmon_envsys_sensor_attach(sc->sc_sme, e);
+       }
+
+       if (c->coulomb_step) {
+               e = &sc->sc_sensor[AXP_SENSOR_BATT_CURRENT_CAPACITY];
+               e->private = AXP_SENSOR_BATT_CURRENT_CAPACITY;
+               e->units = ENVSYS_SAMPHOUR;
+               e->state = ENVSYS_SINVALID;
+               strlcpy(e->desc, "battery current capacity", sizeof(e->desc));
+               sysmon_envsys_sensor_attach(sc->sc_sme, e);
+       }
 }
 
 static void



Home | Main Index | Thread Index | Old Index