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/tools/gpiotools.h
Bartosz Golaszewski 78fd3f3b62 tools: provide the libgpiotools shared library
In order to enable users of the project to reuse the high-level functions
provided to gpio-tools via the static tools-common library (for
instance: for line lookup by name), expose a sub-set of its
functionality in new shared library: libgpiotools, accompanied by a new
public header and providing a stable API/ABI.

Add a new rst page documenting the public API of the libgpiotools shared
library and integrate it into the sphinx build.

Closes: https://github.com/brgl/libgpiod/discussions/178
Acked-by: Kent Gibson <warthog618@gmail.com>
Link: https://patch.msgid.link/20260513-tools-common-shared-lib-v1-1-58ac28a9f1d5@oss.qualcomm.com
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
2026-05-18 10:35:51 +02:00

237 lines
8.4 KiB
C

/* SPDX-License-Identifier: LGPL-2.1-or-later */
/* SPDX-FileCopyrightText: 2017-2021 Bartosz Golaszewski <bartekgola@gmail.com> */
/* SPDX-FileCopyrightText: 2022 Kent Gibson <warthog618@gmail.com> */
/* SPDX-FileCopyrightText: 2026 Qualcomm Technologies, Inc. and/or its subsidiaries */
/**
* @file gpiotools.h
*/
#ifndef __GPIOTOOLS_H__
#define __GPIOTOOLS_H__
#include <gpiod.h>
#include <stdbool.h>
#include <stdint.h>
/**
* @defgroup gpiotools GPIO tools helpers
* @{
*
* Reusable chip and line resolution helpers used by the suite of GPIO
* command-line tools. These functions allow users to build their own programs
* on top of libgpiod using the same high-level abstractions as the gpio-tools.
*
* Unlike libgpiod core C API, public structures exposed by libgpiotools are
* not opaque by design. The goal is to allow easy access to members without
* providing a large number of very similar accessors. We leave some padding
* for potential future extensions.
*
* Error handling: functions typically return negative integer values or NULL
* pointers on failure and set errno to indicate the cause unless otherwise
* noted.
*/
/**
* @brief Descriptor for a single resolved GPIO line.
*/
struct gpiotools_resolved_line {
/** Identifier string from the command line. */
const char *id;
/**
* ID parsed as an integer offset, or -1 if the line must be resolved
* by name.
*/
int id_as_offset;
/** True once the line has been located on a chip. */
bool resolved;
/** True if strict mode found the name on more than one chip. */
bool not_unique;
/** Line info object; only valid once resolved. */
struct gpiod_line_info *info;
/** Index of the owning chip in the resolver's chips array. */
int chip_num;
/** Offset of the line on its chip. */
unsigned int offset;
/** Line value used by gpioget/gpioset. */
int value;
/** @cond INTERNAL */
/* Reserved for future extensions. */
uint32_t padding[5];
/** @endcond */
};
/**
* @brief Descriptor for a single GPIO chip referenced by a resolver.
*/
struct gpiotools_resolved_chip {
/** Chip info object. */
struct gpiod_chip_info *info;
/** Path to the chip device file. */
char *path;
/** @cond INTERNAL */
/* Reserved for future extensions. */
uint32_t padding[5];
/** @endcond */
};
/**
* @brief Resolver mapping requested line names or offsets to GPIO lines.
*/
struct gpiotools_line_resolver {
/** Number of chips the lines span; also the number of entries in chips. */
int num_chips;
/** Number of entries in lines. */
int num_lines;
/** Number of lines that have been found so far. */
int num_found;
/** If true, perform an exhaustive search to verify line name uniqueness. */
bool strict;
/** Array of chip descriptors for the chips that own the requested lines. */
struct gpiotools_resolved_chip *chips;
/** @cond INTERNAL */
/* Reserved for future extensions. */
uint32_t padding[10];
/** @endcond */
/** Flexible array of line descriptors for the requested lines. */
struct gpiotools_resolved_line lines[];
};
/**
* @brief Look up the path to a GPIO chip device.
* @param id Chip identifier: a number ("0"), a name ("gpiochip0"), or a path
* ("/dev/gpiochip0").
* @return Pointer to a newly allocated string containing the filesystem path
* to the GPIO chip or NULL on failure. The user is responsible for
* calling free() on the pointer returned on success.
*/
char *gpiotools_chip_path_lookup(const char *id);
/**
* @brief Get the paths of GPIO chip devices matching an identifier.
* @param id Chip identifier, or NULL to return all chips.
* @param paths_ptr On success, set to a newly allocated array of path strings.
* The caller must free() each element and the array itself.
* @return Number of chips found (0 if none), or negative errno on error.
*/
int gpiotools_chip_paths(const char *id, char ***paths_ptr);
/**
* @brief Get the paths of all GPIO chip devices on the system.
* @param paths_ptr On success, set to a newly allocated array of path strings.
* The caller must free() each element and the array itself.
* @return Number of chips found (0 if none), or negative errno on error.
*/
int gpiotools_all_chip_paths(char ***paths_ptr);
/**
* @brief Allocate and initialise a line resolver.
* @param num_lines Number of lines to resolve.
* @param lines Array of line identifiers (names or offset strings).
* @param num_chips Number of chips to allocate space for.
* @param strict If true, perform an exhaustive search to verify that line
* names are unique.
* @param by_name If true, treat all identifiers as names; if false, try to
* parse them as numeric offsets first.
* @return Pointer to the new resolver, or NULL on failure.
*/
struct gpiotools_line_resolver *
gpiotools_resolver_init(int num_lines, char **lines, int num_chips,
bool strict, bool by_name);
/**
* @brief Resolve lines by numeric offset.
* @param resolver Resolver to update.
* @param num_lines Number of lines on the chip.
*
* Marks lines whose identifier was successfully parsed as a numeric offset as
* resolved. Only applies to the first chip (chip_num == 0).
*
* @return True if any line was resolved, false otherwise.
*/
bool gpiotools_resolve_lines_by_offset(struct gpiotools_line_resolver *resolver,
unsigned int num_lines);
/**
* @brief Check whether line resolution is complete.
* @param resolver Resolver to check.
*
* In non-strict mode, resolution is considered done when all requested lines
* have been found. In strict mode this always returns false so that the
* caller performs an exhaustive search.
*
* @return True if resolution is complete, false otherwise.
*/
bool gpiotools_resolve_done(struct gpiotools_line_resolver *resolver);
/**
* @brief Resolve line names or offsets to GPIO lines on the system.
* @param num_lines Number of lines to resolve.
* @param lines Array of line identifiers (names or offset strings).
* @param chip_id Chip identifier to restrict the search, or NULL to search
* all chips.
* @param strict If true, verify that line names are unique across all chips.
* @param by_name If true, treat all identifiers as names.
* @return Pointer to the populated resolver, or NULL on error with errno set.
*/
struct gpiotools_line_resolver *
gpiotools_resolve_lines(int num_lines, char **lines, const char *chip_id,
bool strict, bool by_name);
/**
* @brief Free a line resolver and all memory it owns.
* @param resolver Resolver to free. May be NULL.
*/
void gpiotools_free_line_resolver(struct gpiotools_line_resolver *resolver);
/**
* @brief Extract offsets and optionally values for lines on a specific chip.
* @param resolver Resolver containing the resolved lines.
* @param chip_num Index of the chip to query.
* @param offsets Pre-allocated array to receive the line offsets.
* @param values Pre-allocated array to receive the line values, or NULL.
* @return Number of lines belonging to the specified chip.
* @note offsets and values must be large enough to hold the number of lines
* stored in the resolver
*/
int
gpiotools_get_line_offsets_and_values(struct gpiotools_line_resolver *resolver,
int chip_num, unsigned int *offsets,
enum gpiod_line_value *values);
/**
* @brief Get the name of a chip referenced by the resolver.
* @param resolver Resolver containing the chip.
* @param chip_num Index of the chip.
* @return Pointer to the chip name string owned by the resolver.
*/
const char *gpiotools_get_chip_name(struct gpiotools_line_resolver *resolver,
int chip_num);
/**
* @brief Get the name of a resolved line.
* @param resolver Resolver containing the line.
* @param chip_num Index of the chip the line belongs to.
* @param offset Offset of the line on the chip.
* @return Pointer to the line name string owned by the resolver, or NULL if
* the line has no name.
*/
const char *gpiotools_get_line_name(struct gpiotools_line_resolver *resolver,
int chip_num, unsigned int offset);
/**
* @brief Update line values stored in the resolver for a specific chip.
* @param resolver Resolver to update.
* @param chip_num Index of the chip whose lines should be updated.
* @param values Array of values to store, one per line on the chip in the
* order they appear in the resolver.
*/
void gpiotools_set_line_values(struct gpiotools_line_resolver *resolver,
int chip_num, enum gpiod_line_value *values);
/**
* @}
*/
#endif /* __GPIOTOOLS_H__ */