Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19b7b8a8 authored by Gregor Boirie's avatar Gregor Boirie Committed by Jonathan Cameron
Browse files

iio:st_pressure: document sampling gains



Details scaling factors and offsets applied to raw temperature and pressure
samples.

Signed-off-by: default avatarGregor Boirie <gregor.boirie@parrot.com>
Tested-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent c9d5e5b9
Loading
Loading
Loading
Loading
+88 −4
Original line number Diff line number Diff line
@@ -28,6 +28,72 @@
#include <linux/iio/common/st_sensors.h>
#include "st_pressure.h"

/*
 * About determining pressure scaling factors
 * ------------------------------------------
 *
 * Datasheets specify typical pressure sensitivity so that pressure is computed
 * according to the following equation :
 *     pressure[mBar] = raw / sensitivity
 * where :
 *     raw          the 24 bits long raw sampled pressure
 *     sensitivity  a scaling factor specified by the datasheet in LSB/mBar
 *
 * IIO ABI expects pressure to be expressed as kPascal, hence pressure should be
 * computed according to :
 *     pressure[kPascal] = pressure[mBar] / 10
 *                       = raw / (sensitivity * 10)                          (1)
 *
 * Finally, st_press_read_raw() returns pressure scaling factor as an
 * IIO_VAL_INT_PLUS_NANO with a zero integral part and "gain" as decimal part.
 * Therefore, from (1), "gain" becomes :
 *     gain = 10^9 / (sensitivity * 10)
 *          = 10^8 / sensitivity
 *
 * About determining temperature scaling factors and offsets
 * ---------------------------------------------------------
 *
 * Datasheets specify typical temperature sensitivity and offset so that
 * temperature is computed according to the following equation :
 *     temp[Celsius] = offset[Celsius] + (raw / sensitivity)
 * where :
 *     raw          the 16 bits long raw sampled temperature
 *     offset       a constant specified by the datasheet in degree Celsius
 *                  (sometimes zero)
 *     sensitivity  a scaling factor specified by the datasheet in LSB/Celsius
 *
 * IIO ABI expects temperature to be expressed as milli degree Celsius such as
 * user space should compute temperature according to :
 *     temp[mCelsius] = temp[Celsius] * 10^3
 *                    = (offset[Celsius] + (raw / sensitivity)) * 10^3
 *                    = ((offset[Celsius] * sensitivity) + raw) *
 *                      (10^3 / sensitivity)                                 (2)
 *
 * IIO ABI expects user space to apply offset and scaling factors to raw samples
 * according to :
 *     temp[mCelsius] = (OFFSET + raw) * SCALE
 * where :
 *     OFFSET an arbitrary constant exposed by device
 *     SCALE  an arbitrary scaling factor exposed by device
 *
 * Matching OFFSET and SCALE with members of (2) gives :
 *     OFFSET = offset[Celsius] * sensitivity                                (3)
 *     SCALE  = 10^3 / sensitivity                                           (4)
 *
 * st_press_read_raw() returns temperature scaling factor as an
 * IIO_VAL_FRACTIONAL with a 10^3 numerator and "gain2" as denominator.
 * Therefore, from (3), "gain2" becomes :
 *     gain2 = sensitivity
 *
 * When declared within channel, i.e. for a non zero specified offset,
 * st_press_read_raw() will return the latter as an IIO_VAL_FRACTIONAL such as :
 *     numerator = OFFSET * 10^3
 *     denominator = 10^3
 * giving from (4):
 *     numerator = offset[Celsius] * 10^3 * sensitivity
 *               = offset[mCelsius] * gain2
 */

#define MCELSIUS_PER_CELSIUS			1000

/* Default pressure sensitivity */
@@ -48,7 +114,11 @@
#define ST_PRESS_1_OUT_XL_ADDR			0x28
#define ST_TEMP_1_OUT_L_ADDR			0x2b

/* CUSTOM VALUES FOR LPS331AP SENSOR */
/*
 * CUSTOM VALUES FOR LPS331AP SENSOR
 * See LPS331AP datasheet:
 * http://www2.st.com/resource/en/datasheet/lps331ap.pdf
 */
#define ST_PRESS_LPS331AP_WAI_EXP		0xbb
#define ST_PRESS_LPS331AP_ODR_ADDR		0x20
#define ST_PRESS_LPS331AP_ODR_MASK		0x70
@@ -71,7 +141,9 @@
#define ST_PRESS_LPS331AP_OD_IRQ_MASK		0x40
#define ST_PRESS_LPS331AP_MULTIREAD_BIT		true

/* CUSTOM VALUES FOR LPS001WP SENSOR */
/*
 * CUSTOM VALUES FOR THE OBSOLETE LPS001WP SENSOR
 */

/* LPS001WP pressure resolution */
#define ST_PRESS_LPS001WP_LSB_PER_MBAR		16UL
@@ -94,7 +166,11 @@
#define ST_PRESS_LPS001WP_OUT_L_ADDR		0x28
#define ST_TEMP_LPS001WP_OUT_L_ADDR		0x2a

/* CUSTOM VALUES FOR LPS25H SENSOR */
/*
 * CUSTOM VALUES FOR LPS25H SENSOR
 * See LPS25H datasheet:
 * http://www2.st.com/resource/en/datasheet/lps25h.pdf
 */
#define ST_PRESS_LPS25H_WAI_EXP			0xbd
#define ST_PRESS_LPS25H_ODR_ADDR		0x20
#define ST_PRESS_LPS25H_ODR_MASK		0x70
@@ -117,7 +193,11 @@
#define ST_PRESS_LPS25H_OUT_XL_ADDR		0x28
#define ST_TEMP_LPS25H_OUT_L_ADDR		0x2b

/* CUSTOM VALUES FOR LPS22HB SENSOR */
/*
 * CUSTOM VALUES FOR LPS22HB SENSOR
 * See LPS22HB datasheet:
 * http://www2.st.com/resource/en/datasheet/lps22hb.pdf
 */
#define ST_PRESS_LPS22HB_WAI_EXP		0xb1
#define ST_PRESS_LPS22HB_ODR_ADDR		0x10
#define ST_PRESS_LPS22HB_ODR_MASK		0x70
@@ -413,6 +493,10 @@ static const struct st_sensor_settings st_press_sensors_settings[] = {
		},
		.fs = {
			.fs_avl = {
				/*
				 * Sensitivity values as defined in table 3 of
				 * LPS22HB datasheet.
				 */
				[0] = {
					.num = ST_PRESS_FS_AVL_1260MB,
					.gain = ST_PRESS_KPASCAL_NANO_SCALE,