| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- .. SPDX-License-Identifier: GPL-2.0
- .. _GPIO_V2_GET_LINE_IOCTL:
- **********************
- GPIO_V2_GET_LINE_IOCTL
- **********************
- Name
- ====
- GPIO_V2_GET_LINE_IOCTL - Request a line or lines from the kernel.
- Synopsis
- ========
- .. c:macro:: GPIO_V2_GET_LINE_IOCTL
- ``int ioctl(int chip_fd, GPIO_V2_GET_LINE_IOCTL, struct gpio_v2_line_request *request)``
- Arguments
- =========
- ``chip_fd``
- The file descriptor of the GPIO character device returned by `open()`.
- ``request``
- The :c:type:`line_request<gpio_v2_line_request>` specifying the lines
- to request and their configuration.
- Description
- ===========
- On success, the requesting process is granted exclusive access to the line
- value, write access to the line configuration, and may receive events when
- edges are detected on the line, all of which are described in more detail in
- :ref:`gpio-v2-line-request`.
- A number of lines may be requested in the one line request, and request
- operations are performed on the requested lines by the kernel as atomically
- as possible. e.g. gpio-v2-line-get-values-ioctl.rst will read all the
- requested lines at once.
- The state of a line, including the value of output lines, is guaranteed to
- remain as requested until the returned file descriptor is closed. Once the
- file descriptor is closed, the state of the line becomes uncontrolled from
- the userspace perspective, and may revert to its default state.
- Requesting a line already in use is an error (**EBUSY**).
- Closing the ``chip_fd`` has no effect on existing line requests.
- .. _gpio-v2-get-line-config-rules:
- Configuration Rules
- -------------------
- For any given requested line, the following configuration rules apply:
- The direction flags, ``GPIO_V2_LINE_FLAG_INPUT`` and
- ``GPIO_V2_LINE_FLAG_OUTPUT``, cannot be combined. If neither are set then
- the only other flag that may be set is ``GPIO_V2_LINE_FLAG_ACTIVE_LOW``
- and the line is requested "as-is" to allow reading of the line value
- without altering the electrical configuration.
- The drive flags, ``GPIO_V2_LINE_FLAG_OPEN_xxx``, require the
- ``GPIO_V2_LINE_FLAG_OUTPUT`` to be set.
- Only one drive flag may be set.
- If none are set then the line is assumed push-pull.
- Only one bias flag, ``GPIO_V2_LINE_FLAG_BIAS_xxx``, may be set, and it
- requires a direction flag to also be set.
- If no bias flags are set then the bias configuration is not changed.
- The edge flags, ``GPIO_V2_LINE_FLAG_EDGE_xxx``, require
- ``GPIO_V2_LINE_FLAG_INPUT`` to be set and may be combined to detect both rising
- and falling edges. Requesting edge detection from a line that does not support
- it is an error (**ENXIO**).
- Only one event clock flag, ``GPIO_V2_LINE_FLAG_EVENT_CLOCK_xxx``, may be set.
- If none are set then the event clock defaults to ``CLOCK_MONOTONIC``.
- The ``GPIO_V2_LINE_FLAG_EVENT_CLOCK_HTE`` flag requires supporting hardware
- and a kernel with ``CONFIG_HTE`` set. Requesting HTE from a device that
- doesn't support it is an error (**EOPNOTSUPP**).
- The :c:type:`debounce_period_us<gpio_v2_line_attribute>` attribute may only
- be applied to lines with ``GPIO_V2_LINE_FLAG_INPUT`` set. When set, debounce
- applies to both the values returned by gpio-v2-line-get-values-ioctl.rst and
- the edges returned by gpio-v2-line-event-read.rst. If not
- supported directly by hardware, debouncing is emulated in software by the
- kernel. Requesting debounce on a line that supports neither debounce in
- hardware nor interrupts, as required for software emulation, is an error
- (**ENXIO**).
- Requesting an invalid configuration is an error (**EINVAL**).
- .. _gpio-v2-get-line-config-support:
- Configuration Support
- ---------------------
- Where the requested configuration is not directly supported by the underlying
- hardware and driver, the kernel applies one of these approaches:
- - reject the request
- - emulate the feature in software
- - treat the feature as best effort
- The approach applied depends on whether the feature can reasonably be emulated
- in software, and the impact on the hardware and userspace if the feature is not
- supported.
- The approach applied for each feature is as follows:
- ============== ===========
- Feature Approach
- ============== ===========
- Bias best effort
- Debounce emulate
- Direction reject
- Drive emulate
- Edge Detection reject
- ============== ===========
- Bias is treated as best effort to allow userspace to apply the same
- configuration for platforms that support internal bias as those that require
- external bias.
- Worst case the line floats rather than being biased as expected.
- Debounce is emulated by applying a filter to hardware interrupts on the line.
- An edge event is generated after an edge is detected and the line remains
- stable for the debounce period.
- The event timestamp corresponds to the end of the debounce period.
- Drive is emulated by switching the line to an input when the line should not
- be actively driven.
- Edge detection requires interrupt support, and is rejected if that is not
- supported. Emulation by polling can still be performed from userspace.
- In all cases, the configuration reported by gpio-v2-get-lineinfo-ioctl.rst
- is the requested configuration, not the resulting hardware configuration.
- Userspace cannot determine if a feature is supported in hardware, is
- emulated, or is best effort.
- Return Value
- ============
- On success 0 and the :c:type:`request.fd<gpio_v2_line_request>` contains the
- file descriptor for the request.
- On error -1 and the ``errno`` variable is set appropriately.
- Common error codes are described in error-codes.rst.
|