29
29
#error not recognized gpio count for mcu
30
30
#endif
31
31
32
- typedef struct {
32
+ typedef struct
33
+ {
33
34
bool used_as_gpio : 1 ;
34
35
PinDirection direction : 1 ;
35
36
bool init_high : 1 ;
@@ -45,29 +46,31 @@ typedef struct {
45
46
typedef uint32_t gpio_mask_t ;
46
47
#endif
47
48
48
- gpio_mask_t m_gpio_initialized ;
49
- gpio_cfg_t m_gpio_cfg [GPIO_PIN_COUNT ];
49
+ static gpio_mask_t m_gpio_initialized ;
50
+ static gpio_cfg_t m_gpio_cfg [GPIO_PIN_COUNT ];
50
51
51
52
52
53
/***********
53
54
GPIO IRQ
54
55
***********/
55
56
56
57
static gpio_irq_handler m_irq_handler ;
57
- static uint32_t m_channel_ids [GPIO_PIN_COUNT ] = {0 };
58
- gpio_mask_t m_gpio_irq_enabled ;
58
+ static uint32_t m_channel_ids [GPIO_PIN_COUNT ] = {0 };
59
+ static gpio_mask_t m_gpio_irq_enabled ;
59
60
60
61
61
62
static void gpiote_irq_handler (nrf_drv_gpiote_pin_t pin , nrf_gpiote_polarity_t action )
62
63
{
63
64
nrf_gpio_pin_sense_t sense = nrf_gpio_pin_sense_get (pin );
64
65
gpio_irq_event event = (sense == NRF_GPIO_PIN_SENSE_LOW ) ? IRQ_RISE : IRQ_FALL ;
65
-
66
- if (m_gpio_irq_enabled & ((gpio_mask_t )1 << pin )) {
66
+
67
+ if (m_gpio_irq_enabled & ((gpio_mask_t )1 << pin ))
68
+ {
67
69
if (((event == IRQ_RISE ) && m_gpio_cfg [pin ].irq_rise )
68
- || ((event == IRQ_FALL ) && m_gpio_cfg [pin ].irq_fall )) {
69
- m_irq_handler (m_channel_ids [pin ], event );
70
- }
70
+ || ((event == IRQ_FALL ) && m_gpio_cfg [pin ].irq_fall ))
71
+ {
72
+ m_irq_handler (m_channel_ids [pin ], event );
73
+ }
71
74
}
72
75
}
73
76
@@ -76,7 +79,8 @@ void GPIOTE_IRQHandler(void);// exported from nrf_drv_gpiote.c
76
79
void gpio_init (gpio_t * obj , PinName pin )
77
80
{
78
81
obj -> pin = pin ;
79
- if (pin == (PinName )NC ) {
82
+ if (pin == (PinName )NC )
83
+ {
80
84
return ;
81
85
}
82
86
MBED_ASSERT ((uint32_t )pin < GPIO_PIN_COUNT );
@@ -92,37 +96,46 @@ void gpio_init(gpio_t *obj, PinName pin)
92
96
int gpio_read (gpio_t * obj )
93
97
{
94
98
MBED_ASSERT (obj -> pin != (PinName )NC );
95
- if (m_gpio_cfg [obj -> pin ].direction == PIN_OUTPUT ) {
99
+ if (m_gpio_cfg [obj -> pin ].direction == PIN_OUTPUT )
100
+ {
96
101
return (nrf_gpio_pin_out_read (obj -> pin ) ? 1 : 0 );
97
- } else {
102
+ }
103
+ else
104
+ {
98
105
return nrf_gpio_pin_read (obj -> pin );
99
106
}
100
107
}
101
108
102
109
static void gpiote_pin_uninit (uint8_t pin )
103
110
{
104
- if (m_gpio_initialized & ((gpio_mask_t )1 << pin )) {
105
- if ((m_gpio_cfg [pin ].direction == PIN_OUTPUT ) && (!m_gpio_cfg [pin ].used_as_irq )) {
111
+ if (m_gpio_initialized & ((gpio_mask_t )1 << pin ))
112
+ {
113
+ if ((m_gpio_cfg [pin ].direction == PIN_OUTPUT ) && (!m_gpio_cfg [pin ].used_as_irq ))
114
+ {
106
115
nrf_drv_gpiote_out_uninit (pin );
107
116
}
108
- else {
117
+ else
118
+ {
109
119
nrf_drv_gpiote_in_uninit (pin );
110
120
}
111
121
}
112
122
}
113
123
114
124
static void gpio_apply_config (uint8_t pin )
115
125
{
116
- if (m_gpio_cfg [pin ].used_as_gpio || m_gpio_cfg [pin ].used_as_irq ) {
126
+ if (m_gpio_cfg [pin ].used_as_gpio || m_gpio_cfg [pin ].used_as_irq )
127
+ {
117
128
if ((m_gpio_cfg [pin ].direction == PIN_INPUT )
118
- || (m_gpio_cfg [pin ].used_as_irq )) {
129
+ || (m_gpio_cfg [pin ].used_as_irq ))
130
+ {
119
131
//Configure as input.
120
132
nrf_drv_gpiote_in_config_t cfg ;
121
133
122
134
cfg .hi_accuracy = false;
123
135
cfg .is_watcher = false;
124
136
cfg .sense = NRF_GPIOTE_POLARITY_TOGGLE ;
125
- if (m_gpio_cfg [pin ].used_as_irq ) {
137
+ if (m_gpio_cfg [pin ].used_as_irq )
138
+ {
126
139
cfg .pull = NRF_GPIO_PIN_PULLUP ;
127
140
nrf_drv_gpiote_in_init (pin , & cfg , gpiote_irq_handler );
128
141
if ((m_gpio_irq_enabled & ((gpio_mask_t )1 << pin ))
@@ -131,8 +144,10 @@ static void gpio_apply_config(uint8_t pin)
131
144
nrf_drv_gpiote_in_event_enable (pin , true);
132
145
}
133
146
}
134
- else {
135
- switch (m_gpio_cfg [pin ].pull ) {
147
+ else
148
+ {
149
+ switch (m_gpio_cfg [pin ].pull )
150
+ {
136
151
case PullUp :
137
152
cfg .pull = NRF_GPIO_PIN_PULLUP ;
138
153
break ;
@@ -146,22 +161,24 @@ static void gpio_apply_config(uint8_t pin)
146
161
nrf_drv_gpiote_in_init (pin , & cfg , NULL );
147
162
}
148
163
}
149
- else {
164
+ else
165
+ {
150
166
// Configure as output.
151
167
nrf_drv_gpiote_out_config_t cfg = GPIOTE_CONFIG_OUT_SIMPLE (m_gpio_cfg [pin ].init_high );
152
168
nrf_drv_gpiote_out_init (pin , & cfg );
153
169
}
154
170
m_gpio_initialized |= ((gpio_mask_t )1 << pin );
155
171
}
156
- else {
172
+ else
173
+ {
157
174
m_gpio_initialized &= ~((gpio_mask_t )1 << pin );
158
175
}
159
176
}
160
177
161
178
162
179
void gpio_mode (gpio_t * obj , PinMode mode )
163
180
{
164
- MBED_ASSERT (obj -> pin <= GPIO_PIN_COUNT );
181
+ MBED_ASSERT (obj -> pin != ( PinName ) NC );
165
182
166
183
gpiote_pin_uninit (obj -> pin ); // try to uninitialize gpio before a change.
167
184
@@ -172,7 +189,7 @@ void gpio_mode(gpio_t *obj, PinMode mode)
172
189
173
190
void gpio_dir (gpio_t * obj , PinDirection direction )
174
191
{
175
- MBED_ASSERT (obj -> pin <= GPIO_PIN_COUNT );
192
+ MBED_ASSERT (obj -> pin != ( PinName ) NC );
176
193
177
194
gpiote_pin_uninit (obj -> pin ); // try to uninitialize gpio before a change.
178
195
@@ -187,7 +204,8 @@ void gpio_dir(gpio_t *obj, PinDirection direction)
187
204
188
205
int gpio_irq_init (gpio_irq_t * obj , PinName pin , gpio_irq_handler handler , uint32_t id )
189
206
{
190
- if (pin == NC ) {
207
+ if (pin == NC )
208
+ {
191
209
return -1 ;
192
210
}
193
211
MBED_ASSERT ((uint32_t )pin < GPIO_PIN_COUNT );
@@ -223,19 +241,25 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
223
241
(m_gpio_irq_enabled & ((gpio_mask_t )1 << obj -> ch )) &&
224
242
(cfg -> irq_rise || cfg -> irq_fall );
225
243
226
- if (event == IRQ_RISE ) {
244
+ if (event == IRQ_RISE )
245
+ {
227
246
cfg -> irq_rise = enable ? true : false;
228
247
}
229
- else if (event == IRQ_FALL ) {
248
+ else if (event == IRQ_FALL )
249
+ {
230
250
cfg -> irq_fall = enable ? true : false;
231
251
}
232
252
233
253
bool irq_enabled_after = cfg -> irq_rise || cfg -> irq_fall ;
234
254
235
- if (irq_enabled_before != irq_enabled_after ) {
236
- if (irq_enabled_after ) {
255
+ if (irq_enabled_before != irq_enabled_after )
256
+ {
257
+ if (irq_enabled_after )
258
+ {
237
259
gpio_irq_enable (obj );
238
- } else {
260
+ }
261
+ else
262
+ {
239
263
gpio_irq_disable (obj );
240
264
}
241
265
}
@@ -245,7 +269,8 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
245
269
void gpio_irq_enable (gpio_irq_t * obj )
246
270
{
247
271
m_gpio_irq_enabled |= ((gpio_mask_t )1 << obj -> ch );
248
- if (m_gpio_cfg [obj -> ch ].irq_rise || m_gpio_cfg [obj -> ch ].irq_fall ) {
272
+ if (m_gpio_cfg [obj -> ch ].irq_rise || m_gpio_cfg [obj -> ch ].irq_fall )
273
+ {
249
274
nrf_drv_gpiote_in_event_enable (obj -> ch , true);
250
275
}
251
276
}
0 commit comments