Paparazzi UAS  v5.18.0_stable
Paparazzi is a free software Unmanned Aircraft System.
gpio_ext_common.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) Tom van Dijk <tomvand@users.noreply.github.com>
3  *
4  * This file is part of paparazzi
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, see
18  * <http://www.gnu.org/licenses/>.
19  */
20 
26 #include "gpio_ext_common.h"
27 
28 #include "generated/airframe.h"
29 #include "generated/modules.h"
30 #include "mcu_periph/gpio.h"
31 
32 #include <stdint.h>
33 
34 
35 /* External GPIO providers */
36 #define GPIO_EXT_NOT_PROVIDED NULL
37 
38 #ifndef GPIO_EXT_PROVIDER1
39 #define GPIO_EXT_PROVIDER1 GPIO_EXT_NOT_PROVIDED
40 #endif
41 #ifndef GPIO_EXT_PROVIDER2
42 #define GPIO_EXT_PROVIDER2 GPIO_EXT_NOT_PROVIDED
43 #endif
44 #ifndef GPIO_EXT_PROVIDER3
45 #define GPIO_EXT_PROVIDER3 GPIO_EXT_NOT_PROVIDED
46 #endif
47 #ifndef GPIO_EXT_PROVIDER4
48 #define GPIO_EXT_PROVIDER4 GPIO_EXT_NOT_PROVIDED
49 #endif
50 
51 static struct gpio_ext_functions *gpio_ext_impl[GPIOEXT_NB] = {
56 };
57 
58 
59 /*
60  * External GPIO implementation
61  */
62 #define SAFE_CALL(_port, _fn, _args...) if(gpio_ext_impl[_port - GPIOEXT1] && gpio_ext_impl[_port - GPIOEXT1]->_fn) gpio_ext_impl[_port - GPIOEXT1]->_fn(_args);
63 
64 // Wrapping functions
68  if (port >= GPIOEXT1 && port < GPIOEXT1 + GPIOEXT_NB) {
69  SAFE_CALL(port, setup_output, port, gpios);
70  } else {
71  __real_gpio_setup_output(port, gpios);
72  }
73 }
74 
75 void __wrap_gpio_setup_input(uint32_t port, uint32_t gpios);
76 void __real_gpio_setup_input(uint32_t port, uint32_t gpios);
78  if (port >= GPIOEXT1 && port < GPIOEXT1 + GPIOEXT_NB) {
79  SAFE_CALL(port, setup_input, port, gpios);
80  } else {
81  __real_gpio_setup_input(port, gpios);
82  }
83 }
84 
88  if (port >= GPIOEXT1 && port < GPIOEXT1 + GPIOEXT_NB) {
89  if (gpio_ext_impl[port - GPIOEXT1] && gpio_ext_impl[port - GPIOEXT1]->get) {
90  return gpio_ext_impl[port - GPIOEXT1]->get(port, gpios);
91  } else {
92  return 0;
93  }
94  } else {
95  return __real_gpio_get(port, gpios);
96  }
97 }
98 
99 void __wrap_gpio_set(uint32_t port, uint32_t gpios);
100 void __real_gpio_set(uint32_t port, uint32_t gpios);
101 void __wrap_gpio_set(uint32_t port, uint32_t gpios) {
102  if (port >= GPIOEXT1 && port < GPIOEXT1 + GPIOEXT_NB) {
103  SAFE_CALL(port, set, port, gpios);
104  } else {
105  __real_gpio_set(port, gpios);
106  }
107 }
108 
109 void __wrap_gpio_clear(uint32_t port, uint32_t gpios);
110 void __real_gpio_clear(uint32_t port, uint32_t gpios);
112  if (port >= GPIOEXT1 && port < GPIOEXT1 + GPIOEXT_NB) {
113  SAFE_CALL(port, clear, port, gpios);
114  } else {
115  __real_gpio_clear(port, gpios);
116  }
117 }
118 
119 void __wrap_gpio_toggle(uint32_t port, uint32_t gpios);
120 void __real_gpio_toggle(uint32_t port, uint32_t gpios);
122  if (port >= GPIOEXT1 && port < GPIOEXT1 + GPIOEXT_NB) {
123  SAFE_CALL(port, toggle, port, gpios);
124  } else {
125  __real_gpio_toggle(port, gpios);
126  }
127 }
128 
129 
__wrap_gpio_setup_input
void __wrap_gpio_setup_input(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.c:77
__wrap_gpio_toggle
void __wrap_gpio_toggle(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.c:121
gpio_ext_impl
static struct gpio_ext_functions * gpio_ext_impl[GPIOEXT_NB]
Definition: gpio_ext_common.c:51
gpio_ext_functions::setup_input
void(* setup_input)(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.h:36
__wrap_gpio_set
void __wrap_gpio_set(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.c:101
__wrap_gpio_get
uint32_t __wrap_gpio_get(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.c:87
GPIO_EXT_PROVIDER2
#define GPIO_EXT_PROVIDER2
Definition: gpio_ext_common.c:42
__real_gpio_setup_output
void __real_gpio_setup_output(uint32_t port, uint32_t gpios)
uint32_t
unsigned long uint32_t
Definition: types.h:18
__real_gpio_clear
void __real_gpio_clear(uint32_t port, uint32_t gpios)
gpio_ext_common.h
__real_gpio_set
void __real_gpio_set(uint32_t port, uint32_t gpios)
GPIO_EXT_PROVIDER4
#define GPIO_EXT_PROVIDER4
Definition: gpio_ext_common.c:48
GPIO_EXT_PROVIDER1
#define GPIO_EXT_PROVIDER1
Definition: gpio_ext_common.c:39
gpio_ext_functions::setup_output
void(* setup_output)(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.h:35
gpio_ext_functions::set
void(* set)(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.h:38
gpio_ext_functions::get
uint32_t(* get)(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.h:37
GPIO_EXT_PROVIDER3
#define GPIO_EXT_PROVIDER3
Definition: gpio_ext_common.c:45
__real_gpio_toggle
void __real_gpio_toggle(uint32_t port, uint32_t gpios)
__real_gpio_setup_input
void __real_gpio_setup_input(uint32_t port, uint32_t gpios)
__wrap_gpio_clear
void __wrap_gpio_clear(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.c:111
__wrap_gpio_setup_output
void __wrap_gpio_setup_output(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.c:67
gpio.h
SAFE_CALL
#define SAFE_CALL(_port, _fn, _args...)
Definition: gpio_ext_common.c:62
__real_gpio_get
uint32_t __real_gpio_get(uint32_t port, uint32_t gpios)
gpio_ext_functions::clear
void(* clear)(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.h:39
gpio_ext_functions
Definition: gpio_ext_common.h:34
gpio_ext_functions::toggle
void(* toggle)(uint32_t port, uint32_t gpios)
Definition: gpio_ext_common.h:40