IMU

ST provides LSM6DSx driver which provides two different ways of reading out IMU data.

Polling mode

Polling mode is the simplest IMU driver configuration, where data is read out on request. This mode does not support hardware timestamping.

Accelerometer

Get raw value of z-axis

$ cat /sys/bus/iio/devices/iio\:device0/in_accel_z_raw

Get y-axis scale value

$ cat /sys/bus/iio/devices/iio\:device0/in_accel_y_scale

Multiply the two to get the acceleration in m/s2. For z-axis this should be around 9.81m/s2.

Example:

$ cat /sys/bus/iio/devices/iio\:device0/in_accel_z_raw
16499
$ cat /sys/bus/iio/devices/iio\:device0/in_accel_y_scale
0.000598

# --> 9.8664

Gyro

Get raw value of x-axis

$ cat /sys/bus/iio/devices/iio\:device1/in_anglvel_x_raw

Buffered mode

Buffered mode enables full driver functionality, but requires hardware interrupts to be processed by the driver, which consumes more CPU load. This mode supports hardware timestamping.

Configuration

Buffered mode requires configuration. Following is a typical configuration to receive all the data IMU provides, including hardware timestamps:

Accelerometer

# Disable buffered mode

$ echo 0 > /sys/bus/iio/devices/iio\:device0/buffer/enable

# Subscribe to data elements

$ echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_accel_x_en
$ echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_accel_y_en
$ echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_accel_z_en
$ echo 1 > /sys/bus/iio/devices/iio\:device0/scan_elements/in_timestamp_en

# Set sampling frequency

$ echo 13 > /sys/bus/iio/devices/iio\:device0/sampling_frequency

# Set buffer length

$ echo 2 > /sys/bus/iio/devices/iio\:device0/buffer/length

# Enable buffered mode

$ echo 1 > /sys/bus/iio/devices/iio\:device0/buffer/enable

Gyro

# Disable buffered mode

$ echo 0 > /sys/bus/iio/devices/iio\:device1/buffer/enable

# Subscribe to data elements

$ echo 1 > /sys/bus/iio/devices/iio\:device1/scan_elements/in_anglvel_x_en
$ echo 1 > /sys/bus/iio/devices/iio\:device1/scan_elements/in_anglvel_y_en
$ echo 1 > /sys/bus/iio/devices/iio\:device1/scan_elements/in_anglvel_z_en
$ echo 1 > /sys/bus/iio/devices/iio\:device1/scan_elements/in_timestamp_en

# Set sampling frequency

$ echo 13 > /sys/bus/iio/devices/iio\:device1/sampling_frequency

# Set buffer length

$ echo 2 > /sys/bus/iio/devices/iio\:device1/buffer/length

# Enable buffered mode

$ echo 1 > /sys/bus/iio/devices/iio\:device1/buffer/enable

Data

Reading out IMU data in buffered mode is done in a different way comparing to polling mode. In polling mode data is provided via driver SysFS nodes, while in buffered mode data is read out via dedicated char devices.

Accelerometer

$ hexdump /dev/iio\:device0

Gyro

$ hexdump /dev/iio\:device1

Reconfiguration

Buffered mode does not allow reconfiguration on the fly. However, it is allowed to temporarily disable buffered mode while IMU char device is opened, which gives a possibility to reconfigure IMU driver. For example, if some application is used to read the data from accelerometer (see example above), it is possible to change its sampling frequency without closing the application:

$ echo 0 > /sys/bus/iio/devices/iio:device0/buffer/enable
$ echo 13 > /sys/bus/iio/devices/iio:device0/sampling_frequency
$ echo 1 > /sys/bus/iio/devices/iio:device0/buffer/enable