On 27/06/16 11:38, Gregor Boirie wrote: > Details scaling factors and offsets applied to raw temperature and pressure > samples. > > Signed-off-by: Gregor Boirie <gregor.boirie@xxxxxxxxxx> Applied. > --- > drivers/iio/pressure/st_pressure_core.c | 92 +++++++++++++++++++++++++++++++-- > 1 file changed, 88 insertions(+), 4 deletions(-) > > diff --git a/drivers/iio/pressure/st_pressure_core.c b/drivers/iio/pressure/st_pressure_core.c > index 8fa3d81..2ab1056 100644 > --- a/drivers/iio/pressure/st_pressure_core.c > +++ b/drivers/iio/pressure/st_pressure_core.c > @@ -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, > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html