Skip to contentSkip to conversation

iio: gyro: mpu3050: Fix reported temperature value

PATCH In review Dmitry Osipenko 3 participants 5 messages Apr 23, 2021 – Apr 24, 2021

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 iio: gyro: mpu3050: Fix reported temperature value

The raw temperature value is a 16-bit signed integer. The sign casting is missing in the code, which results in a wrong temperature reported by userspace tools, fix it.

Fixes 3904b28efb2c ("iio: gyro: Add driver for the MPU-3050 gyroscope")

Datasheet: https://www.cdiweb.com/datasheets/invensense/mpu-3000a.pdf

---

v3: - Improved comment in the code, saying that the temperature range
corresponds to the "best fit straight line" range where temperature is reported reliably, i.e. in accordance to the linear equation.

v2: - Replaced "signed 16bit integer" wording with "16-bit signed integer",
replaced "Link" tag with the "Datasheet" and added "Fixes" tag as was suggested by Andy Shevchenko.

- Added r-b from Andy Shevchenko and Linus Walleij.

 drivers/iio/gyro/mpu3050-core.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/iio/gyro/mpu3050-core.c +11 -2
index ac90be03332a..f17a93519535 100644
@@ -272,7 +272,16 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
 	case IIO_CHAN_INFO_OFFSET:
 		switch (chan->type) {
 		case IIO_TEMP:
-			/* The temperature scaling is (x+23000)/280 Celsius */
+			/*
+			 * The temperature scaling is (x+23000)/280 Celsius
+			 * for the "best fit straight line" temperature range
+			 * of -30C..85C.  The 23000 includes room temperature
+			 * offset of +35C, 280 is the precision scale and x is
+			 * the 16-bit signed integer reported by hardware.
+			 *
+			 * Temperature value itself represents temperature of
+			 * the sensor die.
+			 */
 			*val = 23000;
 			return IIO_VAL_INT;
 		default:
@@ -329,7 +338,7 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,
 				goto out_read_raw_unlock;
 			}
 
-			*val = be16_to_cpu(raw_val);
+			*val = (s16)be16_to_cpu(raw_val);
 			ret = IIO_VAL_INT;
 
 			goto out_read_raw_unlock;
Signature · 1 line
2.30.2
Acked-by Tested-by Maxim Schwalm Tested-by Svyatoslav Ryhel Reviewed-by Andy Shevchenko Reviewed-by Linus Walleij on v3 1/1
#1 lore raw

Hello,

thanks for this work.

Temperature value should obviously be 16 bits signed, thanks for the fix. By looking at our internal datasheets, I can confirm the values for MPU-30x0 family (div by 280 and 23000 offset LSB).

I'm sorry I don't have access to these more than 1 decade old chips, so I cannot test on my side. But there is no reason it wouldn't be OK.

Thanks,
JB

From: Dmitry Osipenko <[email protected]>
Sent: Friday, April 23, 2021 04:09
To: Linus Walleij <[email protected]>; Jonathan Cameron <[email protected]>; Lars-Peter Clausen <[email protected]>; Andy Shevchenko <[email protected]>; Maxim Schwalm <[email protected]>; Svyatoslav Ryhel <[email protected]>
Cc: [email protected] <[email protected]>; [email protected] <[email protected]>
Subject: [PATCH v3] iio: gyro: mpu3050: Fix reported temperature value

 CAUTION: This email originated from outside of the organization. Please make sure the sender is who they say they are and do not click links or open attachments unless you recognize the sender and know the content is safe.

The raw temperature value is a 16-bit signed integer. The sign casting is missing in the code, which results in a wrong temperature reported by userspace tools, fix it.

Fixes 3904b28efb2c ("iio: gyro: Add driver for the MPU-3050 gyroscope")

Datasheet: https://urldefense.com/v3/__https://www.cdiweb.com/datasheets/invensense/mpu-3000a.pdf__;!!As-oOPDlYaQ!RejqeP2WMYRtGXwerukURT11pBrLee8OdIBxdEPzcNdqyuOVrDeorUdlv7_pvdRarvk$

---

v3: - Improved comment in the code, saying that the temperature range corresponds to the "best fit straight line" range where temperature is reported reliably, i.e. in accordance to the linear equation.

v2: - Replaced "signed 16bit integer" wording with "16-bit signed integer", replaced "Link" tag with the "Datasheet" and added "Fixes" tag as was suggested by Andy Shevchenko.

    - Added r-b from Andy Shevchenko and Linus Walleij.

 drivers/iio/gyro/mpu3050-core.c | 13 +++++++++++--

 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/iio/gyro/mpu3050-core.c +0 -0
index ac90be03332a..f17a93519535 100644
@@ -272,7 +272,16 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev,

         case IIO_CHAN_INFO_OFFSET:
                 switch (chan->type) {
                 case IIO_TEMP:
-                       /* The temperature scaling is (x+23000)/280 Celsius */ +                       /*
+                        * The temperature scaling is (x+23000)/280 Celsius +                        * for the "best fit straight line" temperature range +                        * of -30C..85C.  The 23000 includes room temperature +                        * offset of +35C, 280 is the precision scale and x is +                        * the 16-bit signed integer reported by hardware. +                        *
+                        * Temperature value itself represents temperature of +                        * the sensor die.
+                        */
                         *val = 23000;
                         return IIO_VAL_INT;
                 default:
@@ -329,7 +338,7 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev, goto out_read_raw_unlock;
                         }

-                       *val = be16_to_cpu(raw_val);
+                       *val = (s16)be16_to_cpu(raw_val);
                         ret = IIO_VAL_INT;

                         goto out_read_raw_unlock;

Signature · 1 line
2.30.2
#2 lore raw

23.04.2021 13:14, Jean-Baptiste Maneyrol пишет:

Quoted 9 lines

Hello,

thanks for this work.

Temperature value should obviously be 16 bits signed, thanks for the fix. By looking at our internal datasheets, I can confirm the values for MPU-30x0 family (div by 280 and 23000 offset LSB).

I'm sorry I don't have access to these more than 1 decade old chips, so I cannot test on my side. But there is no reason it wouldn't be OK.

Thank you very much for confirming that the equation is correct, very appreciate that.

maintainer
#3 lore raw
Quoted 5 lines · On Sat, 24 Apr 2021 07:58:08 +0300 Dmitry Osipenko <[email protected]> wrote:

23.04.2021 13:14, Jean-Baptiste Maneyrol пишет:

Quoted 4 lines

Hello,

thanks for this work.

Quoted 8 lines
Quoted 5 lines

Temperature value should obviously be 16 bits signed, thanks for the fix. By looking at our internal datasheets, I can confirm the values for MPU-30x0 family (div by 280 and 23000 offset LSB).

I'm sorry I don't have access to these more than 1 decade old chips, so I cannot test on my side. But there is no reason it wouldn't be OK.

Thank you very much for confirming that the equation is correct, very appreciate that.

Thanks. Applied to the fixes-togreg branch of iio.git.
Note these won't go upstream until after rc1 but hopefully will soon after that.

Thanks for the detective work etc on this!

Jonathan

#4 lore raw

24.04.2021 13:46, Jonathan Cameron пишет:

Quoted 14 lines
Quoted 11 lines · On Sat, 24 Apr 2021 07:58:08 +0300 Dmitry Osipenko <[email protected]> wrote:

23.04.2021 13:14, Jean-Baptiste Maneyrol пишет:

Quoted 9 lines

Hello,

thanks for this work.

Temperature value should obviously be 16 bits signed, thanks for the fix. By looking at our internal datasheets, I can confirm the values for MPU-30x0 family (div by 280 and 23000 offset LSB).

I'm sorry I don't have access to these more than 1 decade old chips, so I cannot test on my side. But there is no reason it wouldn't be OK.

Quoted 8 lines
Quoted 2 lines

Thank you very much for confirming that the equation is correct, very appreciate that.

Thanks. Applied to the fixes-togreg branch of iio.git.
Note these won't go upstream until after rc1 but hopefully will soon after that.

Thanks for the detective work etc on this!

Thank you.