Re: [PATCH 2/9] iio: Add inverse unit conversion macros

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 05/08/15 14:38, Lars-Peter Clausen wrote:
> Add inverse unit conversion macro to convert from standard IIO units to
> units that might be used by some devices.
> 
> Those are useful in combination with scale factors that are specified as
> IIO_VAL_FRACTIONAL. Typically the denominator for those specifications will
> contain the maximum raw value the sensor will generate and the numerator
> the value it maps to in a specific unit. Sometimes datasheets specify those
> in different units than the standard IIO units (e.g. degree/s instead of
> rad/s) and so we need to do a unit conversion.
> 
> From a mathematical point of view it does not make a difference whether we
> apply the unit conversion to the numerator or the inverse unit conversion
> to the denominator since (x / y) / z = x / (y * z). But as the denominator
> is typically a larger value and we are rounding both the numerator and
> denominator to integer values using the later method gives us a better
> precision (E.g. the relative error is smaller if we round 8000.3 to 8000
> rather than rounding 8.3 to 8).
> 
> This is where in inverse unit conversion macros will be used.
> 
> Signed-off-by: Lars-Peter Clausen <lars@xxxxxxxxxx>
Applied and marked for stable given the next patch.
> ---
>  include/linux/iio/iio.h | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
> 
> diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h
> index f791482..6bcc9537 100644
> --- a/include/linux/iio/iio.h
> +++ b/include/linux/iio/iio.h
> @@ -645,6 +645,15 @@ int iio_str_to_fixpoint(const char *str, int fract_mult, int *integer,
>  #define IIO_DEGREE_TO_RAD(deg) (((deg) * 314159ULL + 9000000ULL) / 18000000ULL)
>  
>  /**
> + * IIO_RAD_TO_DEGREE() - Convert rad to degree
> + * @rad: A value in rad
> + *
> + * Returns the given value converted from rad to degree
> + */
> +#define IIO_RAD_TO_DEGREE(rad) \
> +	(((rad) * 18000000ULL + 314159ULL / 2) / 314159ULL)
> +
> +/**
>   * IIO_G_TO_M_S_2() - Convert g to meter / second**2
>   * @g: A value in g
>   *
> @@ -652,4 +661,12 @@ int iio_str_to_fixpoint(const char *str, int fract_mult, int *integer,
>   */
>  #define IIO_G_TO_M_S_2(g) ((g) * 980665ULL / 100000ULL)
>  
> +/**
> + * IIO_M_S_2_TO_G() - Convert meter / second**2 to g
> + * @ms2: A value in meter / second**2
> + *
> + * Returns the given value converted from meter / second**2 to g
> + */
> +#define IIO_M_S_2_TO_G(ms2) (((ms2) * 100000ULL + 980665ULL / 2) / 980665ULL)
> +
>  #endif /* _INDUSTRIAL_IO_H_ */
> 

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



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux