2014-04-17 19:36:12 +02:00
|
|
|
/*
|
2016-02-09 16:09:40 +01:00
|
|
|
* Copyright (C) 2014 Hauke Petersen <devel@haukepetersen.de>
|
2016-01-20 17:10:40 +01:00
|
|
|
* 2015 Hamburg University of Applied Sciences
|
|
|
|
* 2015 Freie Universität Berlin
|
2014-04-17 19:36:12 +02:00
|
|
|
*
|
2014-07-31 19:45:27 +02:00
|
|
|
* 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.
|
2014-04-17 19:36:12 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2016-01-20 17:10:40 +01:00
|
|
|
* @ingroup cpu_sam3
|
2017-06-22 15:43:17 +02:00
|
|
|
* @ingroup drivers_periph_gpio
|
2014-04-17 19:36:12 +02:00
|
|
|
* @{
|
2014-05-14 10:46:15 +02:00
|
|
|
*
|
2015-05-22 07:34:41 +02:00
|
|
|
* @file
|
2014-04-17 19:36:12 +02:00
|
|
|
* @brief Low-level GPIO driver implementation
|
|
|
|
*
|
2016-01-20 17:10:40 +01:00
|
|
|
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
|
|
|
* @author Tobias Fredersdorf <tobias.fredersdorf@haw-hamburg.de>
|
2014-05-14 10:46:15 +02:00
|
|
|
*
|
2014-04-17 19:36:12 +02:00
|
|
|
* @}
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "cpu.h"
|
|
|
|
#include "periph/gpio.h"
|
|
|
|
#include "periph_conf.h"
|
2016-01-20 17:10:40 +01:00
|
|
|
#include "periph_cpu.h"
|
2014-04-17 19:36:12 +02:00
|
|
|
|
2020-10-22 11:34:00 +02:00
|
|
|
#define ENABLE_DEBUG 0
|
2014-07-28 20:35:46 +02:00
|
|
|
#include "debug.h"
|
|
|
|
|
2018-09-21 08:19:41 +02:00
|
|
|
/**
|
|
|
|
* @brief Bit positions in the GPIO mode value
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
#define MODE_BIT_IO (0x1)
|
|
|
|
#define MODE_BIT_PUE (0x2)
|
|
|
|
#define MODE_BIT_ODE (0x4)
|
|
|
|
/** @} */
|
|
|
|
|
|
|
|
#ifdef MODULE_PERIPH_GPIO_IRQ
|
2016-01-20 17:10:40 +01:00
|
|
|
/**
|
|
|
|
* @brief We store 4 bit for each external interrupt line (each pin) that can
|
|
|
|
* mapped to an entry in the exti_ctx table
|
|
|
|
*/
|
|
|
|
#define EXTI_MAP_LENGTH (16U)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief We allow for 7 (4-bit - 1) concurrent external interrupts to be set
|
|
|
|
*/
|
|
|
|
#define CTX_NUMOF (7U)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Allocation of memory for 7 independent interrupt slots
|
|
|
|
*/
|
2018-02-21 15:32:00 +01:00
|
|
|
static gpio_isr_ctx_t exti_ctx[CTX_NUMOF];
|
2014-04-17 19:36:12 +02:00
|
|
|
|
2016-01-20 17:10:40 +01:00
|
|
|
/**
|
|
|
|
* @brief Allocation of 4 bit per pin to map a pin to an interrupt context
|
|
|
|
*/
|
|
|
|
static uint32_t exti_map[EXTI_MAP_LENGTH] = {
|
|
|
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
|
|
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
|
|
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
|
|
|
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get context for a specific pin
|
|
|
|
*/
|
make: fix sign-compare errors
cpu, nrf5x_common: fix sign-compare in periph/flashpage
drivers, periph_common: fix sign-compare in flashpage
cpu, sam0_common: fix sign-compare error in periph/gpio
cpu, cc2538: fix sign-compare in periph/timer
cpu, sam3: fix sign-compare in periph/gpio
cpu, stm32_common: fix sign-compare in periph/pwm
cpu, stm32_common: fix sign-compare in periph/timer
cpu, stm32_common: fix sign-compare in periph/flashpage
cpu, nrf5x_common: fix sign-compare in radio/nrfmin
cpu, samd21: fix sign-compare in periph/pwm
cpu, ezr32wg: fix sign-compare in periph/gpio
cpu, ezr32wg: fix sign-compare in periph/timer
drivers, ethos: fix sign-compare
sys, net: fix sign-compare
cpu, atmega_common: fix sign-compare error
cpu, msp430fxyz: fix sign-compare in periph/gpio
boards, msb-430-common: fix sign-compare in board_init
driver, cc2420: fix sign-compared
sys/net: fix sign-compare in gnrc_tftp
driver, pcd8544: fix sign-compare
driver, pn532: fix sign-compare
driver, sdcard_spi: fix sign-compare
tests: fix sign_compare
sys/net, lwmac: fix sign_compare
pkg, lwip: fix sign-compare
boards, waspmote: make CORECLOCK unsigned long to fix sign_compare error
tests, sock_ip: fix sign compare
tests, msg_avail: fix sign compare
tests, sock_udp: fix sign compare
boards: fix sign-compare for calliope and microbit matrix
2017-10-31 11:57:40 +01:00
|
|
|
static inline unsigned _ctx(int port, int pin)
|
2016-01-20 17:10:40 +01:00
|
|
|
{
|
|
|
|
return (exti_map[(port * 4) + (pin >> 3)] >> ((pin & 0x7) * 4)) & 0xf;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Write an entry to the context map array
|
|
|
|
*/
|
|
|
|
static void _write_map(int port, int pin, int ctx)
|
|
|
|
{
|
|
|
|
exti_map[(port * 4) + (pin >> 3)] &= ~(0xf << ((pin & 0x7) * 4));
|
|
|
|
exti_map[(port * 4) + (pin >> 3)] |= (ctx << ((pin & 0x7) * 4));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Find a free spot in the array containing the interrupt contexts
|
|
|
|
*/
|
|
|
|
static int _get_free_ctx(void)
|
|
|
|
{
|
make: fix sign-compare errors
cpu, nrf5x_common: fix sign-compare in periph/flashpage
drivers, periph_common: fix sign-compare in flashpage
cpu, sam0_common: fix sign-compare error in periph/gpio
cpu, cc2538: fix sign-compare in periph/timer
cpu, sam3: fix sign-compare in periph/gpio
cpu, stm32_common: fix sign-compare in periph/pwm
cpu, stm32_common: fix sign-compare in periph/timer
cpu, stm32_common: fix sign-compare in periph/flashpage
cpu, nrf5x_common: fix sign-compare in radio/nrfmin
cpu, samd21: fix sign-compare in periph/pwm
cpu, ezr32wg: fix sign-compare in periph/gpio
cpu, ezr32wg: fix sign-compare in periph/timer
drivers, ethos: fix sign-compare
sys, net: fix sign-compare
cpu, atmega_common: fix sign-compare error
cpu, msp430fxyz: fix sign-compare in periph/gpio
boards, msb-430-common: fix sign-compare in board_init
driver, cc2420: fix sign-compared
sys/net: fix sign-compare in gnrc_tftp
driver, pcd8544: fix sign-compare
driver, pn532: fix sign-compare
driver, sdcard_spi: fix sign-compare
tests: fix sign_compare
sys/net, lwmac: fix sign_compare
pkg, lwip: fix sign-compare
boards, waspmote: make CORECLOCK unsigned long to fix sign_compare error
tests, sock_ip: fix sign compare
tests, msg_avail: fix sign compare
tests, sock_udp: fix sign compare
boards: fix sign-compare for calliope and microbit matrix
2017-10-31 11:57:40 +01:00
|
|
|
for (unsigned i = 0; i < CTX_NUMOF; i++) {
|
2016-01-20 17:10:40 +01:00
|
|
|
if (exti_ctx[i].cb == NULL) {
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Clear the context of the given pin
|
|
|
|
*/
|
|
|
|
static void _ctx_clear(int port, int pin)
|
|
|
|
{
|
make: fix sign-compare errors
cpu, nrf5x_common: fix sign-compare in periph/flashpage
drivers, periph_common: fix sign-compare in flashpage
cpu, sam0_common: fix sign-compare error in periph/gpio
cpu, cc2538: fix sign-compare in periph/timer
cpu, sam3: fix sign-compare in periph/gpio
cpu, stm32_common: fix sign-compare in periph/pwm
cpu, stm32_common: fix sign-compare in periph/timer
cpu, stm32_common: fix sign-compare in periph/flashpage
cpu, nrf5x_common: fix sign-compare in radio/nrfmin
cpu, samd21: fix sign-compare in periph/pwm
cpu, ezr32wg: fix sign-compare in periph/gpio
cpu, ezr32wg: fix sign-compare in periph/timer
drivers, ethos: fix sign-compare
sys, net: fix sign-compare
cpu, atmega_common: fix sign-compare error
cpu, msp430fxyz: fix sign-compare in periph/gpio
boards, msb-430-common: fix sign-compare in board_init
driver, cc2420: fix sign-compared
sys/net: fix sign-compare in gnrc_tftp
driver, pcd8544: fix sign-compare
driver, pn532: fix sign-compare
driver, sdcard_spi: fix sign-compare
tests: fix sign_compare
sys/net, lwmac: fix sign_compare
pkg, lwip: fix sign-compare
boards, waspmote: make CORECLOCK unsigned long to fix sign_compare error
tests, sock_ip: fix sign compare
tests, msg_avail: fix sign compare
tests, sock_udp: fix sign compare
boards: fix sign-compare for calliope and microbit matrix
2017-10-31 11:57:40 +01:00
|
|
|
unsigned ctx = _ctx(port, pin);
|
2016-01-20 17:10:40 +01:00
|
|
|
if (ctx < CTX_NUMOF) {
|
|
|
|
exti_ctx[ctx].cb = NULL;
|
|
|
|
_write_map(port, pin, CTX_NUMOF);
|
2014-04-17 19:36:12 +02:00
|
|
|
}
|
2016-01-20 17:10:40 +01:00
|
|
|
}
|
2018-10-09 14:59:28 +02:00
|
|
|
#endif /* MODULE_PERIPH_GPIO_IRQ */
|
2018-09-21 08:19:41 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Extract the pin's port base address from the given pin identifier
|
|
|
|
*/
|
|
|
|
static inline Pio *_port(gpio_t pin)
|
|
|
|
{
|
|
|
|
return (Pio *)(pin & ~(0x1f));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Extract the port number from the given pin identifier
|
|
|
|
*
|
|
|
|
* Isolating bits 9 to 12 of the port base addresses leads to unique port
|
|
|
|
* numbers.
|
|
|
|
*/
|
|
|
|
static inline int _port_num(gpio_t pin)
|
|
|
|
{
|
|
|
|
return (((pin >> 9) & 0x0f) - 7);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Test if the given port is valid
|
|
|
|
*/
|
|
|
|
static bool _port_valid(Pio *port)
|
|
|
|
{
|
|
|
|
if (port == PIOA || port == PIOB || port == PIOC || port == PIOD) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Get the pin number from the pin identifier, encoded in the LSB 5 bit
|
|
|
|
*/
|
|
|
|
static inline int _pin_num(gpio_t pin)
|
|
|
|
{
|
|
|
|
return (pin & 0x1f);
|
|
|
|
}
|
2016-01-20 17:10:40 +01:00
|
|
|
|
2016-02-20 15:23:48 +01:00
|
|
|
int gpio_init(gpio_t pin, gpio_mode_t mode)
|
2016-01-20 17:10:40 +01:00
|
|
|
{
|
|
|
|
Pio *port = _port(pin);
|
|
|
|
int pin_num = _pin_num(pin);
|
|
|
|
int port_num = _port_num(pin);
|
|
|
|
|
2016-02-20 15:23:48 +01:00
|
|
|
/* make sure port is valid and no pull-down is selected*/
|
|
|
|
if (!_port_valid(port) || (mode == GPIO_IN_PD)) {
|
2016-01-20 17:10:40 +01:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* power on the corresponding port */
|
|
|
|
PMC->PMC_PCER0 = (1 << (port_num + 11));
|
|
|
|
|
|
|
|
/* disable interrupt and clear context (to be safe) */
|
|
|
|
port->PIO_IDR = (1 << pin_num);
|
2018-09-21 08:19:41 +02:00
|
|
|
#ifdef MODULE_PERIPH_GPIO_IRQ
|
2016-01-20 17:10:40 +01:00
|
|
|
_ctx_clear(port_num, pin_num);
|
2018-10-09 14:59:28 +02:00
|
|
|
#endif /* MODULE_PERIPH_GPIO_IRQ */
|
2014-04-17 19:36:12 +02:00
|
|
|
|
2016-01-20 17:10:40 +01:00
|
|
|
/* give the PIO module the power over the corresponding pin */
|
|
|
|
port->PIO_PER = (1 << pin_num);
|
2016-02-20 15:23:48 +01:00
|
|
|
|
|
|
|
/* configure pin direction (in/out) */
|
|
|
|
if (mode & MODE_BIT_IO) {
|
2016-01-20 17:10:40 +01:00
|
|
|
port->PIO_OER = (1 << pin_num);
|
2015-06-03 18:25:13 +02:00
|
|
|
}
|
|
|
|
else {
|
2016-01-20 17:10:40 +01:00
|
|
|
port->PIO_ODR = (1 << pin_num);
|
2015-06-03 18:25:13 +02:00
|
|
|
}
|
2016-02-20 15:23:48 +01:00
|
|
|
/* set pull-up */
|
|
|
|
if (mode & MODE_BIT_PUE) {
|
|
|
|
port->PIO_PUER = (1 << pin_num);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
port->PIO_PUDR = (1 << pin_num);
|
|
|
|
}
|
|
|
|
/* set multi-driver (open-drain) mode */
|
|
|
|
if (mode & MODE_BIT_ODE) {
|
|
|
|
port->PIO_MDER = (1 << pin_num);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
port->PIO_MDDR = (1 << pin_num);
|
|
|
|
}
|
2014-07-28 16:23:24 +02:00
|
|
|
|
|
|
|
return 0;
|
2014-04-17 19:36:12 +02:00
|
|
|
}
|
|
|
|
|
2018-09-21 08:19:41 +02:00
|
|
|
void gpio_init_mux(gpio_t pin, gpio_mux_t mux)
|
|
|
|
{
|
|
|
|
/* power on the corresponding port */
|
|
|
|
PMC->PMC_PCER0 = (1 << (_port_num(pin) + 11));
|
|
|
|
/* give peripheral control over the pin */
|
|
|
|
_port(pin)->PIO_PDR = (1 << _pin_num(pin));
|
|
|
|
/* and configure the MUX */
|
|
|
|
_port(pin)->PIO_ABSR &= ~(1 << _pin_num(pin));
|
|
|
|
_port(pin)->PIO_ABSR |= (mux << _pin_num(pin));
|
|
|
|
}
|
|
|
|
|
|
|
|
void gpio_set(gpio_t pin)
|
|
|
|
{
|
|
|
|
_port(pin)->PIO_SODR = (1 << _pin_num(pin));
|
|
|
|
}
|
|
|
|
|
|
|
|
void gpio_clear(gpio_t pin)
|
|
|
|
{
|
|
|
|
_port(pin)->PIO_CODR = (1 << _pin_num(pin));
|
|
|
|
}
|
|
|
|
|
|
|
|
void gpio_toggle(gpio_t pin)
|
|
|
|
{
|
|
|
|
if (gpio_read(pin)) {
|
|
|
|
_port(pin)->PIO_CODR = (1 << _pin_num(pin));
|
|
|
|
} else {
|
|
|
|
_port(pin)->PIO_SODR = (1 << _pin_num(pin));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-10-22 16:28:58 +02:00
|
|
|
void gpio_write(gpio_t pin, bool value)
|
2018-09-21 08:19:41 +02:00
|
|
|
{
|
|
|
|
if (value) {
|
|
|
|
_port(pin)->PIO_SODR = (1 << _pin_num(pin));
|
|
|
|
} else {
|
|
|
|
_port(pin)->PIO_CODR = (1 << _pin_num(pin));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void gpio_irq_enable(gpio_t pin)
|
|
|
|
{
|
|
|
|
NVIC_EnableIRQ((1 << (_port_num(pin) + PIOA_IRQn)));
|
|
|
|
}
|
|
|
|
|
|
|
|
void gpio_irq_disable(gpio_t pin)
|
|
|
|
{
|
|
|
|
NVIC_DisableIRQ((1 << (_port_num(pin) + PIOA_IRQn)));
|
|
|
|
}
|
|
|
|
|
2024-10-22 21:40:30 +02:00
|
|
|
bool gpio_read(gpio_t pin)
|
2018-09-21 08:19:41 +02:00
|
|
|
{
|
|
|
|
Pio *port = _port(pin);
|
|
|
|
int pin_num = _pin_num(pin);
|
|
|
|
|
|
|
|
if (port->PIO_OSR & (1 << pin_num)) {
|
|
|
|
return (port->PIO_ODSR & (1 << pin_num)) ? 1 : 0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return (port->PIO_PDSR & (1 << pin_num)) ? 1 : 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef MODULE_PERIPH_GPIO_IRQ
|
2016-02-20 15:23:48 +01:00
|
|
|
int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
|
2016-01-20 17:10:40 +01:00
|
|
|
gpio_cb_t cb, void *arg)
|
2014-04-17 19:36:12 +02:00
|
|
|
{
|
2016-01-20 17:10:40 +01:00
|
|
|
Pio *port = _port(pin);
|
|
|
|
int pin_num = _pin_num(pin);
|
|
|
|
int port_num = _port_num(pin);
|
2014-07-28 16:23:24 +02:00
|
|
|
|
2016-01-20 17:10:40 +01:00
|
|
|
/* make sure pin is valid */
|
|
|
|
if (!_port_valid(port)) {
|
|
|
|
return -1;
|
2014-07-28 20:35:46 +02:00
|
|
|
}
|
2014-07-28 16:23:24 +02:00
|
|
|
|
2016-01-20 17:10:40 +01:00
|
|
|
/* configure pin as input */
|
2016-02-20 15:23:48 +01:00
|
|
|
gpio_init(pin, mode);
|
2014-07-28 20:35:46 +02:00
|
|
|
|
2016-01-20 17:10:40 +01:00
|
|
|
/* try go grab a free spot in the context array */
|
|
|
|
int ctx_num = _get_free_ctx();
|
|
|
|
if (ctx_num < 0) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/* save context */
|
|
|
|
exti_ctx[ctx_num].cb = cb;
|
|
|
|
exti_ctx[ctx_num].arg = arg;
|
|
|
|
_write_map(port_num, pin_num, ctx_num);
|
2014-07-28 20:35:46 +02:00
|
|
|
|
|
|
|
/* set the active flank */
|
|
|
|
switch (flank) {
|
|
|
|
case GPIO_FALLING:
|
2016-01-20 17:10:40 +01:00
|
|
|
port->PIO_AIMER = (1 << pin_num);
|
|
|
|
port->PIO_ESR = (1 << pin_num);
|
|
|
|
port->PIO_FELLSR =(1 << pin_num);
|
2014-07-28 20:35:46 +02:00
|
|
|
break;
|
|
|
|
case GPIO_RISING:
|
2016-01-20 17:10:40 +01:00
|
|
|
port->PIO_AIMER = (1 << pin_num);
|
|
|
|
port->PIO_ESR = (1 << pin_num);
|
|
|
|
port->PIO_REHLSR = (1 << pin_num);
|
2014-07-28 20:35:46 +02:00
|
|
|
break;
|
|
|
|
case GPIO_BOTH:
|
2016-01-20 17:10:40 +01:00
|
|
|
port->PIO_AIMDR = (1 << pin_num);
|
2014-07-28 20:35:46 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* clean interrupt status register */
|
|
|
|
port->PIO_ISR;
|
|
|
|
/* enable the interrupt for the given channel */
|
2016-01-20 17:10:40 +01:00
|
|
|
NVIC_EnableIRQ(port_num + PIOA_IRQn);
|
|
|
|
port->PIO_IER = (1 << pin_num);
|
2014-07-28 20:35:46 +02:00
|
|
|
|
|
|
|
return 0;
|
2014-04-17 19:36:12 +02:00
|
|
|
}
|
|
|
|
|
2016-01-20 17:10:40 +01:00
|
|
|
static inline void isr_handler(Pio *port, int port_num)
|
2015-04-10 16:38:48 +02:00
|
|
|
{
|
2016-01-20 17:10:40 +01:00
|
|
|
/* take interrupt flags only from pins which interrupt is enabled */
|
|
|
|
uint32_t status = (port->PIO_ISR & port->PIO_IMR);
|
2015-06-03 18:25:13 +02:00
|
|
|
|
2016-01-20 17:10:40 +01:00
|
|
|
for (int i = 0; i < 32; i++) {
|
2019-11-21 09:09:57 +01:00
|
|
|
if (status & ((uint32_t)1 << i)) {
|
2016-01-20 17:10:40 +01:00
|
|
|
int ctx = _ctx(port_num, i);
|
|
|
|
exti_ctx[ctx].cb(exti_ctx[ctx].arg);
|
|
|
|
}
|
|
|
|
}
|
2016-11-30 18:26:05 +01:00
|
|
|
cortexm_isr_end();
|
2015-04-10 16:38:48 +02:00
|
|
|
}
|
|
|
|
|
2014-10-16 23:13:01 +02:00
|
|
|
void isr_pioa(void)
|
2014-07-28 20:35:46 +02:00
|
|
|
{
|
2016-01-20 17:10:40 +01:00
|
|
|
isr_handler(PIOA, PA);
|
2014-07-28 20:35:46 +02:00
|
|
|
}
|
|
|
|
|
2014-10-16 23:13:01 +02:00
|
|
|
void isr_piob(void)
|
2014-07-28 20:35:46 +02:00
|
|
|
{
|
2016-01-20 17:10:40 +01:00
|
|
|
isr_handler(PIOB, PB);
|
2014-07-28 20:35:46 +02:00
|
|
|
}
|
|
|
|
|
2014-10-16 23:13:01 +02:00
|
|
|
void isr_pioc(void)
|
2014-07-28 20:35:46 +02:00
|
|
|
{
|
2016-01-20 17:10:40 +01:00
|
|
|
isr_handler(PIOC, PC);
|
2014-07-28 20:35:46 +02:00
|
|
|
}
|
|
|
|
|
2014-10-16 23:13:01 +02:00
|
|
|
void isr_piod(void)
|
2014-07-28 20:35:46 +02:00
|
|
|
{
|
2016-01-20 17:10:40 +01:00
|
|
|
isr_handler(PIOD, PD);
|
2014-07-28 20:35:46 +02:00
|
|
|
}
|
2018-10-09 14:59:28 +02:00
|
|
|
#endif /* MODULE_PERIPH_GPIO_IRQ */
|