diff --git a/cpu/msp430fxyz/periph/gpio.c b/cpu/msp430fxyz/periph/gpio.c index e6682eb950a99951805e819e48cee900a8a73e0b..2c3ce701810cf7488deece015a4db522be8260c5 100644 --- a/cpu/msp430fxyz/periph/gpio.c +++ b/cpu/msp430fxyz/periph/gpio.c @@ -33,12 +33,6 @@ */ #define PINS_PER_PORT (8U) -/** - * @brief Interrupt context for each interrupt line - */ -static gpio_isr_ctx_t isr_ctx[ISR_NUMOF]; - - static msp_port_t *_port(gpio_t pin) { switch (pin >> 8) { @@ -59,6 +53,11 @@ static msp_port_t *_port(gpio_t pin) } } +static inline uint8_t _pin(gpio_t pin) +{ + return (uint8_t)(pin & 0xff); +} + static inline msp_port_isr_t *_isr_port(gpio_t pin) { msp_port_t *p = _port(pin); @@ -68,17 +67,6 @@ static inline msp_port_isr_t *_isr_port(gpio_t pin) return NULL; } -static inline uint8_t _pin(gpio_t pin) -{ - return (uint8_t)(pin & 0xff); -} - -static int _ctx(gpio_t pin) -{ - int i = bitarithm_lsb(_pin(pin)); - return (_port(pin) == PORT_1) ? i : (i + 8); -} - int gpio_init(gpio_t pin, gpio_mode_t mode) { msp_port_t *port = _port(pin); @@ -99,34 +87,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) -{ - msp_port_isr_t *port = _isr_port(pin); - - /* check if port, pull resistor and flank configuration are valid */ - if ((port == NULL) || (flank == GPIO_BOTH)) { - return -1; - } - - /* disable any activated interrupt */ - port->IE &= ~(_pin(pin)); - /* configure as input */ - if (gpio_init(pin, mode) < 0) { - return -1; - } - /* save ISR context */ - isr_ctx[_ctx(pin)].cb = cb; - isr_ctx[_ctx(pin)].arg = arg; - /* configure flank */ - port->IES &= ~(_pin(pin)); - port->IES |= (flank & _pin(pin)); - /* clear pending interrupts and enable the IRQ */ - port->IFG &= ~(_pin(pin)); - gpio_irq_enable(pin); - return 0; -} - void gpio_periph_mode(gpio_t pin, bool enable) { REG8 *sel; @@ -151,22 +111,6 @@ void gpio_periph_mode(gpio_t pin, bool enable) } } -void gpio_irq_enable(gpio_t pin) -{ - msp_port_isr_t *port = _isr_port(pin); - if (port) { - port->IE |= _pin(pin); - } -} - -void gpio_irq_disable(gpio_t pin) -{ - msp_port_isr_t *port = _isr_port(pin); - if (port) { - port->IE &= ~(_pin(pin)); - } -} - int gpio_read(gpio_t pin) { msp_port_t *port = _port(pin); @@ -203,6 +147,62 @@ void gpio_write(gpio_t pin, int value) } } +#ifdef MODULE_PERIPH_GPIO_IRQ +/** + * @brief Interrupt context for each interrupt line + */ +static gpio_isr_ctx_t isr_ctx[ISR_NUMOF]; + +static int _ctx(gpio_t pin) +{ + int i = bitarithm_lsb(_pin(pin)); + return (_port(pin) == PORT_1) ? i : (i + 8); +} + +int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) +{ + msp_port_isr_t *port = _isr_port(pin); + + /* check if port, pull resistor and flank configuration are valid */ + if ((port == NULL) || (flank == GPIO_BOTH)) { + return -1; + } + + /* disable any activated interrupt */ + port->IE &= ~(_pin(pin)); + /* configure as input */ + if (gpio_init(pin, mode) < 0) { + return -1; + } + /* save ISR context */ + isr_ctx[_ctx(pin)].cb = cb; + isr_ctx[_ctx(pin)].arg = arg; + /* configure flank */ + port->IES &= ~(_pin(pin)); + port->IES |= (flank & _pin(pin)); + /* clear pending interrupts and enable the IRQ */ + port->IFG &= ~(_pin(pin)); + gpio_irq_enable(pin); + return 0; +} + +void gpio_irq_enable(gpio_t pin) +{ + msp_port_isr_t *port = _isr_port(pin); + if (port) { + port->IE |= _pin(pin); + } +} + +void gpio_irq_disable(gpio_t pin) +{ + msp_port_isr_t *port = _isr_port(pin); + if (port) { + port->IE &= ~(_pin(pin)); + } +} + static inline void isr_handler(msp_port_isr_t *port, int ctx) { for (unsigned i = 0; i < PINS_PER_PORT; i++) { @@ -226,3 +226,4 @@ ISR(PORT2_VECTOR, isr_port2) isr_handler((msp_port_isr_t *)PORT_2, 8); __exit_isr(); } +#endif /* MODULE_PERIPH_GPIO_IRQ */