diff --git a/cpu/atmega_common/periph/gpio.c b/cpu/atmega_common/periph/gpio.c index 52f1b9431a16..994645ad79d0 100644 --- a/cpu/atmega_common/periph/gpio.c +++ b/cpu/atmega_common/periph/gpio.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2015 HAW Hamburg * 2016 INRIA - + * 2018 Acutam Automation, LLC * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level @@ -19,6 +19,7 @@ * @author René Herthel * @author Francisco Acosta * @author Laurent Navet + * @author Matthew Blue * * @} */ @@ -125,7 +126,7 @@ static inline int8_t _int_num(gpio_t pin) return -1; } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { switch (mode) { case GPIO_OUT: @@ -145,7 +146,7 @@ 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, +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_cb_t cb, void *arg) { int8_t int_num = _int_num(pin); @@ -165,7 +166,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return -1; } - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* clear global interrupt flag */ cli(); @@ -196,49 +197,49 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { EIFR |= (1 << _int_num(pin)); EIMSK |= (1 << _int_num(pin)); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { EIMSK &= ~(1 << _int_num(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return (_SFR_MEM8(_pin_addr(pin)) & (1 << _pin_num(pin))); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _SFR_MEM8(_port_addr(pin)) |= (1 << _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _SFR_MEM8(_port_addr(pin)) &= ~(1 << _pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { - if (gpio_read(pin)) { - gpio_clear(pin); + if (gpio_read_ll(pin)) { + gpio_clear_ll(pin); } else { - gpio_set(pin); + gpio_set_ll(pin); } } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { - gpio_set(pin); + gpio_set_ll(pin); } else { - gpio_clear(pin); + gpio_clear_ll(pin); } } diff --git a/cpu/cc2538/periph/gpio.c b/cpu/cc2538/periph/gpio.c index 83a33c86c45d..734fe305e78a 100644 --- a/cpu/cc2538/periph/gpio.c +++ b/cpu/cc2538/periph/gpio.c @@ -93,7 +93,7 @@ static inline uint8_t _pp_num(gpio_t pin) return (uint8_t)((_port_num(pin) * GPIO_BITS_PER_PORT) + _pin_num(pin)); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { /* check if mode is valid */ if (mode == MODE_NOTSUP) { @@ -118,10 +118,10 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { - if (gpio_init(pin, mode) != 0) { + if (gpio_init_ll(pin, mode) != 0) { return -1; } @@ -163,37 +163,37 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { gpio(pin)->IE |= _pin_mask(pin); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { gpio(pin)->IE &= ~_pin_mask(pin); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return (int)(gpio(pin)->DATA & _pin_mask(pin)); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { gpio(pin)->DATA |= _pin_mask(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { gpio(pin)->DATA &= ~_pin_mask(pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { gpio(pin)->DATA ^= _pin_mask(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { gpio(pin)->DATA |= _pin_mask(pin); diff --git a/cpu/cc26x0/periph/gpio.c b/cpu/cc26x0/periph/gpio.c index 7ca9090594b4..3b9f9ee88e9d 100644 --- a/cpu/cc26x0/periph/gpio.c +++ b/cpu/cc26x0/periph/gpio.c @@ -31,7 +31,7 @@ */ static gpio_isr_ctx_t gpio_chan[GPIO_ISR_CHAN_NUMOF]; -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { if ((unsigned int)pin > 31) return -1; @@ -51,10 +51,10 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { - int init = gpio_init(pin, mode); + int init = gpio_init_ll(pin, mode); if (init != 0) return init; @@ -68,22 +68,22 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, /* clears the interrupt flag */ GPIO->EVFLAGS |= (1 << pin); - gpio_irq_enable(pin); + gpio_irq_enable_ll(pin); return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { IOC->CFG[pin] |= IOCFG_EDGEIRQ_ENABLE; } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { IOC->CFG[pin] &= ~IOCFG_EDGEIRQ_ENABLE; } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { if (GPIO->DOE & (1 << pin)) { return (GPIO->DOUT >> pin) & 1; @@ -93,22 +93,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { GPIO->DOUTSET = (1 << pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { GPIO->DOUTCLR = (1 << pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { GPIO->DOUTTGL = (1 << pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { GPIO->DOUTSET = (1 << pin); diff --git a/cpu/efm32/periph/gpio.c b/cpu/efm32/periph/gpio.c index 0746bbb522af..2dba4700d51c 100644 --- a/cpu/efm32/periph/gpio.c +++ b/cpu/efm32/periph/gpio.c @@ -22,9 +22,7 @@ */ #include "cpu.h" - #include "periph/gpio.h" - #include "em_gpio.h" /** @@ -52,7 +50,7 @@ static inline uint32_t _pin_mask(gpio_t pin) return (1 << _pin_num(pin)); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { /* check for valid pin */ if (pin == GPIO_UNDEF) { @@ -72,10 +70,10 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { - int result = gpio_init(pin, mode); + int result = gpio_init_ll(pin, mode); if (result != 0) { return result; @@ -101,37 +99,37 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { GPIO_IntEnable(_pin_mask(pin)); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { GPIO_IntDisable(_pin_mask(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return GPIO_PinInGet(_port_num(pin), _pin_num(pin)); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { GPIO_PinOutSet(_port_num(pin), _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { GPIO_PinOutClear(_port_num(pin), _pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { GPIO_PinOutToggle(_port_num(pin), _pin_num(pin)); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { GPIO_PinOutSet(_port_num(pin), _pin_num(pin)); diff --git a/cpu/ezr32wg/periph/gpio.c b/cpu/ezr32wg/periph/gpio.c index 2cabdb85f866..2ba9b2d408ef 100644 --- a/cpu/ezr32wg/periph/gpio.c +++ b/cpu/ezr32wg/periph/gpio.c @@ -55,7 +55,7 @@ static inline int _pin_mask(gpio_t pin) return (1 << _pin_pos(pin)); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { GPIO_P_TypeDef *port = _port(pin); uint32_t pin_pos = _pin_pos(pin); @@ -80,13 +80,13 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { uint32_t pin_pos = _pin_pos(pin); /* configure as input */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* just in case, disable interrupt for this channel */ GPIO->IEN &= ~(1 << pin_pos); @@ -107,37 +107,37 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { GPIO->IEN |= _pin_mask(pin); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { GPIO->IEN &= ~(_pin_mask(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return _port(pin)->DIN & _pin_mask(pin); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->DOUTSET = _pin_mask(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->DOUTCLR = _pin_mask(pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { _port(pin)->DOUTTGL = _pin_mask(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->DOUTSET = _pin_mask(pin); diff --git a/cpu/fe310/periph/gpio.c b/cpu/fe310/periph/gpio.c index 85e19349956a..356356f8bac2 100644 --- a/cpu/fe310/periph/gpio.c +++ b/cpu/fe310/periph/gpio.c @@ -61,7 +61,7 @@ void gpio_isr(int num) } } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { /* Check for valid pin */ if (pin >= GPIO_NUMOF) { @@ -99,11 +99,11 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { /* Configure pin */ - if (gpio_init(pin, mode) != 0) { + if (gpio_init_ll(pin, mode) != 0) { return -1; } @@ -116,7 +116,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, PLIC_set_priority(INT_GPIO_BASE + pin, GPIO_INTR_PRIORITY); /* Configure the active flank(s) */ - gpio_irq_enable(pin); + gpio_irq_enable_ll(pin); /* Save callback */ isr_ctx[pin].cb = cb; @@ -129,7 +129,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { /* Check for valid pin */ if (pin >= GPIO_NUMOF) { @@ -156,7 +156,7 @@ void gpio_irq_enable(gpio_t pin) } } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { /* Check for valid pin */ if (pin >= GPIO_NUMOF) { @@ -183,27 +183,27 @@ void gpio_irq_disable(gpio_t pin) } } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return (GPIO_REG(GPIO_INPUT_VAL) & (1 << pin)) ? 1 : 0; } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { GPIO_REG(GPIO_OUTPUT_VAL) ^= (1 << pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin); diff --git a/cpu/kinetis/periph/gpio.c b/cpu/kinetis/periph/gpio.c index ec0155dfdc2b..f283c489b12c 100644 --- a/cpu/kinetis/periph/gpio.c +++ b/cpu/kinetis/periph/gpio.c @@ -179,7 +179,7 @@ static void ctx_clear(int port, int pin) write_map(port, pin, ctx); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { /* set pin to analog mode while configuring it */ gpio_init_port(pin, GPIO_AF_ANALOG); @@ -197,10 +197,10 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { - if (gpio_init(pin, mode) < 0) { + if (gpio_init_ll(pin, mode) < 0) { return -1; } @@ -244,20 +244,20 @@ void gpio_init_port(gpio_t pin, uint32_t pcr) } } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { int ctx = get_ctx(port_num(pin), pin_num(pin)); port(pin)->PCR[pin_num(pin)] |= isr_ctx[ctx].state; } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { int ctx = get_ctx(port_num(pin), pin_num(pin)); isr_ctx[ctx].state = port(pin)->PCR[pin_num(pin)] & PORT_PCR_IRQC_MASK; port(pin)->PCR[pin_num(pin)] &= ~(PORT_PCR_IRQC_MASK); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { if (gpio(pin)->PDDR & (1 << pin_num(pin))) { return (gpio(pin)->PDOR & (1 << pin_num(pin))) ? 1 : 0; @@ -267,22 +267,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { gpio(pin)->PSOR = (1 << pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { gpio(pin)->PCOR = (1 << pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { gpio(pin)->PTOR = (1 << pin_num(pin)); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { gpio(pin)->PSOR = (1 << pin_num(pin)); diff --git a/cpu/lm4f120/periph/gpio.c b/cpu/lm4f120/periph/gpio.c index 0cb0bbd90d70..488805c92acf 100644 --- a/cpu/lm4f120/periph/gpio.c +++ b/cpu/lm4f120/periph/gpio.c @@ -93,7 +93,7 @@ typedef struct { static gpio_state_t gpio_config[NUM_OF_PORT][NUM_OF_PINS]; -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -161,8 +161,8 @@ void isr_gpio_portf(void){ _isr_gpio(5); } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -194,7 +194,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, HWREG(port_addr+GPIO_DEN_R_OFF) |= pin_bit; HWREG(port_addr+GPIO_LOCK_R_OFF) = 0; - gpio_irq_enable(pin); + gpio_irq_enable_ll(pin); ROM_IntEnable(int_num); ROM_IntMasterEnable(); @@ -202,7 +202,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -213,7 +213,7 @@ void gpio_irq_enable(gpio_t pin) HWREG(im_reg_addr) |= pin_bit; } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -225,7 +225,7 @@ void gpio_irq_disable(gpio_t pin) } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { const uint8_t port_num = _port_num(pin); const uint32_t port_addr = _port_base[port_num]; @@ -234,7 +234,7 @@ int gpio_read(gpio_t pin) return HWREG(port_addr + ((1<> 1][_pin(pin)]); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { assert(_port(pin) == 0 || _port(pin) == 2); @@ -180,35 +180,35 @@ void gpio_irq_disable(gpio_t pin) } } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { LPC_GPIO_TypeDef *base = _base(pin); return (base->FIOPIN & (1 << _pin(pin))) ? 1 : 0; } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { LPC_GPIO_TypeDef *base = _base(pin); base->FIOSET = (1 << _pin(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { LPC_GPIO_TypeDef *base = _base(pin); base->FIOCLR = (1 << _pin(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { LPC_GPIO_TypeDef *base = _base(pin); base->FIOPIN ^= (1 << _pin(pin)); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { LPC_GPIO_TypeDef *base = _base(pin); diff --git a/cpu/lpc2387/periph/gpio.c b/cpu/lpc2387/periph/gpio.c index 3891c50b7f61..bd5f80e92401 100644 --- a/cpu/lpc2387/periph/gpio.c +++ b/cpu/lpc2387/periph/gpio.c @@ -63,7 +63,7 @@ static int _isr_map_entry(gpio_t pin) { return _pin; } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { unsigned _pin = pin & 31; unsigned port = pin >> 5; @@ -94,8 +94,8 @@ int gpio_init_mux(unsigned pin, unsigned mux) return 0; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { (void)mode; @@ -198,7 +198,7 @@ static void _gpio_configure(gpio_t pin, unsigned rising, unsigned falling) irq_restore(state); } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { int isr_map_entry =_isr_map_entry(pin); int _state_index = _gpio_isr_map[isr_map_entry]; @@ -213,12 +213,12 @@ void gpio_irq_enable(gpio_t pin) bf_isset(_gpio_falling, _state_index)); } -void gpio_irq_disable(gpio_t dev) +void gpio_irq_disable_ll(gpio_t dev) { _gpio_configure(dev, 0, 0); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { unsigned _pin = pin & 31; unsigned port = pin >> 5; @@ -226,7 +226,7 @@ int gpio_read(gpio_t pin) return (_port->PIN & (1 << _pin)) != 0; } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { unsigned _pin = pin & 31; unsigned port = pin >> 5; @@ -234,7 +234,7 @@ void gpio_set(gpio_t pin) _port->SET = 1 << _pin; } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { unsigned _pin = pin & 31; unsigned port = pin >> 5; @@ -242,23 +242,23 @@ void gpio_clear(gpio_t pin) _port->CLR = 1 << _pin; } -void gpio_toggle(gpio_t dev) +void gpio_toggle_ll(gpio_t dev) { - if (gpio_read(dev)) { - gpio_clear(dev); + if (gpio_read_ll(dev)) { + gpio_clear_ll(dev); } else { - gpio_set(dev); + gpio_set_ll(dev); } } -void gpio_write(gpio_t dev, int value) +void gpio_write_ll(gpio_t dev, int value) { if (value) { - gpio_set(dev); + gpio_set_ll(dev); } else { - gpio_clear(dev); + gpio_clear_ll(dev); } } diff --git a/cpu/mips_pic32_common/periph/gpio.c b/cpu/mips_pic32_common/periph/gpio.c index 396d0d574be5..eec130d0a2db 100644 --- a/cpu/mips_pic32_common/periph/gpio.c +++ b/cpu/mips_pic32_common/periph/gpio.c @@ -120,7 +120,7 @@ static inline int check_valid_port(uint8_t port) && base_address[port].gpio != NULL; } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { uint8_t port = GPIO_PORT(pin); uint32_t pin_no = GPIO_PIN_NO(pin); @@ -172,8 +172,8 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { (void)pin; (void)mode; @@ -186,38 +186,52 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return -1; } -int gpio_read(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) +{ + (void)pin; + + /* TODO: Not implemented yet */ +} + +void gpio_irq_disable_ll(gpio_t pin) +{ + (void)pin; + + /* TODO: Not implemented yet */ +} + +int gpio_read_ll(gpio_t pin) { assert(check_valid_port(GPIO_PORT(pin))); return PORTx(GPIO_PORT(pin)) & GPIO_PIN_NO(pin); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { assert(check_valid_port(GPIO_PORT(pin))); LATxSET(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { assert(check_valid_port(GPIO_PORT(pin))); LATxCLR(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { assert(check_valid_port(GPIO_PORT(pin))); LATxINV(GPIO_PORT(pin)) = GPIO_PIN_NO(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) - gpio_set(pin); + gpio_set_ll(pin); else - gpio_clear(pin); + gpio_clear_ll(pin); } diff --git a/cpu/msp430fxyz/periph/gpio.c b/cpu/msp430fxyz/periph/gpio.c index e6682eb950a9..e776adaaf5b1 100644 --- a/cpu/msp430fxyz/periph/gpio.c +++ b/cpu/msp430fxyz/periph/gpio.c @@ -79,7 +79,7 @@ static int _ctx(gpio_t pin) return (_port(pin) == PORT_1) ? i : (i + 8); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { msp_port_t *port = _port(pin); @@ -99,8 +99,8 @@ 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) +int gpio_init_int_ll(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); @@ -112,7 +112,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, /* disable any activated interrupt */ port->IE &= ~(_pin(pin)); /* configure as input */ - if (gpio_init(pin, mode) < 0) { + if (gpio_init_ll(pin, mode) < 0) { return -1; } /* save ISR context */ @@ -123,7 +123,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, port->IES |= (flank & _pin(pin)); /* clear pending interrupts and enable the IRQ */ port->IFG &= ~(_pin(pin)); - gpio_irq_enable(pin); + gpio_irq_enable_ll(pin); return 0; } @@ -151,7 +151,7 @@ void gpio_periph_mode(gpio_t pin, bool enable) } } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { msp_port_isr_t *port = _isr_port(pin); if (port) { @@ -159,7 +159,7 @@ void gpio_irq_enable(gpio_t pin) } } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { msp_port_isr_t *port = _isr_port(pin); if (port) { @@ -167,7 +167,7 @@ void gpio_irq_disable(gpio_t pin) } } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { msp_port_t *port = _port(pin); if (port->DIR & _pin(pin)) { @@ -178,22 +178,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->OD |= _pin(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->OD &= ~(_pin(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { _port(pin)->OD ^= _pin(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->OD |= _pin(pin); diff --git a/cpu/native/periph/gpio.c b/cpu/native/periph/gpio.c index 156b2f42011b..3664529120cd 100644 --- a/cpu/native/periph/gpio.c +++ b/cpu/native/periph/gpio.c @@ -19,15 +19,15 @@ #include "periph/gpio.h" -int gpio_init(gpio_t pin, gpio_mode_t mode) { +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { (void) pin; (void) mode; return -1; } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg){ +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg){ (void) pin; (void) mode; (void) flank; @@ -37,33 +37,33 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return -1; } -void gpio_irq_enable(gpio_t pin) { +void gpio_irq_enable_ll(gpio_t pin) { (void) pin; } -void gpio_irq_disable(gpio_t pin) { +void gpio_irq_disable_ll(gpio_t pin) { (void) pin; } -int gpio_read(gpio_t pin) { +int gpio_read_ll(gpio_t pin) { (void) pin; return 0; } -void gpio_set(gpio_t pin) { +void gpio_set_ll(gpio_t pin) { (void) pin; } -void gpio_clear(gpio_t pin) { +void gpio_clear_ll(gpio_t pin) { (void) pin; } -void gpio_toggle(gpio_t pin) { +void gpio_toggle_ll(gpio_t pin) { (void) pin; } -void gpio_write(gpio_t pin, int value) { +void gpio_write_ll(gpio_t pin, int value) { (void) pin; (void) value; } diff --git a/cpu/nrf5x_common/periph/gpio.c b/cpu/nrf5x_common/periph/gpio.c index cacd1d9e8e4d..1d86569c5729 100644 --- a/cpu/nrf5x_common/periph/gpio.c +++ b/cpu/nrf5x_common/periph/gpio.c @@ -67,7 +67,7 @@ static inline int pin_num(gpio_t pin) #endif } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { switch (mode) { case GPIO_IN: @@ -84,8 +84,8 @@ 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) +int gpio_init_int_ll(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); @@ -93,7 +93,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, exti_chan.cb = cb; exti_chan.arg = arg; /* configure pin as input */ - gpio_init(pin, mode); + gpio_init_ll(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 */ @@ -108,19 +108,19 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { (void) pin; NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk; } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { (void) pin; NRF_GPIOTE->INTENCLR |= GPIOTE_INTENSET_IN0_Msk; } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { if (port(pin)->DIR & (1 << pin)) { return (port(pin)->OUT & (1 << pin)) ? 1 : 0; @@ -130,22 +130,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { port(pin)->OUTSET = (1 << pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { port(pin)->OUTCLR = (1 << pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { port(pin)->OUT ^= (1 << pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { port(pin)->OUTSET = (1 << pin); diff --git a/cpu/sam0_common/periph/gpio.c b/cpu/sam0_common/periph/gpio.c index 62be9b8e4a2c..6d6acbe4d5d6 100644 --- a/cpu/sam0_common/periph/gpio.c +++ b/cpu/sam0_common/periph/gpio.c @@ -78,7 +78,7 @@ void gpio_init_mux(gpio_t pin, gpio_mux_t mux) port->PMUX[pin_pos >> 1].reg |= (mux << (4 * (pin_pos & 0x1))); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { PortGroup* port = _port(pin); int pin_pos = _pin_pos(pin); @@ -111,8 +111,8 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { int exti = _exti(pin); @@ -125,7 +125,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, gpio_config[exti].cb = cb; gpio_config[exti].arg = arg; /* configure pin as input and set MUX to peripheral function A */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); gpio_init_mux(pin, GPIO_MUX_A); #ifdef CPU_FAM_SAMD21 /* enable clocks for the EIC module */ @@ -165,7 +165,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, return 0; } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { int exti = _exti(pin); if (exti == -1) { @@ -174,7 +174,7 @@ void gpio_irq_enable(gpio_t pin) EIC->INTENSET.reg = (1 << exti); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { int exti = _exti(pin); if (exti == -1) { @@ -183,7 +183,7 @@ void gpio_irq_disable(gpio_t pin) EIC->INTENCLR.reg = (1 << exti); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { PortGroup *port = _port(pin); int mask = _pin_mask(pin); @@ -196,22 +196,22 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->OUTSET.reg = _pin_mask(pin); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->OUTCLR.reg = _pin_mask(pin); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { _port(pin)->OUTTGL.reg = _pin_mask(pin); } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->OUTSET.reg = _pin_mask(pin); diff --git a/cpu/sam3/periph/gpio.c b/cpu/sam3/periph/gpio.c index ebe7d73a244c..564a30706a79 100644 --- a/cpu/sam3/periph/gpio.c +++ b/cpu/sam3/periph/gpio.c @@ -145,7 +145,7 @@ static void _ctx_clear(int port, int pin) } } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { Pio *port = _port(pin); int pin_num = _pin_num(pin); @@ -191,8 +191,8 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { Pio *port = _port(pin); int pin_num = _pin_num(pin); @@ -204,7 +204,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, } /* configure pin as input */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* try go grab a free spot in the context array */ int ctx_num = _get_free_ctx(); @@ -252,17 +252,17 @@ void gpio_init_mux(gpio_t pin, gpio_mux_t mux) _port(pin)->PIO_ABSR |= (mux << _pin_num(pin)); } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { NVIC_EnableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { NVIC_DisableIRQ((1 << (_port_num(pin) + PIOA_IRQn))); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { Pio *port = _port(pin); int pin_num = _pin_num(pin); @@ -275,26 +275,26 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { - if (gpio_read(pin)) { + if (gpio_read_ll(pin)) { _port(pin)->PIO_CODR = (1 << _pin_num(pin)); } else { _port(pin)->PIO_SODR = (1 << _pin_num(pin)); } } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->PIO_SODR = (1 << _pin_num(pin)); diff --git a/cpu/stm32_common/periph/gpio.c b/cpu/stm32_common/periph/gpio.c index 7aa0eaba3b1c..d81f129db934 100644 --- a/cpu/stm32_common/periph/gpio.c +++ b/cpu/stm32_common/periph/gpio.c @@ -71,7 +71,7 @@ static inline int _pin_num(gpio_t pin) return (pin & 0x0f); } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -102,8 +102,8 @@ 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) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { int pin_num = _pin_num(pin); int port_num = _port_num(pin); @@ -120,7 +120,7 @@ int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, #endif /* initialize pin as input */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* enable global pin interrupt */ #if defined(CPU_FAM_STM32F0) || defined(CPU_FAM_STM32L0) @@ -191,46 +191,46 @@ void gpio_init_analog(gpio_t pin) _port(pin)->MODER |= (0x3 << (2 * _pin_num(pin))); } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { EXTI->IMR |= (1 << _pin_num(pin)); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { EXTI->IMR &= ~(1 << _pin_num(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { return (_port(pin)->IDR & (1 << _pin_num(pin))); } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->BSRR = (1 << _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->BSRR = (1 << (_pin_num(pin) + 16)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { - if (gpio_read(pin)) { - gpio_clear(pin); + if (gpio_read_ll(pin)) { + gpio_clear_ll(pin); } else { - gpio_set(pin); + gpio_set_ll(pin); } } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { - gpio_set(pin); + gpio_set_ll(pin); } else { - gpio_clear(pin); + gpio_clear_ll(pin); } } diff --git a/cpu/stm32f1/periph/gpio.c b/cpu/stm32f1/periph/gpio.c index 448791dc6223..5f8750242698 100644 --- a/cpu/stm32f1/periph/gpio.c +++ b/cpu/stm32f1/periph/gpio.c @@ -73,7 +73,7 @@ static inline int _pin_num(gpio_t pin) } -int gpio_init(gpio_t pin, gpio_mode_t mode) +int gpio_init_ll(gpio_t pin, gpio_mode_t mode) { GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -99,15 +99,15 @@ int gpio_init(gpio_t pin, gpio_mode_t mode) return 0; /* all OK */ } -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg) +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) { int pin_num = _pin_num(pin); /* disable interrupts on the channel we want to edit (just in case) */ EXTI->IMR &= ~(1 << pin_num); /* configure pin as input */ - gpio_init(pin, mode); + gpio_init_ll(pin, mode); /* set callback */ exti_ctx[pin_num].cb = cb; exti_ctx[pin_num].arg = arg; @@ -160,17 +160,17 @@ void gpio_init_analog(gpio_t pin) _port(pin)->CR[pin_num >= 8] &= ~(0xfl << (4 * (pin_num - ((pin_num >= 8) * 8)))); } -void gpio_irq_enable(gpio_t pin) +void gpio_irq_enable_ll(gpio_t pin) { EXTI->IMR |= (1 << _pin_num(pin)); } -void gpio_irq_disable(gpio_t pin) +void gpio_irq_disable_ll(gpio_t pin) { EXTI->IMR &= ~(1 << _pin_num(pin)); } -int gpio_read(gpio_t pin) +int gpio_read_ll(gpio_t pin) { GPIO_TypeDef *port = _port(pin); int pin_num = _pin_num(pin); @@ -185,27 +185,27 @@ int gpio_read(gpio_t pin) } } -void gpio_set(gpio_t pin) +void gpio_set_ll(gpio_t pin) { _port(pin)->BSRR = (1 << _pin_num(pin)); } -void gpio_clear(gpio_t pin) +void gpio_clear_ll(gpio_t pin) { _port(pin)->BRR = (1 << _pin_num(pin)); } -void gpio_toggle(gpio_t pin) +void gpio_toggle_ll(gpio_t pin) { - if (gpio_read(pin)) { - gpio_clear(pin); + if (gpio_read_ll(pin)) { + gpio_clear_ll(pin); } else { - gpio_set(pin); + gpio_set_ll(pin); } } -void gpio_write(gpio_t pin, int value) +void gpio_write_ll(gpio_t pin, int value) { if (value) { _port(pin)->BSRR = (1 << _pin_num(pin)); diff --git a/drivers/Makefile.dep b/drivers/Makefile.dep index 776b16540929..fd22f09f5195 100644 --- a/drivers/Makefile.dep +++ b/drivers/Makefile.dep @@ -146,6 +146,10 @@ ifneq (,$(filter grove_ledbar,$(USEMODULE))) USEMODULE += my9221 endif +ifneq (,$(filter gpio_exp,$(USEMODULE))) + FEATURES_REQUIRED += periph_gpio +endif + ifneq (,$(filter hd44780,$(USEMODULE))) FEATURES_REQUIRED += periph_gpio USEMODULE += xtimer diff --git a/drivers/Makefile.include b/drivers/Makefile.include index e37c2b67522e..ee768200df19 100644 --- a/drivers/Makefile.include +++ b/drivers/Makefile.include @@ -82,6 +82,10 @@ ifneq (,$(filter fxos8700,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/drivers/fxos8700/include endif +ifneq (,$(filter gpio_exp,$(USEMODULE))) + USEMODULE_INCLUDES += $(RIOTBASE)/drivers/gpio_exp/include +endif + ifneq (,$(filter grove_ledbar,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/drivers/grove_ledbar/include endif diff --git a/drivers/gpio_exp/Makefile b/drivers/gpio_exp/Makefile new file mode 100644 index 000000000000..48422e909a47 --- /dev/null +++ b/drivers/gpio_exp/Makefile @@ -0,0 +1 @@ +include $(RIOTBASE)/Makefile.base diff --git a/drivers/gpio_exp/gpio_exp.c b/drivers/gpio_exp/gpio_exp.c new file mode 100644 index 000000000000..c42b09c3764e --- /dev/null +++ b/drivers/gpio_exp/gpio_exp.c @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup drivers_gpio_exp + * + * @{ + * + * @file + * @brief GPIO expansion functions + * + * @author Matthew Blue + * + * @} + */ + +#include + +#include "gpio_exp.h" +#include "gpio_exp_conf.h" +#include "periph/gpio.h" + +#define ENABLE_DEBUG (0) +#include "debug.h" + +int gpio_exp_init_notsup(void *dev, gpio_t pin, gpio_mode_t mode) +{ + (void)dev; + (void)pin; + (void)mode; + + DEBUG("[gpio_exp] notsup init called for dev %p, pin %u\n", + dev, (unsigned int)pin); + + return -ENOTSUP; +} + +int gpio_exp_init_int_notsup(void *dev, gpio_t pin, + gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) +{ + (void)dev; + (void)pin; + (void)mode; + (void)flank; + (void)cb; + (void)arg; + + DEBUG("[gpio_exp] notsup init_int called for dev %p, pin %u\n", + dev, (unsigned int)pin); + + return -ENOTSUP; +} + +void gpio_exp_irq_notsup(void *dev, gpio_t pin, int state) +{ + (void)dev; + (void)pin; + (void)state; + + DEBUG("[gpio_exp] notsup irq called for dev %p, pin %u\n", + dev, (unsigned int)pin); +} + +int gpio_exp_read_notsup(void *dev, gpio_t pin) +{ + (void)dev; + (void)pin; + + DEBUG("[gpio_exp] notsup read called for dev %p, pin %u\n", + dev, (unsigned int)pin); + + return -ENOTSUP; +} + +void gpio_exp_write_notsup(void *dev, gpio_t pin, int value) +{ + (void)dev; + (void)pin; + (void)value; + + DEBUG("[gpio_exp] notsup write called for dev %p, pin %u\n", + dev, (unsigned int)pin); +} + +gpio_exp_t *gpio_exp_entry(gpio_t gpio) +{ + uint8_t num; + + if (gpio == GPIO_UNDEF) { + return NULL; + } + + num = (uint8_t)((gpio >> GPIO_EXP_DEV_LOC) & GPIO_EXP_MAXDEVMASK); + + /* device is greater than number of listed entries */ + if (num > (sizeof(gpio_exp_list) / sizeof(gpio_exp_list[0]))) { + return NULL; + } + + DEBUG("[gpio_exp] returning list entry %u\n", num); + + /* Cast to discard const */ + return (gpio_exp_t *)&(gpio_exp_list[num]); +} + +gpio_t gpio_exp_pin(gpio_t gpio) +{ + return (gpio & GPIO_EXP_MAXPINMASK); +} diff --git a/drivers/gpio_exp/include/gpio_exp_conf.h b/drivers/gpio_exp/include/gpio_exp_conf.h new file mode 100644 index 000000000000..a82f1637ba9d --- /dev/null +++ b/drivers/gpio_exp/include/gpio_exp_conf.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup drivers_gpio_exp + * + * @{ + * + * @file + * @brief GPIO expansion default list of expanders + * + * @author Matthew Blue + * + * @} + */ + +#ifndef GPIO_EXP_CONF_H +#define GPIO_EXP_CONF_H + +#include + +#include "gpio_exp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief GPIO expansion default notsup driver + * + * Normally this would be provided with the driver implementation + */ +static const gpio_exp_driver_t gpio_exp_notsup_driver = { + .init = &gpio_exp_init_notsup, + .init_int = &gpio_exp_init_int_notsup, + .irq = &gpio_exp_irq_notsup, + .read = &gpio_exp_read_notsup, + .write = &gpio_exp_write_notsup +}; + +/** + * @brief GPIO expansion default list if not defined + */ +static const gpio_exp_t gpio_exp_list[] = +{ + { + .driver = &gpio_exp_notsup_driver, + .dev = NULL + } +}; + +#ifdef __cplusplus +} +#endif + +#endif /* GPIO_EXP_CONF_H */ +/** @} */ diff --git a/drivers/include/gpio_exp.h b/drivers/include/gpio_exp.h new file mode 100644 index 000000000000..0091b8b86004 --- /dev/null +++ b/drivers/include/gpio_exp.h @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @defgroup drivers_gpio_exp GPIO expansion driver + * @ingroup drivers + * @brief Global GPIO driver for pin-mapped GPIO expanders + * + * The GPIO expansion interface makes handling of GPIO expanders invisible to + * code using the GPIO pin API (periph/gpio.h). This is accomplished by + * reserving part of the range of values of gpio_t. When a call to the GPIO API + * uses a pin that falls within this range, it is parsed into a device ID that + * is looked up in the list of GPIO expanders and the call is redirected to + * the corresponding device. + * + * @{ + * + * @file + * @brief GPIO expansion interface definition + * + * @author Matthew Blue + */ + +#ifndef GPIO_EXP_H +#define GPIO_EXP_H + +#include + +#include "periph_cpu.h" +#include "periph/gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GPIO_EXP_DEV_LOC +/** + * @brief Set device ID location in gpio_t + */ +#define GPIO_EXP_DEV_LOC (8*sizeof(gpio_t) - 8) +#endif + +#ifndef GPIO_EXP_MAXDEVMASK +/** + * @brief Maximum device number mask for gpio_exp + */ +#define GPIO_EXP_MAXDEVMASK (0x7f) +#endif + +#ifndef GPIO_EXP_MAXPINMASK +/** + * @brief Maximum pin number mask for gpio_exp + */ +#define GPIO_EXP_MAXPINMASK (0xff) +#endif + +#ifndef GPIO_EXP_THRESH +/** + * @brief Pin numbers greater than GPIO_EXP_THRESH are on GPIO expanders + */ +#define GPIO_EXP_THRESH ((gpio_t)(-1) >> 1) +#endif + +#ifndef GPIO_EXP_PIN +/** + * @brief Convert (device, pin) tuple to @c gpio_t value + * + * @note Device number is determined by its position in gpio_exp_list, + * defined in gpio_exp_params.h + */ +#define GPIO_EXP_PIN(x, y) \ + (gpio_t)(~GPIO_EXP_THRESH | (x << GPIO_EXP_DEV_LOC) | GPIO_PIN(0,y)) +#endif + +/** + * @brief Callback typedef for gpio_init + * + * @see @ref drivers_periph_gpio + */ +typedef int (*gpio_exp_init_t)(void *dev, gpio_t pin, gpio_mode_t mode); + +/** + * @brief Callback typedef for gpio_init_int + * + * @see @ref drivers_periph_gpio + */ +typedef int (*gpio_exp_init_int_t)(void *dev, gpio_t pin, gpio_mode_t mode, + gpio_flank_t flank, gpio_cb_t cb, void *arg); + +/** + * @brief Callback typedef for gpio_irq (merged enable and disable) + * + * @see @ref drivers_periph_gpio + */ +typedef void (*gpio_exp_irq_t)(void *dev, gpio_t pin, int state); + +/** + * @brief Callback typedef for gpio_read + * + * @see @ref drivers_periph_gpio + */ +typedef int (*gpio_exp_read_t)(void *dev, gpio_t pin); + +/** + * @brief Callback typedef for gpio_write + * + * @see @ref drivers_periph_gpio + */ +typedef void (*gpio_exp_write_t)(void *dev, gpio_t pin, int value); + +/** + * @brief Default not supported functions + * @{ + */ +int gpio_exp_init_notsup(void *dev, gpio_t pin, gpio_mode_t mode); +int gpio_exp_init_int_notsup(void *dev, gpio_t pin, gpio_mode_t mode, + gpio_flank_t flank, gpio_cb_t cb, void *arg); +void gpio_exp_irq_notsup(void *dev, gpio_t pin, int state); +int gpio_exp_read_notsup(void *dev, gpio_t pin); +void gpio_exp_write_notsup(void *dev, gpio_t pin, int value); +/** @} */ + +/** + * @brief GPIO expansion driver entry + */ +typedef struct gpio_exp_driver { + gpio_exp_init_t const init; /**< callback for gpio_init */ + gpio_exp_init_int_t const init_int; /**< callback for gpio_init_int */ + gpio_exp_irq_t const irq; /**< callback for gpio_irq */ + gpio_exp_read_t const read; /**< callback for read */ + gpio_exp_write_t const write; /**< callback for write */ +} gpio_exp_driver_t; + +/** + * @brief GPIO expansion list entry + */ +typedef struct gpio_exp { + gpio_exp_driver_t const *driver; /**< pointer to driver */ + void *dev; /**< pointer to device descriptor */ +} gpio_exp_t; + +/** + * @brief Find an entry in the list of expanders by GPIO pin number + * + * @param[in] gpio GPIO to look up + * + * @return pointer to the list entry + * @return NULL if no device is listed + */ +gpio_exp_t *gpio_exp_entry(gpio_t gpio); + +/** + * @brief Strip encoding from a GPIO and return pin number + * + * @param[in] gpio GPIO to strip + * + * @return pin number + */ +gpio_t gpio_exp_pin(gpio_t gpio); + +#ifdef __cplusplus +} +#endif + +#endif /* GPIO_EXP_H */ +/** @} */ diff --git a/drivers/include/periph/gpio.h b/drivers/include/periph/gpio.h index 46c03ebc8f2a..57a0f0aeba5a 100644 --- a/drivers/include/periph/gpio.h +++ b/drivers/include/periph/gpio.h @@ -58,6 +58,10 @@ #include "periph_cpu.h" #include "periph_conf.h" +#ifdef MODULE_GPIO_EXP +#include "gpio_exp.h" +#endif + #ifdef __cplusplus extern "C" { #endif @@ -133,6 +137,24 @@ typedef struct { } gpio_isr_ctx_t; #endif +/** + * @brief Low-level versions of the GPIO functions + * + * These are for cpu gpio.c implementation and should not be called directly. + * @{ + */ +int gpio_init_ll(gpio_t pin, gpio_mode_t mode); +int gpio_init_int_ll(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg); +void gpio_irq_enable_ll(gpio_t pin); +void gpio_irq_disable_ll(gpio_t pin); +int gpio_read_ll(gpio_t pin); +void gpio_set_ll(gpio_t pin); +void gpio_clear_ll(gpio_t pin); +void gpio_toggle_ll(gpio_t pin); +void gpio_write_ll(gpio_t pin, int value); +/** @} */ + /** * @brief Initialize the given pin as general purpose input or output * @@ -146,7 +168,22 @@ typedef struct { * @return 0 on success * @return -1 on error */ -int gpio_init(gpio_t pin, gpio_mode_t mode); +inline int gpio_init(gpio_t pin, gpio_mode_t mode) +{ +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return -1; + } + return exp_entry->driver->init(exp_entry->dev, + gpio_exp_pin(pin), mode); + } +#endif + + return gpio_init_ll(pin, mode); +} /** * @brief Initialize a GPIO pin for external interrupt usage @@ -165,22 +202,67 @@ int gpio_init(gpio_t pin, gpio_mode_t mode); * @return 0 on success * @return -1 on error */ -int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, - gpio_cb_t cb, void *arg); +inline int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank, + gpio_cb_t cb, void *arg) +{ +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return -1; + } + return exp_entry->driver->init_int(exp_entry->dev, + gpio_exp_pin(pin), mode, flank, cb, arg); + } +#endif + + return gpio_init_int_ll(pin, mode, flank, cb, arg); +} /** * @brief Enable pin interrupt if configured as interrupt source * * @param[in] pin the pin to enable the interrupt for */ -void gpio_irq_enable(gpio_t pin); +inline void gpio_irq_enable(gpio_t pin) +{ +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return; + } + exp_entry->driver->irq(exp_entry->dev, gpio_exp_pin(pin), 1); + return; + } +#endif + + gpio_irq_enable_ll(pin); +} /** * @brief Disable the pin interrupt if configured as interrupt source * * @param[in] pin the pin to disable the interrupt for */ -void gpio_irq_disable(gpio_t pin); +inline void gpio_irq_disable(gpio_t pin) +{ +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return; + } + exp_entry->driver->irq(exp_entry->dev, gpio_exp_pin(pin), 0); + return; + } +#endif + + gpio_irq_disable_ll(pin); +} /** * @brief Get the current value of the given pin @@ -190,28 +272,80 @@ void gpio_irq_disable(gpio_t pin); * @return 0 when pin is LOW * @return >0 for HIGH */ -int gpio_read(gpio_t pin); +inline int gpio_read(gpio_t pin) +{ +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return 0; + } + return exp_entry->driver->read(exp_entry->dev, gpio_exp_pin(pin)); + } +#endif + + return gpio_read_ll(pin); +} /** * @brief Set the given pin to HIGH * * @param[in] pin the pin to set */ -void gpio_set(gpio_t pin); +inline void gpio_set(gpio_t pin) +{ +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_write(pin, 1); + return; + } +#endif + + gpio_set_ll(pin); +} /** * @brief Set the given pin to LOW * * @param[in] pin the pin to clear */ -void gpio_clear(gpio_t pin); +inline void gpio_clear(gpio_t pin) +{ +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_write(pin, 0); + return; + } +#endif + + gpio_clear_ll(pin); +} /** * @brief Toggle the value of the given pin * * @param[in] pin the pin to toggle */ -void gpio_toggle(gpio_t pin); +inline void gpio_toggle(gpio_t pin) +{ +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + if (gpio_read(pin)) { + gpio_write(pin, 1); + } + else { + gpio_write(pin, 0); + } + return; + } +#endif + + gpio_toggle_ll(pin); +} /** * @brief Set the given pin to the given value @@ -219,7 +353,22 @@ void gpio_toggle(gpio_t pin); * @param[in] pin the pin to set * @param[in] value value to set the pin to, 0 for LOW, HIGH otherwise */ -void gpio_write(gpio_t pin, int value); +inline void gpio_write(gpio_t pin, int value) +{ +#ifdef MODULE_GPIO_EXP + /* check to see if the pin is on a GPIO expander */ + if (pin > GPIO_EXP_THRESH) { + gpio_exp_t *exp_entry = gpio_exp_entry(pin); + if (exp_entry == NULL) { + return; + } + exp_entry->driver->write(exp_entry->dev, gpio_exp_pin(pin), value); + return; + } +#endif + + gpio_write_ll(pin, value); +} #ifdef __cplusplus } diff --git a/tests/driver_gpio_exp/Makefile b/tests/driver_gpio_exp/Makefile new file mode 100644 index 000000000000..6e5a41d15a5c --- /dev/null +++ b/tests/driver_gpio_exp/Makefile @@ -0,0 +1,17 @@ +include ../Makefile.tests_common + +# The CPUs of these boards do not provide a gpio.c API. +# CPUs: cc430, mips32r2_generic, native +BOARD_BLACKLIST := chronos \ + mips-malta \ + native + +USEMODULE += gpio_exp + +TEST_ON_CI_WHITELIST += all + +include ./Makefile.include +include $(RIOTBASE)/Makefile.include + +test: + ./tests/01-run.py diff --git a/tests/driver_gpio_exp/Makefile.include b/tests/driver_gpio_exp/Makefile.include new file mode 100644 index 000000000000..83e8b3dcf40d --- /dev/null +++ b/tests/driver_gpio_exp/Makefile.include @@ -0,0 +1,2 @@ +# include test specific includes +export INCLUDES += -I$(CURDIR)/include diff --git a/tests/driver_gpio_exp/include/gpio_exp_conf.h b/tests/driver_gpio_exp/include/gpio_exp_conf.h new file mode 100644 index 000000000000..0ad272e28f81 --- /dev/null +++ b/tests/driver_gpio_exp/include/gpio_exp_conf.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * + * @{ + * + * @file + * @brief GPIO expansion test list of expanders + * + * @author Matthew Blue + * + * @} + */ + +#ifndef GPIO_EXP_CONF_H +#define GPIO_EXP_CONF_H + +#include + +#include "gpio_exp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Reference the driver structs + * + * @{ + */ +extern gpio_exp_driver_t test_gpio_exp_test_driver; +extern gpio_exp_driver_t test_gpio_exp_notsup_driver; +/** @} */ + +/** + * @brief GPIO expansion test list + */ +static const gpio_exp_t gpio_exp_list[] = +{ + { + .driver = &test_gpio_exp_test_driver, + .dev = (void *)0xbeef + }, + { + .driver = &test_gpio_exp_notsup_driver, + .dev = NULL + } +}; + +#ifdef __cplusplus +} +#endif + +#endif /* GPIO_EXP_CONF_H */ +/** @} */ diff --git a/tests/driver_gpio_exp/main.c b/tests/driver_gpio_exp/main.c new file mode 100644 index 000000000000..ac7ca5cb757c --- /dev/null +++ b/tests/driver_gpio_exp/main.c @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @{ + * + * @file + * @brief GPIO expander test routine + * + * @author Matthew Blue + * @} + */ + +#include + +#include "gpio_exp.h" + +/* GPIO expansion test functions */ +int test_gpio_exp_init(void *dev, gpio_t pin, gpio_mode_t mode); +int test_gpio_exp_init_int(void *dev, gpio_t pin, gpio_mode_t mode, + gpio_flank_t flank, gpio_cb_t cb, void *arg); +void test_gpio_exp_irq(void *dev, gpio_t pin, int state); +int test_gpio_exp_read(void *dev, gpio_t pin); +void test_gpio_exp_write(void *dev, gpio_t pin, int value); + +/* GPIO expansion test drivers */ +const gpio_exp_driver_t test_gpio_exp_test_driver = { + .init = &test_gpio_exp_init, + .init_int = &test_gpio_exp_init_int, + .irq = &test_gpio_exp_irq, + .read = &test_gpio_exp_read, + .write = &test_gpio_exp_write +}; +const gpio_exp_driver_t test_gpio_exp_notsup_driver = { + .init = &gpio_exp_init_notsup, + .init_int = &gpio_exp_init_int_notsup, + .irq = &gpio_exp_irq_notsup, + .read = &gpio_exp_read_notsup, + .write = &gpio_exp_write_notsup +}; + +int test_gpio_exp_init(void *dev, gpio_t pin, gpio_mode_t mode) +{ + (void)mode; + + printf("init on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); + + return 0; +} + +int test_gpio_exp_init_int(void *dev, gpio_t pin, gpio_mode_t mode, + gpio_flank_t flank, gpio_cb_t cb, void *arg) +{ + (void)mode; + (void)flank; + (void)cb; + (void)arg; + + printf("init_int on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); + + return 0; +} + +void test_gpio_exp_irq(void *dev, gpio_t pin, int state) +{ + (void)state; + + printf("irq on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); +} + +int test_gpio_exp_read(void *dev, gpio_t pin) +{ + printf("read on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); + + return 0; +} + +void test_gpio_exp_write(void *dev, gpio_t pin, int value) +{ + (void)value; + + printf("write on dev 0x%x with pin %u\n", + (uint16_t)(uintptr_t)dev, (unsigned int)pin); +} + +int main(void) +{ + uint16_t num; + gpio_t pin; + + puts("gpio_exp test routine"); + + for (num = 0; num < 4; num++) { + pin = (1 << num); + printf("Running gpio.h functions on pin %u\n", (unsigned int)pin); + + gpio_init(GPIO_EXP_PIN(0, pin), 0x0); + gpio_init_int(GPIO_EXP_PIN(0, pin), 0x0, 0x0, NULL, NULL); + gpio_irq_enable(GPIO_EXP_PIN(0, pin)); + gpio_irq_disable(GPIO_EXP_PIN(0, pin)); + gpio_read(GPIO_EXP_PIN(0, pin)); + gpio_set(GPIO_EXP_PIN(0, pin)); + gpio_clear(GPIO_EXP_PIN(0, pin)); + gpio_toggle(GPIO_EXP_PIN(0, pin)); + gpio_write(GPIO_EXP_PIN(0, pin), 0); + } + + puts("Running notsup functions"); + puts("(they should not print output)"); + + for (num = 0; num < 4; num++) { + pin = (1 << num); + printf("Running notsup gpio.h functions on pin %u\n", + (unsigned int)pin); + + gpio_init(GPIO_EXP_PIN(1, pin), 0x0); + gpio_init_int(GPIO_EXP_PIN(1, pin), 0x0, 0x0, NULL, NULL); + gpio_irq_enable(GPIO_EXP_PIN(1, pin)); + gpio_irq_disable(GPIO_EXP_PIN(1, pin)); + gpio_read(GPIO_EXP_PIN(1, pin)); + gpio_set(GPIO_EXP_PIN(1, pin)); + gpio_clear(GPIO_EXP_PIN(1, pin)); + gpio_toggle(GPIO_EXP_PIN(1, pin)); + gpio_write(GPIO_EXP_PIN(1, pin), 0); + } + + puts("Checking that all pins in range have init error using notsup"); + puts("(lack of init error implies improper redirection)"); + + for (num = 0; num <= GPIO_EXP_MAXPINMASK; num++) { + if (gpio_init(GPIO_EXP_PIN(1, num), 0x0) >= 0) { + printf("init succeeded on pin %u\n", num); + puts("[FAILED]"); + return 1; + } + } + + puts("[SUCCESS]"); + + return 0; +} diff --git a/tests/driver_gpio_exp/tests/01-run.py b/tests/driver_gpio_exp/tests/01-run.py new file mode 100755 index 000000000000..add0fb6a5320 --- /dev/null +++ b/tests/driver_gpio_exp/tests/01-run.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2018 Acutam Automation, LLC +# +# This file is subject to the terms and conditions of the GNU Lesser +# General Public License v2.1. See the file LICENSE in the top level +# directory for more details. + +import os +import sys + + +def testfunc(child): + child.expect_exact("gpio_exp test routine") + for i in range(4): + child.expect('Running gpio.h functions on pin \d+') + child.expect('init on dev 0xbeef with pin \d+') + child.expect('init_int on dev 0xbeef with pin \d+') + child.expect('irq on dev 0xbeef with pin \d+') + child.expect('irq on dev 0xbeef with pin \d+') + child.expect('read on dev 0xbeef with pin \d+') + child.expect('write on dev 0xbeef with pin \d+') + child.expect('write on dev 0xbeef with pin \d+') + child.expect('read on dev 0xbeef with pin \d+') + child.expect('write on dev 0xbeef with pin \d+') + child.expect('write on dev 0xbeef with pin \d+') + child.expect_exact("Running notsup functions") + child.expect_exact("(they should not print output)") + for i in range(4): + child.expect('Running notsup gpio.h functions on pin \d+') + child.expect_exact("Checking that all pins in range have init error using notsup") + child.expect_exact("(lack of init error implies improper redirection)") + child.expect_exact("[SUCCESS]") + + +if __name__ == "__main__": + sys.path.append(os.path.join(os.environ['RIOTBASE'], 'dist/tools/testrunner')) + from testrunner import run + sys.exit(run(testfunc)) diff --git a/tests/driver_gpio_exp_coll/Makefile b/tests/driver_gpio_exp_coll/Makefile new file mode 100644 index 000000000000..6c34580e39c5 --- /dev/null +++ b/tests/driver_gpio_exp_coll/Makefile @@ -0,0 +1,11 @@ +include ../Makefile.tests_common + +# The CPUs of these boards do not provide a gpio.c API. +# CPUs: cc430, mips32r2_generic, native +BOARD_BLACKLIST := chronos \ + mips-malta \ + native + +USEMODULE += gpio_exp + +include $(RIOTBASE)/Makefile.include diff --git a/tests/driver_gpio_exp_coll/main.c b/tests/driver_gpio_exp_coll/main.c new file mode 100644 index 000000000000..4a491e358162 --- /dev/null +++ b/tests/driver_gpio_exp_coll/main.c @@ -0,0 +1,354 @@ +/* + * Copyright (C) 2018 Acutam Automation, LLC + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup tests + * @{ + * + * @file + * @brief GPIO expander compile time gpio_t collision test + * + * @author Matthew Blue + * @} + */ + +#include "assert.h" +#include "gpio_exp.h" +#include "periph/gpio.h" + +#if defined(CPU_MSP430FXYZ) +#define COLL_PINMASK (0x07) +#else +#define COLL_PINMASK (0x0f) +#endif + +#define COLL_TEST(port) \ + (GPIO_PIN(port, COLL_PINMASK) > GPIO_EXP_THRESH) + +#if defined(CPU_ATMEGA1281) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_ATMEGA1284P) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) + +#elif defined(CPU_ATMEGA2560) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) \ + || COLL_TEST(PORT_J) \ + || COLL_TEST(PORT_K) \ + || COLL_TEST(PORT_L) + +#elif defined(CPU_ATMEGA256RFR2) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_ATMEGA328P) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) + +#elif defined(CPU_CC2538) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) + +#elif defined(CPU_CC26X0) +/* CPU does have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_EFM32) +/* PORT_A */ +#if (_GPIO_PORT_A_PIN_COUNT > 0) +#define COLL_TEST_PORTA (COLL_TEST(PA)) +#else +#define COLL_TEST_PORTA (0) +#endif +/* PORT_B */ +#if (_GPIO_PORT_B_PIN_COUNT > 0) +#define COLL_TEST_PORTB (COLL_TEST_PORTA || COLL_TEST(PB)) +#else +#define COLL_TEST_PORTB (COLL_TEST_PORTA) +#endif +/* PORT_C */ +#if (_GPIO_PORT_C_PIN_COUNT > 0) +#define COLL_TEST_PORTC (COLL_TEST_PORTB || COLL_TEST(PC)) +#else +#define COLL_TEST_PORTC (COLL_TEST_PORTB) +#endif +/* PORT_D */ +#if (_GPIO_PORT_D_PIN_COUNT > 0) +#define COLL_TEST_PORTD (COLL_TEST_PORTC || COLL_TEST(PD)) +#else +#define COLL_TEST_PORTD (COLL_TEST_PORTC) +#endif +/* PORT_E */ +#if (_GPIO_PORT_E_PIN_COUNT > 0) +#define COLL_TEST_PORTE (COLL_TEST_PORTD || COLL_TEST(PE)) +#else +#define COLL_TEST_PORTE (COLL_TEST_PORTD) +#endif +/* PORT_F */ +#if (_GPIO_PORT_F_PIN_COUNT > 0) +#define COLL_TEST_PORTF (COLL_TEST_PORTE || COLL_TEST(PF)) +#else +#define COLL_TEST_PORTF (COLL_TEST_PORTE) +#endif +/* PORT_G */ +#if (_GPIO_PORT_G_PIN_COUNT > 0) +#define COLL_TEST_PORTG (COLL_TEST_PORTF || COLL_TEST(PG)) +#else +#define COLL_TEST_PORTG (COLL_TEST_PORTF) +#endif +/* PORT_H */ +#if (_GPIO_PORT_H_PIN_COUNT > 0) +#define COLL_TEST_PORTH (COLL_TEST_PORTG || COLL_TEST(PH)) +#else +#define COLL_TEST_PORTH (COLL_TEST_PORTG) +#endif +/* PORT_I */ +#if (_GPIO_PORT_I_PIN_COUNT > 0) +#define COLL_TEST_PORTI (COLL_TEST_PORTH || COLL_TEST(PI)) +#else +#define COLL_TEST_PORTI (COLL_TEST_PORTH) +#endif +/* PORT_J */ +#if (_GPIO_PORT_J_PIN_COUNT > 0) +#define COLL_TEST_PORTJ (COLL_TEST_PORTI || COLL_TEST(PJ)) +#else +#define COLL_TEST_PORTJ (COLL_TEST_PORTI) +#endif +/* PORT_K */ +#if (_GPIO_PORT_K_PIN_COUNT > 0) +#define COLL_TEST_PORTK (COLL_TEST_PORTJ || COLL_TEST(PK)) +#else +#define COLL_TEST_PORTK (COLL_TEST_PORTJ) +#endif +/* Combination of all existent ports */ +#define COLL_TEST_PORTS (COLL_TEST_PORTK) + +#elif defined(CPU_EZR32WG) +#define COLL_TEST_PORTS \ + COLL_TEST(PA) \ + || COLL_TEST(PB) \ + || COLL_TEST(PC) \ + || COLL_TEST(PD) \ + || COLL_TEST(PE) \ + || COLL_TEST(PF) + +#elif defined(CPU_FE310) +/* CPU does not have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_KINETIS) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_LM4F120) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) + +#elif defined(CPU_LPC1768) +/* CPU does not have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_LPC2387) +/* CPU does not have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_MIPS_PIC32MX) || defined(CPU_MIPS_PIC32MZ) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_MSP430FXYZ) +#define COLL_TEST_PORTS \ + COLL_TEST(P1) \ + || COLL_TEST(P2) \ + || COLL_TEST(P3) \ + || COLL_TEST(P4) \ + || COLL_TEST(P5) \ + || COLL_TEST(P6) + +#elif defined(CPU_NRF51) || defined(CPU_NRF52) +/* CPU does not have port definitions */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#elif defined(CPU_SAM3) +#define COLL_TEST_PORTS \ + COLL_TEST(PA) \ + || COLL_TEST(PB) \ + || COLL_TEST(PC) \ + || COLL_TEST(PD) + +#elif defined(CPU_SAMD21) || defined(CPU_SAML21) +#define COLL_TEST_PORTS \ + COLL_TEST(PA) \ + || COLL_TEST(PB) \ + || COLL_TEST(PC) + +#elif defined(CPU_STM32F0) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) + +#elif defined(CPU_STM32F1) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) + +#elif defined(CPU_STM32F2) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) \ + || COLL_TEST(PORT_I) + +#elif defined(CPU_STM32F3) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) + +#elif defined(CPU_STM32F4) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) \ + || COLL_TEST(PORT_I) + +#elif defined(CPU_STM32F7) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) \ + || COLL_TEST(PORT_I) \ + || COLL_TEST(PORT_J) \ + || COLL_TEST(PORT_K) + +#elif defined(CPU_STM32L0) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_H) + +#elif defined(CPU_STM32L1) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) + +#elif defined(CPU_STM32L4) +#define COLL_TEST_PORTS \ + COLL_TEST(PORT_A) \ + || COLL_TEST(PORT_B) \ + || COLL_TEST(PORT_C) \ + || COLL_TEST(PORT_D) \ + || COLL_TEST(PORT_E) \ + || COLL_TEST(PORT_F) \ + || COLL_TEST(PORT_G) \ + || COLL_TEST(PORT_H) + +#else + +/* unknown CPU (default to simpler, less thorough test) */ +#define COLL_TEST_PORTS \ + COLL_TEST(0) + +#endif /* defined(CPU) */ + +#define COLL_RES (!(COLL_TEST_PORTS)) + +static_assert(COLL_RES, "[driver_gpio_exp_coll] Collision in GPIO_EXP_PIN"); + +int main(void) +{ + return 0; +}