2023-07-12 07:59:33

by Ramona Bolboaca

[permalink] [raw]
Subject: [PATCH 0/1] Add new channels for adis16475

Add delta angle and delta velocity channels to adis16475 driver.
All supported devices offer the capabilities to read this data
by performing raw register reads.

Ramona Bolboaca (1):
iio: imu: adis16475.c: Add delta angle and delta velocity channels

drivers/iio/imu/adis16475.c | 88 +++++++++++++++++++++++++++++++++++++
1 file changed, 88 insertions(+)

--
2.25.1



2023-07-12 08:01:15

by Ramona Bolboaca

[permalink] [raw]
Subject: [PATCH 1/1] iio: imu: adis16475.c: Add delta angle and delta velocity channels

Add delta angle and delta velocity channels to adis16475 driver.
All supported devices offer the capabilities to read this data
by performing raw register reads.

Signed-off-by: Ramona Bolboaca <[email protected]>
---
drivers/iio/imu/adis16475.c | 88 +++++++++++++++++++++++++++++++++++++
1 file changed, 88 insertions(+)

diff --git a/drivers/iio/imu/adis16475.c b/drivers/iio/imu/adis16475.c
index 3abffb01ba31..84bee9e155bd 100644
--- a/drivers/iio/imu/adis16475.c
+++ b/drivers/iio/imu/adis16475.c
@@ -31,6 +31,12 @@
#define ADIS16475_REG_Y_ACCEL_L 0x14
#define ADIS16475_REG_Z_ACCEL_L 0x18
#define ADIS16475_REG_TEMP_OUT 0x1c
+#define ADIS16475_REG_X_DELTANG_L 0x24
+#define ADIS16475_REG_Y_DELTANG_L 0x28
+#define ADIS16475_REG_Z_DELTANG_L 0x2C
+#define ADIS16475_REG_X_DELTVEL_L 0x30
+#define ADIS16475_REG_Y_DELTVEL_L 0x34
+#define ADIS16475_REG_Z_DELTVEL_L 0x38
#define ADIS16475_REG_X_GYRO_BIAS_L 0x40
#define ADIS16475_REG_Y_GYRO_BIAS_L 0x44
#define ADIS16475_REG_Z_GYRO_BIAS_L 0x48
@@ -90,6 +96,8 @@ struct adis16475_chip_info {
u32 accel_max_val;
u32 accel_max_scale;
u32 temp_scale;
+ u32 deltang_max_val;
+ u32 deltvel_max_val;
u32 int_clk;
u16 max_dec;
u8 num_sync;
@@ -453,6 +461,14 @@ static int adis16475_read_raw(struct iio_dev *indio_dev,
case IIO_TEMP:
*val = st->info->temp_scale;
return IIO_VAL_INT;
+ case IIO_ROT:
+ *val = st->info->deltang_max_val;
+ *val2 = 31;
+ return IIO_VAL_FRACTIONAL_LOG2;
+ case IIO_VELOCITY:
+ *val = st->info->deltvel_max_val;
+ *val2 = 31;
+ return IIO_VAL_FRACTIONAL_LOG2;
default:
return -EINVAL;
}
@@ -553,6 +569,32 @@ static int adis16475_write_raw(struct iio_dev *indio_dev,
}, \
}

+#define ADIS16475_MOD_CHAN_DELTA(_type, _mod, _address, _r_bits, _s_bits) { \
+ .type = (_type), \
+ .modified = 1, \
+ .channel2 = (_mod), \
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
+ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
+ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
+ BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
+ .address = (_address), \
+ .scan_index = -1, \
+ .scan_type = { \
+ .sign = 's', \
+ .realbits = (_r_bits), \
+ .storagebits = (_s_bits), \
+ .endianness = IIO_BE, \
+ }, \
+ }
+
+#define ADIS16475_DELTANG_CHAN(_mod) \
+ ADIS16475_MOD_CHAN_DELTA(IIO_ROT, IIO_MOD_ ## _mod, \
+ ADIS16475_REG_ ## _mod ## _DELTANG_L, 32, 32)
+
+#define ADIS16475_DELTVEL_CHAN(_mod) \
+ ADIS16475_MOD_CHAN_DELTA(IIO_VELOCITY, IIO_MOD_ ## _mod, \
+ ADIS16475_REG_ ## _mod ## _DELTVEL_L, 32, 32)
+
static const struct iio_chan_spec adis16475_channels[] = {
ADIS16475_GYRO_CHANNEL(X),
ADIS16475_GYRO_CHANNEL(Y),
@@ -561,6 +603,12 @@ static const struct iio_chan_spec adis16475_channels[] = {
ADIS16475_ACCEL_CHANNEL(Y),
ADIS16475_ACCEL_CHANNEL(Z),
ADIS16475_TEMP_CHANNEL(),
+ ADIS16475_DELTANG_CHAN(X),
+ ADIS16475_DELTANG_CHAN(Y),
+ ADIS16475_DELTANG_CHAN(Z),
+ ADIS16475_DELTVEL_CHAN(X),
+ ADIS16475_DELTVEL_CHAN(Y),
+ ADIS16475_DELTVEL_CHAN(Z),
IIO_CHAN_SOFT_TIMESTAMP(7)
};

@@ -664,6 +712,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
.temp_scale = 100,
+ .deltang_max_val = 2160,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -679,6 +729,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
.temp_scale = 100,
+ .deltang_max_val = 360,
+ .deltvel_max_val = 100,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -694,6 +746,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
.temp_scale = 100,
+ .deltang_max_val = 720,
+ .deltvel_max_val = 100,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -709,6 +763,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
.temp_scale = 100,
+ .deltang_max_val = 2160,
+ .deltvel_max_val = 100,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -724,6 +780,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
.temp_scale = 100,
+ .deltang_max_val = 360,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -739,6 +797,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
.temp_scale = 100,
+ .deltang_max_val = 720,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -754,6 +814,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
.temp_scale = 100,
+ .deltang_max_val = 2160,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -769,6 +831,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
.temp_scale = 100,
+ .deltang_max_val = 360,
+ .deltvel_max_val = 100,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -784,6 +848,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
.temp_scale = 100,
+ .deltang_max_val = 720,
+ .deltvel_max_val = 100,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -799,6 +865,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
.temp_scale = 100,
+ .deltang_max_val = 2160,
+ .deltvel_max_val = 100,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -814,6 +882,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
.temp_scale = 100,
+ .deltang_max_val = 360,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -829,6 +899,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
.temp_scale = 100,
+ .deltang_max_val = 720,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -844,6 +916,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 1,
.accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
.temp_scale = 100,
+ .deltang_max_val = 2160,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -859,6 +933,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 392,
.accel_max_scale = 32000 << 16,
.temp_scale = 100,
+ .deltang_max_val = 2160,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -876,6 +952,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 78,
.accel_max_scale = 32000 << 16,
.temp_scale = 100,
+ .deltang_max_val = 360,
+ .deltvel_max_val = 100,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -893,6 +971,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 78,
.accel_max_scale = 32000 << 16,
.temp_scale = 100,
+ .deltang_max_val = 720,
+ .deltvel_max_val = 100,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -910,6 +990,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 78,
.accel_max_scale = 32000 << 16,
.temp_scale = 100,
+ .deltang_max_val = 2160,
+ .deltvel_max_val = 100,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -927,6 +1009,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 392,
.accel_max_scale = 32000 << 16,
.temp_scale = 100,
+ .deltang_max_val = 360,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -944,6 +1028,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 392,
.accel_max_scale = 32000 << 16,
.temp_scale = 100,
+ .deltang_max_val = 720,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
@@ -961,6 +1047,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] = {
.accel_max_val = 392,
.accel_max_scale = 32000 << 16,
.temp_scale = 100,
+ .deltang_max_val = 2160,
+ .deltvel_max_val = 400,
.int_clk = 2000,
.max_dec = 1999,
.sync = adis16475_sync_mode,
--
2.25.1


2023-07-13 07:23:07

by Nuno Sá

[permalink] [raw]
Subject: Re: [PATCH 1/1] iio: imu: adis16475.c: Add delta angle and delta velocity channels

On Wed, 2023-07-12 at 10:50 +0300, Ramona Bolboaca wrote:
> Add delta angle and delta velocity channels to adis16475 driver.
> All supported devices offer the capabilities to read this data
> by performing raw register reads.
>
> Signed-off-by: Ramona Bolboaca <[email protected]>
> ---

To note that for some devices (like adis1505) these channels can also be buffered
(not together with normal accel and gyro data) so we should support it as we have
everything needed. I honestly think it should be done right now but it would be a
more complex change, yes. Anyways, I don't feel too strong about it, so:

Reviewed-by: Nuno Sa <[email protected]>

(ABI related, we're also not completely sure IIO_ROT is a perfect fit but hopefully
good enough).

>  drivers/iio/imu/adis16475.c | 88 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 88 insertions(+)
>
> diff --git a/drivers/iio/imu/adis16475.c b/drivers/iio/imu/adis16475.c
> index 3abffb01ba31..84bee9e155bd 100644
> --- a/drivers/iio/imu/adis16475.c
> +++ b/drivers/iio/imu/adis16475.c
> @@ -31,6 +31,12 @@
>  #define ADIS16475_REG_Y_ACCEL_L                0x14
>  #define ADIS16475_REG_Z_ACCEL_L                0x18
>  #define ADIS16475_REG_TEMP_OUT         0x1c
> +#define ADIS16475_REG_X_DELTANG_L      0x24
> +#define ADIS16475_REG_Y_DELTANG_L      0x28
> +#define ADIS16475_REG_Z_DELTANG_L      0x2C
> +#define ADIS16475_REG_X_DELTVEL_L      0x30
> +#define ADIS16475_REG_Y_DELTVEL_L      0x34
> +#define ADIS16475_REG_Z_DELTVEL_L      0x38
>  #define ADIS16475_REG_X_GYRO_BIAS_L    0x40
>  #define ADIS16475_REG_Y_GYRO_BIAS_L    0x44
>  #define ADIS16475_REG_Z_GYRO_BIAS_L    0x48
> @@ -90,6 +96,8 @@ struct adis16475_chip_info {
>         u32 accel_max_val;
>         u32 accel_max_scale;
>         u32 temp_scale;
> +       u32 deltang_max_val;
> +       u32 deltvel_max_val;
>         u32 int_clk;
>         u16 max_dec;
>         u8 num_sync;
> @@ -453,6 +461,14 @@ static int adis16475_read_raw(struct iio_dev *indio_dev,
>                 case IIO_TEMP:
>                         *val = st->info->temp_scale;
>                         return IIO_VAL_INT;
> +               case IIO_ROT:
> +                       *val = st->info->deltang_max_val;
> +                       *val2 = 31;
> +                       return IIO_VAL_FRACTIONAL_LOG2;
> +               case IIO_VELOCITY:
> +                       *val = st->info->deltvel_max_val;
> +                       *val2 = 31;
> +                       return IIO_VAL_FRACTIONAL_LOG2;
>                 default:
>                         return -EINVAL;
>                 }
> @@ -553,6 +569,32 @@ static int adis16475_write_raw(struct iio_dev *indio_dev,
>                 }, \
>         }
>  
> +#define ADIS16475_MOD_CHAN_DELTA(_type, _mod, _address, _r_bits, _s_bits) { \
> +               .type = (_type), \
> +               .modified = 1, \
> +               .channel2 = (_mod), \
> +               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
> +               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
> +               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
> +                       BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
> +               .address = (_address), \
> +               .scan_index = -1, \
> +               .scan_type = { \
> +                       .sign = 's', \
> +                       .realbits = (_r_bits), \
> +                       .storagebits = (_s_bits), \
> +                       .endianness = IIO_BE, \
> +               }, \
> +       }
> +
> +#define ADIS16475_DELTANG_CHAN(_mod) \
> +       ADIS16475_MOD_CHAN_DELTA(IIO_ROT, IIO_MOD_ ## _mod, \
> +                          ADIS16475_REG_ ## _mod ## _DELTANG_L, 32, 32)
> +
> +#define ADIS16475_DELTVEL_CHAN(_mod) \
> +       ADIS16475_MOD_CHAN_DELTA(IIO_VELOCITY, IIO_MOD_ ## _mod, \
> +                          ADIS16475_REG_ ## _mod ## _DELTVEL_L, 32, 32)
> +
>  static const struct iio_chan_spec adis16475_channels[] = {
>         ADIS16475_GYRO_CHANNEL(X),
>         ADIS16475_GYRO_CHANNEL(Y),
> @@ -561,6 +603,12 @@ static const struct iio_chan_spec adis16475_channels[] = {
>         ADIS16475_ACCEL_CHANNEL(Y),
>         ADIS16475_ACCEL_CHANNEL(Z),
>         ADIS16475_TEMP_CHANNEL(),
> +       ADIS16475_DELTANG_CHAN(X),
> +       ADIS16475_DELTANG_CHAN(Y),
> +       ADIS16475_DELTANG_CHAN(Z),
> +       ADIS16475_DELTVEL_CHAN(X),
> +       ADIS16475_DELTVEL_CHAN(Y),
> +       ADIS16475_DELTVEL_CHAN(Z),
>         IIO_CHAN_SOFT_TIMESTAMP(7)
>  };
>  
> @@ -664,6 +712,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 2160,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -679,6 +729,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 360,
> +               .deltvel_max_val = 100,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -694,6 +746,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 720,
> +               .deltvel_max_val = 100,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -709,6 +763,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 2160,
> +               .deltvel_max_val = 100,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -724,6 +780,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 360,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -739,6 +797,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 720,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -754,6 +814,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 2160,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -769,6 +831,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 360,
> +               .deltvel_max_val = 100,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -784,6 +848,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 720,
> +               .deltvel_max_val = 100,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -799,6 +865,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 2160,
> +               .deltvel_max_val = 100,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -814,6 +882,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 360,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -829,6 +899,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 720,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -844,6 +916,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 1,
>                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
>                 .temp_scale = 100,
> +               .deltang_max_val = 2160,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -859,6 +933,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 392,
>                 .accel_max_scale = 32000 << 16,
>                 .temp_scale = 100,
> +               .deltang_max_val = 2160,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -876,6 +952,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 78,
>                 .accel_max_scale = 32000 << 16,
>                 .temp_scale = 100,
> +               .deltang_max_val = 360,
> +               .deltvel_max_val = 100,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -893,6 +971,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 78,
>                 .accel_max_scale = 32000 << 16,
>                 .temp_scale = 100,
> +               .deltang_max_val = 720,
> +               .deltvel_max_val = 100,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -910,6 +990,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> {
>                 .accel_max_val = 78,
>                 .accel_max_scale = 32000 << 16,
>                 .temp_scale = 100,
> +               .deltang_max_val = 2160,
> +               .deltvel_max_val = 100,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -927,6 +1009,8 @@ static const struct adis16475_chip_info adis16475_chip_info[]
> = {
>                 .accel_max_val = 392,
>                 .accel_max_scale = 32000 << 16,
>                 .temp_scale = 100,
> +               .deltang_max_val = 360,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -944,6 +1028,8 @@ static const struct adis16475_chip_info adis16475_chip_info[]
> = {
>                 .accel_max_val = 392,
>                 .accel_max_scale = 32000 << 16,
>                 .temp_scale = 100,
> +               .deltang_max_val = 720,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,
> @@ -961,6 +1047,8 @@ static const struct adis16475_chip_info adis16475_chip_info[]
> = {
>                 .accel_max_val = 392,
>                 .accel_max_scale = 32000 << 16,
>                 .temp_scale = 100,
> +               .deltang_max_val = 2160,
> +               .deltvel_max_val = 400,
>                 .int_clk = 2000,
>                 .max_dec = 1999,
>                 .sync = adis16475_sync_mode,

2023-07-16 14:12:46

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH 1/1] iio: imu: adis16475.c: Add delta angle and delta velocity channels

On Thu, 13 Jul 2023 08:57:34 +0200
Nuno Sá <[email protected]> wrote:

> On Wed, 2023-07-12 at 10:50 +0300, Ramona Bolboaca wrote:
> > Add delta angle and delta velocity channels to adis16475 driver.
> > All supported devices offer the capabilities to read this data
> > by performing raw register reads.
> >
> > Signed-off-by: Ramona Bolboaca <[email protected]>
> > ---
>
> To note that for some devices (like adis1505) these channels can also be buffered
> (not together with normal accel and gyro data) so we should support it as we have
> everything needed. I honestly think it should be done right now but it would be a
> more complex change, yes. Anyways, I don't feel too strong about it, so:

Sounds like multiple buffer support needed etc, so definitely a bigger change.

>
> Reviewed-by: Nuno Sa <[email protected]>
>
> (ABI related, we're also not completely sure IIO_ROT is a perfect fit but hopefully
> good enough).

That's a good point. ROT is used in two ways previously:
1) Rotation from magnetic / true north
2) Quaternion absolute rotation.

A delta value like this isn't even close to the same. In fact, given I assume
this operates when the device is self clocking, they seem to be rotation in
a fixed time - (so in units, scaled version of radians per second - where scale
involves the sampling period).
That unit set is same as anglvel which we already have from the gyroscope
(though as an instantaneous measurement)

I guess the intent here is that a driver would probably 'sum' the values from
each sample from the fifo to establish what we'd expect from IIO_ROT channels
(rotation wrt some fixed location) We could do that - but then you'd need
to support the buffer. That raises the question - is this useful without
buffered support? Is it helpful to know a single reading from this?

In their raw form I'm not sure what is a good way to represent these. They
aren't IIO_ROT and they aren't IIO_ANG_VEL.

Much as I don't like adding them with out good reason I think we may need a new
channel type for this.

Same applies to delta velocity.


>
> >  drivers/iio/imu/adis16475.c | 88 +++++++++++++++++++++++++++++++++++++
> >  1 file changed, 88 insertions(+)
> >
> > diff --git a/drivers/iio/imu/adis16475.c b/drivers/iio/imu/adis16475.c
> > index 3abffb01ba31..84bee9e155bd 100644
> > --- a/drivers/iio/imu/adis16475.c
> > +++ b/drivers/iio/imu/adis16475.c
> > @@ -31,6 +31,12 @@
> >  #define ADIS16475_REG_Y_ACCEL_L                0x14
> >  #define ADIS16475_REG_Z_ACCEL_L                0x18
> >  #define ADIS16475_REG_TEMP_OUT         0x1c
> > +#define ADIS16475_REG_X_DELTANG_L      0x24
> > +#define ADIS16475_REG_Y_DELTANG_L      0x28
> > +#define ADIS16475_REG_Z_DELTANG_L      0x2C
> > +#define ADIS16475_REG_X_DELTVEL_L      0x30
> > +#define ADIS16475_REG_Y_DELTVEL_L      0x34
> > +#define ADIS16475_REG_Z_DELTVEL_L      0x38
> >  #define ADIS16475_REG_X_GYRO_BIAS_L    0x40
> >  #define ADIS16475_REG_Y_GYRO_BIAS_L    0x44
> >  #define ADIS16475_REG_Z_GYRO_BIAS_L    0x48
> > @@ -90,6 +96,8 @@ struct adis16475_chip_info {
> >         u32 accel_max_val;
> >         u32 accel_max_scale;
> >         u32 temp_scale;
> > +       u32 deltang_max_val;
> > +       u32 deltvel_max_val;
> >         u32 int_clk;
> >         u16 max_dec;
> >         u8 num_sync;
> > @@ -453,6 +461,14 @@ static int adis16475_read_raw(struct iio_dev *indio_dev,
> >                 case IIO_TEMP:
> >                         *val = st->info->temp_scale;
> >                         return IIO_VAL_INT;
> > +               case IIO_ROT:
> > +                       *val = st->info->deltang_max_val;
> > +                       *val2 = 31;
> > +                       return IIO_VAL_FRACTIONAL_LOG2;
> > +               case IIO_VELOCITY:
> > +                       *val = st->info->deltvel_max_val;
> > +                       *val2 = 31;
> > +                       return IIO_VAL_FRACTIONAL_LOG2;
> >                 default:
> >                         return -EINVAL;
> >                 }
> > @@ -553,6 +569,32 @@ static int adis16475_write_raw(struct iio_dev *indio_dev,
> >                 }, \
> >         }
> >  
> > +#define ADIS16475_MOD_CHAN_DELTA(_type, _mod, _address, _r_bits, _s_bits) { \
> > +               .type = (_type), \
> > +               .modified = 1, \
> > +               .channel2 = (_mod), \
> > +               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
> > +               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
> > +               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
> > +                       BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
> > +               .address = (_address), \
> > +               .scan_index = -1, \
> > +               .scan_type = { \
> > +                       .sign = 's', \
> > +                       .realbits = (_r_bits), \
> > +                       .storagebits = (_s_bits), \
> > +                       .endianness = IIO_BE, \
> > +               }, \
> > +       }
> > +
> > +#define ADIS16475_DELTANG_CHAN(_mod) \
> > +       ADIS16475_MOD_CHAN_DELTA(IIO_ROT, IIO_MOD_ ## _mod, \
> > +                          ADIS16475_REG_ ## _mod ## _DELTANG_L, 32, 32)
> > +
> > +#define ADIS16475_DELTVEL_CHAN(_mod) \
> > +       ADIS16475_MOD_CHAN_DELTA(IIO_VELOCITY, IIO_MOD_ ## _mod, \
> > +                          ADIS16475_REG_ ## _mod ## _DELTVEL_L, 32, 32)
> > +
> >  static const struct iio_chan_spec adis16475_channels[] = {
> >         ADIS16475_GYRO_CHANNEL(X),
> >         ADIS16475_GYRO_CHANNEL(Y),
> > @@ -561,6 +603,12 @@ static const struct iio_chan_spec adis16475_channels[] = {
> >         ADIS16475_ACCEL_CHANNEL(Y),
> >         ADIS16475_ACCEL_CHANNEL(Z),
> >         ADIS16475_TEMP_CHANNEL(),
> > +       ADIS16475_DELTANG_CHAN(X),
> > +       ADIS16475_DELTANG_CHAN(Y),
> > +       ADIS16475_DELTANG_CHAN(Z),
> > +       ADIS16475_DELTVEL_CHAN(X),
> > +       ADIS16475_DELTVEL_CHAN(Y),
> > +       ADIS16475_DELTVEL_CHAN(Z),
> >         IIO_CHAN_SOFT_TIMESTAMP(7)
> >  };
> >  
> > @@ -664,6 +712,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 2160,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -679,6 +729,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 360,
> > +               .deltvel_max_val = 100,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -694,6 +746,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 720,
> > +               .deltvel_max_val = 100,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -709,6 +763,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 2160,
> > +               .deltvel_max_val = 100,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -724,6 +780,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 360,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -739,6 +797,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 720,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -754,6 +814,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 2160,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -769,6 +831,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 360,
> > +               .deltvel_max_val = 100,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -784,6 +848,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 720,
> > +               .deltvel_max_val = 100,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -799,6 +865,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 2160,
> > +               .deltvel_max_val = 100,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -814,6 +882,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 360,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -829,6 +899,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 720,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -844,6 +916,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 1,
> >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 2160,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -859,6 +933,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 392,
> >                 .accel_max_scale = 32000 << 16,
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 2160,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -876,6 +952,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 78,
> >                 .accel_max_scale = 32000 << 16,
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 360,
> > +               .deltvel_max_val = 100,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -893,6 +971,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 78,
> >                 .accel_max_scale = 32000 << 16,
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 720,
> > +               .deltvel_max_val = 100,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -910,6 +990,8 @@ static const struct adis16475_chip_info adis16475_chip_info[] =
> > {
> >                 .accel_max_val = 78,
> >                 .accel_max_scale = 32000 << 16,
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 2160,
> > +               .deltvel_max_val = 100,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -927,6 +1009,8 @@ static const struct adis16475_chip_info adis16475_chip_info[]
> > = {
> >                 .accel_max_val = 392,
> >                 .accel_max_scale = 32000 << 16,
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 360,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -944,6 +1028,8 @@ static const struct adis16475_chip_info adis16475_chip_info[]
> > = {
> >                 .accel_max_val = 392,
> >                 .accel_max_scale = 32000 << 16,
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 720,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
> > @@ -961,6 +1047,8 @@ static const struct adis16475_chip_info adis16475_chip_info[]
> > = {
> >                 .accel_max_val = 392,
> >                 .accel_max_scale = 32000 << 16,
> >                 .temp_scale = 100,
> > +               .deltang_max_val = 2160,
> > +               .deltvel_max_val = 400,
> >                 .int_clk = 2000,
> >                 .max_dec = 1999,
> >                 .sync = adis16475_sync_mode,
>


2023-07-17 07:46:27

by Nuno Sá

[permalink] [raw]
Subject: Re: [PATCH 1/1] iio: imu: adis16475.c: Add delta angle and delta velocity channels

Hi Jonathan,

On Sun, 2023-07-16 at 15:04 +0100, Jonathan Cameron wrote:
> On Thu, 13 Jul 2023 08:57:34 +0200
> Nuno Sá <[email protected]> wrote:
>
> > On Wed, 2023-07-12 at 10:50 +0300, Ramona Bolboaca wrote:
> > > Add delta angle and delta velocity channels to adis16475 driver.
> > > All supported devices offer the capabilities to read this data
> > > by performing raw register reads.
> > >
> > > Signed-off-by: Ramona Bolboaca <[email protected]>
> > > --- 
> >
> > To note that for some devices (like adis1505) these channels can also be buffered
> > (not together with normal accel and gyro data) so we should support it as we have
> > everything needed. I honestly think it should be done right now but it would be a
> > more complex change, yes. Anyways, I don't feel too strong about it, so:
>
> Sounds like multiple buffer support needed etc, so definitely a bigger change.
>
> >
> > Reviewed-by: Nuno Sa <[email protected]>
> >
> > (ABI related, we're also not completely sure IIO_ROT is a perfect fit but
> > hopefully
> > good enough).
>
> That's a good point.  ROT is used in two ways previously:
> 1) Rotation from magnetic / true north
> 2) Quaternion absolute rotation.
>
> A delta value like this isn't even close to the same.  In fact, given I assume
> this operates when the device is self clocking, they seem to be rotation in
> a fixed time - (so in units, scaled version of radians per second - where scale
> involves the sampling period).
> That unit set is same as anglvel which we already have from the gyroscope
> (though as an instantaneous measurement)
>

I think we really get angles in these channels..

> I guess the intent here is that a driver would probably 'sum' the values from
> each sample from the fifo to establish what we'd expect from IIO_ROT channels
> (rotation wrt some fixed location)  We could do that - but then you'd need

These looks like the roll, pitch, yaw modifiers (see below).

> to support the buffer.   That raises the question - is this useful without
> buffered support?  Is it helpful to know a single reading from this?
>
> In their raw form I'm not sure what is a good way to represent these.  They
> aren't IIO_ROT and they aren't IIO_ANG_VEL.
>
> Much as I don't like adding them with out good reason I think we may need a new
> channel type for this.
>
> Same applies to delta velocity.
>
>

Hmm, at least this one I though it was a good fit. From the datasheet:

"The delta velocity outputs represent an integration of the
acceleration measurements and use the following formula for
all three axes (x-axis displayed):"

So this reads velocity (at least from a math point of view :)) and the units are
indeed in m/s.

For the gyroscope data, it's the same but I'm not sure if the integration of the data
directly fits in IIO_ROT (even though we are getting angles). From quickly googling
it, things like roll, pitch, yaw started to pop up (and we do have those modifiers
for IIO_ROT in the ABI). But from [1] (which is actually and ADI support forum :)),
it seems those refer to accumulating these samples (as you mentioned) which I guess
it would be up to the application to deal with... So even though
in_rot_{yaw|pitch|roll}_raw seems it could fit I'm not so sure since we are not
really doing any accumulation (unless adding buffer support implies it)?

We also have in in_angl_raw (IIO_ANGL):

"Angle of rotation. Units after application of scale and offset are radians."

Would this fit? We would need to extend the ABI to document the x,y,z modifiers...

Anyways, these were just my 5 cents and 5min googling is far from being accurate :).

[1]: https://ez.analog.com/mems/f/q-a/90988/adis16488bmlz-what-is-the-delta-angles

- Nuno Sá

> >
> > >  drivers/iio/imu/adis16475.c | 88 +++++++++++++++++++++++++++++++++++++
> > >  1 file changed, 88 insertions(+)
> > >
> > > diff --git a/drivers/iio/imu/adis16475.c b/drivers/iio/imu/adis16475.c
> > > index 3abffb01ba31..84bee9e155bd 100644
> > > --- a/drivers/iio/imu/adis16475.c
> > > +++ b/drivers/iio/imu/adis16475.c
> > > @@ -31,6 +31,12 @@
> > >  #define ADIS16475_REG_Y_ACCEL_L                0x14
> > >  #define ADIS16475_REG_Z_ACCEL_L                0x18
> > >  #define ADIS16475_REG_TEMP_OUT         0x1c
> > > +#define ADIS16475_REG_X_DELTANG_L      0x24
> > > +#define ADIS16475_REG_Y_DELTANG_L      0x28
> > > +#define ADIS16475_REG_Z_DELTANG_L      0x2C
> > > +#define ADIS16475_REG_X_DELTVEL_L      0x30
> > > +#define ADIS16475_REG_Y_DELTVEL_L      0x34
> > > +#define ADIS16475_REG_Z_DELTVEL_L      0x38
> > >  #define ADIS16475_REG_X_GYRO_BIAS_L    0x40
> > >  #define ADIS16475_REG_Y_GYRO_BIAS_L    0x44
> > >  #define ADIS16475_REG_Z_GYRO_BIAS_L    0x48
> > > @@ -90,6 +96,8 @@ struct adis16475_chip_info {
> > >         u32 accel_max_val;
> > >         u32 accel_max_scale;
> > >         u32 temp_scale;
> > > +       u32 deltang_max_val;
> > > +       u32 deltvel_max_val;
> > >         u32 int_clk;
> > >         u16 max_dec;
> > >         u8 num_sync;
> > > @@ -453,6 +461,14 @@ static int adis16475_read_raw(struct iio_dev *indio_dev,
> > >                 case IIO_TEMP:
> > >                         *val = st->info->temp_scale;
> > >                         return IIO_VAL_INT;
> > > +               case IIO_ROT:
> > > +                       *val = st->info->deltang_max_val;
> > > +                       *val2 = 31;
> > > +                       return IIO_VAL_FRACTIONAL_LOG2;
> > > +               case IIO_VELOCITY:
> > > +                       *val = st->info->deltvel_max_val;
> > > +                       *val2 = 31;
> > > +                       return IIO_VAL_FRACTIONAL_LOG2;
> > >                 default:
> > >                         return -EINVAL;
> > >                 }
> > > @@ -553,6 +569,32 @@ static int adis16475_write_raw(struct iio_dev *indio_dev,
> > >                 }, \
> > >         }
> > >  
> > > +#define ADIS16475_MOD_CHAN_DELTA(_type, _mod, _address, _r_bits, _s_bits) { \
> > > +               .type = (_type), \
> > > +               .modified = 1, \
> > > +               .channel2 = (_mod), \
> > > +               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
> > > +               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
> > > +               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
> > > +                       BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
> > > +               .address = (_address), \
> > > +               .scan_index = -1, \
> > > +               .scan_type = { \
> > > +                       .sign = 's', \
> > > +                       .realbits = (_r_bits), \
> > > +                       .storagebits = (_s_bits), \
> > > +                       .endianness = IIO_BE, \
> > > +               }, \
> > > +       }
> > > +
> > > +#define ADIS16475_DELTANG_CHAN(_mod) \
> > > +       ADIS16475_MOD_CHAN_DELTA(IIO_ROT, IIO_MOD_ ## _mod, \
> > > +                          ADIS16475_REG_ ## _mod ## _DELTANG_L, 32, 32)
> > > +
> > > +#define ADIS16475_DELTVEL_CHAN(_mod) \
> > > +       ADIS16475_MOD_CHAN_DELTA(IIO_VELOCITY, IIO_MOD_ ## _mod, \
> > > +                          ADIS16475_REG_ ## _mod ## _DELTVEL_L, 32, 32)
> > > +
> > >  static const struct iio_chan_spec adis16475_channels[] = {
> > >         ADIS16475_GYRO_CHANNEL(X),
> > >         ADIS16475_GYRO_CHANNEL(Y),
> > > @@ -561,6 +603,12 @@ static const struct iio_chan_spec adis16475_channels[] = {
> > >         ADIS16475_ACCEL_CHANNEL(Y),
> > >         ADIS16475_ACCEL_CHANNEL(Z),
> > >         ADIS16475_TEMP_CHANNEL(),
> > > +       ADIS16475_DELTANG_CHAN(X),
> > > +       ADIS16475_DELTANG_CHAN(Y),
> > > +       ADIS16475_DELTANG_CHAN(Z),
> > > +       ADIS16475_DELTVEL_CHAN(X),
> > > +       ADIS16475_DELTVEL_CHAN(Y),
> > > +       ADIS16475_DELTVEL_CHAN(Z),
> > >         IIO_CHAN_SOFT_TIMESTAMP(7)
> > >  };
> > >  
> > > @@ -664,6 +712,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 2160,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -679,6 +729,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 360,
> > > +               .deltvel_max_val = 100,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -694,6 +746,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 720,
> > > +               .deltvel_max_val = 100,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -709,6 +763,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 2160,
> > > +               .deltvel_max_val = 100,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -724,6 +780,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 360,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -739,6 +797,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 720,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -754,6 +814,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 2160,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -769,6 +831,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 360,
> > > +               .deltvel_max_val = 100,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -784,6 +848,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 720,
> > > +               .deltvel_max_val = 100,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -799,6 +865,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 2160,
> > > +               .deltvel_max_val = 100,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -814,6 +882,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 360,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -829,6 +899,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 720,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -844,6 +916,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 1,
> > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 2160,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -859,6 +933,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 392,
> > >                 .accel_max_scale = 32000 << 16,
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 2160,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -876,6 +952,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 78,
> > >                 .accel_max_scale = 32000 << 16,
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 360,
> > > +               .deltvel_max_val = 100,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -893,6 +971,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 78,
> > >                 .accel_max_scale = 32000 << 16,
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 720,
> > > +               .deltvel_max_val = 100,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -910,6 +990,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[] =
> > > {
> > >                 .accel_max_val = 78,
> > >                 .accel_max_scale = 32000 << 16,
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 2160,
> > > +               .deltvel_max_val = 100,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -927,6 +1009,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[]
> > > = {
> > >                 .accel_max_val = 392,
> > >                 .accel_max_scale = 32000 << 16,
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 360,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -944,6 +1028,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[]
> > > = {
> > >                 .accel_max_val = 392,
> > >                 .accel_max_scale = 32000 << 16,
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 720,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode,
> > > @@ -961,6 +1047,8 @@ static const struct adis16475_chip_info
> > > adis16475_chip_info[]
> > > = {
> > >                 .accel_max_val = 392,
> > >                 .accel_max_scale = 32000 << 16,
> > >                 .temp_scale = 100,
> > > +               .deltang_max_val = 2160,
> > > +               .deltvel_max_val = 400,
> > >                 .int_clk = 2000,
> > >                 .max_dec = 1999,
> > >                 .sync = adis16475_sync_mode, 
> >
>

2023-07-20 19:04:27

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH 1/1] iio: imu: adis16475.c: Add delta angle and delta velocity channels

On Mon, 17 Jul 2023 09:09:39 +0200
Nuno Sá <[email protected]> wrote:

> Hi Jonathan,
>
> On Sun, 2023-07-16 at 15:04 +0100, Jonathan Cameron wrote:
> > On Thu, 13 Jul 2023 08:57:34 +0200
> > Nuno Sá <[email protected]> wrote:
> >
> > > On Wed, 2023-07-12 at 10:50 +0300, Ramona Bolboaca wrote:
> > > > Add delta angle and delta velocity channels to adis16475 driver.
> > > > All supported devices offer the capabilities to read this data
> > > > by performing raw register reads.
> > > >
> > > > Signed-off-by: Ramona Bolboaca <[email protected]>
> > > > --- 
> > >
> > > To note that for some devices (like adis1505) these channels can also be buffered
> > > (not together with normal accel and gyro data) so we should support it as we have
> > > everything needed. I honestly think it should be done right now but it would be a
> > > more complex change, yes. Anyways, I don't feel too strong about it, so:
> >
> > Sounds like multiple buffer support needed etc, so definitely a bigger change.
> >
> > >
> > > Reviewed-by: Nuno Sa <[email protected]>
> > >
> > > (ABI related, we're also not completely sure IIO_ROT is a perfect fit but
> > > hopefully
> > > good enough).
> >
> > That's a good point.  ROT is used in two ways previously:
> > 1) Rotation from magnetic / true north
> > 2) Quaternion absolute rotation.
> >
> > A delta value like this isn't even close to the same.  In fact, given I assume
> > this operates when the device is self clocking, they seem to be rotation in
> > a fixed time - (so in units, scaled version of radians per second - where scale
> > involves the sampling period).
> > That unit set is same as anglvel which we already have from the gyroscope
> > (though as an instantaneous measurement)
> >
>
> I think we really get angles in these channels..
>
> > I guess the intent here is that a driver would probably 'sum' the values from
> > each sample from the fifo to establish what we'd expect from IIO_ROT channels
> > (rotation wrt some fixed location)  We could do that - but then you'd need
>
> These looks like the roll, pitch, yaw modifiers (see below).

Those are wrt to an absolute orientation (kind of because they interact horribly
and it depends on starting point, but lets ignore those subtleties. Quaternions
people - learn the maths! - or use the appropriate Lie Group / Geometric algebra
form of your choice).

>
> > to support the buffer.   That raises the question - is this useful without
> > buffered support?  Is it helpful to know a single reading from this?
> >
> > In their raw form I'm not sure what is a good way to represent these.  They
> > aren't IIO_ROT and they aren't IIO_ANG_VEL.
> >
> > Much as I don't like adding them with out good reason I think we may need a new
> > channel type for this.
> >
> > Same applies to delta velocity.
> >
> >
>
> Hmm, at least this one I though it was a good fit. From the datasheet:
>
> "The delta velocity outputs represent an integration of the
> acceleration measurements and use the following formula for
> all three axes (x-axis displayed):"
>
> So this reads velocity (at least from a math point of view :)) and the units are
> indeed in m/s.
>
> For the gyroscope data, it's the same but I'm not sure if the integration of the data
> directly fits in IIO_ROT (even though we are getting angles). From quickly googling
> it, things like roll, pitch, yaw started to pop up (and we do have those modifiers
> for IIO_ROT in the ABI). But from [1] (which is actually and ADI support forum :)),
> it seems those refer to accumulating these samples (as you mentioned) which I guess
> it would be up to the application to deal with... So even though
> in_rot_{yaw|pitch|roll}_raw seems it could fit I'm not so sure since we are not
> really doing any accumulation (unless adding buffer support implies it)?
>
> We also have in in_angl_raw (IIO_ANGL):
>
> "Angle of rotation. Units after application of scale and offset are radians."
>
> Would this fit? We would need to extend the ABI to document the x,y,z modifiers...

I think it only fits if integrated another time in the driver (which we don't want to do
based on general approach in IIO of leaving that sort of complexity to userspace).
Otherwise we have a set of delta angles over time which is not what IIO_ANGL is for.
Mostly it's been used for tilt sensors IIRC and those have a measurement relative to
a fixed point (rather than the last sample)



>
> Anyways, these were just my 5 cents and 5min googling is far from being accurate :).
>
> [1]: https://ez.analog.com/mems/f/q-a/90988/adis16488bmlz-what-is-the-delta-angles
>
> - Nuno Sá
>
> > >
> > > >  drivers/iio/imu/adis16475.c | 88 +++++++++++++++++++++++++++++++++++++
> > > >  1 file changed, 88 insertions(+)
> > > >
> > > > diff --git a/drivers/iio/imu/adis16475.c b/drivers/iio/imu/adis16475.c
> > > > index 3abffb01ba31..84bee9e155bd 100644
> > > > --- a/drivers/iio/imu/adis16475.c
> > > > +++ b/drivers/iio/imu/adis16475.c
> > > > @@ -31,6 +31,12 @@
> > > >  #define ADIS16475_REG_Y_ACCEL_L                0x14
> > > >  #define ADIS16475_REG_Z_ACCEL_L                0x18
> > > >  #define ADIS16475_REG_TEMP_OUT         0x1c
> > > > +#define ADIS16475_REG_X_DELTANG_L      0x24
> > > > +#define ADIS16475_REG_Y_DELTANG_L      0x28
> > > > +#define ADIS16475_REG_Z_DELTANG_L      0x2C
> > > > +#define ADIS16475_REG_X_DELTVEL_L      0x30
> > > > +#define ADIS16475_REG_Y_DELTVEL_L      0x34
> > > > +#define ADIS16475_REG_Z_DELTVEL_L      0x38
> > > >  #define ADIS16475_REG_X_GYRO_BIAS_L    0x40
> > > >  #define ADIS16475_REG_Y_GYRO_BIAS_L    0x44
> > > >  #define ADIS16475_REG_Z_GYRO_BIAS_L    0x48
> > > > @@ -90,6 +96,8 @@ struct adis16475_chip_info {
> > > >         u32 accel_max_val;
> > > >         u32 accel_max_scale;
> > > >         u32 temp_scale;
> > > > +       u32 deltang_max_val;
> > > > +       u32 deltvel_max_val;
> > > >         u32 int_clk;
> > > >         u16 max_dec;
> > > >         u8 num_sync;
> > > > @@ -453,6 +461,14 @@ static int adis16475_read_raw(struct iio_dev *indio_dev,
> > > >                 case IIO_TEMP:
> > > >                         *val = st->info->temp_scale;
> > > >                         return IIO_VAL_INT;
> > > > +               case IIO_ROT:
> > > > +                       *val = st->info->deltang_max_val;
> > > > +                       *val2 = 31;
> > > > +                       return IIO_VAL_FRACTIONAL_LOG2;
> > > > +               case IIO_VELOCITY:
> > > > +                       *val = st->info->deltvel_max_val;
> > > > +                       *val2 = 31;
> > > > +                       return IIO_VAL_FRACTIONAL_LOG2;
> > > >                 default:
> > > >                         return -EINVAL;
> > > >                 }
> > > > @@ -553,6 +569,32 @@ static int adis16475_write_raw(struct iio_dev *indio_dev,
> > > >                 }, \
> > > >         }
> > > >  
> > > > +#define ADIS16475_MOD_CHAN_DELTA(_type, _mod, _address, _r_bits, _s_bits) { \
> > > > +               .type = (_type), \
> > > > +               .modified = 1, \
> > > > +               .channel2 = (_mod), \
> > > > +               .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
> > > > +               .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
> > > > +               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ) | \
> > > > +                       BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
> > > > +               .address = (_address), \
> > > > +               .scan_index = -1, \
> > > > +               .scan_type = { \
> > > > +                       .sign = 's', \
> > > > +                       .realbits = (_r_bits), \
> > > > +                       .storagebits = (_s_bits), \
> > > > +                       .endianness = IIO_BE, \
> > > > +               }, \
> > > > +       }
> > > > +
> > > > +#define ADIS16475_DELTANG_CHAN(_mod) \
> > > > +       ADIS16475_MOD_CHAN_DELTA(IIO_ROT, IIO_MOD_ ## _mod, \
> > > > +                          ADIS16475_REG_ ## _mod ## _DELTANG_L, 32, 32)
> > > > +
> > > > +#define ADIS16475_DELTVEL_CHAN(_mod) \
> > > > +       ADIS16475_MOD_CHAN_DELTA(IIO_VELOCITY, IIO_MOD_ ## _mod, \
> > > > +                          ADIS16475_REG_ ## _mod ## _DELTVEL_L, 32, 32)
> > > > +
> > > >  static const struct iio_chan_spec adis16475_channels[] = {
> > > >         ADIS16475_GYRO_CHANNEL(X),
> > > >         ADIS16475_GYRO_CHANNEL(Y),
> > > > @@ -561,6 +603,12 @@ static const struct iio_chan_spec adis16475_channels[] = {
> > > >         ADIS16475_ACCEL_CHANNEL(Y),
> > > >         ADIS16475_ACCEL_CHANNEL(Z),
> > > >         ADIS16475_TEMP_CHANNEL(),
> > > > +       ADIS16475_DELTANG_CHAN(X),
> > > > +       ADIS16475_DELTANG_CHAN(Y),
> > > > +       ADIS16475_DELTANG_CHAN(Z),
> > > > +       ADIS16475_DELTVEL_CHAN(X),
> > > > +       ADIS16475_DELTVEL_CHAN(Y),
> > > > +       ADIS16475_DELTVEL_CHAN(Z),
> > > >         IIO_CHAN_SOFT_TIMESTAMP(7)
> > > >  };
> > > >  
> > > > @@ -664,6 +712,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 2160,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -679,6 +729,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 360,
> > > > +               .deltvel_max_val = 100,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -694,6 +746,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 720,
> > > > +               .deltvel_max_val = 100,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -709,6 +763,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 2160,
> > > > +               .deltvel_max_val = 100,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -724,6 +780,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 360,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -739,6 +797,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 720,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -754,6 +814,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 2160,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -769,6 +831,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 360,
> > > > +               .deltvel_max_val = 100,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -784,6 +848,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 720,
> > > > +               .deltvel_max_val = 100,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -799,6 +865,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(4000 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 2160,
> > > > +               .deltvel_max_val = 100,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -814,6 +882,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 360,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -829,6 +899,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 720,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -844,6 +916,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 1,
> > > >                 .accel_max_scale = IIO_M_S_2_TO_G(800 << 16),
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 2160,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -859,6 +933,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 392,
> > > >                 .accel_max_scale = 32000 << 16,
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 2160,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -876,6 +952,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 78,
> > > >                 .accel_max_scale = 32000 << 16,
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 360,
> > > > +               .deltvel_max_val = 100,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -893,6 +971,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 78,
> > > >                 .accel_max_scale = 32000 << 16,
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 720,
> > > > +               .deltvel_max_val = 100,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -910,6 +990,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[] =
> > > > {
> > > >                 .accel_max_val = 78,
> > > >                 .accel_max_scale = 32000 << 16,
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 2160,
> > > > +               .deltvel_max_val = 100,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -927,6 +1009,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[]
> > > > = {
> > > >                 .accel_max_val = 392,
> > > >                 .accel_max_scale = 32000 << 16,
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 360,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -944,6 +1028,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[]
> > > > = {
> > > >                 .accel_max_val = 392,
> > > >                 .accel_max_scale = 32000 << 16,
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 720,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode,
> > > > @@ -961,6 +1047,8 @@ static const struct adis16475_chip_info
> > > > adis16475_chip_info[]
> > > > = {
> > > >                 .accel_max_val = 392,
> > > >                 .accel_max_scale = 32000 << 16,
> > > >                 .temp_scale = 100,
> > > > +               .deltang_max_val = 2160,
> > > > +               .deltvel_max_val = 400,
> > > >                 .int_clk = 2000,
> > > >                 .max_dec = 1999,
> > > >                 .sync = adis16475_sync_mode, 
> > >
> >
>