Commit 81ebe850 authored by Hartmut Knaack's avatar Hartmut Knaack Committed by Jonathan Cameron

iio:pressure:bmp280: fix pressure calculation

According to the datasheet and as defined in struct bmp280_comp_press, dig_p1 is
of type u16, while dig_p2 to dig_p9 are of type s16. In
bmp280_read_compensation_press(), values read from the device were treated as
the wrong type.
In bmp280_read_press() the fractional part of the measured pressure is
calculated wrong. A better way is to use *val for the raw pressure and *val2 for
the quotient and let the core do the proper conversion using IIO_VAL_FRACTIONAL.
Signed-off-by: default avatarHartmut Knaack <knaack.h@gmx.de>
Acked-by: default avatarVlad Dogaru <vlad.dogaru@intel.com>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent c1b50156
...@@ -176,15 +176,15 @@ static int bmp280_read_compensation_press(struct bmp280_data *data, ...@@ -176,15 +176,15 @@ static int bmp280_read_compensation_press(struct bmp280_data *data,
return ret; return ret;
} }
comp->dig_p1 = (s16) le16_to_cpu(buf[0]); comp->dig_p1 = (u16) le16_to_cpu(buf[0]);
comp->dig_p2 = (u16) le16_to_cpu(buf[1]); comp->dig_p2 = (s16) le16_to_cpu(buf[1]);
comp->dig_p3 = (u16) le16_to_cpu(buf[2]); comp->dig_p3 = (s16) le16_to_cpu(buf[2]);
comp->dig_p4 = (u16) le16_to_cpu(buf[3]); comp->dig_p4 = (s16) le16_to_cpu(buf[3]);
comp->dig_p5 = (u16) le16_to_cpu(buf[4]); comp->dig_p5 = (s16) le16_to_cpu(buf[4]);
comp->dig_p6 = (u16) le16_to_cpu(buf[5]); comp->dig_p6 = (s16) le16_to_cpu(buf[5]);
comp->dig_p7 = (u16) le16_to_cpu(buf[6]); comp->dig_p7 = (s16) le16_to_cpu(buf[6]);
comp->dig_p8 = (u16) le16_to_cpu(buf[7]); comp->dig_p8 = (s16) le16_to_cpu(buf[7]);
comp->dig_p9 = (u16) le16_to_cpu(buf[8]); comp->dig_p9 = (s16) le16_to_cpu(buf[8]);
return 0; return 0;
} }
...@@ -309,10 +309,10 @@ static int bmp280_read_press(struct bmp280_data *data, ...@@ -309,10 +309,10 @@ static int bmp280_read_press(struct bmp280_data *data,
adc_press = be32_to_cpu(tmp) >> 12; adc_press = be32_to_cpu(tmp) >> 12;
comp_press = bmp280_compensate_press(data, &comp, adc_press); comp_press = bmp280_compensate_press(data, &comp, adc_press);
*val = comp_press / 256000; *val = comp_press;
*val2 = comp_press * 1000000 / 256000; *val2 = 256000;
return IIO_VAL_INT_PLUS_MICRO; return IIO_VAL_FRACTIONAL;
} }
static int bmp280_read_raw(struct iio_dev *indio_dev, static int bmp280_read_raw(struct iio_dev *indio_dev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment