#ifndef _LIBXPIO_H
#define _LIBXPIO_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
#include <libdevinfo.h>
#include <sys/gpio/dpio.h>
typedef enum {
XPIO_ERR_OK = 0,
XPIO_ERR_NO_MEM,
XPIO_ERR_LIBDEVINFO,
XPIO_ERR_INTERNAL,
XPIO_ERR_BAD_PTR,
XPIO_ERR_WRONG_MINOR_TYPE,
XPIO_ERR_OPEN_DEV,
XPIO_ERR_KGPIO,
XPIO_ERR_BAD_CTRL_NAME,
XPIO_ERR_BAD_GPIO_ID,
XPIO_ERR_BAD_UPDATE,
XPIO_ERR_UPDATE_USED,
XPIO_ERR_BAD_DPIO_FEAT,
XPIO_ERR_BAD_DPIO_NAME,
XPIO_ERR_BAD_GPIO_NAME,
XPIO_ERR_NO_LOOKUP_MATCH
} xpio_err_t;
typedef enum {
XPIO_ATTR_TYPE_STRING,
XPIO_ATTR_TYPE_UINT32
} xpio_attr_type_t;
typedef enum {
XPIO_ATTR_PROT_RO,
XPIO_ATTR_PROT_RW
} xpio_attr_prot_t;
typedef struct xpio xpio_t;
typedef struct xpio_ctrl xpio_ctrl_t;
typedef struct xpio_ctrl_info xpio_ctrl_info_t;
typedef struct xpio_gpio_info xpio_gpio_info_t;
typedef struct xpio_gpio_attr xpio_gpio_attr_t;
typedef struct xpio_gpio_attr_err xpio_gpio_attr_err_t;
typedef struct xpio_gpio_update xpio_gpio_update_t;
typedef struct xpio_dpio_info xpio_dpio_info_t;
extern xpio_t *xpio_init(void);
extern void xpio_fini(xpio_t *);
extern xpio_err_t xpio_err(xpio_t *);
extern int32_t xpio_syserr(xpio_t *);
extern const char *xpio_errmsg(xpio_t *);
extern const char *xpio_err2str(xpio_t *, xpio_err_t);
typedef struct {
di_minor_t xcd_minor;
} xpio_ctrl_disc_t;
typedef bool (*xpio_ctrl_disc_f)(xpio_t *, xpio_ctrl_disc_t *, void *);
extern void xpio_ctrl_discover(xpio_t *, xpio_ctrl_disc_f, void *);
extern bool xpio_ctrl_init(xpio_t *, di_minor_t, xpio_ctrl_t **);
extern bool xpio_ctrl_init_by_name(xpio_t *, const char *, xpio_ctrl_t **);
extern void xpio_ctrl_fini(xpio_ctrl_t *);
extern bool xpio_ctrl_info(xpio_ctrl_t *, xpio_ctrl_info_t **);
extern void xpio_ctrl_info_free(xpio_ctrl_info_t *);
extern uint32_t xpio_ctrl_info_ngpios(xpio_ctrl_info_t *);
extern uint32_t xpio_ctrl_info_ndpios(xpio_ctrl_info_t *);
extern const char *xpio_ctrl_info_devpath(xpio_ctrl_info_t *);
extern bool xpio_gpio_lookup_id(xpio_ctrl_t *, const char *, uint32_t *);
extern bool xpio_gpio_info(xpio_ctrl_t *, uint32_t, xpio_gpio_info_t **);
extern uint32_t xpio_gpio_id(xpio_gpio_info_t *);
extern xpio_gpio_attr_t *xpio_gpio_attr_next(xpio_gpio_info_t *,
xpio_gpio_attr_t *);
extern xpio_gpio_attr_t *xpio_gpio_attr_find(xpio_gpio_info_t *, const char *);
extern const char *xpio_gpio_attr_name(xpio_gpio_info_t *, xpio_gpio_attr_t *);
extern xpio_attr_type_t xpio_gpio_attr_type(xpio_gpio_info_t *,
xpio_gpio_attr_t *);
extern xpio_attr_prot_t xpio_gpio_attr_prot(xpio_gpio_info_t *,
xpio_gpio_attr_t *);
extern bool xpio_gpio_attr_value_uint32(xpio_gpio_attr_t *, uint32_t *);
extern bool xpio_gpio_attr_value_string(xpio_gpio_attr_t *, const char **);
extern void xpio_gpio_attr_possible_uint32(xpio_gpio_info_t *,
xpio_gpio_attr_t *, uint32_t **, uint_t *);
extern void xpio_gpio_attr_possible_string(xpio_gpio_info_t *,
xpio_gpio_attr_t *, const char ***, uint_t *);
extern bool xpio_gpio_attr_xlate_to_str(xpio_gpio_info_t *, xpio_gpio_attr_t *,
char *, size_t);
extern bool xpio_gpio_attr_xlate_uint32_to_str(xpio_gpio_info_t *,
xpio_gpio_attr_t *, uint32_t, char *, size_t);
extern void xpio_gpio_info_free(xpio_gpio_info_t *);
typedef enum {
XPIO_UPDATE_ERR_OK,
XPIO_UPDATE_ERR_RO,
XPIO_UPDATE_ERR_UNKNOWN_ATTR,
XPIO_UPDATE_ERR_BAD_TYPE,
XPIO_UPDATE_ERR_UNKNOWN_VAL,
XPIO_UPDATE_ERR_CANT_XLATE,
XPIO_UPDATE_ERR_CANT_APPLY_VAL,
XPIO_UPDATE_ERR_NO_MEM,
XPIO_UPDATE_ERR_INTERNAL
} xpio_update_err_t;
extern bool xpio_gpio_update_init(xpio_t *, xpio_gpio_info_t *,
xpio_gpio_update_t **);
extern xpio_update_err_t xpio_update_err(xpio_gpio_update_t *);
extern int32_t xpio_update_syserr(xpio_gpio_update_t *);
extern const char *xpio_update_errmsg(xpio_gpio_update_t *);
extern const char *xpio_update_err2str(xpio_gpio_update_t *,
xpio_update_err_t);
extern bool xpio_gpio_attr_set_str(xpio_gpio_update_t *, xpio_gpio_attr_t *,
const char *);
extern bool xpio_gpio_attr_set_uint32(xpio_gpio_update_t *, xpio_gpio_attr_t *,
uint32_t);
extern bool xpio_gpio_attr_from_str(xpio_gpio_update_t *,
xpio_gpio_attr_t *, const char *);
extern bool xpio_gpio_update(xpio_ctrl_t *, xpio_gpio_update_t *);
extern xpio_gpio_attr_err_t *xpio_gpio_attr_err_next(xpio_gpio_update_t *,
xpio_gpio_attr_err_t *);
extern const char *xpio_gpio_attr_err_name(xpio_gpio_attr_err_t *);
extern xpio_update_err_t xpio_gpio_attr_err_err(xpio_gpio_attr_err_t *);
extern void xpio_gpio_update_free(xpio_gpio_update_t *);
typedef enum {
XPIO_DPIO_F_READ = 1 << 0,
XPIO_DPIO_F_WRITE = 1 << 1,
XPIO_DPIO_F_KERNEL = 1 << 2,
} xpio_dpio_features_t;
extern bool xpio_dpio_create(xpio_ctrl_t *, xpio_gpio_info_t *, const char *,
xpio_dpio_features_t);
extern bool xpio_dpio_destroy(xpio_ctrl_t *, xpio_gpio_info_t *);
typedef struct {
di_minor_t xdd_minor;
} xpio_dpio_disc_t;
typedef bool (*xpio_dpio_disc_f)(xpio_t *, xpio_dpio_disc_t *, void *);
extern void xpio_dpio_discover(xpio_t *, xpio_dpio_disc_f, void *);
extern bool xpio_dpio_info(xpio_t *, di_minor_t, xpio_dpio_info_t **);
extern const char *xpio_dpio_info_ctrl(xpio_dpio_info_t *);
extern const char *xpio_dpio_info_name(xpio_dpio_info_t *);
extern uint32_t xpio_dpio_info_gpionum(xpio_dpio_info_t *);
extern dpio_caps_t xpio_dpio_info_caps(xpio_dpio_info_t *);
extern dpio_flags_t xpio_dpio_info_flags(xpio_dpio_info_t *);
extern void xpio_dpio_info_free(xpio_dpio_info_t *);
#ifdef __cplusplus
}
#endif
#endif