Documentation/driver-api/iio/core.rst
The Industrial I/O core offers both a unified framework for writing drivers for
many different types of embedded sensors and a standard interface to user space
applications manipulating sensors. The implementation can be found under
:file:drivers/iio/industrialio-*
iio_dev from a driveriio_dev from a driverAn IIO device usually corresponds to a single hardware sensor and it provides all the information needed by a driver handling a device. Let's first have a look at the functionality embedded in an IIO device then we will show how a device driver makes use of an IIO device.
There are two ways for a user space application to interact with an IIO driver.
/sys/bus/iio/devices/iio:device{X}/, this represents a hardware sensor
and groups together the data channels of the same chip./dev/iio:device{X}, character device node interface used for
buffered data transfer and for events information retrieval.A typical IIO driver will register itself as an :doc:I2C <../i2c> or
:doc:SPI <../spi> driver and will create two routines, probe and remove.
At probe:
At remove, we free the resources allocated in probe in reverse order:
Attributes are sysfs files used to expose chip info and also allowing applications to set various configuration parameters. For device with index X, attributes can be found under /sys/bus/iio/devices/iio:deviceX/ directory. Common attributes are:
name, description of the physical chip.dev, shows the major:minor pair associated with
:file:/dev/iio:deviceX node.sampling_frequency_available, available discrete set of sampling
frequency values for device.struct iio_chan_spec - specification of a single channel
An IIO device channel is a representation of a data channel. An IIO device can have one or multiple channels. For example:
An IIO channel is described by the struct iio_chan_spec. A thermometer driver for the temperature sensor in the example above would have to describe its channel as follows::
static const struct iio_chan_spec temp_channel[] = { { .type = IIO_TEMP, .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), }, };
Channel sysfs attributes exposed to userspace are specified in the form of bitmasks. Depending on their shared info, attributes can be set in one of the following masks:
When there are multiple data channels per channel type we have two ways to distinguish between them:
iio_chan_spec to 1. Modifiers are
specified using .channel2 field of the same :c:type:iio_chan_spec
structure and are used to indicate a physically unique characteristic of the
channel such as its direction or spectral response. For example, a light
sensor can have two channels, one for infrared light and one for both
infrared and visible light.iio_chan_spec to 1. In this case the
channel is simply another instance with an index specified by the .channel
field.Here is how we can make use of the channel's modifiers::
static const struct iio_chan_spec light_channels[] = { { .type = IIO_INTENSITY, .modified = 1, .channel2 = IIO_MOD_LIGHT_IR, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_shared = BIT(IIO_CHAN_INFO_SAMP_FREQ), }, { .type = IIO_INTENSITY, .modified = 1, .channel2 = IIO_MOD_LIGHT_BOTH, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), .info_mask_shared = BIT(IIO_CHAN_INFO_SAMP_FREQ), }, { .type = IIO_LIGHT, .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), .info_mask_shared = BIT(IIO_CHAN_INFO_SAMP_FREQ), }, }
This channel's definition will generate two separate sysfs files for raw data retrieval:
/sys/bus/iio/devices/iio:device{X}/in_intensity_ir_raw/sys/bus/iio/devices/iio:device{X}/in_intensity_both_rawone file for processed data:
/sys/bus/iio/devices/iio:device{X}/in_illuminance_inputand one shared sysfs file for sampling frequency:
/sys/bus/iio/devices/iio:device{X}/sampling_frequency.Here is how we can make use of the channel's indexing::
static const struct iio_chan_spec light_channels[] = { { .type = IIO_VOLTAGE, .indexed = 1, .channel = 0, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), }, { .type = IIO_VOLTAGE, .indexed = 1, .channel = 1, .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), }, }
This will generate two separate attributes files for raw data retrieval:
/sys/bus/iio/devices/iio:device{X}/in_voltage0_raw, representing
voltage measurement for channel 0./sys/bus/iio/devices/iio:device{X}/in_voltage1_raw, representing
voltage measurement for channel 1... kernel-doc:: include/linux/iio/iio.h .. kernel-doc:: drivers/iio/industrialio-core.c :export: