mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
e7fbaf3815
- removed the __attribute__((naked)) from ISRs - removed ISR_ENTER() and ISR_EXIT() macros Rationale: Cortex-Mx MCUs save registers R0-R4 automatically on calling ISRs. The naked attribute tells the compiler not to save any other registers. This is fine, as long as the code in the ISR is not nested. If nested, it will use also R4 and R5, which will then lead to currupted registers on exit of the ISR. Removing the naked will fix this.
1461 lines
34 KiB
C
1461 lines
34 KiB
C
/*
|
|
* Copyright (C) 2014 Hauke Petersen <mail@haukepetersen.de>
|
|
*
|
|
* 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 driver_periph
|
|
* @{
|
|
*
|
|
* @file gpio.c
|
|
* @brief Low-level GPIO driver implementation
|
|
*
|
|
* @author Hauke Petersen <mail@haukepetersen.de>
|
|
*
|
|
* @}
|
|
*/
|
|
|
|
#include "cpu.h"
|
|
#include "sched.h"
|
|
#include "thread.h"
|
|
#include "periph/gpio.h"
|
|
#include "periph_conf.h"
|
|
|
|
#define ENABLE_DEBUG (0)
|
|
#include "debug.h"
|
|
|
|
/* guard file in case no GPIO devices are defined */
|
|
#if GPIO_NUMOF
|
|
|
|
typedef struct {
|
|
gpio_cb_t cb; /**< callback called from GPIO interrupt */
|
|
void *arg; /**< argument passed to the callback */
|
|
} gpio_state_t;
|
|
|
|
static gpio_state_t gpio_config[GPIO_NUMOF];
|
|
|
|
int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
|
{
|
|
Pio *port = 0;
|
|
uint32_t pin = 0;
|
|
|
|
switch (dev) {
|
|
#if GPIO_0_EN
|
|
case GPIO_0:
|
|
port = GPIO_0_DEV;
|
|
pin = GPIO_0_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_1_EN
|
|
case GPIO_1:
|
|
port = GPIO_1_DEV;
|
|
pin = GPIO_1_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_2_EN
|
|
case GPIO_2:
|
|
port = GPIO_2_DEV;
|
|
pin = GPIO_2_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_3_EN
|
|
case GPIO_3:
|
|
port = GPIO_3_DEV;
|
|
pin = GPIO_3_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_4_EN
|
|
case GPIO_4:
|
|
port = GPIO_4_DEV;
|
|
pin = GPIO_4_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_5_EN
|
|
case GPIO_5:
|
|
port = GPIO_5_DEV;
|
|
pin = GPIO_5_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_6_EN
|
|
case GPIO_6:
|
|
port = GPIO_6_DEV;
|
|
pin = GPIO_6_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_7_EN
|
|
case GPIO_7:
|
|
port = GPIO_7_DEV;
|
|
pin = GPIO_7_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_8_EN
|
|
case GPIO_8:
|
|
port = GPIO_8_DEV;
|
|
pin = GPIO_8_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_9_EN
|
|
case GPIO_9:
|
|
port = GPIO_9_DEV;
|
|
pin = GPIO_9_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_10_EN
|
|
case GPIO_10:
|
|
port = GPIO_10_DEV;
|
|
pin = GPIO_10_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_11_EN
|
|
case GPIO_11:
|
|
port = GPIO_11_DEV;
|
|
pin = GPIO_11_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_12_EN
|
|
case GPIO_12:
|
|
port = GPIO_12_DEV;
|
|
pin = GPIO_12_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_13_EN
|
|
case GPIO_13:
|
|
port = GPIO_13_DEV;
|
|
pin = GPIO_13_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_14_EN
|
|
case GPIO_14:
|
|
port = GPIO_14_DEV;
|
|
pin = GPIO_14_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_15_EN
|
|
case GPIO_15:
|
|
port = GPIO_15_DEV;
|
|
pin = GPIO_15_PIN;
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
/* configure pin as output */
|
|
port->PIO_PER = pin;
|
|
port->PIO_OER = pin;
|
|
port->PIO_CODR = pin;
|
|
|
|
/* configure the pin's pull resistor state */
|
|
switch (pushpull) {
|
|
case GPIO_PULLDOWN:
|
|
return -1;
|
|
case GPIO_PULLUP:
|
|
port->PIO_PUER = pin;
|
|
break;
|
|
case GPIO_NOPULL:
|
|
port->PIO_PUDR = pin;
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
|
|
{
|
|
Pio *port = 0;
|
|
uint32_t pin = 0;
|
|
|
|
switch (dev) {
|
|
#if GPIO_0_EN
|
|
case GPIO_0:
|
|
port = GPIO_0_DEV;
|
|
pin = GPIO_0_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_0_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_1_EN
|
|
case GPIO_1:
|
|
port = GPIO_1_DEV;
|
|
pin = GPIO_1_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_1_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_2_EN
|
|
case GPIO_2:
|
|
port = GPIO_2_DEV;
|
|
pin = GPIO_2_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_2_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_3_EN
|
|
case GPIO_3:
|
|
port = GPIO_3_DEV;
|
|
pin = GPIO_3_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_3_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_4_EN
|
|
case GPIO_4:
|
|
port = GPIO_4_DEV;
|
|
pin = GPIO_4_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_4_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_5_EN
|
|
case GPIO_5:
|
|
port = GPIO_5_DEV;
|
|
pin = GPIO_5_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_5_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_6_EN
|
|
case GPIO_6:
|
|
port = GPIO_6_DEV;
|
|
pin = GPIO_6_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_6_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_7_EN
|
|
case GPIO_7:
|
|
port = GPIO_7_DEV;
|
|
pin = GPIO_7_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_7_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_8_EN
|
|
case GPIO_8:
|
|
port = GPIO_8_DEV;
|
|
pin = GPIO_8_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_8_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_9_EN
|
|
case GPIO_9:
|
|
port = GPIO_9_DEV;
|
|
pin = GPIO_9_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_9_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_10_EN
|
|
case GPIO_10:
|
|
port = GPIO_10_DEV;
|
|
pin = GPIO_10_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_10_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_11_EN
|
|
case GPIO_11:
|
|
port = GPIO_11_DEV;
|
|
pin = GPIO_11_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_11_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_12_EN
|
|
case GPIO_12:
|
|
port = GPIO_12_DEV;
|
|
pin = GPIO_12_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_12_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_13_EN
|
|
case GPIO_13:
|
|
port = GPIO_13_DEV;
|
|
pin = GPIO_13_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_13_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_14_EN
|
|
case GPIO_14:
|
|
port = GPIO_14_DEV;
|
|
pin = GPIO_14_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_14_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_15_EN
|
|
case GPIO_15:
|
|
port = GPIO_15_DEV;
|
|
pin = GPIO_15_PIN;
|
|
PMC->PMC_PCER0 = (1 << GPIO_15_IRQ);
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
/* give the PIO module the power over the corresponding pin */
|
|
port->PIO_PER = pin;
|
|
/* configure pin as input */
|
|
port->PIO_ODR = pin;
|
|
|
|
/* configure the pin's pull resistor state */
|
|
switch (pushpull) {
|
|
case GPIO_PULLDOWN:
|
|
return -1;
|
|
case GPIO_PULLUP:
|
|
port->PIO_PUER = pin;
|
|
break;
|
|
case GPIO_NOPULL:
|
|
port->PIO_PUDR = pin;
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg)
|
|
{
|
|
int res;
|
|
Pio *port = 0;
|
|
uint32_t pin = 0;
|
|
|
|
/* initialize port as input */
|
|
res = gpio_init_in(dev, pullup);
|
|
if (res < 0) {
|
|
return res;
|
|
}
|
|
|
|
/* read port and enable port interrupts */
|
|
switch (dev) {
|
|
#if GPIO_0_EN
|
|
case GPIO_0:
|
|
port = GPIO_0_DEV;
|
|
pin = GPIO_0_PIN;
|
|
NVIC_SetPriority(GPIO_0_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_0_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_1_EN
|
|
case GPIO_1:
|
|
port = GPIO_1_DEV;
|
|
pin = GPIO_1_PIN;
|
|
NVIC_SetPriority(GPIO_1_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_1_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_2_EN
|
|
case GPIO_2:
|
|
port = GPIO_2_DEV;
|
|
pin = GPIO_2_PIN;
|
|
NVIC_SetPriority(GPIO_2_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_2_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_3_EN
|
|
case GPIO_3:
|
|
port = GPIO_3_DEV;
|
|
pin = GPIO_3_PIN;
|
|
NVIC_SetPriority(GPIO_3_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_3_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_4_EN
|
|
case GPIO_4:
|
|
port = GPIO_4_DEV;
|
|
pin = GPIO_4_PIN;
|
|
NVIC_SetPriority(GPIO_4_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_4_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_5_EN
|
|
case GPIO_5:
|
|
port = GPIO_5_DEV;
|
|
pin = GPIO_5_PIN;
|
|
NVIC_SetPriority(GPIO_5_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_5_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_6_EN
|
|
case GPIO_6:
|
|
port = GPIO_6_DEV;
|
|
pin = GPIO_6_PIN;
|
|
NVIC_SetPriority(GPIO_6_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_6_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_7_EN
|
|
case GPIO_7:
|
|
port = GPIO_7_DEV;
|
|
pin = GPIO_7_PIN;
|
|
NVIC_SetPriority(GPIO_7_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_7_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_8_EN
|
|
case GPIO_8:
|
|
port = GPIO_8_DEV;
|
|
pin = GPIO_8_PIN;
|
|
NVIC_SetPriority(GPIO_8_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_8_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_9_EN
|
|
case GPIO_9:
|
|
port = GPIO_9_DEV;
|
|
pin = GPIO_9_PIN;
|
|
NVIC_SetPriority(GPIO_9_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_9_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_10_EN
|
|
case GPIO_10:
|
|
port = GPIO_10_DEV;
|
|
pin = GPIO_10_PIN;
|
|
NVIC_SetPriority(GPIO_10_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_10_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_11_EN
|
|
case GPIO_11:
|
|
port = GPIO_11_DEV;
|
|
pin = GPIO_11_PIN;
|
|
NVIC_SetPriority(GPIO_11_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_11_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_12_EN
|
|
case GPIO_12:
|
|
port = GPIO_12_DEV;
|
|
pin = GPIO_12_PIN;
|
|
NVIC_SetPriority(GPIO_12_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_12_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_13_EN
|
|
case GPIO_13:
|
|
port = GPIO_13_DEV;
|
|
pin = GPIO_13_PIN;
|
|
NVIC_SetPriority(GPIO_13_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_13_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_14_EN
|
|
case GPIO_14:
|
|
port = GPIO_14_DEV;
|
|
pin = GPIO_14_PIN;
|
|
NVIC_SetPriority(GPIO_14_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_14_IRQ);
|
|
break;
|
|
#endif
|
|
#if GPIO_15_EN
|
|
case GPIO_15:
|
|
port = GPIO_15_DEV;
|
|
pin = GPIO_15_PIN;
|
|
NVIC_SetPriority(GPIO_15_IRQ, GPIO_IRQ_PRIO);
|
|
NVIC_EnableIRQ(GPIO_15_IRQ);
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
/* set callback function and parameter */
|
|
gpio_config[dev].cb = cb;
|
|
gpio_config[dev].arg = arg;
|
|
|
|
/* set the active flank */
|
|
switch (flank) {
|
|
case GPIO_FALLING:
|
|
port->PIO_AIMER = pin;
|
|
port->PIO_ESR = pin;
|
|
port->PIO_FELLSR = pin;
|
|
break;
|
|
case GPIO_RISING:
|
|
port->PIO_AIMER = pin;
|
|
port->PIO_ESR = pin;
|
|
port->PIO_REHLSR = pin;
|
|
break;
|
|
case GPIO_BOTH:
|
|
port->PIO_AIMDR = pin;
|
|
break;
|
|
}
|
|
|
|
/* clean interrupt status register */
|
|
port->PIO_ISR;
|
|
|
|
/* enable the interrupt for the given channel */
|
|
port->PIO_IER = pin;
|
|
|
|
return 0;
|
|
}
|
|
|
|
int gpio_read(gpio_t dev)
|
|
{
|
|
Pio *port = 0;
|
|
uint32_t pin = 0;
|
|
int res;
|
|
|
|
switch (dev) {
|
|
#if GPIO_0_EN
|
|
case GPIO_0:
|
|
port = GPIO_0_DEV;
|
|
pin = GPIO_0_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_1_EN
|
|
case GPIO_1:
|
|
port = GPIO_1_DEV;
|
|
pin = GPIO_1_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_2_EN
|
|
case GPIO_2:
|
|
port = GPIO_2_DEV;
|
|
pin = GPIO_2_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_3_EN
|
|
case GPIO_3:
|
|
port = GPIO_3_DEV;
|
|
pin = GPIO_3_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_4_EN
|
|
case GPIO_4:
|
|
port = GPIO_4_DEV;
|
|
pin = GPIO_4_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_5_EN
|
|
case GPIO_5:
|
|
port = GPIO_5_DEV;
|
|
pin = GPIO_5_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_6_EN
|
|
case GPIO_6:
|
|
port = GPIO_6_DEV;
|
|
pin = GPIO_6_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_7_EN
|
|
case GPIO_7:
|
|
port = GPIO_7_DEV;
|
|
pin = GPIO_7_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_8_EN
|
|
case GPIO_8:
|
|
port = GPIO_8_DEV;
|
|
pin = GPIO_8_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_9_EN
|
|
case GPIO_9:
|
|
port = GPIO_9_DEV;
|
|
pin = GPIO_9_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_10_EN
|
|
case GPIO_10:
|
|
port = GPIO_10_DEV;
|
|
pin = GPIO_10_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_11_EN
|
|
case GPIO_11:
|
|
port = GPIO_11_DEV;
|
|
pin = GPIO_11_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_12_EN
|
|
case GPIO_12:
|
|
port = GPIO_12_DEV;
|
|
pin = GPIO_12_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_13_EN
|
|
case GPIO_13:
|
|
port = GPIO_13_DEV;
|
|
pin = GPIO_13_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_14_EN
|
|
case GPIO_14:
|
|
port = GPIO_14_DEV;
|
|
pin = GPIO_14_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_15_EN
|
|
case GPIO_15:
|
|
port = GPIO_15_DEV;
|
|
pin = GPIO_15_PIN;
|
|
break;
|
|
#endif
|
|
}
|
|
|
|
if (port->PIO_OSR & pin) {
|
|
res = port->PIO_ODSR & pin;
|
|
}
|
|
else {
|
|
res = port->PIO_PDSR & pin;
|
|
}
|
|
|
|
/* make sure we are not returning a negative value if bit 31 is set */
|
|
if (res < -1) {
|
|
res = 1;
|
|
}
|
|
|
|
return res;
|
|
}
|
|
|
|
void gpio_set(gpio_t dev)
|
|
{
|
|
switch (dev) {
|
|
#if GPIO_0_EN
|
|
case GPIO_0:
|
|
GPIO_0_DEV->PIO_SODR = GPIO_0_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_1_EN
|
|
case GPIO_1:
|
|
GPIO_1_DEV->PIO_SODR = GPIO_1_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_2_EN
|
|
case GPIO_2:
|
|
GPIO_2_DEV->PIO_SODR = GPIO_2_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_3_EN
|
|
case GPIO_3:
|
|
GPIO_3_DEV->PIO_SODR = GPIO_3_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_4_EN
|
|
case GPIO_4:
|
|
GPIO_4_DEV->PIO_SODR = GPIO_4_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_5_EN
|
|
case GPIO_5:
|
|
GPIO_5_DEV->PIO_SODR = GPIO_5_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_6_EN
|
|
case GPIO_6:
|
|
GPIO_6_DEV->PIO_SODR = GPIO_6_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_7_EN
|
|
case GPIO_7:
|
|
GPIO_7_DEV->PIO_SODR = GPIO_7_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_8_EN
|
|
case GPIO_8:
|
|
GPIO_8_DEV->PIO_SODR = GPIO_8_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_9_EN
|
|
case GPIO_9:
|
|
GPIO_9_DEV->PIO_SODR = GPIO_9_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_10_EN
|
|
case GPIO_10:
|
|
GPIO_10_DEV->PIO_SODR = GPIO_10_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_11_EN
|
|
case GPIO_11:
|
|
GPIO_11_DEV->PIO_SODR = GPIO_11_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_12_EN
|
|
case GPIO_12:
|
|
GPIO_12_DEV->PIO_SODR = GPIO_12_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_13_EN
|
|
case GPIO_13:
|
|
GPIO_13_DEV->PIO_SODR = GPIO_13_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_14_EN
|
|
case GPIO_14:
|
|
GPIO_14_DEV->PIO_SODR = GPIO_14_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_15_EN
|
|
case GPIO_15:
|
|
GPIO_15_DEV->PIO_SODR = GPIO_15_PIN;
|
|
break;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void gpio_clear(gpio_t dev)
|
|
{
|
|
switch (dev) {
|
|
#if GPIO_0_EN
|
|
case GPIO_0:
|
|
GPIO_0_DEV->PIO_CODR = GPIO_0_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_1_EN
|
|
case GPIO_1:
|
|
GPIO_1_DEV->PIO_CODR = GPIO_1_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_2_EN
|
|
case GPIO_2:
|
|
GPIO_2_DEV->PIO_CODR = GPIO_2_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_3_EN
|
|
case GPIO_3:
|
|
GPIO_3_DEV->PIO_CODR = GPIO_3_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_4_EN
|
|
case GPIO_4:
|
|
GPIO_4_DEV->PIO_CODR = GPIO_4_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_5_EN
|
|
case GPIO_5:
|
|
GPIO_5_DEV->PIO_CODR = GPIO_5_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_6_EN
|
|
case GPIO_6:
|
|
GPIO_6_DEV->PIO_CODR = GPIO_6_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_7_EN
|
|
case GPIO_7:
|
|
GPIO_7_DEV->PIO_CODR = GPIO_7_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_8_EN
|
|
case GPIO_8:
|
|
GPIO_8_DEV->PIO_CODR = GPIO_8_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_9_EN
|
|
case GPIO_9:
|
|
GPIO_9_DEV->PIO_CODR = GPIO_9_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_10_EN
|
|
case GPIO_10:
|
|
GPIO_10_DEV->PIO_CODR = GPIO_10_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_11_EN
|
|
case GPIO_11:
|
|
GPIO_11_DEV->PIO_CODR = GPIO_11_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_12_EN
|
|
case GPIO_12:
|
|
GPIO_12_DEV->PIO_CODR = GPIO_12_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_13_EN
|
|
case GPIO_13:
|
|
GPIO_13_DEV->PIO_CODR = GPIO_13_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_14_EN
|
|
case GPIO_14:
|
|
GPIO_14_DEV->PIO_CODR = GPIO_14_PIN;
|
|
break;
|
|
#endif
|
|
#if GPIO_15_EN
|
|
case GPIO_15:
|
|
GPIO_15_DEV->PIO_CODR = GPIO_15_PIN;
|
|
break;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
void gpio_toggle(gpio_t dev)
|
|
{
|
|
if (gpio_read(dev)) {
|
|
gpio_clear(dev);
|
|
} else {
|
|
gpio_set(dev);
|
|
}
|
|
}
|
|
|
|
void gpio_write(gpio_t dev, int value)
|
|
{
|
|
if (value) {
|
|
gpio_set(dev);
|
|
} else {
|
|
gpio_clear(dev);
|
|
}
|
|
}
|
|
|
|
void isr_pioa(void)
|
|
{
|
|
uint32_t status = PIOA->PIO_ISR;
|
|
#ifdef GPIO_A0_MAP
|
|
if (status & (1 << 0)) {
|
|
gpio_config[GPIO_A0_MAP].cb(gpio_config[GPIO_A0_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A1_MAP
|
|
if (status & (1 << 1)) {
|
|
gpio_config[GPIO_A1_MAP].cb(gpio_config[GPIO_A1_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A2_MAP
|
|
if (status & (1 << 2)) {
|
|
gpio_config[GPIO_A2_MAP].cb(gpio_config[GPIO_A2_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A3_MAP
|
|
if (status & (1 << 3)) {
|
|
gpio_config[GPIO_A3_MAP].cb(gpio_config[GPIO_A3_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A4_MAP
|
|
if (status & (1 << 4)) {
|
|
gpio_config[GPIO_A4_MAP].cb(gpio_config[GPIO_A4_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A5_MAP
|
|
if (status & (1 << 5)) {
|
|
gpio_config[GPIO_A5_MAP].cb(gpio_config[GPIO_A5_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A6_MAP
|
|
if (status & (1 << 6)) {
|
|
gpio_config[GPIO_A6_MAP].cb(gpio_config[GPIO_A6_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A7_MAP
|
|
if (status & (1 << 7)) {
|
|
gpio_config[GPIO_A7_MAP].cb(gpio_config[GPIO_A7_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A8_MAP
|
|
if (status & (1 << 8)) {
|
|
gpio_config[GPIO_A8_MAP].cb(gpio_config[GPIO_A8_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A9_MAP
|
|
if (status & (1 << 9)) {
|
|
gpio_config[GPIO_A9_MAP].cb(gpio_config[GPIO_A9_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A10_MAP
|
|
if (status & (1 << 10)) {
|
|
gpio_config[GPIO_A10_MAP].cb(gpio_config[GPIO_A10_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A11_MAP
|
|
if (status & (1 << 11)) {
|
|
gpio_config[GPIO_A11_MAP].cb(gpio_config[GPIO_A11_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A12_MAP
|
|
if (status & (1 << 12)) {
|
|
gpio_config[GPIO_A12_MAP].cb(gpio_config[GPIO_A12_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A13_MAP
|
|
if (status & (1 << 13)) {
|
|
gpio_config[GPIO_A13_MAP].cb(gpio_config[GPIO_A13_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A14_MAP
|
|
if (status & (1 << 14)) {
|
|
gpio_config[GPIO_A14_MAP].cb(gpio_config[GPIO_A14_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A15_MAP
|
|
if (status & (1 << 15)) {
|
|
gpio_config[GPIO_A15_MAP].cb(gpio_config[GPIO_A15_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A16_MAP
|
|
if (status & (1 << 16)) {
|
|
gpio_config[GPIO_A16_MAP].cb(gpio_config[GPIO_A16_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A17_MAP
|
|
if (status & (1 << 17)) {
|
|
gpio_config[GPIO_A17_MAP].cb(gpio_config[GPIO_A17_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A18_MAP
|
|
if (status & (1 << 18)) {
|
|
gpio_config[GPIO_A18_MAP].cb(gpio_config[GPIO_A18_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A19_MAP
|
|
if (status & (1 << 19)) {
|
|
gpio_config[GPIO_A19_MAP].cb(gpio_config[GPIO_A19_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A20_MAP
|
|
if (status & (1 << 20)) {
|
|
gpio_config[GPIO_A20_MAP].cb(gpio_config[GPIO_A20_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A21_MAP
|
|
if (status & (1 << 21)) {
|
|
gpio_config[GPIO_A21_MAP].cb(gpio_config[GPIO_A21_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A22_MAP
|
|
if (status & (1 << 22)) {
|
|
gpio_config[GPIO_A22_MAP].cb(gpio_config[GPIO_A22_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A23_MAP
|
|
if (status & (1 << 23)) {
|
|
gpio_config[GPIO_A23_MAP].cb(gpio_config[GPIO_A23_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A24_MAP
|
|
if (status & (1 << 24)) {
|
|
gpio_config[GPIO_A24_MAP].cb(gpio_config[GPIO_A24_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A25_MAP
|
|
if (status & (1 << 25)) {
|
|
gpio_config[GPIO_A25_MAP].cb(gpio_config[GPIO_A25_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A26_MAP
|
|
if (status & (1 << 26)) {
|
|
gpio_config[GPIO_A26_MAP].cb(gpio_config[GPIO_A26_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A27_MAP
|
|
if (status & (1 << 27)) {
|
|
gpio_config[GPIO_A27_MAP].cb(gpio_config[GPIO_A27_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A28_MAP
|
|
if (status & (1 << 28)) {
|
|
gpio_config[GPIO_A28_MAP].cb(gpio_config[GPIO_A28_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A29_MAP
|
|
if (status & (1 << 29)) {
|
|
gpio_config[GPIO_A29_MAP].cb(gpio_config[GPIO_A29_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A30_MAP
|
|
if (status & (1 << 30)) {
|
|
gpio_config[GPIO_A30_MAP].cb(gpio_config[GPIO_A30_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_A31_MAP
|
|
if (status & (1 << 31)) {
|
|
gpio_config[GPIO_A31_MAP].cb(gpio_config[GPIO_A31_MAP].arg);
|
|
}
|
|
#endif
|
|
if (sched_context_switch_request) {
|
|
thread_yield();
|
|
}
|
|
}
|
|
|
|
void isr_piob(void)
|
|
{
|
|
uint32_t status = PIOB->PIO_ISR;
|
|
#ifdef GPIO_B0_MAP
|
|
if (status & (1 << 0)) {
|
|
gpio_config[GPIO_B0_MAP].cb(gpio_config[GPIO_B0_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B1_MAP
|
|
if (status & (1 << 1)) {
|
|
gpio_config[GPIO_B1_MAP].cb(gpio_config[GPIO_B1_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B2_MAP
|
|
if (status & (1 << 2)) {
|
|
gpio_config[GPIO_B2_MAP].cb(gpio_config[GPIO_B2_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B3_MAP
|
|
if (status & (1 << 3)) {
|
|
gpio_config[GPIO_B3_MAP].cb(gpio_config[GPIO_B3_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B4_MAP
|
|
if (status & (1 << 4)) {
|
|
gpio_config[GPIO_B4_MAP].cb(gpio_config[GPIO_B4_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B5_MAP
|
|
if (status & (1 << 5)) {
|
|
gpio_config[GPIO_B5_MAP].cb(gpio_config[GPIO_B5_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B6_MAP
|
|
if (status & (1 << 6)) {
|
|
gpio_config[GPIO_B6_MAP].cb(gpio_config[GPIO_B6_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B7_MAP
|
|
if (status & (1 << 7)) {
|
|
gpio_config[GPIO_B7_MAP].cb(gpio_config[GPIO_B7_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B8_MAP
|
|
if (status & (1 << 8)) {
|
|
gpio_config[GPIO_B8_MAP].cb(gpio_config[GPIO_B8_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B9_MAP
|
|
if (status & (1 << 9)) {
|
|
gpio_config[GPIO_B9_MAP].cb(gpio_config[GPIO_B9_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B10_MAP
|
|
if (status & (1 << 10)) {
|
|
gpio_config[GPIO_B10_MAP].cb(gpio_config[GPIO_B10_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B11_MAP
|
|
if (status & (1 << 11)) {
|
|
gpio_config[GPIO_B11_MAP].cb(gpio_config[GPIO_B11_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B12_MAP
|
|
if (status & (1 << 12)) {
|
|
gpio_config[GPIO_B12_MAP].cb(gpio_config[GPIO_B12_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B13_MAP
|
|
if (status & (1 << 13)) {
|
|
gpio_config[GPIO_B13_MAP].cb(gpio_config[GPIO_B13_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B14_MAP
|
|
if (status & (1 << 14)) {
|
|
gpio_config[GPIO_B14_MAP].cb(gpio_config[GPIO_B14_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B15_MAP
|
|
if (status & (1 << 15)) {
|
|
gpio_config[GPIO_B15_MAP].cb(gpio_config[GPIO_B15_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B16_MAP
|
|
if (status & (1 << 16)) {
|
|
gpio_config[GPIO_B16_MAP].cb(gpio_config[GPIO_B16_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B17_MAP
|
|
if (status & (1 << 17)) {
|
|
gpio_config[GPIO_B17_MAP].cb(gpio_config[GPIO_B17_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B18_MAP
|
|
if (status & (1 << 18)) {
|
|
gpio_config[GPIO_B18_MAP].cb(gpio_config[GPIO_B18_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B19_MAP
|
|
if (status & (1 << 19)) {
|
|
gpio_config[GPIO_B19_MAP].cb(gpio_config[GPIO_B19_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B20_MAP
|
|
if (status & (1 << 20)) {
|
|
gpio_config[GPIO_B20_MAP].cb(gpio_config[GPIO_B20_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B21_MAP
|
|
if (status & (1 << 21)) {
|
|
gpio_config[GPIO_B21_MAP].cb(gpio_config[GPIO_B21_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B22_MAP
|
|
if (status & (1 << 22)) {
|
|
gpio_config[GPIO_B22_MAP].cb(gpio_config[GPIO_B22_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B23_MAP
|
|
if (status & (1 << 23)) {
|
|
gpio_config[GPIO_B23_MAP].cb(gpio_config[GPIO_B23_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B24_MAP
|
|
if (status & (1 << 24)) {
|
|
gpio_config[GPIO_B24_MAP].cb(gpio_config[GPIO_B24_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B25_MAP
|
|
if (status & (1 << 25)) {
|
|
gpio_config[GPIO_B25_MAP].cb(gpio_config[GPIO_B25_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B26_MAP
|
|
if (status & (1 << 26)) {
|
|
gpio_config[GPIO_B26_MAP].cb(gpio_config[GPIO_B26_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B27_MAP
|
|
if (status & (1 << 27)) {
|
|
gpio_config[GPIO_B27_MAP].cb(gpio_config[GPIO_B27_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B28_MAP
|
|
if (status & (1 << 28)) {
|
|
gpio_config[GPIO_B28_MAP].cb(gpio_config[GPIO_B28_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B29_MAP
|
|
if (status & (1 << 29)) {
|
|
gpio_config[GPIO_B29_MAP].cb(gpio_config[GPIO_B29_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B30_MAP
|
|
if (status & (1 << 30)) {
|
|
gpio_config[GPIO_B30_MAP].cb(gpio_config[GPIO_B30_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_B31_MAP
|
|
if (status & (1 << 31)) {
|
|
gpio_config[GPIO_B31_MAP].cb(gpio_config[GPIO_B31_MAP].arg);
|
|
}
|
|
#endif
|
|
if (sched_context_switch_request) {
|
|
thread_yield();
|
|
}
|
|
}
|
|
|
|
void isr_pioc(void)
|
|
{
|
|
uint32_t status = PIOC->PIO_ISR;
|
|
#ifdef GPIO_C0_MAP
|
|
if (status & (1 << 0)) {
|
|
gpio_config[GPIO_C0_MAP].cb(gpio_config[GPIO_C0_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C1_MAP
|
|
if (status & (1 << 1)) {
|
|
gpio_config[GPIO_C1_MAP].cb(gpio_config[GPIO_C1_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C2_MAP
|
|
if (status & (1 << 2)) {
|
|
gpio_config[GPIO_C2_MAP].cb(gpio_config[GPIO_C2_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C3_MAP
|
|
if (status & (1 << 3)) {
|
|
gpio_config[GPIO_C3_MAP].cb(gpio_config[GPIO_C3_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C4_MAP
|
|
if (status & (1 << 4)) {
|
|
gpio_config[GPIO_C4_MAP].cb(gpio_config[GPIO_C4_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C5_MAP
|
|
if (status & (1 << 5)) {
|
|
gpio_config[GPIO_C5_MAP].cb(gpio_config[GPIO_C5_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C6_MAP
|
|
if (status & (1 << 6)) {
|
|
gpio_config[GPIO_C6_MAP].cb(gpio_config[GPIO_C6_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C7_MAP
|
|
if (status & (1 << 7)) {
|
|
gpio_config[GPIO_C7_MAP].cb(gpio_config[GPIO_C7_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C8_MAP
|
|
if (status & (1 << 8)) {
|
|
gpio_config[GPIO_C8_MAP].cb(gpio_config[GPIO_C8_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C9_MAP
|
|
if (status & (1 << 9)) {
|
|
gpio_config[GPIO_C9_MAP].cb(gpio_config[GPIO_C9_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C10_MAP
|
|
if (status & (1 << 10)) {
|
|
gpio_config[GPIO_C10_MAP].cb(gpio_config[GPIO_C10_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C11_MAP
|
|
if (status & (1 << 11)) {
|
|
gpio_config[GPIO_C11_MAP].cb(gpio_config[GPIO_C11_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C12_MAP
|
|
if (status & (1 << 12)) {
|
|
gpio_config[GPIO_C12_MAP].cb(gpio_config[GPIO_C12_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C13_MAP
|
|
if (status & (1 << 13)) {
|
|
gpio_config[GPIO_C13_MAP].cb(gpio_config[GPIO_C13_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C14_MAP
|
|
if (status & (1 << 14)) {
|
|
gpio_config[GPIO_C14_MAP].cb(gpio_config[GPIO_C14_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C15_MAP
|
|
if (status & (1 << 15)) {
|
|
gpio_config[GPIO_C15_MAP].cb(gpio_config[GPIO_C15_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C16_MAP
|
|
if (status & (1 << 16)) {
|
|
gpio_config[GPIO_C16_MAP].cb(gpio_config[GPIO_C16_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C17_MAP
|
|
if (status & (1 << 17)) {
|
|
gpio_config[GPIO_C17_MAP].cb(gpio_config[GPIO_C17_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C18_MAP
|
|
if (status & (1 << 18)) {
|
|
gpio_config[GPIO_C18_MAP].cb(gpio_config[GPIO_C18_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C19_MAP
|
|
if (status & (1 << 19)) {
|
|
gpio_config[GPIO_C19_MAP].cb(gpio_config[GPIO_C19_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C20_MAP
|
|
if (status & (1 << 20)) {
|
|
gpio_config[GPIO_C20_MAP].cb(gpio_config[GPIO_C20_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C21_MAP
|
|
if (status & (1 << 21)) {
|
|
gpio_config[GPIO_C21_MAP].cb(gpio_config[GPIO_C21_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C22_MAP
|
|
if (status & (1 << 22)) {
|
|
gpio_config[GPIO_C22_MAP].cb(gpio_config[GPIO_C22_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C23_MAP
|
|
if (status & (1 << 23)) {
|
|
gpio_config[GPIO_C23_MAP].cb(gpio_config[GPIO_C23_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C24_MAP
|
|
if (status & (1 << 24)) {
|
|
gpio_config[GPIO_C24_MAP].cb(gpio_config[GPIO_C24_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C25_MAP
|
|
if (status & (1 << 25)) {
|
|
gpio_config[GPIO_C25_MAP].cb(gpio_config[GPIO_C25_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C26_MAP
|
|
if (status & (1 << 26)) {
|
|
gpio_config[GPIO_C26_MAP].cb(gpio_config[GPIO_C26_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C27_MAP
|
|
if (status & (1 << 27)) {
|
|
gpio_config[GPIO_C27_MAP].cb(gpio_config[GPIO_C27_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C28_MAP
|
|
if (status & (1 << 28)) {
|
|
gpio_config[GPIO_C28_MAP].cb(gpio_config[GPIO_C28_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C29_MAP
|
|
if (status & (1 << 29)) {
|
|
gpio_config[GPIO_C29_MAP].cb(gpio_config[GPIO_C29_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C30_MAP
|
|
if (status & (1 << 30)) {
|
|
gpio_config[GPIO_C30_MAP].cb(gpio_config[GPIO_C30_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_C31_MAP
|
|
if (status & (1 << 31)) {
|
|
gpio_config[GPIO_C31_MAP].cb(gpio_config[GPIO_C31_MAP].arg);
|
|
}
|
|
#endif
|
|
if (sched_context_switch_request) {
|
|
thread_yield();
|
|
}
|
|
}
|
|
|
|
void isr_piod(void)
|
|
{
|
|
uint32_t status = PIOD->PIO_ISR;
|
|
#ifdef GPIO_D0_MAP
|
|
if (status & (1 << 0)) {
|
|
gpio_config[GPIO_D0_MAP].cb(gpio_config[GPIO_D0_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D1_MAP
|
|
if (status & (1 << 1)) {
|
|
gpio_config[GPIO_D1_MAP].cb(gpio_config[GPIO_D1_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D2_MAP
|
|
if (status & (1 << 2)) {
|
|
gpio_config[GPIO_D2_MAP].cb(gpio_config[GPIO_D2_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D3_MAP
|
|
if (status & (1 << 3)) {
|
|
gpio_config[GPIO_D3_MAP].cb(gpio_config[GPIO_D3_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D4_MAP
|
|
if (status & (1 << 4)) {
|
|
gpio_config[GPIO_D4_MAP].cb(gpio_config[GPIO_D4_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D5_MAP
|
|
if (status & (1 << 5)) {
|
|
gpio_config[GPIO_D5_MAP].cb(gpio_config[GPIO_D5_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D6_MAP
|
|
if (status & (1 << 6)) {
|
|
gpio_config[GPIO_D6_MAP].cb(gpio_config[GPIO_D6_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D7_MAP
|
|
if (status & (1 << 7)) {
|
|
gpio_config[GPIO_D7_MAP].cb(gpio_config[GPIO_D7_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D8_MAP
|
|
if (status & (1 << 8)) {
|
|
gpio_config[GPIO_D8_MAP].cb(gpio_config[GPIO_D8_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D9_MAP
|
|
if (status & (1 << 9)) {
|
|
gpio_config[GPIO_D9_MAP].cb(gpio_config[GPIO_D9_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D10_MAP
|
|
if (status & (1 << 10)) {
|
|
gpio_config[GPIO_D10_MAP].cb(gpio_config[GPIO_D10_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D11_MAP
|
|
if (status & (1 << 11)) {
|
|
gpio_config[GPIO_D11_MAP].cb(gpio_config[GPIO_D11_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D12_MAP
|
|
if (status & (1 << 12)) {
|
|
gpio_config[GPIO_D12_MAP].cb(gpio_config[GPIO_D12_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D13_MAP
|
|
if (status & (1 << 13)) {
|
|
gpio_config[GPIO_D13_MAP].cb(gpio_config[GPIO_D13_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D14_MAP
|
|
if (status & (1 << 14)) {
|
|
gpio_config[GPIO_D14_MAP].cb(gpio_config[GPIO_D14_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D15_MAP
|
|
if (status & (1 << 15)) {
|
|
gpio_config[GPIO_D15_MAP].cb(gpio_config[GPIO_D15_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D16_MAP
|
|
if (status & (1 << 16)) {
|
|
gpio_config[GPIO_D16_MAP].cb(gpio_config[GPIO_D16_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D17_MAP
|
|
if (status & (1 << 17)) {
|
|
gpio_config[GPIO_D17_MAP].cb(gpio_config[GPIO_D17_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D18_MAP
|
|
if (status & (1 << 18)) {
|
|
gpio_config[GPIO_D18_MAP].cb(gpio_config[GPIO_D18_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D19_MAP
|
|
if (status & (1 << 19)) {
|
|
gpio_config[GPIO_D19_MAP].cb(gpio_config[GPIO_D19_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D20_MAP
|
|
if (status & (1 << 20)) {
|
|
gpio_config[GPIO_D20_MAP].cb(gpio_config[GPIO_D20_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D21_MAP
|
|
if (status & (1 << 21)) {
|
|
gpio_config[GPIO_D21_MAP].cb(gpio_config[GPIO_D21_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D22_MAP
|
|
if (status & (1 << 22)) {
|
|
gpio_config[GPIO_D22_MAP].cb(gpio_config[GPIO_D22_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D23_MAP
|
|
if (status & (1 << 23)) {
|
|
gpio_config[GPIO_D23_MAP].cb(gpio_config[GPIO_D23_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D24_MAP
|
|
if (status & (1 << 24)) {
|
|
gpio_config[GPIO_D24_MAP].cb(gpio_config[GPIO_D24_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D25_MAP
|
|
if (status & (1 << 25)) {
|
|
gpio_config[GPIO_D25_MAP].cb(gpio_config[GPIO_D25_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D26_MAP
|
|
if (status & (1 << 26)) {
|
|
gpio_config[GPIO_D26_MAP].cb(gpio_config[GPIO_D26_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D27_MAP
|
|
if (status & (1 << 27)) {
|
|
gpio_config[GPIO_D27_MAP].cb(gpio_config[GPIO_D27_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D28_MAP
|
|
if (status & (1 << 28)) {
|
|
gpio_config[GPIO_D28_MAP].cb(gpio_config[GPIO_D28_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D29_MAP
|
|
if (status & (1 << 29)) {
|
|
gpio_config[GPIO_D29_MAP].cb(gpio_config[GPIO_D29_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D30_MAP
|
|
if (status & (1 << 30)) {
|
|
gpio_config[GPIO_D30_MAP].cb(gpio_config[GPIO_D30_MAP].arg);
|
|
}
|
|
#endif
|
|
#ifdef GPIO_D31_MAP
|
|
if (status & (1 << 31)) {
|
|
gpio_config[GPIO_D31_MAP].cb(gpio_config[GPIO_D31_MAP].arg);
|
|
}
|
|
#endif
|
|
if (sched_context_switch_request) {
|
|
thread_yield();
|
|
}
|
|
}
|
|
|
|
#endif /* GPIO_NUMOF */
|