1
0
mirror of https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git synced 2026-10-24 00:48:53 +03:00
Files
libgpiod/include/gpiod.h
Bartosz Golaszewski 7e11886fff doc: provide sphinx docs for the core C API and C++ bindings
Current sphinx/ contents are mostly WiP. Let's beat them into shape for
publishing on ReadTheDocs.

Integrate the API documentation generated with doxygen for the core C
API and C++ bindings into sphinx using breathe.

Update configure.ac to check for sphinx-build in addition to doxygen and
make the main Makefile trigger a sphinx build on `make doc` (although
the docs can also be generated without starting the build system by
running: `sphinx-build ./docs/ docs/sphinx-output`).

Move the introduction text from the main header into the relevant .rst
file.

Remove obsolete Doxyfile.in and create a static Doxygen under doc/ where
all the documentation now lives.

Update .gitignore where needed.

Reviewed-by: Vincent Fazio <vfazio@xes-inc.com>
Link: https://lore.kernel.org/r/20250211-improve-docs-v4-12-dc56702c2ca8@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
2025-02-17 09:18:11 +01:00

1331 lines
42 KiB
C

/* SPDX-License-Identifier: LGPL-2.1-or-later */
/* SPDX-FileCopyrightText: 2017-2022 Bartosz Golaszewski <brgl@bgdev.pl> */
/**
* @file gpiod.h
*/
#ifndef __LIBGPIOD_GPIOD_H__
#define __LIBGPIOD_GPIOD_H__
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @struct gpiod_chip
* @{
*
* Refer to @ref chips for functions that operate on gpiod_chip.
*
* @}
*/
struct gpiod_chip;
/**
* @struct gpiod_chip_info
* @{
*
* Refer to @ref chip_info for functions that operate on gpiod_chip_info.
*
* @}
*/
struct gpiod_chip_info;
/**
* @struct gpiod_line_info
* @{
*
* Refer to @ref line_info for functions that operate on gpiod_line_info.
*
* @}
*/
struct gpiod_line_info;
/**
* @struct gpiod_line_settings
* @{
*
* Refer to @ref line_settings for functions that operate on
* gpiod_line_settings.
*
* @}
*/
struct gpiod_line_settings;
/**
* @struct gpiod_line_config
* @{
*
* Refer to @ref line_config for functions that operate on gpiod_line_config.
*
* @}
*/
struct gpiod_line_config;
/**
* @struct gpiod_request_config
* @{
*
* Refer to @ref request_config for functions that operate on
* gpiod_request_config.
*
* @}
*/
struct gpiod_request_config;
/**
* @struct gpiod_line_request
* @{
*
* Refer to @ref line_request for functions that operate on
* gpiod_line_request.
*
* @}
*/
struct gpiod_line_request;
/**
* @struct gpiod_info_event
* @{
*
* Refer to @ref line_watch for functions that operate on gpiod_info_event.
*
* @}
*/
struct gpiod_info_event;
/**
* @struct gpiod_edge_event
* @{
*
* Refer to @ref edge_event for functions that operate on gpiod_edge_event.
*
* @}
*/
struct gpiod_edge_event;
/**
* @struct gpiod_edge_event_buffer
* @{
*
* Refer to @ref edge_event for functions that operate on
* gpiod_edge_event_buffer.
*
* @}
*/
struct gpiod_edge_event_buffer;
/**
* @defgroup chips GPIO chips
* @{
*
* Functions and data structures for GPIO chip operations.
*
* A GPIO chip object is associated with an open file descriptor to the GPIO
* character device. It exposes basic information about the chip and allows
* callers to retrieve information about each line, watch lines for state
* changes and make line requests.
*/
/**
* @brief Open a chip by path.
* @param path Path to the gpiochip device file.
* @return GPIO chip object or NULL if an error occurred. The returned object
* must be closed by the caller using ::gpiod_chip_close.
*/
struct gpiod_chip *gpiod_chip_open(const char *path);
/**
* @brief Close the chip and release all associated resources.
* @param chip Chip to close.
*/
void gpiod_chip_close(struct gpiod_chip *chip);
/**
* @brief Get information about the chip.
* @param chip GPIO chip object.
* @return New GPIO chip info object or NULL if an error occurred. The returned
* object must be freed by the caller using ::gpiod_chip_info_free.
*/
struct gpiod_chip_info *gpiod_chip_get_info(struct gpiod_chip *chip);
/**
* @brief Get the path used to open the chip.
* @param chip GPIO chip object.
* @return Path to the file passed as argument to ::gpiod_chip_open. The
* returned pointer is valid for the lifetime of the chip object and
* must not be freed by the caller.
*/
const char *gpiod_chip_get_path(struct gpiod_chip *chip);
/**
* @brief Get a snapshot of information about a line.
* @param chip GPIO chip object.
* @param offset The offset of the GPIO line.
* @return New GPIO line info object or NULL if an error occurred. The returned
* object must be freed by the caller using ::gpiod_line_info_free.
*/
struct gpiod_line_info *gpiod_chip_get_line_info(struct gpiod_chip *chip,
unsigned int offset);
/**
* @brief Get a snapshot of the status of a line and start watching it for
* future changes.
* @param chip GPIO chip object.
* @param offset The offset of the GPIO line.
* @return New GPIO line info object or NULL if an error occurred. The returned
* object must be freed by the caller using ::gpiod_line_info_free.
* @note Line status does not include the line value. To monitor the line
* value the line must be requested as an input with edge detection set.
*/
struct gpiod_line_info *gpiod_chip_watch_line_info(struct gpiod_chip *chip,
unsigned int offset);
/**
* @brief Stop watching a line for status changes.
* @param chip GPIO chip object.
* @param offset The offset of the line to stop watching.
* @return 0 on success, -1 on failure.
*/
int gpiod_chip_unwatch_line_info(struct gpiod_chip *chip, unsigned int offset);
/**
* @brief Get the file descriptor associated with the chip.
* @param chip GPIO chip object.
* @return File descriptor number for the chip.
*
* This function never fails. The returned file descriptor must not be closed
* by the caller. Call ::gpiod_chip_close to close the file descriptor by
* closing the chip owning it.
*/
int gpiod_chip_get_fd(struct gpiod_chip *chip);
/**
* @brief Wait for line status change events on any of the watched lines
* on the chip.
* @param chip GPIO chip object.
* @param timeout_ns Wait time limit in nanoseconds. If set to 0, the function
* returns immediately. If set to a negative number, the
* function blocks indefinitely until an event becomes
* available.
* @return 0 if wait timed out, -1 if an error occurred, 1 if an event is
* pending.
*/
int gpiod_chip_wait_info_event(struct gpiod_chip *chip, int64_t timeout_ns);
/**
* @brief Read a single line status change event from the chip.
* @param chip GPIO chip object.
* @return Newly read watch event object or NULL on error. The event must be
* freed by the caller using ::gpiod_info_event_free.
* @note If no events are pending, this function will block.
*/
struct gpiod_info_event *gpiod_chip_read_info_event(struct gpiod_chip *chip);
/**
* @brief Map a line's name to its offset within the chip.
* @param chip GPIO chip object.
* @param name Name of the GPIO line to map.
* @return Offset of the line within the chip or -1 on error.
* @note If a line with given name is not exposed by the chip, the function
* sets errno to ENOENT.
*/
int gpiod_chip_get_line_offset_from_name(struct gpiod_chip *chip,
const char *name);
/**
* @brief Request a set of lines for exclusive usage.
* @param chip GPIO chip object.
* @param req_cfg Request config object. Can be NULL for default settings.
* @param line_cfg Line config object.
* @return New line request object or NULL if an error occurred. The request
* must be released by the caller using ::gpiod_line_request_release.
*/
struct gpiod_line_request *
gpiod_chip_request_lines(struct gpiod_chip *chip,
struct gpiod_request_config *req_cfg,
struct gpiod_line_config *line_cfg);
/**
* @}
*
* @defgroup chip_info Chip info
* @{
*
* Functions for retrieving kernel information about chips.
*
* Line info object contains an immutable snapshot of a chip's status.
*
* The chip info contains all the publicly available information about a
* chip.
*
* Some accessor methods return pointers. Those pointers refer to internal
* fields. The lifetimes of those fields are tied to the lifetime of the
* containing chip info object. Such pointers remain valid until
* ::gpiod_chip_info_free is called on the containing chip info object. They
* must not be freed by the caller.
*/
/**
* @brief Free a chip info object and release all associated resources.
* @param info GPIO chip info object to free.
*/
void gpiod_chip_info_free(struct gpiod_chip_info *info);
/**
* @brief Get the name of the chip as represented in the kernel.
* @param info GPIO chip info object.
* @return Valid pointer to a human-readable string containing the chip name.
* The string lifetime is tied to the chip info object so the pointer
* must not be freed by the caller.
*/
const char *gpiod_chip_info_get_name(struct gpiod_chip_info *info);
/**
* @brief Get the label of the chip as represented in the kernel.
* @param info GPIO chip info object.
* @return Valid pointer to a human-readable string containing the chip label.
* The string lifetime is tied to the chip info object so the pointer
* must not be freed by the caller.
*/
const char *gpiod_chip_info_get_label(struct gpiod_chip_info *info);
/**
* @brief Get the number of lines exposed by the chip.
* @param info GPIO chip info object.
* @return Number of GPIO lines.
*/
size_t gpiod_chip_info_get_num_lines(struct gpiod_chip_info *info);
/**
* @}
*
* @defgroup line_defs Line definitions
* @{
*
* These defines are used across the API.
*/
/**
* @brief Logical line state.
*/
enum gpiod_line_value {
GPIOD_LINE_VALUE_ERROR = -1,
/**< Returned to indicate an error when reading the value. */
GPIOD_LINE_VALUE_INACTIVE = 0,
/**< Line is logically inactive. */
GPIOD_LINE_VALUE_ACTIVE = 1,
/**< Line is logically active. */
};
/**
* @brief Direction settings.
*/
enum gpiod_line_direction {
GPIOD_LINE_DIRECTION_AS_IS = 1,
/**< Request the line(s), but don't change direction. */
GPIOD_LINE_DIRECTION_INPUT,
/**< Direction is input - for reading the value of an externally driven
* GPIO line. */
GPIOD_LINE_DIRECTION_OUTPUT,
/**< Direction is output - for driving the GPIO line. */
};
/**
* @brief Edge detection settings.
*/
enum gpiod_line_edge {
GPIOD_LINE_EDGE_NONE = 1,
/**< Line edge detection is disabled. */
GPIOD_LINE_EDGE_RISING,
/**< Line detects rising edge events. */
GPIOD_LINE_EDGE_FALLING,
/**< Line detects falling edge events. */
GPIOD_LINE_EDGE_BOTH,
/**< Line detects both rising and falling edge events. */
};
/**
* @brief Internal bias settings.
*/
enum gpiod_line_bias {
GPIOD_LINE_BIAS_AS_IS = 1,
/**< Don't change the bias setting when applying line config. */
GPIOD_LINE_BIAS_UNKNOWN,
/**< The internal bias state is unknown. */
GPIOD_LINE_BIAS_DISABLED,
/**< The internal bias is disabled. */
GPIOD_LINE_BIAS_PULL_UP,
/**< The internal pull-up bias is enabled. */
GPIOD_LINE_BIAS_PULL_DOWN,
/**< The internal pull-down bias is enabled. */
};
/**
* @brief Drive settings.
*/
enum gpiod_line_drive {
GPIOD_LINE_DRIVE_PUSH_PULL = 1,
/**< Drive setting is push-pull. */
GPIOD_LINE_DRIVE_OPEN_DRAIN,
/**< Line output is open-drain. */
GPIOD_LINE_DRIVE_OPEN_SOURCE,
/**< Line output is open-source. */
};
/**
* @brief Clock settings.
*/
enum gpiod_line_clock {
GPIOD_LINE_CLOCK_MONOTONIC = 1,
/**< Line uses the monotonic clock for edge event timestamps. */
GPIOD_LINE_CLOCK_REALTIME,
/**< Line uses the realtime clock for edge event timestamps. */
GPIOD_LINE_CLOCK_HTE,
/**< Line uses the hardware timestamp engine for event timestamps. */
};
/**
* @}
*
* @defgroup line_info Line info
* @{
*
* Functions for retrieving kernel information about both requested and free
* lines.
*
* Line info object contains an immutable snapshot of a line's status.
*
* The line info contains all the publicly available information about a
* line, which does not include the line value. The line must be requested
* to access the line value.
*
* Some accessor methods return pointers. Those pointers refer to internal
* fields. The lifetimes of those fields are tied to the lifetime of the
* containing line info object. Such pointers remain valid until
* ::gpiod_line_info_free is called on the containing line info object. They
* must not be freed by the caller.
*/
/**
* @brief Free a line info object and release all associated resources.
* @param info GPIO line info object to free.
*/
void gpiod_line_info_free(struct gpiod_line_info *info);
/**
* @brief Copy a line info object.
* @param info Line info to copy.
* @return Copy of the line info or NULL on error. The returned object must
* be freed by the caller using :gpiod_line_info_free.
*/
struct gpiod_line_info *gpiod_line_info_copy(struct gpiod_line_info *info);
/**
* @brief Get the offset of the line.
* @param info GPIO line info object.
* @return Offset of the line within the parent chip.
*
* The offset uniquely identifies the line on the chip. The combination of the
* chip and offset uniquely identifies the line within the system.
*/
unsigned int gpiod_line_info_get_offset(struct gpiod_line_info *info);
/**
* @brief Get the name of the line.
* @param info GPIO line info object.
* @return Name of the GPIO line as it is represented in the kernel.
* This function returns a valid pointer to a null-terminated string
* or NULL if the line is unnamed. The string lifetime is tied to the
* line info object so the pointer must not be freed.
*/
const char *gpiod_line_info_get_name(struct gpiod_line_info *info);
/**
* @brief Check if the line is in use.
* @param info GPIO line object.
* @return True if the line is in use, false otherwise.
*
* The exact reason a line is busy cannot be determined from user space.
* It may have been requested by another process or hogged by the kernel.
* It only matters that the line is used and can't be requested until
* released by the existing consumer.
*/
bool gpiod_line_info_is_used(struct gpiod_line_info *info);
/**
* @brief Get the name of the consumer of the line.
* @param info GPIO line info object.
* @return Name of the GPIO consumer as it is represented in the kernel.
* This function returns a valid pointer to a null-terminated string
* or NULL if the consumer name is not set.
* The string lifetime is tied to the line info object so the pointer
* must not be freed.
*/
const char *gpiod_line_info_get_consumer(struct gpiod_line_info *info);
/**
* @brief Get the direction setting of the line.
* @param info GPIO line info object.
* @return Returns ::GPIOD_LINE_DIRECTION_INPUT or
* ::GPIOD_LINE_DIRECTION_OUTPUT.
*/
enum gpiod_line_direction
gpiod_line_info_get_direction(struct gpiod_line_info *info);
/**
* @brief Get the edge detection setting of the line.
* @param info GPIO line info object.
* @return Returns ::GPIOD_LINE_EDGE_NONE, ::GPIOD_LINE_EDGE_RISING,
* ::GPIOD_LINE_EDGE_FALLING or ::GPIOD_LINE_EDGE_BOTH.
*/
enum gpiod_line_edge
gpiod_line_info_get_edge_detection(struct gpiod_line_info *info);
/**
* @brief Get the bias setting of the line.
* @param info GPIO line object.
* @return Returns ::GPIOD_LINE_BIAS_PULL_UP, ::GPIOD_LINE_BIAS_PULL_DOWN,
* ::GPIOD_LINE_BIAS_DISABLED or ::GPIOD_LINE_BIAS_UNKNOWN.
*/
enum gpiod_line_bias
gpiod_line_info_get_bias(struct gpiod_line_info *info);
/**
* @brief Get the drive setting of the line.
* @param info GPIO line info object.
* @return Returns ::GPIOD_LINE_DRIVE_PUSH_PULL, ::GPIOD_LINE_DRIVE_OPEN_DRAIN
* or ::GPIOD_LINE_DRIVE_OPEN_SOURCE.
*/
enum gpiod_line_drive
gpiod_line_info_get_drive(struct gpiod_line_info *info);
/**
* @brief Check if the logical value of the line is inverted compared to the
* physical.
* @param info GPIO line object.
* @return True if the line is "active-low", false otherwise.
*/
bool gpiod_line_info_is_active_low(struct gpiod_line_info *info);
/**
* @brief Check if the line is debounced (either by hardware or by the kernel
* software debouncer).
* @param info GPIO line info object.
* @return True if the line is debounced, false otherwise.
*/
bool gpiod_line_info_is_debounced(struct gpiod_line_info *info);
/**
* @brief Get the debounce period of the line, in microseconds.
* @param info GPIO line info object.
* @return Debounce period in microseconds.
* 0 if the line is not debounced.
*/
unsigned long
gpiod_line_info_get_debounce_period_us(struct gpiod_line_info *info);
/**
* @brief Get the event clock setting used for edge event timestamps for the
* line.
* @param info GPIO line info object.
* @return Returns ::GPIOD_LINE_CLOCK_MONOTONIC, ::GPIOD_LINE_CLOCK_HTE or
* ::GPIOD_LINE_CLOCK_REALTIME.
*/
enum gpiod_line_clock
gpiod_line_info_get_event_clock(struct gpiod_line_info *info);
/**
* @}
*
* @defgroup line_watch Line status watch events
* @{
*
* Accessors for the info event objects allowing to monitor changes in GPIO
* line status.
*
* Callers are notified about changes in a line's status due to GPIO uAPI
* calls. Each info event contains information about the event itself
* (timestamp, type) as well as a snapshot of line's status in the form
* of a line-info object.
*/
/**
* @brief Line status change event types.
*/
enum gpiod_info_event_type {
GPIOD_INFO_EVENT_LINE_REQUESTED = 1,
/**< Line has been requested. */
GPIOD_INFO_EVENT_LINE_RELEASED,
/**< Previously requested line has been released. */
GPIOD_INFO_EVENT_LINE_CONFIG_CHANGED,
/**< Line configuration has changed. */
};
/**
* @brief Free the info event object and release all associated resources.
* @param event Info event to free.
*/
void gpiod_info_event_free(struct gpiod_info_event *event);
/**
* @brief Get the event type of the status change event.
* @param event Line status watch event.
* @return One of ::GPIOD_INFO_EVENT_LINE_REQUESTED,
* ::GPIOD_INFO_EVENT_LINE_RELEASED or
* ::GPIOD_INFO_EVENT_LINE_CONFIG_CHANGED.
*/
enum gpiod_info_event_type
gpiod_info_event_get_event_type(struct gpiod_info_event *event);
/**
* @brief Get the timestamp of the event.
* @param event Line status watch event.
* @return Timestamp in nanoseconds, read from the monotonic clock.
*/
uint64_t gpiod_info_event_get_timestamp_ns(struct gpiod_info_event *event);
/**
* @brief Get the snapshot of line-info associated with the event.
* @param event Line info event object.
* @return Returns a pointer to the line-info object associated with the event.
* The object lifetime is tied to the event object, so the pointer must
* be not be freed by the caller.
* @warning Thread-safety:
* Since the line-info object is tied to the event, different threads
* may not operate on the event and line-info at the same time. The
* line-info can be copied using ::gpiod_line_info_copy in order to
* create a standalone object - which then may safely be used from a
* different thread concurrently.
*/
struct gpiod_line_info *
gpiod_info_event_get_line_info(struct gpiod_info_event *event);
/**
* @}
*
* @defgroup line_settings Line settings objects
* @{
*
* Functions for manipulating line settings objects.
*
* Line settings object contains a set of line properties that can be used
* when requesting lines or reconfiguring an existing request.
*
* Mutators in general can only fail if the new property value is invalid. The
* return values can be safely ignored - the object remains valid even after
* a mutator fails and simply uses the sane default appropriate for given
* property.
*/
/**
* @brief Create a new line settings object.
* @return New line settings object or NULL on error. The returned object must
* be freed by the caller using ::gpiod_line_settings_free.
*/
struct gpiod_line_settings *gpiod_line_settings_new(void);
/**
* @brief Free the line settings object and release all associated resources.
* @param settings Line settings object.
*/
void gpiod_line_settings_free(struct gpiod_line_settings *settings);
/**
* @brief Reset the line settings object to its default values.
* @param settings Line settings object.
*/
void gpiod_line_settings_reset(struct gpiod_line_settings *settings);
/**
* @brief Copy the line settings object.
* @param settings Line settings object to copy.
* @return New line settings object that must be freed using
* ::gpiod_line_settings_free or NULL on failure.
*/
struct gpiod_line_settings *
gpiod_line_settings_copy(struct gpiod_line_settings *settings);
/**
* @brief Set direction.
* @param settings Line settings object.
* @param direction New direction.
* @return 0 on success, -1 on error.
*/
int gpiod_line_settings_set_direction(struct gpiod_line_settings *settings,
enum gpiod_line_direction direction);
/**
* @brief Get direction.
* @param settings Line settings object.
* @return Current direction.
*/
enum gpiod_line_direction
gpiod_line_settings_get_direction(struct gpiod_line_settings *settings);
/**
* @brief Set edge detection.
* @param settings Line settings object.
* @param edge New edge detection setting.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_settings_set_edge_detection(struct gpiod_line_settings *settings,
enum gpiod_line_edge edge);
/**
* @brief Get edge detection.
* @param settings Line settings object.
* @return Current edge detection setting.
*/
enum gpiod_line_edge
gpiod_line_settings_get_edge_detection(struct gpiod_line_settings *settings);
/**
* @brief Set bias.
* @param settings Line settings object.
* @param bias New bias.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_settings_set_bias(struct gpiod_line_settings *settings,
enum gpiod_line_bias bias);
/**
* @brief Get bias.
* @param settings Line settings object.
* @return Current bias setting.
*/
enum gpiod_line_bias
gpiod_line_settings_get_bias(struct gpiod_line_settings *settings);
/**
* @brief Set drive.
* @param settings Line settings object.
* @param drive New drive setting.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_settings_set_drive(struct gpiod_line_settings *settings,
enum gpiod_line_drive drive);
/**
* @brief Get drive.
* @param settings Line settings object.
* @return Current drive setting.
*/
enum gpiod_line_drive
gpiod_line_settings_get_drive(struct gpiod_line_settings *settings);
/**
* @brief Set active-low setting.
* @param settings Line settings object.
* @param active_low New active-low setting.
*/
void gpiod_line_settings_set_active_low(struct gpiod_line_settings *settings,
bool active_low);
/**
* @brief Get active-low setting.
* @param settings Line settings object.
* @return True if active-low is enabled, false otherwise.
*/
bool gpiod_line_settings_get_active_low(struct gpiod_line_settings *settings);
/**
* @brief Set debounce period.
* @param settings Line settings object.
* @param period New debounce period in microseconds.
*/
void
gpiod_line_settings_set_debounce_period_us(struct gpiod_line_settings *settings,
unsigned long period);
/**
* @brief Get debounce period.
* @param settings Line settings object.
* @return Current debounce period in microseconds.
*/
unsigned long
gpiod_line_settings_get_debounce_period_us(
struct gpiod_line_settings *settings);
/**
* @brief Set event clock.
* @param settings Line settings object.
* @param event_clock New event clock.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_settings_set_event_clock(struct gpiod_line_settings *settings,
enum gpiod_line_clock event_clock);
/**
* @brief Get event clock setting.
* @param settings Line settings object.
* @return Current event clock setting.
*/
enum gpiod_line_clock
gpiod_line_settings_get_event_clock(struct gpiod_line_settings *settings);
/**
* @brief Set the output value.
* @param settings Line settings object.
* @param value New output value.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_settings_set_output_value(struct gpiod_line_settings *settings,
enum gpiod_line_value value);
/**
* @brief Get the output value.
* @param settings Line settings object.
* @return Current output value.
*/
enum gpiod_line_value
gpiod_line_settings_get_output_value(struct gpiod_line_settings *settings);
/**
* @}
*
* @defgroup line_config Line configuration objects
* @{
*
* Functions for manipulating line configuration objects.
*
* The line-config object contains the configuration for lines that can be
* used in two cases:
* - when making a line request
* - when reconfiguring a set of already requested lines.
*
* A new line-config object is empty. Using it in a request will lead to an
* error. In order to a line-config to become useful, it needs to be assigned
* at least one offset-to-settings mapping by calling
* ::gpiod_line_config_add_line_settings.
*
* When calling ::gpiod_chip_request_lines, the library will request all
* offsets that were assigned settings in the order that they were assigned.
* If any of the offsets was duplicated, the last one will take precedence.
*/
/**
* @brief Create a new line config object.
* @return New line config object or NULL on error. The returned object must
* be freed by the caller using ::gpiod_line_config_free.
*/
struct gpiod_line_config *gpiod_line_config_new(void);
/**
* @brief Free the line config object and release all associated resources.
* @param config Line config object to free.
*/
void gpiod_line_config_free(struct gpiod_line_config *config);
/**
* @brief Reset the line config object.
* @param config Line config object to free.
*
* Resets the entire configuration stored in the object. This is useful if
* the user wants to reuse the object without reallocating it.
*/
void gpiod_line_config_reset(struct gpiod_line_config *config);
/**
* @brief Add line settings for a set of offsets.
* @param config Line config object.
* @param offsets Array of offsets for which to apply the settings.
* @param num_offsets Number of offsets stored in the offsets array.
* @param settings Line settings to apply.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_config_add_line_settings(struct gpiod_line_config *config,
const unsigned int *offsets,
size_t num_offsets,
struct gpiod_line_settings *settings);
/**
* @brief Get line settings for offset.
* @param config Line config object.
* @param offset Offset for which to get line settings.
* @return New line settings object (must be freed by the caller) or NULL on
* error.
*/
struct gpiod_line_settings *
gpiod_line_config_get_line_settings(struct gpiod_line_config *config,
unsigned int offset);
/**
* @brief Set output values for a number of lines.
* @param config Line config object.
* @param values Buffer containing the output values.
* @param num_values Number of values in the buffer.
* @return 0 on success, -1 on error.
*
* This is a helper that allows users to set multiple (potentially different)
* output values at once while using the same line settings object. Instead of
* modifying the output value in the settings object and calling
* ::gpiod_line_config_add_line_settings multiple times, we can specify the
* settings, add them for a set of offsets and then call this function to
* set the output values.
*
* Values set by this function override whatever values were specified in the
* regular line settings.
*
* Each value must be associated with the line identified by the corresponding
* entry in the offset array filled by
* ::gpiod_line_request_get_requested_offsets.
*/
int gpiod_line_config_set_output_values(struct gpiod_line_config *config,
const enum gpiod_line_value *values,
size_t num_values);
/**
* @brief Get the number of configured line offsets.
* @param config Line config object.
* @return Number of offsets for which line settings have been added.
*/
size_t
gpiod_line_config_get_num_configured_offsets(struct gpiod_line_config *config);
/**
* @brief Get configured offsets.
* @param config Line config object.
* @param offsets Array to store offsets.
* @param max_offsets Number of offsets that can be stored in the offsets array.
* @return Number of offsets stored in the offsets array.
*
* If max_offsets is lower than the number of lines actually requested (this
* value can be retrieved using ::gpiod_line_config_get_num_configured_offsets),
* then only up to max_lines offsets will be stored in offsets.
*/
size_t
gpiod_line_config_get_configured_offsets(struct gpiod_line_config *config,
unsigned int *offsets,
size_t max_offsets);
/**
* @}
*
* @defgroup request_config Request configuration objects
* @{
*
* Functions for manipulating request configuration objects.
*
* Request config objects are used to pass a set of options to the kernel at
* the time of the line request. The mutators don't return error values. If the
* values are invalid, in general they are silently adjusted to acceptable
* ranges.
*/
/**
* @brief Create a new request config object.
* @return New request config object or NULL on error. The returned object must
* be freed by the caller using ::gpiod_request_config_free.
*/
struct gpiod_request_config *gpiod_request_config_new(void);
/**
* @brief Free the request config object and release all associated resources.
* @param config Line config object.
*/
void gpiod_request_config_free(struct gpiod_request_config *config);
/**
* @brief Set the consumer name for the request.
* @param config Request config object.
* @param consumer Consumer name.
* @note If the consumer string is too long, it will be truncated to the max
* accepted length.
*/
void gpiod_request_config_set_consumer(struct gpiod_request_config *config,
const char *consumer);
/**
* @brief Get the consumer name configured in the request config.
* @param config Request config object.
* @return Consumer name stored in the request config.
*/
const char *
gpiod_request_config_get_consumer(struct gpiod_request_config *config);
/**
* @brief Set the size of the kernel event buffer for the request.
* @param config Request config object.
* @param event_buffer_size New event buffer size.
* @note The kernel may adjust the value if it's too high. If set to 0, the
* default value will be used.
* @note The kernel buffer is distinct from and independent of the user space
* buffer (::gpiod_edge_event_buffer_new).
*/
void
gpiod_request_config_set_event_buffer_size(struct gpiod_request_config *config,
size_t event_buffer_size);
/**
* @brief Get the edge event buffer size for the request config.
* @param config Request config object.
* @return Edge event buffer size setting from the request config.
*/
size_t
gpiod_request_config_get_event_buffer_size(struct gpiod_request_config *config);
/**
* @}
*
* @defgroup line_request Line request operations
* @{
*
* Functions allowing interactions with requested lines.
*/
/**
* @brief Release the requested lines and free all associated resources.
* @param request Line request object to release.
*/
void gpiod_line_request_release(struct gpiod_line_request *request);
/**
* @brief Get the name of the chip this request was made on.
* @param request Line request object.
* @return Name the GPIO chip device. The returned pointer is valid for the
* lifetime of the request object and must not be freed by the caller.
*/
const char *
gpiod_line_request_get_chip_name(struct gpiod_line_request *request);
/**
* @brief Get the number of lines in the request.
* @param request Line request object.
* @return Number of requested lines.
*/
size_t
gpiod_line_request_get_num_requested_lines(struct gpiod_line_request *request);
/**
* @brief Get the offsets of the lines in the request.
* @param request Line request object.
* @param offsets Array to store offsets.
* @param max_offsets Number of offsets that can be stored in the offsets array.
* @return Number of offsets stored in the offsets array.
*
* If max_offsets is lower than the number of lines actually requested (this
* value can be retrieved using ::gpiod_line_request_get_num_requested_lines),
* then only up to max_lines offsets will be stored in offsets.
*/
size_t
gpiod_line_request_get_requested_offsets(struct gpiod_line_request *request,
unsigned int *offsets,
size_t max_offsets);
/**
* @brief Get the value of a single requested line.
* @param request Line request object.
* @param offset The offset of the line of which the value should be read.
* @return Returns 1 or 0 on success and -1 on error.
*/
enum gpiod_line_value
gpiod_line_request_get_value(struct gpiod_line_request *request,
unsigned int offset);
/**
* @brief Get the values of a subset of requested lines.
* @param request GPIO line request.
* @param num_values Number of lines for which to read values.
* @param offsets Array of offsets identifying the subset of requested lines
* from which to read values.
* @param values Array in which the values will be stored. Must be sized
* to hold \p num_values entries. Each value is associated with
* the line identified by the corresponding entry in \p offsets.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_request_get_values_subset(struct gpiod_line_request *request,
size_t num_values,
const unsigned int *offsets,
enum gpiod_line_value *values);
/**
* @brief Get the values of all requested lines.
* @param request GPIO line request.
* @param values Array in which the values will be stored. Must be sized to
* hold the number of lines filled by
* ::gpiod_line_request_get_num_requested_lines.
* Each value is associated with the line identified by the
* corresponding entry in the offset array filled by
* ::gpiod_line_request_get_requested_offsets.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_request_get_values(struct gpiod_line_request *request,
enum gpiod_line_value *values);
/**
* @brief Set the value of a single requested line.
* @param request Line request object.
* @param offset The offset of the line for which the value should be set.
* @param value Value to set.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_request_set_value(struct gpiod_line_request *request,
unsigned int offset,
enum gpiod_line_value value);
/**
* @brief Set the values of a subset of requested lines.
* @param request GPIO line request.
* @param num_values Number of lines for which to set values.
* @param offsets Array of offsets, containing the number of entries specified
* by \p num_values, identifying the requested lines for
* which to set values.
* @param values Array of values to set, containing the number of entries
* specified by \p num_values. Each value is associated with the
* line identified by the corresponding entry in \p offsets.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_request_set_values_subset(struct gpiod_line_request *request,
size_t num_values,
const unsigned int *offsets,
const enum gpiod_line_value *values);
/**
* @brief Set the values of all lines associated with a request.
* @param request GPIO line request.
* @param values Array containing the values to set. Must be sized to
* contain the number of lines filled by
* ::gpiod_line_request_get_num_requested_lines.
* Each value is associated with the line identified by the
* corresponding entry in the offset array filled by
* ::gpiod_line_request_get_requested_offsets.
* @return 0 on success, -1 on failure.
*/
int gpiod_line_request_set_values(struct gpiod_line_request *request,
const enum gpiod_line_value *values);
/**
* @brief Update the configuration of lines associated with a line request.
* @param request GPIO line request.
* @param config New line config to apply.
* @return 0 on success, -1 on failure.
* @note The new line configuration completely replaces the old.
* @note Any requested lines without overrides are configured to the requested
* defaults.
* @note Any configured overrides for lines that have not been requested
* are silently ignored.
*/
int gpiod_line_request_reconfigure_lines(struct gpiod_line_request *request,
struct gpiod_line_config *config);
/**
* @brief Get the file descriptor associated with a line request.
* @param request GPIO line request.
* @return The file descriptor associated with the request.
* This function never fails.
* The returned file descriptor must not be closed by the caller.
* Call ::gpiod_line_request_release to close the file.
*/
int gpiod_line_request_get_fd(struct gpiod_line_request *request);
/**
* @brief Wait for edge events on any of the requested lines.
* @param request GPIO line request.
* @param timeout_ns Wait time limit in nanoseconds. If set to 0, the function
* returns immediately. If set to a negative number, the
* function blocks indefinitely until an event becomes
* available.
* @return 0 if wait timed out, -1 if an error occurred, 1 if an event is
* pending.
*
* Lines must have edge detection set for edge events to be emitted.
* By default edge detection is disabled.
*/
int gpiod_line_request_wait_edge_events(struct gpiod_line_request *request,
int64_t timeout_ns);
/**
* @brief Read a number of edge events from a line request.
* @param request GPIO line request.
* @param buffer Edge event buffer, sized to hold at least \p max_events.
* @param max_events Maximum number of events to read.
* @return On success returns the number of events read from the file
* descriptor, on failure return -1.
* @note This function will block if no event was queued for the line request.
* @note Any exising events in the buffer are overwritten. This is not an
* append operation.
*/
int gpiod_line_request_read_edge_events(struct gpiod_line_request *request,
struct gpiod_edge_event_buffer *buffer,
size_t max_events);
/**
* @}
*
* @defgroup edge_event Line edge events handling
* @{
*
* Functions and data types for handling edge events.
*
* An edge event object contains information about a single line edge event.
* It contains the event type, timestamp and the offset of the line on which
* the event occurred as well as two sequence numbers (global for all lines
* in the associated request and local for this line only).
*
* Edge events are stored into an edge-event buffer object to improve
* performance and to limit the number of memory allocations when a large
* number of events are being read.
*/
/**
* @brief Event types.
*/
enum gpiod_edge_event_type {
GPIOD_EDGE_EVENT_RISING_EDGE = 1,
/**< Rising edge event. */
GPIOD_EDGE_EVENT_FALLING_EDGE,
/**< Falling edge event. */
};
/**
* @brief Free the edge event object.
* @param event Edge event object to free.
*/
void gpiod_edge_event_free(struct gpiod_edge_event *event);
/**
* @brief Copy the edge event object.
* @param event Edge event to copy.
* @return Copy of the edge event or NULL on error. The returned object must
* be freed by the caller using ::gpiod_edge_event_free.
*/
struct gpiod_edge_event *gpiod_edge_event_copy(struct gpiod_edge_event *event);
/**
* @brief Get the event type.
* @param event GPIO edge event.
* @return The event type (::GPIOD_EDGE_EVENT_RISING_EDGE or
* ::GPIOD_EDGE_EVENT_FALLING_EDGE).
*/
enum gpiod_edge_event_type
gpiod_edge_event_get_event_type(struct gpiod_edge_event *event);
/**
* @brief Get the timestamp of the event.
* @param event GPIO edge event.
* @return Timestamp in nanoseconds.
* @note The source clock for the timestamp depends on the event_clock
* setting for the line.
*/
uint64_t gpiod_edge_event_get_timestamp_ns(struct gpiod_edge_event *event);
/**
* @brief Get the offset of the line which triggered the event.
* @param event GPIO edge event.
* @return Line offset.
*/
unsigned int gpiod_edge_event_get_line_offset(struct gpiod_edge_event *event);
/**
* @brief Get the global sequence number of the event.
* @param event GPIO edge event.
* @return Sequence number of the event in the series of events for all lines
* in the associated line request.
*/
unsigned long gpiod_edge_event_get_global_seqno(struct gpiod_edge_event *event);
/**
* @brief Get the event sequence number specific to the line.
* @param event GPIO edge event.
* @return Sequence number of the event in the series of events only for this
* line within the lifetime of the associated line request.
*/
unsigned long gpiod_edge_event_get_line_seqno(struct gpiod_edge_event *event);
/**
* @brief Create a new edge event buffer.
* @param capacity Number of events the buffer can store (min = 1, max = 1024).
* @return New edge event buffer or NULL on error.
* @note If capacity equals 0, it will be set to a default value of 64. If
* capacity is larger than 1024, it will be limited to 1024.
* @note The user space buffer is independent of the kernel buffer
* (::gpiod_request_config_set_event_buffer_size). As the user space
* buffer is filled from the kernel buffer, there is no benefit making
* the user space buffer larger than the kernel buffer.
* The default kernel buffer size for each request is (16 * num_lines).
*/
struct gpiod_edge_event_buffer *
gpiod_edge_event_buffer_new(size_t capacity);
/**
* @brief Get the capacity (the max number of events that can be stored) of
* the event buffer.
* @param buffer Edge event buffer.
* @return The capacity of the buffer.
*/
size_t
gpiod_edge_event_buffer_get_capacity(struct gpiod_edge_event_buffer *buffer);
/**
* @brief Free the edge event buffer and release all associated resources.
* @param buffer Edge event buffer to free.
*/
void gpiod_edge_event_buffer_free(struct gpiod_edge_event_buffer *buffer);
/**
* @brief Get an event stored in the buffer.
* @param buffer Edge event buffer.
* @param index Index of the event in the buffer.
* @return Pointer to an event stored in the buffer. The lifetime of the
* event is tied to the buffer object. Users must not free the event
* returned by this function.
* @warning Thread-safety:
* Since events are tied to the buffer instance, different threads
* may not operate on the buffer and any associated events at the same
* time. Events can be copied using ::gpiod_edge_event_copy in order
* to create a standalone objects - which each may safely be used from
* a different thread concurrently.
*/
struct gpiod_edge_event *
gpiod_edge_event_buffer_get_event(struct gpiod_edge_event_buffer *buffer,
unsigned long index);
/**
* @brief Get the number of events a buffer has stored.
* @param buffer Edge event buffer.
* @return Number of events stored in the buffer.
*/
size_t
gpiod_edge_event_buffer_get_num_events(struct gpiod_edge_event_buffer *buffer);
/**
* @}
*
* @defgroup misc Stuff that didn't fit anywhere else
* @{
*
* Various libgpiod-related functions.
*/
/**
* @brief Check if the file pointed to by path is a GPIO chip character device.
* @param path Path to check.
* @return True if the file exists and is either a GPIO chip character device
* or a symbolic link to one.
*/
bool gpiod_is_gpiochip_device(const char *path);
/**
* @brief Get the API version of the library as a human-readable string.
* @return A valid pointer to a human-readable string containing the library
* version. The pointer is valid for the lifetime of the program and
* must not be freed by the caller.
*/
const char *gpiod_api_version(void);
/**
* @}
*/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* __LIBGPIOD_GPIOD_H__ */