diff options
author | Marco Peereboom <marco@cvs.openbsd.org> | 2006-02-17 07:09:26 +0000 |
---|---|---|
committer | Marco Peereboom <marco@cvs.openbsd.org> | 2006-02-17 07:09:26 +0000 |
commit | cc91cf4c126918bfd6d46340186beccf2089aee7 (patch) | |
tree | b0292af8a5be0c55c0eb8458ab947c8ce57b74ff /sys/dev/acpi/acpibat.c | |
parent | 31da0da33f29d78ec378f9f2492774a0092ea480 (diff) |
Propogate some values through the sysctl hw.sesnsors interface for debug
purposes. This will be removed later and replaced with something better.
Diffstat (limited to 'sys/dev/acpi/acpibat.c')
-rw-r--r-- | sys/dev/acpi/acpibat.c | 87 |
1 files changed, 86 insertions, 1 deletions
diff --git a/sys/dev/acpi/acpibat.c b/sys/dev/acpi/acpibat.c index 864e7a96bc9..a5ed42fe68f 100644 --- a/sys/dev/acpi/acpibat.c +++ b/sys/dev/acpi/acpibat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: acpibat.c,v 1.13 2006/02/17 00:45:27 marco Exp $ */ +/* $OpenBSD: acpibat.c,v 1.14 2006/02/17 07:09:25 marco Exp $ */ /* * Copyright (c) 2005 Marco Peereboom <marco@openbsd.org> * @@ -28,6 +28,8 @@ #include <dev/acpi/amltypes.h> #include <dev/acpi/dsdt.h> +#include <sys/sensors.h> + int acpibat_match(struct device *, void *, void *); void acpibat_attach(struct device *, struct device *, void *); @@ -42,6 +44,8 @@ struct acpibat_softc { struct acpibat_bif sc_bif; struct acpibat_bst sc_bst; + + struct sensor sens[13]; /* XXX debug only */ }; struct cfattach acpibat_ca = { @@ -52,6 +56,7 @@ struct cfdriver acpibat_cd = { NULL, "acpibat", DV_DULL }; +void acpibat_refresh(void *); int acpibat_getbif(struct acpibat_softc *); int acpibat_getbst(struct acpibat_softc *); @@ -70,11 +75,13 @@ acpibat_match(struct device *parent, void *match, void *aux) return (1); } +/* XXX this is for debug only, remove later */ void acpibat_attach(struct device *parent, struct device *self, void *aux) { struct acpibat_softc *sc = (struct acpibat_softc *) self; struct acpi_attach_args *aa = aux; + int i; sc->sc_acpi = (struct acpi_softc *)parent; sc->sc_devnode = aa->aaa_node->child; @@ -89,6 +96,84 @@ acpibat_attach(struct device *parent, struct device *self, void *aux) sc->sc_bif.bif_serial, sc->sc_bif.bif_type, sc->sc_bif.bif_oem); + + memset(sc->sens, 0, sizeof(sc->sens)); + + for (i = 0; i < 13; i++) + strlcpy(sc->sens[i].device, DEVNAME(sc), sizeof(sc->sens[i].device)); + + strlcpy(sc->sens[0].desc, "last full capacity", sizeof(sc->sens[2].desc)); + sc->sens[0].type = SENSOR_PERCENT; + sensor_add(&sc->sens[0]); + sc->sens[0].value = sc->sc_bif.bif_last_capacity / sc->sc_bif.bif_cap_granu1 * 1000; + + strlcpy(sc->sens[1].desc, "warning capacity", sizeof(sc->sens[1].desc)); + sc->sens[1].type = SENSOR_PERCENT; + sensor_add(&sc->sens[1]); + sc->sens[1].value = sc->sc_bif.bif_warning / sc->sc_bif.bif_cap_granu1 * 1000; + + strlcpy(sc->sens[2].desc, "low capacity", sizeof(sc->sens[2].desc)); + sc->sens[2].type = SENSOR_PERCENT; + sensor_add(&sc->sens[2]); + sc->sens[2].value = sc->sc_bif.bif_warning / sc->sc_bif.bif_cap_granu1 * 1000; + + strlcpy(sc->sens[3].desc, "voltage", sizeof(sc->sens[3].desc)); + sc->sens[3].type = SENSOR_VOLTS_DC; + sensor_add(&sc->sens[3]); + sc->sens[3].status = SENSOR_S_OK; + sc->sens[3].value = sc->sc_bif.bif_voltage * 1000; + + strlcpy(sc->sens[4].desc, "state", sizeof(sc->sens[4].desc)); + sc->sens[4].type = SENSOR_INTEGER; + sensor_add(&sc->sens[4]); + sc->sens[4].status = SENSOR_S_OK; + sc->sens[4].value = sc->sc_bst.bst_state; + + strlcpy(sc->sens[5].desc, "rate", sizeof(sc->sens[5].desc)); + sc->sens[5].type = SENSOR_INTEGER; + sensor_add(&sc->sens[5]); + sc->sens[5].value = sc->sc_bst.bst_rate; + + strlcpy(sc->sens[6].desc, "remaining capacity", sizeof(sc->sens[6].desc)); + sc->sens[6].type = SENSOR_PERCENT; + sensor_add(&sc->sens[6]); + sc->sens[6].value = sc->sc_bst.bst_capacity / sc->sc_bif.bif_cap_granu1 * 1000; + + strlcpy(sc->sens[7].desc, "current voltage", sizeof(sc->sens[7].desc)); + sc->sens[7].type = SENSOR_VOLTS_DC; + sensor_add(&sc->sens[7]); + sc->sens[7].status = SENSOR_S_OK; + sc->sens[7].value = sc->sc_bst.bst_voltage * 1000; + + if (sensor_task_register(sc, acpibat_refresh, 10)) + printf(", unable to register update task\n"); +} + +void +acpibat_refresh(void *arg) +{ + struct acpibat_softc *sc = arg; + + acpibat_getbif(sc); + acpibat_getbst(sc); + + sc->sens[0].value = sc->sc_bif.bif_last_capacity / sc->sc_bif.bif_cap_granu1 * 1000; + sc->sens[1].value = sc->sc_bif.bif_warning / sc->sc_bif.bif_cap_granu1 * 1000; + sc->sens[2].value = sc->sc_bif.bif_warning / sc->sc_bif.bif_cap_granu1 * 1000; + sc->sens[3].value = sc->sc_bif.bif_voltage * 1000; + + sc->sens[4].status = SENSOR_S_OK; + if (sc->sc_bst.bst_state & BST_DISCHARGE) + strlcpy(sc->sens[4].desc, "battery discharging", sizeof(sc->sens[4].desc)); + else if (sc->sc_bst.bst_state & BST_CHARGE) + strlcpy(sc->sens[4].desc, "battery charging", sizeof(sc->sens[4].desc)); + else if (sc->sc_bst.bst_state & BST_CRITICAL) { + strlcpy(sc->sens[4].desc, "battery critical", sizeof(sc->sens[4].desc)); + sc->sens[4].status = SENSOR_S_CRIT; + } + sc->sens[4].value = sc->sc_bst.bst_state; + sc->sens[5].value = sc->sc_bst.bst_rate; + sc->sens[6].value = sc->sc_bst.bst_capacity / sc->sc_bif.bif_cap_granu1 * 1000; } int |