Hello David, On 18/12/14(Thu) 00:45, David Higgs wrote: > While my device does not seem to provide AtRateTimeToFull or > AtRateTimeToEmpty, it does have RunTimeToEmpty. Then I found that > SENSOR_TIMEDELTA values are in nanoseconds and that scaling for them was > never implemented correctly. > > I am confused by the spec [1], though; see 4.2.5 - Battery Measures. The > reported values are supposedly in minutes but hid_info.unit is 0x1001 > (seconds) and observation of RunTimeToEmpty appears to agree. I don’t see > any other drivers in the tree that pay attention to unit or unit_exponent > fields, and don’t want to go down a rabbit hole if there’s no interest. > > As usual, feedback is welcome.
Table 1 of section 3.2.3 indicates that the physical unit for time reports are in seconds. So I guess it is a mistake in the document. I like your diff but I'd prefer to see the scaling done based on the unit rather than the name. Why not adding new defines for the various Physical Unit defined in the table and do the switch on hitem.unit? And what about the exponent? > [1] http://www.usb.org/developers/hidpage/pdcv10.pdf > > --david > > > Index: upd.c > =================================================================== > RCS file: /cvs/src/sys/dev/usb/upd.c,v > retrieving revision 1.12 > diff -u -p -r1.12 upd.c > --- upd.c 11 Dec 2014 18:50:32 -0000 1.12 > +++ upd.c 18 Dec 2014 05:02:30 -0000 > @@ -66,7 +66,11 @@ static struct upd_usage_entry upd_usage_ > { HUP_BATTERY, HUB_AC_PRESENT, > SENSOR_INDICATOR, "ACPresent" }, > { HUP_BATTERY, HUB_ATRATE_TIMETOFULL, > - SENSOR_TIMEDELTA, "AtRateTimeToFull" } > + SENSOR_TIMEDELTA, "AtRateTimeToFull" }, > + { HUP_BATTERY, HUB_ATRATE_TIMETOEMPTY, > + SENSOR_TIMEDELTA, "AtRateTimeToEmpty" }, > + { HUP_BATTERY, HUB_RUNTIMETO_EMPTY, > + SENSOR_TIMEDELTA, "RunTimeToEmpty" }, > }; > > struct upd_report { > @@ -322,9 +326,9 @@ upd_update_sensors(struct upd_softc *sc, > int repid) > { > struct upd_sensor *sensor; > - ulong hdata, batpres; > - ulong adjust; > - int i; > + int64_t adjust; > + ulong batpres; > + int hdata, i; > > sensor = upd_lookup_sensor(sc, HUP_BATTERY, HUB_BATTERY_PRESENT); > batpres = sensor ? sensor->ksensor.value : -1; > @@ -353,6 +357,11 @@ upd_update_sensors(struct upd_softc *sc, > case HUB_FULLCHARGE_CAPACITY: > adjust = 1000; /* scale adjust */ > break; > + case HUB_ATRATE_TIMETOFULL: > + case HUB_ATRATE_TIMETOEMPTY: > + case HUB_RUNTIMETO_EMPTY: > + adjust = 1000000000LL; /* XXX not minutes? */ > + break; > default: > adjust = 1; /* no scale adjust */ > break; > @@ -363,7 +372,7 @@ upd_update_sensors(struct upd_softc *sc, > sensor->ksensor.value = hdata * adjust; > sensor->ksensor.status = SENSOR_S_OK; > sensor->ksensor.flags &= ~SENSOR_FINVALID; > - DPRINTF(("%s: hidget data: %lu\n", > + DPRINTF(("%s: hidget data: %d\n", > sc->sc_sensordev.xname, hdata)); > } > } > >