#ifndef _SYS_GPIO_H_
#define _SYS_GPIO_H_
#include <sys/ioccom.h>
#include <sys/time.h>
#define GPIO_PIN_LOW 0x00
#define GPIO_PIN_HIGH 0x01
#define GPIOMAXNAME 64
#define GPIO_PIN_INPUT 0x00000001
#define GPIO_PIN_OUTPUT 0x00000002
#define GPIO_PIN_INOUT 0x00000004
#define GPIO_PIN_OPENDRAIN 0x00000008
#define GPIO_PIN_PUSHPULL 0x00000010
#define GPIO_PIN_TRISTATE 0x00000020
#define GPIO_PIN_PULLUP 0x00000040
#define GPIO_PIN_PULLDOWN 0x00000080
#define GPIO_PIN_INVIN 0x00000100
#define GPIO_PIN_INVOUT 0x00000200
#define GPIO_PIN_USER 0x00000400
#define GPIO_PIN_PULSATE 0x00000800
#define GPIO_PIN_SET 0x00008000
#define GPIO_PIN_ALT0 0x00010000
#define GPIO_PIN_ALT1 0x00020000
#define GPIO_PIN_ALT2 0x00040000
#define GPIO_PIN_ALT3 0x00080000
#define GPIO_PIN_ALT4 0x00100000
#define GPIO_PIN_ALT5 0x00200000
#define GPIO_PIN_ALT6 0x00400000
#define GPIO_PIN_ALT7 0x00800000
#define GPIO_PIN_HWCAPS (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT | \
GPIO_PIN_INOUT | GPIO_PIN_OPENDRAIN | \
GPIO_PIN_PUSHPULL | GPIO_PIN_TRISTATE | \
GPIO_PIN_PULLUP | GPIO_PIN_PULLDOWN | \
GPIO_PIN_PULSATE | GPIO_PIN_ALT0 | \
GPIO_PIN_ALT1 | GPIO_PIN_ALT2 | \
GPIO_PIN_ALT3 | GPIO_PIN_ALT4 | \
GPIO_PIN_ALT5 | GPIO_PIN_ALT6 | \
GPIO_PIN_ALT7)
#define GPIO_INTR_POS_EDGE 0x00000001
#define GPIO_INTR_NEG_EDGE 0x00000002
#define GPIO_INTR_DOUBLE_EDGE 0x00000004
#define GPIO_INTR_HIGH_LEVEL 0x00000008
#define GPIO_INTR_LOW_LEVEL 0x00000010
#define GPIO_INTR_MPSAFE 0x80000000
#define GPIO_INTR_EDGE_MASK (GPIO_INTR_POS_EDGE | \
GPIO_INTR_NEG_EDGE | \
GPIO_INTR_DOUBLE_EDGE)
#define GPIO_INTR_LEVEL_MASK (GPIO_INTR_HIGH_LEVEL | \
GPIO_INTR_LOW_LEVEL)
#define GPIO_INTR_MODE_MASK (GPIO_INTR_EDGE_MASK | \
GPIO_INTR_LEVEL_MASK)
struct gpio_info {
int gpio_npins;
};
struct gpio_req {
char gp_name[GPIOMAXNAME];
int gp_pin;
int gp_value;
};
struct gpio_set {
char gp_name[GPIOMAXNAME];
int gp_pin;
int gp_caps;
int gp_flags;
char gp_name2[GPIOMAXNAME];
};
struct gpio_attach {
char ga_dvname[16];
int ga_offset;
uint32_t ga_mask;
uint32_t ga_flags;
};
#define GPIOINFO _IOR('G', 0, struct gpio_info)
#define GPIOSET _IOWR('G', 5, struct gpio_set)
#define GPIOUNSET _IOWR('G', 6, struct gpio_set)
#define GPIOREAD _IOWR('G', 7, struct gpio_req)
#define GPIOWRITE _IOWR('G', 8, struct gpio_req)
#define GPIOTOGGLE _IOWR('G', 9, struct gpio_req)
#define GPIOATTACH _IOWR('G', 10, struct gpio_attach)
#ifdef COMPAT_50
struct gpio_attach50 {
char ga_dvname[16];
int ga_offset;
uint32_t ga_mask;
};
struct gpio_pin_ctl {
int gp_pin;
int gp_caps;
int gp_flags;
};
struct gpio_pin_op {
int gp_pin;
int gp_value;
};
#define GPIOPINREAD _IOWR('G', 1, struct gpio_pin_op)
#define GPIOPINWRITE _IOWR('G', 2, struct gpio_pin_op)
#define GPIOPINTOGGLE _IOWR('G', 3, struct gpio_pin_op)
#define GPIOPINCTL _IOWR('G', 4, struct gpio_pin_ctl)
#define GPIOATTACH50 _IOWR('G', 10, struct gpio_attach50)
#define GPIODETACH50 _IOWR('G', 11, struct gpio_attach50)
#define GPIODETACH _IOWR('G', 11, struct gpio_attach)
#endif
#endif