21
21
22
22
23
23
#if defined(TARGET_MCU_NRF51822 )
24
- #define GPIO_PIN_COUNT 31
24
+ #define GPIO_PIN_COUNT 31
25
25
#elif defined(TARGET_MCU_NRF52832 )
26
- #define GPIO_PIN_COUNT 32
26
+ #define GPIO_PIN_COUNT 32
27
27
#elif defined(TARGET_MCU_NRF52840 )
28
- #define GPIO_PIN_COUNT 48
28
+ #define GPIO_PIN_COUNT 48
29
29
#else
30
- #error not recognized gpio count for mcu
30
+ #error not recognized gpio count for mcu
31
31
#endif
32
32
33
33
typedef struct {
@@ -40,9 +40,9 @@ typedef struct {
40
40
} gpio_cfg_t ;
41
41
42
42
#if GPIO_PIN_COUNT > 32
43
- typedef uint64_t gpio_mask_t ;
43
+ typedef uint64_t gpio_mask_t ;
44
44
#else
45
- typedef uint32_t gpio_mask_t ;
45
+ typedef uint32_t gpio_mask_t ;
46
46
#endif
47
47
48
48
static gpio_mask_t m_gpio_initialized ;
@@ -62,12 +62,12 @@ static void gpiote_irq_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t a
62
62
{
63
63
nrf_gpio_pin_sense_t sense = nrf_gpio_pin_sense_get (pin );
64
64
gpio_irq_event event = (sense == NRF_GPIO_PIN_SENSE_LOW ) ? IRQ_RISE : IRQ_FALL ;
65
-
65
+
66
66
if (m_gpio_irq_enabled & ((gpio_mask_t )1 << pin )) {
67
67
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
- }
68
+ || ((event == IRQ_FALL ) && m_gpio_cfg [pin ].irq_fall )) {
69
+ m_irq_handler (m_channel_ids [pin ], event );
70
+ }
71
71
}
72
72
}
73
73
@@ -80,9 +80,9 @@ void gpio_init(gpio_t *obj, PinName pin)
80
80
return ;
81
81
}
82
82
MBED_ASSERT ((uint32_t )pin < GPIO_PIN_COUNT );
83
-
83
+
84
84
NVIC_SetVector (GPIOTE_IRQn , (uint32_t ) GPIOTE_IRQHandler );
85
-
85
+
86
86
(void ) nrf_drv_gpiote_init ();
87
87
88
88
m_gpio_cfg [obj -> pin ].used_as_gpio = true;
@@ -111,8 +111,7 @@ static void gpiote_pin_uninit(uint8_t pin)
111
111
if (m_gpio_initialized & ((gpio_mask_t )1UL << pin )) {
112
112
if ((m_gpio_cfg [pin ].direction == PIN_OUTPUT ) && (!m_gpio_cfg [pin ].used_as_irq )) {
113
113
nrf_drv_gpiote_out_uninit (pin );
114
- }
115
- else if (m_gpio_cfg [pin ].used_as_irq ) {
114
+ } else if (m_gpio_cfg [pin ].used_as_irq ) {
116
115
nrf_drv_gpiote_in_uninit (pin );
117
116
}
118
117
}
@@ -122,45 +121,40 @@ static void gpio_apply_config(uint8_t pin)
122
121
{
123
122
if (m_gpio_cfg [pin ].used_as_gpio || m_gpio_cfg [pin ].used_as_irq ) {
124
123
if ((m_gpio_cfg [pin ].direction == PIN_INPUT )
125
- || (m_gpio_cfg [pin ].used_as_irq )) {
124
+ || (m_gpio_cfg [pin ].used_as_irq )) {
126
125
//Configure as input.
127
126
nrf_drv_gpiote_in_config_t cfg ;
128
127
129
128
cfg .hi_accuracy = false;
130
129
cfg .is_watcher = false;
131
130
cfg .sense = NRF_GPIOTE_POLARITY_TOGGLE ;
131
+ switch (m_gpio_cfg [pin ].pull ) {
132
+ case PullUp :
133
+ cfg .pull = NRF_GPIO_PIN_PULLUP ;
134
+ break ;
135
+ case PullDown :
136
+ cfg .pull = NRF_GPIO_PIN_PULLDOWN ;
137
+ break ;
138
+ default :
139
+ cfg .pull = NRF_GPIO_PIN_NOPULL ;
140
+ break ;
141
+ }
132
142
if (m_gpio_cfg [pin ].used_as_irq ) {
133
- cfg .pull = NRF_GPIO_PIN_PULLUP ;
134
143
nrf_drv_gpiote_in_init (pin , & cfg , gpiote_irq_handler );
135
144
if ((m_gpio_irq_enabled & ((gpio_mask_t )1 << pin ))
136
- && (m_gpio_cfg [pin ].irq_rise || m_gpio_cfg [pin ].irq_fall ))
137
- {
145
+ && (m_gpio_cfg [pin ].irq_rise || m_gpio_cfg [pin ].irq_fall )) {
138
146
nrf_drv_gpiote_in_event_enable (pin , true);
139
147
}
148
+ } else {
149
+ nrf_gpio_cfg_input (pin , cfg .pull );
140
150
}
141
- else {
142
- switch (m_gpio_cfg [pin ].pull ) {
143
- case PullUp :
144
- cfg .pull = NRF_GPIO_PIN_PULLUP ;
145
- break ;
146
- case PullDown :
147
- cfg .pull = NRF_GPIO_PIN_PULLDOWN ;
148
- break ;
149
- default :
150
- cfg .pull = NRF_GPIO_PIN_NOPULL ;
151
- break ;
152
- }
153
- nrf_gpio_cfg_input (pin ,cfg .pull );
154
- }
155
- }
156
- else {
151
+ } else {
157
152
// Configure as output.
158
153
nrf_drv_gpiote_out_config_t cfg = GPIOTE_CONFIG_OUT_SIMPLE (nrf_gpio_pin_out_read (pin ));
159
154
nrf_drv_gpiote_out_init (pin , & cfg );
160
155
}
161
156
m_gpio_initialized |= ((gpio_mask_t )1UL << pin );
162
- }
163
- else {
157
+ } else {
164
158
m_gpio_initialized &= ~((gpio_mask_t )1UL << pin );
165
159
}
166
160
}
@@ -169,9 +163,9 @@ static void gpio_apply_config(uint8_t pin)
169
163
void gpio_mode (gpio_t * obj , PinMode mode )
170
164
{
171
165
MBED_ASSERT (obj -> pin != (PinName )NC );
172
-
166
+
173
167
gpiote_pin_uninit (obj -> pin ); // try to uninitialize gpio before a change.
174
-
168
+
175
169
m_gpio_cfg [obj -> pin ].pull = mode ;
176
170
gpio_apply_config (obj -> pin );
177
171
}
@@ -180,9 +174,9 @@ void gpio_mode(gpio_t *obj, PinMode mode)
180
174
void gpio_dir (gpio_t * obj , PinDirection direction )
181
175
{
182
176
MBED_ASSERT (obj -> pin != (PinName )NC );
183
-
177
+
184
178
gpiote_pin_uninit (obj -> pin ); // try to uninitialize gpio before a change.
185
-
179
+
186
180
m_gpio_cfg [obj -> pin ].direction = direction ;
187
181
gpio_apply_config (obj -> pin );
188
182
}
@@ -201,8 +195,9 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
201
195
(void ) nrf_drv_gpiote_init ();
202
196
203
197
gpiote_pin_uninit (pin ); // try to uninitialize gpio before a change.
204
-
198
+
205
199
m_gpio_cfg [pin ].used_as_irq = true;
200
+ m_gpio_cfg [pin ].pull = PullNone ;
206
201
m_channel_ids [pin ] = id ;
207
202
obj -> ch = pin ;
208
203
m_irq_handler = handler ;
@@ -225,15 +220,14 @@ void gpio_irq_free(gpio_irq_t *obj)
225
220
226
221
void gpio_irq_set (gpio_irq_t * obj , gpio_irq_event event , uint32_t enable )
227
222
{
228
- gpio_cfg_t * cfg = & m_gpio_cfg [obj -> ch ];
223
+ gpio_cfg_t * cfg = & m_gpio_cfg [obj -> ch ];
229
224
bool irq_enabled_before =
230
225
(m_gpio_irq_enabled & ((gpio_mask_t )1 << obj -> ch )) &&
231
226
(cfg -> irq_rise || cfg -> irq_fall );
232
227
233
228
if (event == IRQ_RISE ) {
234
229
cfg -> irq_rise = enable ? true : false;
235
- }
236
- else if (event == IRQ_FALL ) {
230
+ } else if (event == IRQ_FALL ) {
237
231
cfg -> irq_fall = enable ? true : false;
238
232
}
239
233
0 commit comments