Re: [PATCH] iio: hudmidity: hdc100x: fix incorrect shifting and scaling

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

 



On Sun, May 29, 2016 at 07:53:08PM -0700, Matt Ranostay wrote:
> Alison,
> 
> Can you give a Tested-by:  since I don't own this sensor anymore.
> 
> Thanks,
> 
> Matt

Tested it.  Verified temp & humidty calcs.  Looks great!

And, (seeing a pattern here ;)) this comes with another question,
probably directed a Jonathan...

with regards to temperature calculations:

Datasheets give numbers for this method:
	temp = ((raw * scale) + offset)
IIO drivers report numbers for this method:
	temp = ((raw + offset) * scale)

I've figured out the math for translating between them and creating
the offset for the driver to report in sysfs, but don't know why we
are doing that. 'Our' way seems kind of ugly. For example, for HDC1008
the offset is -40. It's the minimum expected temp value. But, we munge
it to be -15887.515151 so we can apply it before scaling.
		 
Why do we do it this way in IIO?

alisons

> 
> On Sun, May 29, 2016 at 7:52 PM, Matt Ranostay <mranostay@xxxxxxxxx> wrote:
> > Shifting sensor data to the right 2 bits was incorrect and caused the
> > scaling values + offsets to be invalid.
> >
> > Reported-by: Alison Schofield <amsfield22@xxxxxxxxx>
> > Signed-off-by: Matt Ranostay <mranostay@xxxxxxxxx>
> > ---
> >  drivers/iio/humidity/hdc100x.c | 16 ++++++++--------
> >  1 file changed, 8 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/iio/humidity/hdc100x.c b/drivers/iio/humidity/hdc100x.c
> > index 3070983..a03832a 100644
> > --- a/drivers/iio/humidity/hdc100x.c
> > +++ b/drivers/iio/humidity/hdc100x.c
> > @@ -164,14 +164,14 @@ static int hdc100x_get_measurement(struct hdc100x_data *data,
> >                 dev_err(&client->dev, "cannot read high byte measurement");
> >                 return ret;
> >         }
> > -       val = ret << 6;
> > +       val = ret << 8;
> >
> >         ret = i2c_smbus_read_byte(client);
> >         if (ret < 0) {
> >                 dev_err(&client->dev, "cannot read low byte measurement");
> >                 return ret;
> >         }
> > -       val |= ret >> 2;
> > +       val |= ret;
> >
> >         return val;
> >  }
> > @@ -212,17 +212,17 @@ static int hdc100x_read_raw(struct iio_dev *indio_dev,
> >         case IIO_CHAN_INFO_SCALE:
> >                 if (chan->type == IIO_TEMP) {
> >                         *val = 165000;
> > -                       *val2 = 65536 >> 2;
> > +                       *val2 = 65536;
> >                         return IIO_VAL_FRACTIONAL;
> >                 } else {
> > -                       *val = 0;
> > -                       *val2 = 10000;
> > -                       return IIO_VAL_INT_PLUS_MICRO;
> > +                       *val = 100;
> > +                       *val2 = 65536;
> > +                       return IIO_VAL_FRACTIONAL;
> >                 }
> >                 break;
> >         case IIO_CHAN_INFO_OFFSET:
> > -               *val = -3971;
> > -               *val2 = 879096;
> > +               *val = -15887;
> > +               *val2 = 515151;
> >                 return IIO_VAL_INT_PLUS_MICRO;
> >         default:
> >                 return -EINVAL;
> > --
> > 2.7.4
> >
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux