blob: 46f9d3e7d5cfb6d260b8f9b11994516e8fed5ad1 [file] [log] [blame]
.. _module-pw_digital_io_linux:
.. cpp:namespace-push:: pw::digital_io
===================
pw_digital_io_linux
===================
.. pigweed-module::
:name: pw_digital_io_linux
``pw_digital_io_linux`` implements the :ref:`module-pw_digital_io` interface
using the `Linux userspace gpio-cdev interface
<https://www.kernel.org/doc/Documentation/ABI/testing/gpio-cdev>`_.
.. note::
Currently only the v1 userspace ABI is supported (https://pwbug.dev/328268007).
-------------
API reference
-------------
The following classes make up the public API:
``LinuxDigitalIoChip``
======================
Represents an open handle to a GPIO *chip* (e.g. ``/dev/gpiochip0``).
This can be created using an existing file descriptor
(``LinuxDigitalIoChip(fd)``) or by opening a given path
(``LinuxDigitalIoChip::Open(path)``).
``LinuxDigitalIn``
==================
Represents a single input line and implements :cpp:class:`DigitalIn`.
This is acquired by calling ``chip.GetInputLine()`` with an appropriate
``LinuxInputConfig``.
``LinuxDigitalInInterrupt``
===========================
Represents a single input line configured for interrupts and implements
:cpp:class:`DigitalInInterrupt`.
This is acquired by calling ``chip.GetInterruptLine()`` with an appropriate
``LinuxInputConfig``.
``LinuxDigitalOut``
===================
Represents a single input line and implements :cpp:class:`DigitalOut`.
This is acquired by calling ``chip.GetOutputLine()`` with an appropriate
``LinuxOutputConfig``.
.. warning::
The ``Disable()`` implementation only closes the GPIO handle file
descriptor, relying on the underlying GPIO driver / pinctrl to restore
the state of the line. This may or may not be implemented depending on
the GPIO driver.
------
Guides
------
Example code to use GPIO pins:
Configure an input pin and get its state
========================================
.. literalinclude:: examples/input.cc
:language: cpp
:linenos:
:lines: 15-
Configure an output pin and set its state
=========================================
.. literalinclude:: examples/output.cc
:language: cpp
:linenos:
:lines: 15-
Configure an interrupt pin and handle events
============================================
.. literalinclude:: examples/interrupt.cc
:language: cpp
:linenos:
:lines: 15-
.. _module-pw_digital_io_linux-cli:
----------------------
Command-Line Interface
----------------------
This module also provides a tool also named ``pw_digital_io_linux`` which
provides a basic command-line interface to the library. It provides the
following sub-commands:
``get``
=======
Configure a GPIO line as an input and get its value.
Usage:
.. code-block:: none
get [-i] CHIP LINE
Options:
* ``-i``: Invert; configure as active-low.
Arguments:
* ``CHIP``: gpiochip path (e.g. ``/dev/gpiochip0``)
* ``LINE``: GPIO line number (e.g. ``1``)
``set``
=======
Configure a GPIO line as an output and set its value.
.. warning::
After this process exits, the GPIO line could immediately return to its
hardware-controlled default state (depending on the GPIO driver).
Usage:
.. code-block:: none
set [-i] CHIP LINE VALUE
Options:
* ``-i``: Invert; configure as active-low.
Arguments:
* ``CHIP``: gpiochip path (e.g. ``/dev/gpiochip0``)
* ``LINE``: GPIO line number (e.g. ``1``)
* ``VALUE``: the value to set (``0`` = inactive or ``1`` = active)
.. _module-pw_digital_io_linux-cli-watch:
``watch``
=========
Configure a GPIO line as an input and watch for interrupt events.
By default, both rising and falling edges will trigger an event.
This can be changed via the ``-t`` option.
Usage:
.. code-block:: none
watch [-i] [{-ta,-tb,-td}] CHIP LINE
Options:
* ``-i``: Invert; configure as active-low.
* ``-t``: Trigger for an interrupt:
* ``-ta`` - activating edge
* ``-tb`` - both edges (default)
* ``-td`` - deactivating edge
Arguments:
* ``CHIP``: gpiochip path (e.g. ``/dev/gpiochip0``)
* ``LINE``: GPIO line number (e.g. ``1``)
.. cpp:namespace-pop::