iio:pressure:bmp280: fix pressure calculation
PATCH 1/3 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.
---
drivers/iio/pressure/bmp280.c +12 -12
@@ -176,15 +176,15 @@ static int bmp280_read_compensation_press(struct bmp280_data *data,return ret; } - comp->dig_p1 = (s16 )le16_to_cpu (buf[0 ]); - comp->dig_p2 = (u16 )le16_to_cpu (buf[1 ]); - comp->dig_p3 = (u16 )le16_to_cpu (buf[2 ]); - comp->dig_p4 = (u16 )le16_to_cpu (buf[3 ]); - comp->dig_p5 = (u16 )le16_to_cpu (buf[4 ]); - comp->dig_p6 = (u16 )le16_to_cpu (buf[5 ]); - comp->dig_p7 = (u16 )le16_to_cpu (buf[6 ]); - comp->dig_p8 = (u16 )le16_to_cpu (buf[7 ]); - comp->dig_p9 = (u16 )le16_to_cpu (buf[8 ]); + comp->dig_p1 = (u16 )le16_to_cpu (buf[0 ]); + comp->dig_p2 = (s16 )le16_to_cpu (buf[1 ]); + comp->dig_p3 = (s16 )le16_to_cpu (buf[2 ]); + comp->dig_p4 = (s16 )le16_to_cpu (buf[3 ]); + comp->dig_p5 = (s16 )le16_to_cpu (buf[4 ]); + comp->dig_p6 = (s16 )le16_to_cpu (buf[5 ]); + comp->dig_p7 = (s16 )le16_to_cpu (buf[6 ]); + comp->dig_p8 = (s16 )le16_to_cpu (buf[7 ]); + comp->dig_p9 = (s16 )le16_to_cpu (buf[8 ]);return 0 ; }
@@ -309,10 +309,10 @@ static int bmp280_read_press(struct bmp280_data *data, adc_press =be32_to_cpu (tmp) >>12 ; comp_press =bmp280_compensate_press (data, &comp, adc_press); - *val = comp_press /256000 ; - *val2 = comp_press *1000000 /256000 ; + *val = comp_press; + *val2 =256000 ; -return IIO_VAL_INT_PLUS_MICRO ; +return IIO_VAL_FRACTIONAL ; } static int bmp280_read_raw(struct iio_dev *indio_dev,
Quoted 9 lines · Hartmut Knaack
According to the datasheet and as defined in struct
bmp280_comp_press,dig_p1is of type u16, whiledig_p2todig_p9are of type s16. Inbmp280_read_compensation_press(), values read from the device were treated as the wrong type.
Inbmp280_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 usingIIO_VAL_FRACTIONAL.Signed-off-by Hartmut Knaack <[email protected]>
Jonathan Cameron
maintainerQuoted 9 lines · Vlad Dogaru
Quoted 8 lines · Hartmut Knaack
According to the datasheet and as defined in struct
bmp280_comp_press,dig_p1is of type u16, whiledig_p2todig_p9are of type s16. Inbmp280_read_compensation_press(), values read from the device were treated as the wrong type.
Inbmp280_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 usingIIO_VAL_FRACTIONAL.
Quoted 3 lines
Quoted 1 line
Signed-off-by Hartmut Knaack <[email protected]>Acked-by Vlad Dogaru <[email protected]>
Applied to the togreg branch of iio.git - initially pushed out as testing for the autobuilders to play.
Thanks,
Jonathan
Quoted 5 lines
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html