diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2008-04-23 11:11:15 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2008-04-23 11:11:15 +0000 |
commit | 085ccde0e13b19ada2b604ba21633a2b553626ab (patch) | |
tree | 382fe4b609d4a2f3a90d3b074d736b80d44eca0e /sys/dev/i2c/adt7462.c | |
parent | 2a58963f6f3e04c3ec1f36582d4999a094feee5c (diff) |
learn about the fans
Diffstat (limited to 'sys/dev/i2c/adt7462.c')
-rw-r--r-- | sys/dev/i2c/adt7462.c | 95 |
1 files changed, 74 insertions, 21 deletions
diff --git a/sys/dev/i2c/adt7462.c b/sys/dev/i2c/adt7462.c index 1ac783c7cea..cbda0ef5679 100644 --- a/sys/dev/i2c/adt7462.c +++ b/sys/dev/i2c/adt7462.c @@ -1,4 +1,4 @@ -/* $OpenBSD: adt7462.c,v 1.5 2008/04/22 03:05:03 cnst Exp $ */ +/* $OpenBSD: adt7462.c,v 1.6 2008/04/23 11:11:14 deraadt Exp $ */ /* * Copyright (c) 2008 Theo de Raadt @@ -23,21 +23,45 @@ #include <dev/i2c/i2cvar.h> -#define ADT7462_INT_TEMPL 0x88 -#define ADT7462_INT_TEMPH 0x89 -#define ADT7462_EXT_TEMP1L 0x8a -#define ADT7462_EXT_TEMP1H 0x8b -#define ADT7462_EXT_TEMP2L 0x8c -#define ADT7462_EXT_TEMP2H 0x8d -#define ADT7462_EXT_TEMP3L 0x8e -#define ADT7462_EXT_TEMP3H 0x8f +#define ADT7462_TEMPL 0x88 +#define ADT7462_TEMPH 0x89 +#define ADT7462_TEMP1L 0x8a +#define ADT7462_TEMP1H 0x8b +#define ADT7462_TEMP2L 0x8c +#define ADT7462_TEMP2H 0x8d +#define ADT7462_TEMP3L 0x8e +#define ADT7462_TEMP3H 0x8f +#define ADT7262_TACH1L 0x98 +#define ADT7262_TACH1H 0x99 +#define ADT7262_TACH2L 0x9a +#define ADT7262_TACH2H 0x9b +#define ADT7262_TACH3L 0x9c +#define ADT7262_TACH3H 0x9d +#define ADT7262_TACH4L 0x9e +#define ADT7262_TACH4H 0x9f +#define ADT7262_TACH5L 0xa2 +#define ADT7262_TACH5H 0xa3 +#define ADT7262_TACH6L 0xa4 +#define ADT7262_TACH6H 0xa5 +#define ADT7262_TACH7L 0xa6 +#define ADT7262_TACH7H 0xa7 +#define ADT7262_TACH8L 0xa8 +#define ADT7262_TACH8H 0xa9 /* Sensors */ #define ADTFSM_TEMP0 0 #define ADTFSM_TEMP1 1 #define ADTFSM_TEMP2 2 #define ADTFSM_TEMP3 3 -#define ADTFSM_NUM_SENSORS 4 +#define ADTFSM_TACH1 4 +#define ADTFSM_TACH2 5 +#define ADTFSM_TACH3 6 +#define ADTFSM_TACH4 7 +#define ADTFSM_TACH5 8 +#define ADTFSM_TACH6 9 +#define ADTFSM_TACH7 10 +#define ADTFSM_TACH8 11 +#define ADTFSM_NUM_SENSORS 12 struct adtfsm_softc { struct device sc_dev; @@ -85,16 +109,22 @@ adtfsm_attach(struct device *parent, struct device *self, void *aux) strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname, sizeof(sc->sc_sensordev.xname)); - for (i = 0; i < 4; i++) + for (i = ADTFSM_TEMP0; i <= ADTFSM_TEMP3; i++) { sc->sc_sensor[i].type = SENSOR_TEMP; + sc->sc_sensor[i].flags |= SENSOR_FINVALID; + } - for (i = 0; i < 1; i++) - strlcpy(sc->sc_sensor[i].desc, "Internal", - sizeof(sc->sc_sensor[i].desc)); + strlcpy(sc->sc_sensor[0].desc, "Internal", + sizeof(sc->sc_sensor[0].desc)); for (i = 1; i < 4; i++) strlcpy(sc->sc_sensor[i].desc, "External", sizeof(sc->sc_sensor[i].desc)); + for (i = ADTFSM_TACH1; i <= ADTFSM_TACH8; i++) { + sc->sc_sensor[i].type = SENSOR_FANRPM; + sc->sc_sensor[i].flags |= SENSOR_FINVALID; + } + if (sensor_task_register(sc, adtfsm_refresh, 5) == NULL) { printf(", unable to register update task\n"); return; @@ -112,14 +142,17 @@ adtfsm_refresh(void *arg) { struct adtfsm_softc *sc = arg; u_int8_t cmdh, cmdl, datah = 0x01, datal = 0x02; + struct ksensor *ks; + u_short ut; short t; int i; iic_acquire_bus(sc->sc_tag, 0); - for (i = 0; i < 4; i++) { - cmdl = ADT7462_INT_TEMPL + i * 2; - cmdh = ADT7462_INT_TEMPH + i * 2; + for (i = 0; i <= ADTFSM_TEMP3 - ADTFSM_TEMP0; i++) { + cmdl = ADT7462_TEMPL + i * 2; + cmdh = ADT7462_TEMPH + i * 2; + ks = &sc->sc_sensor[ADTFSM_TEMP0 + i]; if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr, &cmdl, sizeof cmdl, &datal, sizeof datal, 0) == 0 && @@ -127,11 +160,31 @@ adtfsm_refresh(void *arg) sc->sc_addr, &cmdh, sizeof cmdh, &datah, sizeof datah, 0) == 0) { t = (((datah << 8) | datal) >> 6) - (64 << 2); - sc->sc_sensor[i].value = 273150000 + t * 250000; - sc->sc_sensor[i].flags &= ~SENSOR_FINVALID; + ks->value = 273150000 + t * 250000; + ks->flags &= ~SENSOR_FINVALID; + } else + ks->flags |= SENSOR_FINVALID; + } + + for (i = 0; i <= ADTFSM_TACH8 - ADTFSM_TACH1; i++) { + cmdl = ADT7262_TACH1L + i * 2; + cmdh = ADT7262_TACH1H + i * 2; + ks = &sc->sc_sensor[ADTFSM_TACH1 + i]; + if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, + sc->sc_addr, &cmdl, sizeof cmdl, &datal, + sizeof datal, 0) == 0 && + iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, + sc->sc_addr, &cmdh, sizeof cmdh, &datah, + sizeof datah, 0) == 0) { + ut = ((datah << 8) | datal); + if (ut == 0x0000 || ut == 0xffff) + ks->flags |= SENSOR_FINVALID; + else { + ks->value = 90000 * 60 / ut; + ks->flags &= ~SENSOR_FINVALID; + } } else - sc->sc_sensor[i].flags |= SENSOR_FINVALID; - printf("val %02x %02x\n", datah, datal); + ks->flags |= SENSOR_FINVALID; } iic_release_bus(sc->sc_tag, 0); |