| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- .. SPDX-License-Identifier: GPL-2.0
- .. _GPIO_V2_LINE_EVENT_READ:
- ***********************
- GPIO_V2_LINE_EVENT_READ
- ***********************
- Name
- ====
- GPIO_V2_LINE_EVENT_READ - Read edge detection events for lines from a request.
- Synopsis
- ========
- ``int read(int req_fd, void *buf, size_t count)``
- Arguments
- =========
- ``req_fd``
- The file descriptor of the GPIO character device, as returned in the
- :c:type:`request.fd<gpio_v2_line_request>` by gpio-v2-get-line-ioctl.rst.
- ``buf``
- The buffer to contain the :c:type:`events<gpio_v2_line_event>`.
- ``count``
- The number of bytes available in ``buf``, which must be at
- least the size of a :c:type:`gpio_v2_line_event`.
- Description
- ===========
- Read edge detection events for lines from a request.
- Edge detection must be enabled for the input line using either
- ``GPIO_V2_LINE_FLAG_EDGE_RISING`` or ``GPIO_V2_LINE_FLAG_EDGE_FALLING``, or
- both. Edge events are then generated whenever edge interrupts are detected on
- the input line.
- Edges are defined in terms of changes to the logical line value, so an inactive
- to active transition is a rising edge. If ``GPIO_V2_LINE_FLAG_ACTIVE_LOW`` is
- set then logical polarity is the opposite of physical polarity, and
- ``GPIO_V2_LINE_FLAG_EDGE_RISING`` then corresponds to a falling physical edge.
- The kernel captures and timestamps edge events as close as possible to their
- occurrence and stores them in a buffer from where they can be read by
- userspace at its convenience using `read()`.
- Events read from the buffer are always in the same order that they were
- detected by the kernel, including when multiple lines are being monitored by
- the one request.
- The size of the kernel event buffer is fixed at the time of line request
- creation, and can be influenced by the
- :c:type:`request.event_buffer_size<gpio_v2_line_request>`.
- The default size is 16 times the number of lines requested.
- The buffer may overflow if bursts of events occur quicker than they are read
- by userspace. If an overflow occurs then the oldest buffered event is
- discarded. Overflow can be detected from userspace by monitoring the event
- sequence numbers.
- To minimize the number of calls required to copy events from the kernel to
- userspace, `read()` supports copying multiple events. The number of events
- copied is the lower of the number available in the kernel buffer and the
- number that will fit in the userspace buffer (``buf``).
- Changing the edge detection flags using gpio-v2-line-set-config-ioctl.rst
- does not remove or modify the events already contained in the kernel event
- buffer.
- The `read()` will block if no event is available and the ``req_fd`` has not
- been set **O_NONBLOCK**.
- The presence of an event can be tested for by checking that the ``req_fd`` is
- readable using `poll()` or an equivalent.
- Return Value
- ============
- On success the number of bytes read, which will be a multiple of the size of a
- :c:type:`gpio_v2_line_event` event.
- On error -1 and the ``errno`` variable is set appropriately.
- Common error codes are described in error-codes.rst.
|