mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
8243b2877e
Add documentation for adis16475 driver which describes the driver device files and shows how the user may use the ABI for various scenarios (configuration, measurement, etc.). Signed-off-by: Ramona Gradinariu <ramona.gradinariu@analog.com> Link: https://lore.kernel.org/r/20240221085848.991413-4-ramona.gradinariu@analog.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
408 lines
19 KiB
ReStructuredText
408 lines
19 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0
|
||
|
||
================
|
||
ADIS16475 driver
|
||
================
|
||
|
||
This driver supports Analog Device's IMUs on SPI bus.
|
||
|
||
1. Supported devices
|
||
====================
|
||
|
||
* `ADIS16465 <https://www.analog.com/ADIS16465>`_
|
||
* `ADIS16467 <https://www.analog.com/ADIS16467>`_
|
||
* `ADIS16470 <https://www.analog.com/ADIS16470>`_
|
||
* `ADIS16475 <https://www.analog.com/ADIS16475>`_
|
||
* `ADIS16477 <https://www.analog.com/ADIS16477>`_
|
||
* `ADIS16500 <https://www.analog.com/ADIS16500>`_
|
||
* `ADIS16505 <https://www.analog.com/ADIS16505>`_
|
||
* `ADIS16507 <https://www.analog.com/ADIS16507>`_
|
||
|
||
Each supported device is a precision, miniature microelectromechanical system
|
||
(MEMS) inertial measurement unit (IMU) that includes a triaxial gyroscope and a
|
||
triaxial accelerometer. Each inertial sensor in the IMU device combines with
|
||
signal conditioning that optimizes dynamic performance. The factory calibration
|
||
characterizes each sensor for sensitivity, bias, alignment, linear acceleration
|
||
(gyroscope bias), and point of percussion (accelerometer location). As a result,
|
||
each sensor has dynamic compensation formulas that provide accurate sensor
|
||
measurements over a broad set of conditions.
|
||
|
||
2. Device attributes
|
||
====================
|
||
|
||
Accelerometer, gyroscope measurements are always provided. Furthermore, the
|
||
driver offers the capability to retrieve the delta angle and the delta velocity
|
||
measurements computed by the device.
|
||
|
||
The delta angle measurements represent a calculation of angular displacement
|
||
between each sample update, while the delta velocity measurements represent a
|
||
calculation of linear velocity change between each sample update.
|
||
|
||
Finally, temperature data are provided which show a coarse measurement of
|
||
the temperature inside of the IMU device. This data is most useful for
|
||
monitoring relative changes in the thermal environment.
|
||
|
||
The signal chain of each inertial sensor (accelerometers and gyroscopes)
|
||
includes the application of unique correction formulas, which are derived from
|
||
extensive characterization of bias, sensitivity, alignment, response to linear
|
||
acceleration (gyroscopes), and point of percussion (accelerometer location)
|
||
over a temperature range of −40°C to +85°C, for each ADIS device. These
|
||
correction formulas are not accessible, but users do have the opportunity to
|
||
adjust the bias for each sensor individually through the calibbias attribute.
|
||
|
||
Each IIO device, has a device folder under ``/sys/bus/iio/devices/iio:deviceX``,
|
||
where X is the IIO index of the device. Under these folders reside a set of
|
||
device files, depending on the characteristics and features of the hardware
|
||
device in questions. These files are consistently generalized and documented in
|
||
the IIO ABI documentation.
|
||
|
||
The following tables show the adis16475 related device files, found in the
|
||
specific device folder path ``/sys/bus/iio/devices/iio:deviceX``.
|
||
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| 3-Axis Accelerometer related device files | Description |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_accel_scale | Scale for the accelerometer channels. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_accel_x_calibbias | Calibration offset for the X-axis accelerometer channel. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_accel_calibbias_x | x-axis acceleration offset correction |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_accel_x_raw | Raw X-axis accelerometer channel value. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_accel_calibbias_y | y-axis acceleration offset correction |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_accel_y_raw | Raw Y-axis accelerometer channel value. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_accel_z_calibbias | Calibration offset for the Z-axis accelerometer channel. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_accel_z_raw | Raw Z-axis accelerometer channel value. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_deltavelocity_scale | Scale for delta velocity channels. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_deltavelocity_x_raw | Raw X-axis delta velocity channel value. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_deltavelocity_y_raw | Raw Y-axis delta velocity channel value. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
| in_deltavelocity_z_raw | Raw Z-axis delta velocity channel value. |
|
||
+-------------------------------------------+----------------------------------------------------------+
|
||
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| 3-Axis Gyroscope related device files | Description |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_anglvel_scale | Scale for the gyroscope channels. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_anglvel_x_calibbias | Calibration offset for the X-axis gyroscope channel. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_anglvel_calibbias_x | x-axis gyroscope offset correction |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_anglvel_x_raw | Raw X-axis gyroscope channel value. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_anglvel_calibbias_y | y-axis gyroscope offset correction |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_anglvel_y_raw | Raw Y-axis gyroscope channel value. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_anglvel_z_calibbias | Calibration offset for the Z-axis gyroscope channel. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_anglvel_z_raw | Raw Z-axis gyroscope channel value. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_deltaangl_scale | Scale for delta angle channels. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_deltaangl_x_raw | Raw X-axis delta angle channel value. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_deltaangl_y_raw | Raw Y-axis delta angle channel value. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
| in_deltaangl_z_raw | Raw Z-axis delta angle channel value. |
|
||
+---------------------------------------+------------------------------------------------------+
|
||
|
||
+----------------------------------+-------------------------------------------+
|
||
| Temperature sensor related files | Description |
|
||
+----------------------------------+-------------------------------------------+
|
||
| in_temp0_raw | Raw temperature channel value. |
|
||
+----------------------------------+-------------------------------------------+
|
||
| in_temp0_scale | Scale for the temperature sensor channel. |
|
||
+----------------------------------+-------------------------------------------+
|
||
|
||
+-------------------------------+---------------------------------------------------------+
|
||
| Miscellaneous device files | Description |
|
||
+-------------------------------+---------------------------------------------------------+
|
||
| name | Name of the IIO device. |
|
||
+-------------------------------+---------------------------------------------------------+
|
||
| sampling_frequency | Currently selected sample rate. |
|
||
+-------------------------------+---------------------------------------------------------+
|
||
| filter_low_pass_3db_frequency | Bandwidth for the accelerometer and gyroscope channels. |
|
||
+-------------------------------+---------------------------------------------------------+
|
||
|
||
The following table shows the adis16475 related device debug files, found in the
|
||
specific device debug folder path ``/sys/kernel/debug/iio/iio:deviceX``.
|
||
|
||
+----------------------+-------------------------------------------------------------------------+
|
||
| Debugfs device files | Description |
|
||
+----------------------+-------------------------------------------------------------------------+
|
||
| serial_number | The serial number of the chip in hexadecimal format. |
|
||
+----------------------+-------------------------------------------------------------------------+
|
||
| product_id | Chip specific product id (e.g. 16475, 16500, 16505, etc.). |
|
||
+----------------------+-------------------------------------------------------------------------+
|
||
| flash_count | The number of flash writes performed on the device. |
|
||
+----------------------+-------------------------------------------------------------------------+
|
||
| firmware_revision | String containing the firmware revision in the following format ##.##. |
|
||
+----------------------+-------------------------------------------------------------------------+
|
||
| firmware_date | String containing the firmware date in the following format mm-dd-yyyy. |
|
||
+----------------------+-------------------------------------------------------------------------+
|
||
|
||
Channels processed values
|
||
-------------------------
|
||
|
||
A channel value can be read from its _raw attribute. The value returned is the
|
||
raw value as reported by the devices. To get the processed value of the channel,
|
||
apply the following formula:
|
||
|
||
.. code-block:: bash
|
||
|
||
processed value = (_raw + _offset) * _scale
|
||
|
||
Where _offset and _scale are device attributes. If no _offset attribute is
|
||
present, simply assume its value is 0.
|
||
|
||
The adis16475 driver offers data for 5 types of channels, the table below shows
|
||
the measurement units for the processed value, which are defined by the IIO
|
||
framework:
|
||
|
||
+-------------------------------------+---------------------------+
|
||
| Channel type | Measurement unit |
|
||
+-------------------------------------+---------------------------+
|
||
| Acceleration on X, Y, and Z axis | Meters per Second squared |
|
||
+-------------------------------------+---------------------------+
|
||
| Angular velocity on X, Y and Z axis | Radians per second |
|
||
+-------------------------------------+---------------------------+
|
||
| Delta velocity on X. Y, and Z axis | Meters per Second |
|
||
+-------------------------------------+---------------------------+
|
||
| Delta angle on X, Y, and Z axis | Radians |
|
||
+-------------------------------------+---------------------------+
|
||
| Temperature | Millidegrees Celsius |
|
||
+-------------------------------------+---------------------------+
|
||
|
||
Usage examples
|
||
--------------
|
||
|
||
Show device name:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> cat name
|
||
adis16505-2
|
||
|
||
Show accelerometer channels value:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_accel_x_raw
|
||
-275924
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_accel_y_raw
|
||
-30142222
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_accel_z_raw
|
||
261265769
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_accel_scale
|
||
0.000000037
|
||
|
||
- X-axis acceleration = in_accel_x_raw * in_accel_scale = −0.010209188 m/s^2
|
||
- Y-axis acceleration = in_accel_y_raw * in_accel_scale = −1.115262214 m/s^2
|
||
- Z-axis acceleration = in_accel_z_raw * in_accel_scale = 9.666833453 m/s^2
|
||
|
||
Show gyroscope channels value:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_anglvel_x_raw
|
||
-3324626
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_anglvel_y_raw
|
||
1336980
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_anglvel_z_raw
|
||
-602983
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_anglvel_scale
|
||
0.000000006
|
||
|
||
- X-axis angular velocity = in_anglvel_x_raw * in_anglvel_scale = −0.019947756 rad/s
|
||
- Y-axis angular velocity = in_anglvel_y_raw * in_anglvel_scale = 0.00802188 rad/s
|
||
- Z-axis angular velocity = in_anglvel_z_raw * in_anglvel_scale = −0.003617898 rad/s
|
||
|
||
Set calibration offset for accelerometer channels:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_accel_x_calibbias
|
||
0
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> echo 5000 > in_accel_x_calibbias
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_accel_x_calibbias
|
||
5000
|
||
|
||
Set calibration offset for gyroscope channels:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_anglvel_y_calibbias
|
||
0
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> echo -5000 > in_anglvel_y_calibbias
|
||
root:/sys/bus/iio/devices/iio:device0> cat in_anglvel_y_calibbias
|
||
-5000
|
||
|
||
Set sampling frequency:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> cat sampling_frequency
|
||
2000.000000
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> echo 1000 > sampling_frequency
|
||
1000.000000
|
||
|
||
Set bandwidth for accelerometer and gyroscope:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> cat filter_low_pass_3db_frequency
|
||
720
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> echo 360 > filter_low_pass_3db_frequency
|
||
root:/sys/bus/iio/devices/iio:device0> cat filter_low_pass_3db_frequency
|
||
360
|
||
|
||
Show serial number:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/kernel/debug/iio/iio:device0> cat serial_number
|
||
0x04f9
|
||
|
||
Show product id:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/kernel/debug/iio/iio:device0> cat product_id
|
||
16505
|
||
|
||
Show flash count:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/kernel/debug/iio/iio:device0> cat flash_count
|
||
150
|
||
|
||
Show firmware revision:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/kernel/debug/iio/iio:device0> cat firmware_revision
|
||
1.6
|
||
|
||
Show firmware date:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/kernel/debug/iio/iio:device0> cat firmware_date
|
||
06-27-2019
|
||
|
||
3. Device buffers
|
||
=================
|
||
|
||
This driver supports IIO buffers.
|
||
|
||
All devices support retrieving the raw acceleration, gyroscope and temperature
|
||
measurements using buffers.
|
||
|
||
The following device families also support retrieving the delta velocity, delta
|
||
angle and temperature measurements using buffers:
|
||
|
||
- ADIS16477
|
||
- ADIS16500
|
||
- ADIS16505
|
||
- ADIS16507
|
||
|
||
However, when retrieving acceleration or gyroscope data using buffers, delta
|
||
readings will not be available and vice versa.
|
||
|
||
Usage examples
|
||
--------------
|
||
|
||
Set device trigger in current_trigger, if not already set:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> cat trigger/current_trigger
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> echo adis16505-2-dev0 > trigger/current_trigger
|
||
root:/sys/bus/iio/devices/iio:device0> cat trigger/current_trigger
|
||
adis16505-2-dev0
|
||
|
||
Select channels for buffer read:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> echo 1 > scan_elements/in_deltavelocity_x_en
|
||
root:/sys/bus/iio/devices/iio:device0> echo 1 > scan_elements/in_deltavelocity_y_en
|
||
root:/sys/bus/iio/devices/iio:device0> echo 1 > scan_elements/in_deltavelocity_z_en
|
||
root:/sys/bus/iio/devices/iio:device0> echo 1 > scan_elements/in_temp0_en
|
||
|
||
Set the number of samples to be stored in the buffer:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> echo 10 > buffer/length
|
||
|
||
Enable buffer readings:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> echo 1 > buffer/enable
|
||
|
||
Obtain buffered data:
|
||
|
||
.. code-block:: bash
|
||
|
||
root:/sys/bus/iio/devices/iio:device0> hexdump -C /dev/iio\:device0
|
||
...
|
||
00001680 01 1f 00 00 ff ff fe ef 00 00 47 bf 00 03 35 55 |..........G...5U|
|
||
00001690 01 1f 00 00 ff ff ff d9 00 00 46 f1 00 03 35 35 |..........F...55|
|
||
000016a0 01 1f 00 00 ff ff fe fc 00 00 46 cb 00 03 35 7b |..........F...5{|
|
||
000016b0 01 1f 00 00 ff ff fe 41 00 00 47 0d 00 03 35 8b |.......A..G...5.|
|
||
000016c0 01 1f 00 00 ff ff fe 37 00 00 46 b4 00 03 35 90 |.......7..F...5.|
|
||
000016d0 01 1d 00 00 ff ff fe 5a 00 00 45 d7 00 03 36 08 |.......Z..E...6.|
|
||
000016e0 01 1b 00 00 ff ff fe fb 00 00 45 e7 00 03 36 60 |..........E...6`|
|
||
000016f0 01 1a 00 00 ff ff ff 17 00 00 46 bc 00 03 36 de |..........F...6.|
|
||
00001700 01 1a 00 00 ff ff fe 59 00 00 46 d7 00 03 37 b8 |.......Y..F...7.|
|
||
00001710 01 1a 00 00 ff ff fe ae 00 00 46 95 00 03 37 ba |..........F...7.|
|
||
00001720 01 1a 00 00 ff ff fe c5 00 00 46 63 00 03 37 9f |..........Fc..7.|
|
||
00001730 01 1a 00 00 ff ff fe 55 00 00 46 89 00 03 37 c1 |.......U..F...7.|
|
||
00001740 01 1a 00 00 ff ff fe 31 00 00 46 aa 00 03 37 f7 |.......1..F...7.|
|
||
...
|
||
|
||
See ``Documentation/iio/iio_devbuf.rst`` for more information about how buffered
|
||
data is structured.
|
||
|
||
4. IIO Interfacing Tools
|
||
========================
|
||
|
||
Linux Kernel Tools
|
||
------------------
|
||
|
||
Linux Kernel provides some userspace tools that can be used to retrieve data
|
||
from IIO sysfs:
|
||
|
||
* lsiio: example application that provides a list of IIO devices and triggers
|
||
* iio_event_monitor: example application that reads events from an IIO device
|
||
and prints them
|
||
* iio_generic_buffer: example application that reads data from buffer
|
||
* iio_utils: set of APIs, typically used to access sysfs files.
|
||
|
||
LibIIO
|
||
------
|
||
|
||
LibIIO is a C/C++ library that provides generic access to IIO devices. The
|
||
library abstracts the low-level details of the hardware, and provides a simple
|
||
yet complete programming interface that can be used for advanced projects.
|
||
|
||
For more information about LibIIO, please see:
|
||
https://github.com/analogdevicesinc/libiio
|