1
0
Fork 0

iio:st_pressure: document sampling gains

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

Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
hifive-unleashed-5.1
Gregor Boirie 2016-06-27 12:38:54 +02:00 committed by Jonathan Cameron
parent c9d5e5b97e
commit 19b7b8a89b
1 changed files with 88 additions and 4 deletions

View File

@ -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,