> Date: Tue, 25 Aug 2020 21:19:19 +0200 > From: Paul de Weerd <we...@weirdnet.nl> > > Hi all, > > I've dug out my stash of weird usb devices and found another sensor (a > uthum(4), with only temperature support). I have a few other sensors > in live machines too (acpitz(4), cpu(4), admtemp(4), it(4), maybe some > more) that I could look into. > > Is there any interest in adding support for setting the tv member for > non-time sensitive sensors? Or should I drop this quest?
I don't understand the point. None of the sensor drivers set that member except the timedelta sensors. I don't think adding code to do so to all sensor drivers makes sense. > uhidev6 at uhub3 port 1 configuration 1 interface 0 "Ten X Technology, Inc. > PCsensor Temper" rev 1.10/1.50 addr 10 > uhidev6: iclass 3/1 > uthum0 at uhidev6 > uhidev7 at uhub3 port 1 configuration 1 interface 1 "Ten X Technology, Inc. > PCsensor Temper" rev 1.10/1.50 addr 10 > uhidev7: iclass 3/0 > uthum1 at uhidev7 > uthum1: type ds75/12bit (temperature) > > Paul 'WEiRD' de Weerd > > (following diff has been compile tested only so far) > > Index: uthum.c > =================================================================== > RCS file: /home/OpenBSD/cvs/src/sys/dev/usb/uthum.c,v > retrieving revision 1.34 > diff -u -p -r1.34 uthum.c > --- uthum.c 14 Feb 2020 14:55:30 -0000 1.34 > +++ uthum.c 25 Aug 2020 19:15:45 -0000 > @@ -662,6 +662,7 @@ uthum_refresh_temperhum(struct uthum_sof > sc->sc_sensor[UTHUM_TEMPERHUM_TEMP].sensor.flags &= ~SENSOR_FINVALID; > sc->sc_sensor[UTHUM_TEMPERHUM_HUM].sensor.value = rh; > sc->sc_sensor[UTHUM_TEMPERHUM_HUM].sensor.flags &= ~SENSOR_FINVALID; > + microtime(&sc->sc_sensor[UTHUM_TEMPERHUM_HUM].sensor.tv); > } > > void > @@ -699,6 +700,7 @@ uthum_refresh_temper(struct uthum_softc > > sc->sc_sensor[sensor].sensor.value = (temp * 10000) + 273150000; > sc->sc_sensor[sensor].sensor.flags &= ~SENSOR_FINVALID; > + microtime(&sc->sc_sensor[sensor].sensor.tv); > } > > void > @@ -733,6 +735,7 @@ uthum_refresh_temperntc(struct uthum_sof > temp += sc->sc_sensor[sensor].cal_offset * 10000; > sc->sc_sensor[sensor].sensor.value = temp; > sc->sc_sensor[sensor].sensor.flags &= ~SENSOR_FINVALID; > + microtime(&sc->sc_sensor[sensor].sensor.tv); > } > } > > > On Sat, Aug 15, 2020 at 10:08:56AM +0200, Paul de Weerd wrote: > | Thanks Hiltjo, that made me look at ugold.c. > | > | With the below diff, my simple test program shows a value for the tv > | struct member. > | > | [weerd@pom] $ ./sensor_last_change > | 1597477798.557355: 28.72 > | > | However, given what Hiltjo showed, the tv member seems to only be used > | for time-sensors, so it may be completely on purpose that other > | sensors don't expose this. My rationale for inspecting tv is to > | ensure that I only take 'unique' samples (so when tv of the new sample > | differs from the previous one - while the actual value may remain the > | same). > | > | Is this worth adding? > | > | Cheers, > | > | Paul 'WEiRD' de Weerd > | > | Index: ugold.c > | =================================================================== > | RCS file: /home/OpenBSD/cvs/src/sys/dev/usb/ugold.c,v > | retrieving revision 1.14 > | diff -u -p -r1.14 ugold.c > | --- ugold.c 5 Oct 2017 17:29:00 -0000 1.14 > | +++ ugold.c 15 Aug 2020 07:32:42 -0000 > | @@ -270,11 +270,13 @@ ugold_ds75_intr(struct uhidev *addr, voi > | case 4: > | temp = ugold_ds75_temp(buf[4], buf[5]); > | sc->sc_sensor[UGOLD_OUTER].value = temp; > | + microtime(&sc->sc_sensor[UGOLD_OUTER].tv); > | sc->sc_sensor[UGOLD_OUTER].flags &= ~SENSOR_FINVALID; > | /* FALLTHROUGH */ > | case 2: > | temp = ugold_ds75_temp(buf[2], buf[3]); > | sc->sc_sensor[UGOLD_INNER].value = temp; > | + microtime(&sc->sc_sensor[UGOLD_INNER].tv); > | sc->sc_sensor[UGOLD_INNER].flags &= ~SENSOR_FINVALID; > | break; > | default: > | @@ -394,9 +396,11 @@ ugold_si700x_intr(struct uhidev *addr, v > | sc->sc_hdev.sc_dev.dv_xname, buf[1]); > | temp = ugold_si700x_temp(sc->sc_type, buf[2], buf[3]); > | sc->sc_sensor[UGOLD_INNER].value = (temp * 1000) + 273150000; > | + microtime(&sc->sc_sensor[UGOLD_INNER].tv); > | sc->sc_sensor[UGOLD_INNER].flags &= ~SENSOR_FINVALID; > | rhum = ugold_si700x_rhum(sc->sc_type, buf[4], buf[5], temp); > | sc->sc_sensor[UGOLD_HUM].value = rhum; > | + microtime(&sc->sc_sensor[UGOLD_HUM].tv); > | sc->sc_sensor[UGOLD_HUM].flags &= ~SENSOR_FINVALID; > | break; > | default: > | > | On Fri, Aug 14, 2020 at 02:50:39PM +0200, Hiltjo Posthuma wrote: > | | On Fri, Aug 14, 2020 at 01:46:57PM +0200, Paul de Weerd wrote: > | | > Hi all, > | | > > | | > I'm trying to read temperature sensor values from my ugold(4) device. > | | > Seems to work alright (I get the same temperature reading as sysctl(8) > | | > returns for the sensor), but the 'sensor value last change time' > | | > doesn't seem to be updated. > | | > > | | > [weerd@pom] $ cat sensor_last_change.c > | | > #include <stdio.h> > | | > #include <sys/time.h> > | | > #include <sys/sensors.h> > | | > #include <sys/sysctl.h> > | | > > | | > int > | | > main() > | | > { > | | > int mib[5]; > | | > size_t sensorlen; > | | > struct sensor sensor; > | | > > | | > mib[0] = CTL_HW; > | | > mib[1] = HW_SENSORS; > | | > mib[2] = 3; /* ugold0 on my machine */ > | | > mib[3] = SENSOR_TEMP; > | | > mib[4] = 0; > | | > > | | > sensorlen = sizeof(sensor); > | | > sysctl(mib, 5, &sensor, &sensorlen, NULL, 0); > | | > printf("%lld.%06ld: %.2f\n", > | | > sensor.tv.tv_sec, > | | > sensor.tv.tv_usec, > | | > ((sensor.value-273150000)/1000000.0)); > | | > > | | > return 0; > | | > } > | | > [weerd@pom] $ make sensor_last_change > | | > cc -O2 -pipe -MD -MP -o sensor_last_change sensor_last_change.c > | | > [weerd@pom] $ ./sensor_last_change > | | > 0.000000: 32.32 > | | > [weerd@pom] $ sysctl -n hw.sensors.ugold0.temp0 > | | > 32.32 degC (inner) > | | > > | | > The 'tv' member of struct sensor seems to always be 0.0. Am I doing > | | > something wrong? > | | > > | | > Cluesticks very welcome... > | | > > | | > Thanks, > | | > > | | > Paul > | | > > | | > -- > | | > >++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+ > | | > +++++++++++>-]<.>++[<------------>-]<+.--------------.[-] > | | > http://www.weirdnet.nl/ > | | > > | | > | | Hi, > | | > | | I don't think you're doing anything wrong, but I don't think its > supported by > | | the device and it's simply not set and so stays zero. > | | > | | A quick grep shows some files which do use it: > | | > | | /usr/src/sys $ grep -R sc_sensor\.tv . > | | ./dev/gpio/gpiodcf.c: microtime(&sc->sc_sensor.tv); > | | ./dev/pv/hypervic.c: microtime(&sc->sc_sensor.tv); > | | ./dev/pv/vmt.c: struct timeval *guest = &sc->sc_sensor.tv; > | | ./dev/pv/vmmci.c: struct timeval *guest = > &sc->sc_sensor.tv; > | | ./dev/usb/udcf.c: microtime(&sc->sc_sensor.tv); > | | > | | I have a ugold(4) device and will gladly test any improvements/patches. > | | > | | -- > | | Kind regards, > | | Hiltjo > | > | -- > | >++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+ > | +++++++++++>-]<.>++[<------------>-]<+.--------------.[-] > | http://www.weirdnet.nl/ > | > > -- > >++++++++[<++++++++++>-]<+++++++.>+++[<------>-]<.>+++[<+ > +++++++++++>-]<.>++[<------------>-]<+.--------------.[-] > http://www.weirdnet.nl/ > >