Skip to contentSkip to conversation

iio:pressure:bmp280: fix pressure calculation

PATCH In review Hartmut Knaack 3 participants 3 messages Oct 31, 2014 – Nov 5, 2014 IIO

lore
Share & tools
lore
#0 lore raw

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
index ce29ff9..75038da 100644
@@ -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,
Acked-by on v1 1/3
#1 lore raw
Quoted 9 lines · Hartmut Knaack

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.

maintainer
#2 lore raw
Quoted 9 lines · Vlad Dogaru
Quoted 8 lines · Hartmut Knaack

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.

Quoted 3 lines
Quoted 1 line

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