| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- .. SPDX-License-Identifier: GPL-2.0-only
- =============
- AD4695 driver
- =============
- ADC driver for Analog Devices Inc. AD4695 and similar devices. The module name
- is ``ad4695``.
- Supported devices
- =================
- The following chips are supported by this driver:
- * `AD4695 <https://www.analog.com/AD4695>`_
- * `AD4696 <https://www.analog.com/AD4696>`_
- * `AD4697 <https://www.analog.com/AD4697>`_
- * `AD4698 <https://www.analog.com/AD4698>`_
- Supported features
- ==================
- SPI wiring modes
- ----------------
- The driver currently supports the following SPI wiring configuration:
- 4-wire mode
- ^^^^^^^^^^^
- In this mode, CNV and CS are tied together and there is a single SDO line.
- .. code-block::
- +-------------+ +-------------+
- | CS |<-+------| CS |
- | CNV |<-+ | |
- | ADC | | HOST |
- | | | |
- | SDI |<--------| SDO |
- | SDO |-------->| SDI |
- | SCLK |<--------| SCLK |
- +-------------+ +-------------+
- To use this mode, in the device tree, omit the ``cnv-gpios`` and
- ``spi-rx-bus-width`` properties.
- SPI offload wiring
- ^^^^^^^^^^^^^^^^^^
- When used with a SPI offload, the supported wiring configuration is:
- .. code-block::
- +-------------+ +-------------+
- | GP0/BUSY |-------->| TRIGGER |
- | CS |<--------| CS |
- | | | |
- | ADC | | SPI |
- | | | |
- | SDI |<--------| SDO |
- | SDO |-------->| SDI |
- | SCLK |<--------| SCLK |
- | | | |
- | | +-------------+
- | CNV |<-----+--| PWM |
- | | +--| GPIO |
- +-------------+ +-------------+
- In this case, both the ``cnv-gpios`` and ``pwms`` properties are required.
- The ``#trigger-source-cells = <2>`` property is also required to connect back
- to the SPI offload. The SPI offload will have ``trigger-sources`` property
- with cells to indicate the busy signal and which GPx pin is used, e.g
- ``<&ad4695 AD4695_TRIGGER_EVENT_BUSY AD4695_TRIGGER_PIN_GP0>``.
- .. seealso:: `SPI offload support`_
- Channel configuration
- ---------------------
- Since the chip supports multiple ways to configure each channel, this must be
- described in the device tree based on what is actually wired up to the inputs.
- There are three typical configurations:
- An ``INx`` pin is used as the positive input with the ``REFGND``, ``COM`` or
- the next ``INx`` pin as the negative input.
- Pairing with REFGND
- ^^^^^^^^^^^^^^^^^^^
- Each ``INx`` pin can be used as a pseudo-differential input in conjunction with
- the ``REFGND`` pin. The device tree will look like this:
- .. code-block::
- channel@0 {
- reg = <0>; /* IN0 */
- };
- If no other channel properties are needed (e.g. ``adi,no-high-z``), the channel
- node can be omitted entirely.
- This will appear on the IIO bus as the ``voltage0`` channel. The processed value
- (*raw × scale*) will be the voltage present on the ``IN0`` pin relative to
- ``REFGND``. (Offset is always 0 when pairing with ``REFGND``.)
- Pairing with COM
- ^^^^^^^^^^^^^^^^
- Each ``INx`` pin can be used as a pseudo-differential input in conjunction with
- the ``COM`` pin. The device tree will look like this:
- .. code-block::
- com-supply = <&vref_div_2>;
- channel@1 {
- reg = <1>; /* IN1 */
- common-mode-channel = <AD4695_COMMON_MODE_COM>;
- bipolar;
- };
- This will appear on the IIO bus as the ``voltage1`` channel. The processed value
- (*(raw + offset) × scale*) will be the voltage measured on the ``IN1`` pin
- relative to ``REFGND``. (The offset is determined by the ``com-supply`` voltage.)
- The macro comes from:
- .. code-block::
- #include <dt-bindings/iio/adc/adi,ad4695.h>
- Pairing two INx pins
- ^^^^^^^^^^^^^^^^^^^^
- An even-numbered ``INx`` pin and the following odd-numbered ``INx`` pin can be
- used as a pseudo-differential input. The device tree for using ``IN2`` as the
- positive input and ``IN3`` as the negative input will look like this:
- .. code-block::
- in3-supply = <&vref_div_2>;
- channel@2 {
- reg = <2>; /* IN2 */
- common-mode-channel = <3>; /* IN3 */
- bipolar;
- };
- This will appear on the IIO bus as the ``voltage2`` channel. The processed value
- (*(raw + offset) × scale*) will be the voltage measured on the ``IN1`` pin
- relative to ``REFGND``. (Offset is determined by the ``in3-supply`` voltage.)
- VCC supply
- ----------
- The chip supports being powered by an external LDO via the ``VCC`` input or an
- internal LDO via the ``LDO_IN`` input. The driver looks at the device tree to
- determine which is being used. If ``ldo-supply`` is present, then the internal
- LDO is used. If ``vcc-supply`` is present, then the external LDO is used and
- the internal LDO is disabled.
- Reference voltage
- -----------------
- The chip supports an external reference voltage via the ``REF`` input or an
- internal buffered reference voltage via the ``REFIN`` input. The driver looks
- at the device tree to determine which is being used. If ``ref-supply`` is
- present, then the external reference voltage is used and the internal buffer is
- disabled. If ``refin-supply`` is present, then the internal buffered reference
- voltage is used.
- Gain/offset calibration
- -----------------------
- System calibration is supported using the channel gain and offset registers via
- the ``calibscale`` and ``calibbias`` attributes respectively.
- Oversampling
- ------------
- The chip supports per-channel oversampling when SPI offload is being used, with
- available oversampling ratios (OSR) of 1 (default), 4, 16, and 64. Enabling
- oversampling on a channel raises the effective number of bits of sampled data to
- 17 (OSR == 4), 18 (16), or 19 (64), respectively. This can be set via the
- ``oversampling_ratio`` attribute.
- Setting the oversampling ratio for a channel also changes the sample rate for
- that channel, since it requires multiple conversions per 1 sample. Specifically,
- the new sampling frequency is the PWM sampling frequency divided by the
- particular OSR. This is set automatically by the driver when setting the
- ``oversampling_ratio`` attribute. For example, if the device's current
- ``sampling_frequency`` is 10000 and an OSR of 4 is set on channel ``voltage0``,
- the new reported sampling rate for that channel will be 2500 (ignoring PWM API
- rounding), while all others will remain at 10000. Subsequently setting the
- sampling frequency to a higher value on that channel will adjust the CNV trigger
- period for all channels, e.g. if ``voltage0``'s sampling frequency is adjusted
- from 2500 (with an OSR of 4) to 10000, the value reported by
- ``in_voltage0_sampling_frequency`` will be 10000, but all other channels will
- now report 40000.
- For simplicity, the sampling frequency of the device should be set (considering
- the highest desired OSR value to be used) first, before configuring oversampling
- for specific channels.
- Unimplemented features
- ----------------------
- - Additional wiring modes
- - Threshold events
- - GPIO support
- - CRC support
- SPI offload support
- ===================
- To be able to achieve the maximum sample rate, the driver can be used with the
- `AXI SPI Engine`_ to provide SPI offload support.
- .. _AXI SPI Engine: http://analogdevicesinc.github.io/hdl/projects/ad469x_fmc/index.html
- .. seealso:: `SPI offload wiring`_
- When SPI offload is being used, some attributes will be different.
- * ``trigger`` directory is removed.
- * ``in_voltage0_sampling_frequency`` attributes are added for setting the sample
- rate.
- * ``in_voltage0_sampling_frequency_available`` attributes are added for querying
- the max sample rate.
- * ``timestamp`` channel is removed.
- * Buffer data format may be different compared to when offload is not used,
- e.g. the ``buffer0/in_voltage0_type`` attribute.
- Device buffers
- ==============
- This driver supports hardware triggered buffers. This uses the "advanced
- sequencer" feature of the chip to trigger a burst of conversions.
- Also see :doc:`iio_devbuf` for more general information.
- Effective sample rate for buffered reads
- ----------------------------------------
- When SPI offload is not used, the sample rate is determined by the trigger that
- is manually configured in userspace. All enabled channels will be read in a
- burst when the trigger is received.
- When SPI offload is used, the sample rate is configured per channel. All
- channels will have the same rate, so only one ``in_voltageY_sampling_frequency``
- attribute needs to be set. Since this rate determines the delay between each
- individual conversion, the effective sample rate for each sample is actually
- the sum of the periods of each enabled channel in a buffered read. In other
- words, it is the value of the ``in_voltageY_sampling_frequency`` attribute
- divided by the number of enabled channels. So if 4 channels are enabled, with
- the ``in_voltageY_sampling_frequency`` attributes set to 1 MHz, the effective
- sample rate is 250 kHz.
- With oversampling enabled, the effective sample rate also depends on the OSR
- assigned to each channel. For example, if one of the 4 channels mentioned in the
- previous case is configured with an OSR of 4, the effective sample rate for that
- channel becomes (1 MHz / 4 ) = 250 kHz. The effective sample rate for all
- four channels is then 1 / ( (3 / 1 MHz) + ( 1 / 250 kHz) ) ~= 142.9 kHz. Note
- that in this case "sample" refers to one read of all enabled channels (i.e. one
- full cycle through the auto-sequencer).
|