mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-17 04:52:59 +01:00
Merge pull request #10005 from haukepetersen/fix_gpioirq_nrf
cpu/nrf5x/gpio: use periph_gpio_irq feature
This commit is contained in:
commit
272ae30d26
@ -34,10 +34,12 @@
|
||||
#define PORT_BIT (1 << 5)
|
||||
#define PIN_MASK (0x1f)
|
||||
|
||||
#ifdef MODULE_PERIPH_GPIO_IRQ
|
||||
/**
|
||||
* @brief Place to store the interrupt context
|
||||
*/
|
||||
static gpio_isr_ctx_t exti_chan;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Get the port's base address
|
||||
@ -72,42 +74,6 @@ int gpio_init(gpio_t pin, gpio_mode_t mode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
|
||||
gpio_cb_t cb, void *arg)
|
||||
{
|
||||
/* disable external interrupt in case one is active */
|
||||
NRF_GPIOTE->INTENSET &= ~(GPIOTE_INTENSET_IN0_Msk);
|
||||
/* save callback */
|
||||
exti_chan.cb = cb;
|
||||
exti_chan.arg = arg;
|
||||
/* configure pin as input */
|
||||
gpio_init(pin, mode);
|
||||
/* set interrupt priority and enable global GPIOTE interrupt */
|
||||
NVIC_EnableIRQ(GPIOTE_IRQn);
|
||||
/* configure the GPIOTE channel: set even mode, pin and active flank */
|
||||
NRF_GPIOTE->CONFIG[0] = (GPIOTE_CONFIG_MODE_Event |
|
||||
(pin << GPIOTE_CONFIG_PSEL_Pos) |
|
||||
#ifdef CPU_MODEL_NRF52840XXAA
|
||||
((pin & PORT_BIT) << 8) |
|
||||
#endif
|
||||
(flank << GPIOTE_CONFIG_POLARITY_Pos));
|
||||
/* enable external interrupt */
|
||||
NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gpio_irq_enable(gpio_t pin)
|
||||
{
|
||||
(void) pin;
|
||||
NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk;
|
||||
}
|
||||
|
||||
void gpio_irq_disable(gpio_t pin)
|
||||
{
|
||||
(void) pin;
|
||||
NRF_GPIOTE->INTENCLR |= GPIOTE_INTENSET_IN0_Msk;
|
||||
}
|
||||
|
||||
int gpio_read(gpio_t pin)
|
||||
{
|
||||
if (port(pin)->DIR & (1 << pin)) {
|
||||
@ -142,6 +108,43 @@ void gpio_write(gpio_t pin, int value)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MODULE_PERIPH_GPIO_IRQ
|
||||
int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
|
||||
gpio_cb_t cb, void *arg)
|
||||
{
|
||||
/* disable external interrupt in case one is active */
|
||||
NRF_GPIOTE->INTENSET &= ~(GPIOTE_INTENSET_IN0_Msk);
|
||||
/* save callback */
|
||||
exti_chan.cb = cb;
|
||||
exti_chan.arg = arg;
|
||||
/* configure pin as input */
|
||||
gpio_init(pin, mode);
|
||||
/* set interrupt priority and enable global GPIOTE interrupt */
|
||||
NVIC_EnableIRQ(GPIOTE_IRQn);
|
||||
/* configure the GPIOTE channel: set even mode, pin and active flank */
|
||||
NRF_GPIOTE->CONFIG[0] = (GPIOTE_CONFIG_MODE_Event |
|
||||
(pin << GPIOTE_CONFIG_PSEL_Pos) |
|
||||
#ifdef CPU_MODEL_NRF52840XXAA
|
||||
((pin & PORT_BIT) << 8) |
|
||||
#endif
|
||||
(flank << GPIOTE_CONFIG_POLARITY_Pos));
|
||||
/* enable external interrupt */
|
||||
NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gpio_irq_enable(gpio_t pin)
|
||||
{
|
||||
(void) pin;
|
||||
NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk;
|
||||
}
|
||||
|
||||
void gpio_irq_disable(gpio_t pin)
|
||||
{
|
||||
(void) pin;
|
||||
NRF_GPIOTE->INTENCLR |= GPIOTE_INTENSET_IN0_Msk;
|
||||
}
|
||||
|
||||
void isr_gpiote(void)
|
||||
{
|
||||
if (NRF_GPIOTE->EVENTS_IN[0] == 1) {
|
||||
@ -150,3 +153,4 @@ void isr_gpiote(void)
|
||||
}
|
||||
cortexm_isr_end();
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user