Hardware Abstraction Layer for FreeRTOS
gpio.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Author: Andreas Werner <kernel@andy89.org>
4  * Date: 2016
5  */
6 #ifndef GPIO_H_
7 #define GPIO_H_
8 #include <stdint.h>
9 #include <stdbool.h>
10 #include <mux.h>
11 #include <hal.h>
12 
26 struct gpio;
30 struct gpio_pin;
44 };
62 };
80 };
81 
82 #ifdef CONFIG_GPIO_MULTI
83 
86 struct gpio_ops {
87  struct gpio *(*gpio_init)(uint32_t index);
88  int32_t (*gpio_deinit)(struct gpio *gpio);
89  struct gpio_pin *(*gpioPin_init)(struct gpio *gpio, uint32_t pin, enum gpio_direction dir, enum gpio_setting setting);
90  int32_t (*gpioPin_deinit)(struct gpio_pin *pin);
91  int32_t (*gpioPin_enableInterrupt)(struct gpio_pin *pin);
92  int32_t (*gpioPin_disableInterrupt)(struct gpio_pin *pin);
93  int32_t (*gpioPin_setCallback)(struct gpio_pin *pin, bool (*callback)(struct gpio_pin *pin, uint32_t pinID, void *data), void *data, enum gpio_interrupt inter);
94  int32_t (*gpioPin_setDirection)(struct gpio_pin *pin, enum gpio_direction dir);
95  int32_t (*gpioPin_setSetting)(struct gpio_pin *pin, enum gpio_setting setting);
96  int32_t (*gpioPin_SchmittTrigger)(struct gpio_pin *pin, bool schmitt);
97  int32_t (*gpioPin_setValue)(struct gpio_pin *pin, bool value);
98  int32_t (*gpioPin_setPin)(struct gpio_pin *pin);
99  int32_t (*gpioPin_clearPin)(struct gpio_pin *pin);
100  int32_t (*gpioPin_togglePin)(struct gpio_pin *pin);
101  bool (*gpioPin_getValue)(struct gpio_pin *pin);
102 };
103 #endif
104 
107 struct gpio_generic {
112  bool init;
113 #ifdef CONFIG_INSTANCE_NAME
114 
117  const char *name;
118 #endif
119 #ifdef CONFIG_GPIO_MULTI
120 
123  const struct gpio_ops *ops;
124 #endif
125 };
131 };
132 
133 #ifndef CONFIG_GPIO_MULTI
134 
138 struct gpio *gpio_init(uint32_t index);
144 int32_t gpio_deinit(struct gpio *gpio);
145 
165 struct gpio_pin *gpioPin_init(struct gpio *gpio, uint32_t pin, enum gpio_direction dir, enum gpio_setting setting);
171 int32_t gpioPin_deinit(struct gpio_pin *pin);
177 int32_t gpioPin_enableInterrupt(struct gpio_pin *pin);
183 int32_t gpioPin_disableInterrupt(struct gpio_pin *pin);
192 int32_t gpioPin_setCallback(struct gpio_pin *pin, bool (*callback)(struct gpio_pin *pin, uint32_t pinID, void *data), void *data, enum gpio_interrupt inter);
199 int32_t gpioPin_setDirection(struct gpio_pin *pin, enum gpio_direction dir);
206 int32_t gpioPin_setSetting(struct gpio_pin *pin, enum gpio_setting setting);
213 int32_t gpioPin_SchmittTrigger(struct gpio_pin *pin, bool schmitt);
220 int32_t gpioPin_setValue(struct gpio_pin *pin, bool value);
226 int32_t gpioPin_setPin(struct gpio_pin *pin);
232 int32_t gpioPin_clearPin(struct gpio_pin *pin);
238 int32_t gpioPin_togglePin(struct gpio_pin *pin);
244 bool gpioPin_getValue(struct gpio_pin *pin);
246 #else
247 inline struct gpio *gpio_init(uint32_t index) {
249  struct gpio_generic *gpio = (struct gpio_generic *) HAL_GET_DEV(gpio, index);
250  if (gpio == NULL) {
251  return NULL;
252  }
253  return gpio->ops->gpio_init(index);
254 }
255 inline int32_t gpio_deinit(struct gpio *gpio) {
256  struct gpio_generic *g = (struct gpio_generic *) gpio;
257  return g->ops->gpio_deinit(gpio);
258 }
259 inline struct gpio_pin *gpioPin_init(struct gpio *gpio, uint32_t pin, enum gpio_direction dir, enum gpio_setting setting) {
260  struct gpio_generic *g = (struct gpio_generic *) gpio;
261  return g->ops->gpioPin_init(gpio, pin, dir, setting);
262 }
263 inline int32_t gpioPin_deinit(struct gpio_pin *pin) {
264  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
265  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
266  return g->ops->gpioPin_deinit(pin);
267 }
268 inline int32_t gpioPin_enableInterrupt(struct gpio_pin *pin) {
269  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
270  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
271  return g->ops->gpioPin_enableInterrupt(pin);
272 }
273 inline int32_t gpioPin_disableInterrupt(struct gpio_pin *pin) {
274  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
275  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
276  return g->ops->gpioPin_disableInterrupt(pin);
277 }
278 inline int32_t gpioPin_setCallback(struct gpio_pin *pin, bool (*callback)(struct gpio_pin *pin, uint32_t pinID, void *data), void *data, enum gpio_interrupt inter) {
279  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
280  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
281  return g->ops->gpioPin_setCallback(pin, callback, data, inter);
282 }
283 inline int32_t gpioPin_setDirection(struct gpio_pin *pin, enum gpio_direction dir) {
284  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
285  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
286  return g->ops->gpioPin_setDirection(pin, dir);
287 }
288 inline int32_t gpioPin_setSetting(struct gpio_pin *pin, enum gpio_setting setting) {
289  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
290  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
291  return g->ops->gpioPin_setSetting(pin, setting);
292 }
293 inline int32_t gpioPin_SchmittTrigger(struct gpio_pin *pin, bool schmitt) {
294  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
295  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
296  return g->ops->gpioPin_SchmittTrigger(pin, schmitt);
297 }
298 inline int32_t gpioPin_setValue(struct gpio_pin *pin, bool value) {
299  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
300  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
301  return g->ops->gpioPin_setValue(pin, value);
302 }
303 inline int32_t gpioPin_setPin(struct gpio_pin *pin) {
304  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
305  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
306  return g->ops->gpioPin_setPin(pin);
307 }
308 inline int32_t gpioPin_clearPin(struct gpio_pin *pin) {
309  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
310  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
311  return g->ops->gpioPin_clearPin(pin);
312 }
313 inline int32_t gpioPin_togglePin(struct gpio_pin *pin) {
314  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
315  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
316  return g->ops->gpioPin_togglePin(pin);
317 }
318 inline bool gpioPin_getValue(struct gpio_pin *pin) {
319  struct gpio_pin_generic *p = (struct gpio_pin_generic *) pin;
320  struct gpio_generic *g = (struct gpio_generic *) p->gpio;
321  return g->ops->gpioPin_getValue(pin);
322 }
323 #endif
324 
325 #endif
gpio_pin_generic
Definition: gpio.h:129
gpioPin_clearPin
int32_t gpioPin_clearPin(struct gpio_pin *pin)
GPIO_EITHER
@ GPIO_EITHER
Definition: gpio.h:79
gpioPin_setDirection
int32_t gpioPin_setDirection(struct gpio_pin *pin, enum gpio_direction dir)
gpioPin_setValue
int32_t gpioPin_setValue(struct gpio_pin *pin, bool value)
gpioPin_disableInterrupt
int32_t gpioPin_disableInterrupt(struct gpio_pin *pin)
hal.h
gpioPin_enableInterrupt
int32_t gpioPin_enableInterrupt(struct gpio_pin *pin)
gpio_pin_generic::gpio
struct gpio_generic * gpio
Definition: gpio.h:130
gpioPin_setPin
int32_t gpioPin_setPin(struct gpio_pin *pin)
gpioPin_togglePin
int32_t gpioPin_togglePin(struct gpio_pin *pin)
GPIO_PULL_DOWN
@ GPIO_PULL_DOWN
Definition: gpio.h:61
GPIO_PULL_UP
@ GPIO_PULL_UP
Definition: gpio.h:57
gpio_deinit
int32_t gpio_deinit(struct gpio *gpio)
gpio_init
struct gpio * gpio_init(uint32_t index)
HAL_DEFINE_GLOBAL_ARRAY
#define HAL_DEFINE_GLOBAL_ARRAY(gns)
Definition: hal.h:149
gpioPin_deinit
int32_t gpioPin_deinit(struct gpio_pin *pin)
gpio_setting
gpio_setting
Definition: gpio.h:49
gpio_interrupt
gpio_interrupt
Definition: gpio.h:67
GPIO_RISING
@ GPIO_RISING
Definition: gpio.h:75
HAL_GET_DEV
#define HAL_GET_DEV(gns, index)
Definition: hal.h:182
gpio_generic
Definition: gpio.h:107
gpioPin_SchmittTrigger
int32_t gpioPin_SchmittTrigger(struct gpio_pin *pin, bool schmitt)
GPIO_FALLING
@ GPIO_FALLING
Definition: gpio.h:71
gpioPin_setSetting
int32_t gpioPin_setSetting(struct gpio_pin *pin, enum gpio_setting setting)
gpioPin_init
struct gpio_pin * gpioPin_init(struct gpio *gpio, uint32_t pin, enum gpio_direction dir, enum gpio_setting setting)
GPIO_OUTPUT
@ GPIO_OUTPUT
Definition: gpio.h:43
GPIO_OPEN
@ GPIO_OPEN
Definition: gpio.h:53
gpio_generic::init
bool init
Definition: gpio.h:112
gpioPin_setCallback
int32_t gpioPin_setCallback(struct gpio_pin *pin, bool(*callback)(struct gpio_pin *pin, uint32_t pinID, void *data), void *data, enum gpio_interrupt inter)
gpioPin_getValue
bool gpioPin_getValue(struct gpio_pin *pin)
GPIO_INPUT
@ GPIO_INPUT
Definition: gpio.h:39
gpio_direction
gpio_direction
Definition: gpio.h:35
mux.h