22
22
23
23
#define GPIO_PIN_COUNT 31
24
24
25
- typedef enum {
26
- GPIO_NOT_USED = 0 ,
27
- GPIO_USED = 1 ,
28
- GPIO_USED_IRQ = 2 ,
29
- GPIO_USED_IRQ_DISABLED = 3
30
- } gpio_usage_t ;
31
-
32
25
typedef struct {
33
26
bool used_as_gpio : 1 ;
34
27
PinDirection direction : 1 ;
@@ -100,13 +93,13 @@ static void gpio_apply_config(uint8_t pin)
100
93
nrf_drv_gpiote_in_uninit (pin );
101
94
}
102
95
}
103
-
96
+
104
97
if (m_gpio_cfg [pin ].used_as_gpio || m_gpio_cfg [pin ].used_as_irq ) {
105
98
if ((m_gpio_cfg [pin ].direction == PIN_INPUT )
106
99
|| (m_gpio_cfg [pin ].used_as_irq )) {
107
100
//Configure as input.
108
101
nrf_drv_gpiote_in_config_t cfg ;
109
-
102
+
110
103
cfg .hi_accuracy = false;
111
104
cfg .is_watcher = false;
112
105
cfg .sense = NRF_GPIOTE_POLARITY_TOGGLE ;
@@ -116,7 +109,7 @@ static void gpio_apply_config(uint8_t pin)
116
109
if ((m_gpio_irq_enabled & (1 << pin ))
117
110
&& (m_gpio_cfg [pin ].irq_rise || m_gpio_cfg [pin ].irq_fall ))
118
111
{
119
- nrf_drv_gpiote_in_event_enable (pin , false );
112
+ nrf_drv_gpiote_in_event_enable (pin , true );
120
113
}
121
114
}
122
115
else {
@@ -198,30 +191,25 @@ void gpio_irq_free(gpio_irq_t *obj)
198
191
199
192
void gpio_irq_set (gpio_irq_t * obj , gpio_irq_event event , uint32_t enable )
200
193
{
201
- bool event_enabled_before = false;
202
- if ((m_gpio_irq_enabled & (1 << obj -> ch ))
203
- && (m_gpio_cfg [obj -> ch ].irq_rise || m_gpio_cfg [obj -> ch ].irq_fall )) {
204
- event_enabled_before = true;
205
- }
194
+ gpio_cfg_t * cfg = & m_gpio_cfg [obj -> ch ];
195
+ bool irq_enabled_before =
196
+ (m_gpio_irq_enabled & (1 << obj -> ch )) &&
197
+ (cfg -> irq_rise || cfg -> irq_fall );
206
198
207
199
if (event == IRQ_RISE ) {
208
- m_gpio_cfg [ obj -> ch ]. irq_rise = enable ? true : false;
200
+ cfg -> irq_rise = enable ? true : false;
209
201
}
210
202
else if (event == IRQ_FALL ) {
211
- m_gpio_cfg [ obj -> ch ]. irq_fall = enable ? true : false;
203
+ cfg -> irq_fall = enable ? true : false;
212
204
}
213
205
214
- bool event_enabled_after = false;
215
- if ((m_gpio_irq_enabled & (1 << obj -> ch ))
216
- && (m_gpio_cfg [obj -> ch ].irq_rise || m_gpio_cfg [obj -> ch ].irq_fall )) {
217
- event_enabled_after = true;
218
- }
206
+ bool irq_enabled_after = cfg -> irq_rise || cfg -> irq_fall ;
219
207
220
- if (event_enabled_before != event_enabled_after ) {
221
- if (event_enabled_after ) {
222
- nrf_drv_gpiote_in_event_enable (obj -> ch ,false );
208
+ if (irq_enabled_before != irq_enabled_after ) {
209
+ if (irq_enabled_after ) {
210
+ gpio_irq_enable (obj );
223
211
} else {
224
- nrf_drv_gpiote_in_event_disable (obj -> ch );
212
+ gpio_irq_disable (obj );
225
213
}
226
214
}
227
215
}
@@ -239,7 +227,5 @@ void gpio_irq_enable(gpio_irq_t *obj)
239
227
void gpio_irq_disable (gpio_irq_t * obj )
240
228
{
241
229
m_gpio_irq_enabled &= ~(1 << obj -> ch );
242
- if (m_gpio_cfg [obj -> ch ].irq_rise || m_gpio_cfg [obj -> ch ].irq_fall ) {
243
- nrf_drv_gpiote_in_event_enable (obj -> ch , false);
244
- }
230
+ nrf_drv_gpiote_in_event_disable (obj -> ch );
245
231
}
0 commit comments