mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
cpus: adjusted uart implementations for changed IF
- adjusted stm32f0 - adjusted stm32f3 - adjusted stm32f4 - adjusted sam3x8e - adjusted nrf51822
This commit is contained in:
parent
aa3e40c9b1
commit
13894fa70c
@ -30,7 +30,6 @@
|
||||
#define CLOCK_PLL_MUL (CLOCK_CORECLOCK / CLOCK_HSE)
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @name Timer configuration
|
||||
* @{
|
||||
@ -60,7 +59,6 @@
|
||||
#define TIMER_1_IRQ_PRIO
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @name UART configuration
|
||||
* @{
|
||||
@ -97,7 +95,6 @@
|
||||
#define UART_1_AF 1
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @name ADC configuration
|
||||
* @{
|
||||
@ -133,115 +130,6 @@
|
||||
#define ADC_0_CH5_PIN 5
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @name PWM configuration
|
||||
* @{
|
||||
*/
|
||||
#define PWM_NUMOF (0U) /* TODO */
|
||||
#define PWM_0_EN 0
|
||||
#define PWM_1_EN 0
|
||||
|
||||
/* PWM 0 device configuration */
|
||||
#define PWM_0_DEV
|
||||
#define PWM_0_CHANNELS
|
||||
/* PWM 0 pin configuration */
|
||||
#define PWM_0_PORT
|
||||
#define PWM_0_PINS
|
||||
#define PWM_0_PORT_CLKEN()
|
||||
#define PWM_0_CH1_AFCFG()
|
||||
#define PWM_0_CH2_AFCFG()
|
||||
#define PWM_0_CH3_AFCFG()
|
||||
#define PWM_0_CH4_AFCFG()
|
||||
|
||||
/* PWM 1 device configuration */
|
||||
#define PWM_1_DEV
|
||||
#define PWM_1_CHANNELS
|
||||
/* PWM 1 pin configuration */
|
||||
#define PWM_1_PORT
|
||||
#define PWM_1_PINS
|
||||
#define PWM_1_PORT_CLKEN()
|
||||
#define PWM_1_CH1_AFCFG()
|
||||
#define PWM_1_CH2_AFCFG()
|
||||
#define PWM_1_CH3_AFCFG()
|
||||
#define PWM_1_CH4_AFCFG()
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @name SPI configuration
|
||||
* @{
|
||||
*/
|
||||
#define SPI_NUMOF (0U) /* TODO */
|
||||
#define SPI_0_EN 0
|
||||
#define SPI_1_EN 0
|
||||
|
||||
/* SPI 0 device config */
|
||||
#define SPI_0_DEV
|
||||
#define SPI_0_CLKEN()
|
||||
#define SPI_0_IRQ SPI1_IRQn
|
||||
#define SPI_0_IRQ_HANDLER
|
||||
#define SPI_0_IRQ_PRIO 1
|
||||
/* SPI 1 pin configuration */
|
||||
#define SPI_0_PORT
|
||||
#define SPI_0_PINS
|
||||
#define SPI_1_PORT_CLKEN()
|
||||
#define SPI_1_SCK_AFCFG()
|
||||
#define SPI_1_MISO_AFCFG()
|
||||
#define SPI_1_MOSI_AFCFG()
|
||||
|
||||
/* SPI 1 device config */
|
||||
#define SPI_1_DEV SPI2
|
||||
#define SPI_1_CLKEN()
|
||||
#define SPI_1_IRQ SPI2_IRQn
|
||||
#define SPI_1_IRQ_HANDLER
|
||||
#define SPI_1_IRQ_PRIO 1
|
||||
/* SPI 1 pin configuration */
|
||||
#define SPI_1_PORT
|
||||
#define SPI_1_PINS
|
||||
#define SPI_1_PORT_CLKEN()
|
||||
#define SPI_1_SCK_AFCFG()
|
||||
#define SPI_1_MISO_AFCFG()
|
||||
#define SPI_1_MOSI_AFCFG()
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @name I2C configuration
|
||||
* @{
|
||||
*/
|
||||
#define I2C_NUMOF (0U) /* TODO */
|
||||
#define I2C_0_EN 0
|
||||
#define I2C_0_EN 0
|
||||
|
||||
/* SPI 0 device configuration */
|
||||
#define I2C_0_DEV I2C1
|
||||
#define I2C_0_CLKEN()
|
||||
#define I2C_0_ISR isr_i2c1
|
||||
#define I2C_0_IRQ I2C1_IRQn
|
||||
#define I2C_0_IRQ_PRIO 1
|
||||
/* SPI 0 pin configuration */
|
||||
#define I2C_0_PORT
|
||||
#define I2C_0_PINS
|
||||
#define I2C_0_PORT_CLKEN()
|
||||
#define I2C_0_SCL_AFCFG()
|
||||
#define I2C_0_SDA_AFCFG()
|
||||
|
||||
/* SPI 1 device configuration */
|
||||
#define I2C_1_DEV I2C2
|
||||
#define I2C_1_CLKEN()
|
||||
#define I2C_1_ISR isr_i2c2
|
||||
#define I2C_1_IRQ I2C2_IRQn
|
||||
#define I2C_1_IRQ_PRIO 1
|
||||
/* SPI 1 pin configuration */
|
||||
#define I2C_1_PORT
|
||||
#define I2C_1_PINS
|
||||
#define I2C_1_PORT_CLKEN()
|
||||
#define I2C_1_SCL_AFCFG()
|
||||
#define I2C_1_SDA_AFCFG()
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @name GPIO configuration
|
||||
* @{
|
||||
|
@ -34,7 +34,6 @@
|
||||
#define CLOCK_FLASH_LATENCY FLASH_ACR_LATENCY_1
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @brief Timer configuration
|
||||
* @{
|
||||
@ -53,7 +52,6 @@
|
||||
#define TIMER_0_IRQ_CHAN TIM2_IRQn
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @brief UART configuration
|
||||
* @{
|
||||
@ -104,7 +102,6 @@
|
||||
#define UART_2_AF 7
|
||||
/** @} */
|
||||
|
||||
|
||||
/**
|
||||
* @brief GPIO configuration
|
||||
* @{
|
||||
|
@ -29,8 +29,13 @@
|
||||
#include "periph/gpio.h"
|
||||
#include "periph_conf.h"
|
||||
|
||||
/* guard file in case no GPIO device is defined */
|
||||
#if GPIO_NUMOF
|
||||
|
||||
typedef struct {
|
||||
void (*cb)(void);
|
||||
gpio_t dev;
|
||||
gpio_cb_t cb;
|
||||
void *arg;
|
||||
} gpio_state_t;
|
||||
|
||||
static gpio_state_t gpio_config;
|
||||
@ -126,10 +131,9 @@ static inline int get_pin(gpio_t dev)
|
||||
return GPIO_15_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int gpio_init_out(gpio_t dev, gpio_pp_t pullup)
|
||||
@ -148,7 +152,7 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pullup)
|
||||
/* set pull register configuration */
|
||||
switch (pullup) {
|
||||
case GPIO_NOPULL:
|
||||
break;
|
||||
return -1;
|
||||
case GPIO_PULLUP:
|
||||
NRF_GPIO->PIN_CNF[dev] |= (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos);
|
||||
break;
|
||||
@ -176,7 +180,7 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pullup)
|
||||
/* set pull register configuration */
|
||||
switch (pullup) {
|
||||
case GPIO_NOPULL:
|
||||
break;
|
||||
return -1;
|
||||
case GPIO_PULLUP:
|
||||
NRF_GPIO->PIN_CNF[dev] |= (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos);
|
||||
break;
|
||||
@ -188,7 +192,7 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pullup)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, void (*cb)(void))
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg)
|
||||
{
|
||||
int res;
|
||||
uint32_t pin;
|
||||
@ -207,7 +211,9 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, void (*cb)(v
|
||||
NVIC_EnableIRQ(GPIOTE_IRQn);
|
||||
|
||||
/* save callback */
|
||||
gpio_config.dev = dev;
|
||||
gpio_config.cb = cb;
|
||||
gpio_config.arg = arg;
|
||||
|
||||
/* reset GPIOTE configuration register to EVENT mode*/
|
||||
NRF_GPIOTE->CONFIG[0] = GPIOTE_CONFIG_MODE_Event;
|
||||
@ -234,18 +240,18 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, void (*cb)(v
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_irq_enable(gpio_t dev)
|
||||
void gpio_irq_enable(gpio_t dev)
|
||||
{
|
||||
NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk;
|
||||
|
||||
return 0;
|
||||
if (gpio_config.dev == dev) {
|
||||
NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Msk;
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_irq_disable(gpio_t dev)
|
||||
void gpio_irq_disable(gpio_t dev)
|
||||
{
|
||||
NRF_GPIOTE->INTENCLR |= GPIOTE_INTENSET_IN0_Msk;
|
||||
|
||||
return 0;
|
||||
if (gpio_config.dev == dev) {
|
||||
NRF_GPIOTE->INTENCLR |= GPIOTE_INTENSET_IN0_Msk;
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_read(gpio_t dev)
|
||||
@ -272,48 +278,42 @@ int gpio_read(gpio_t dev)
|
||||
res = 1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
return res;
|
||||
}
|
||||
|
||||
int gpio_set(gpio_t dev)
|
||||
void gpio_set(gpio_t dev)
|
||||
{
|
||||
int pin = get_pin(dev);
|
||||
if (pin < 0) {
|
||||
return pin;
|
||||
return;
|
||||
}
|
||||
|
||||
NRF_GPIO->OUTSET = (1 << pin);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_clear(gpio_t dev)
|
||||
void gpio_clear(gpio_t dev)
|
||||
{
|
||||
int pin = get_pin(dev);
|
||||
if (pin < 0) {
|
||||
return pin;
|
||||
return;
|
||||
}
|
||||
|
||||
NRF_GPIO->OUTCLR = (1 << pin);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_toggle(gpio_t dev)
|
||||
void gpio_toggle(gpio_t dev)
|
||||
{
|
||||
if (gpio_read(dev)) {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
} else {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_write(gpio_t dev, int value)
|
||||
void gpio_write(gpio_t dev, int value)
|
||||
{
|
||||
if (value) {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
} else {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
}
|
||||
}
|
||||
|
||||
@ -323,10 +323,12 @@ __attribute__((naked)) void isr_gpiote(void)
|
||||
if (NRF_GPIOTE->EVENTS_IN[0] == 1)
|
||||
{
|
||||
NRF_GPIOTE->EVENTS_IN[0] = 0;
|
||||
gpio_config.cb();
|
||||
gpio_config.cb(gpio_config.arg);
|
||||
}
|
||||
if (sched_context_switch_request) {
|
||||
thread_yield();
|
||||
}
|
||||
ISR_EXIT();
|
||||
}
|
||||
|
||||
#endif /* GPIO_NUMOF */
|
||||
|
@ -22,18 +22,20 @@
|
||||
#include "periph/gpio.h"
|
||||
#include "periph_conf.h"
|
||||
|
||||
/* guard file in case no GPIO devices are defined */
|
||||
#if GPIO_NUMOF
|
||||
|
||||
typedef struct {
|
||||
void (*cb)(void);
|
||||
gpio_cb_t cb; /**< callback called from GPIO interrupt */
|
||||
void *arg; /**< argument passed to the callback */
|
||||
} gpio_state_t;
|
||||
|
||||
// static gpio_state_t config[GPIO_NUMOF];
|
||||
|
||||
|
||||
/* static gpio_state_t gpio_config[GPIO_NUMOF]; */
|
||||
|
||||
int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
||||
{
|
||||
Pio *port;
|
||||
uint32_t pin;
|
||||
Pio *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -132,17 +134,17 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
||||
pin = GPIO_15_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* 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 -2;
|
||||
return -1;
|
||||
case GPIO_PULLUP:
|
||||
port->PIO_PUER = pin;
|
||||
break;
|
||||
@ -150,13 +152,14 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
||||
port->PIO_PUDR = pin;
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
|
||||
{
|
||||
Pio *port;
|
||||
uint32_t pin;
|
||||
Pio *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -255,16 +258,16 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
|
||||
pin = GPIO_15_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* configure pin as input */
|
||||
port->PIO_PER = pin;
|
||||
port->PIO_ODR = pin;
|
||||
|
||||
/* configure the pin's pull resistor state */
|
||||
switch (pushpull) {
|
||||
case GPIO_PULLDOWN:
|
||||
return -2;
|
||||
return -1;
|
||||
case GPIO_PULLUP:
|
||||
port->PIO_PUER = pin;
|
||||
break;
|
||||
@ -272,248 +275,261 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
|
||||
port->PIO_PUDR = pin;
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, void (*cb)(void))
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg)
|
||||
{
|
||||
// TODO implement
|
||||
return -3;
|
||||
/* TODO implement */
|
||||
return -1;
|
||||
}
|
||||
|
||||
void gpio_irq_enable(gpio_t dev)
|
||||
{
|
||||
/* TODO implement */
|
||||
}
|
||||
|
||||
void gpio_irq_disable(gpio_t dev)
|
||||
{
|
||||
/* TODO implement */
|
||||
}
|
||||
|
||||
int gpio_read(gpio_t dev)
|
||||
{
|
||||
int res = -1;
|
||||
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
case GPIO_0:
|
||||
return GPIO_0_DEV->PIO_PDSR & GPIO_0_PIN;
|
||||
res = GPIO_0_DEV->PIO_PDSR & GPIO_0_PIN;
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
case GPIO_1:
|
||||
return GPIO_1_DEV->PIO_PDSR & GPIO_1_PIN;
|
||||
res = GPIO_1_DEV->PIO_PDSR & GPIO_1_PIN;
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
case GPIO_2:
|
||||
return GPIO_2_DEV->PIO_PDSR & GPIO_2_PIN;
|
||||
res = GPIO_2_DEV->PIO_PDSR & GPIO_2_PIN;
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
case GPIO_3:
|
||||
return GPIO_3_DEV->PIO_PDSR & GPIO_3_PIN;
|
||||
res = GPIO_3_DEV->PIO_PDSR & GPIO_3_PIN;
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
case GPIO_4:
|
||||
return GPIO_4_DEV->PIO_PDSR & GPIO_4_PIN;
|
||||
res = GPIO_4_DEV->PIO_PDSR & GPIO_4_PIN;
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
case GPIO_5:
|
||||
return GPIO_5_DEV->PIO_PDSR & GPIO_5_PIN;
|
||||
res = GPIO_5_DEV->PIO_PDSR & GPIO_5_PIN;
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
case GPIO_6:
|
||||
return GPIO_6_DEV->PIO_PDSR & GPIO_6_PIN;
|
||||
res = GPIO_6_DEV->PIO_PDSR & GPIO_6_PIN;
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
case GPIO_7:
|
||||
return GPIO_7_DEV->PIO_PDSR & GPIO_7_PIN;
|
||||
res = GPIO_7_DEV->PIO_PDSR & GPIO_7_PIN;
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
case GPIO_8:
|
||||
return GPIO_8_DEV->PIO_PDSR & GPIO_8_PIN;
|
||||
res = GPIO_8_DEV->PIO_PDSR & GPIO_8_PIN;
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
case GPIO_9:
|
||||
return GPIO_9_DEV->PIO_PDSR & GPIO_9_PIN;
|
||||
res = GPIO_9_DEV->PIO_PDSR & GPIO_9_PIN;
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
case GPIO_10:
|
||||
return GPIO_10_DEV->PIO_PDSR & GPIO_10_PIN;
|
||||
res = GPIO_10_DEV->PIO_PDSR & GPIO_10_PIN;
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
case GPIO_11:
|
||||
return GPIO_11_DEV->PIO_PDSR & GPIO_11_PIN;
|
||||
res = GPIO_11_DEV->PIO_PDSR & GPIO_11_PIN;
|
||||
#endif
|
||||
#if GPIO_12_EN
|
||||
case GPIO_12:
|
||||
return GPIO_12_DEV->PIO_PDSR & GPIO_12_PIN;
|
||||
res = GPIO_12_DEV->PIO_PDSR & GPIO_12_PIN;
|
||||
#endif
|
||||
#if GPIO_13_EN
|
||||
case GPIO_13:
|
||||
return GPIO_13_DEV->PIO_PDSR & GPIO_13_PIN;
|
||||
res = GPIO_13_DEV->PIO_PDSR & GPIO_13_PIN;
|
||||
#endif
|
||||
#if GPIO_14_EN
|
||||
case GPIO_14:
|
||||
return GPIO_14_DEV->PIO_PDSR & GPIO_14_PIN;
|
||||
res = GPIO_14_DEV->PIO_PDSR & GPIO_14_PIN;
|
||||
#endif
|
||||
#if GPIO_15_EN
|
||||
case GPIO_15:
|
||||
return GPIO_15_DEV->PIO_PDSR & GPIO_15_PIN;
|
||||
res = GPIO_15_DEV->PIO_PDSR & GPIO_15_PIN;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* make sure we are not returning a negative value if bit 31 is set */
|
||||
if (res < -1) {
|
||||
res = 1;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int gpio_set(gpio_t dev)
|
||||
void gpio_set(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
case GPIO_0:
|
||||
return GPIO_0_DEV->PIO_SODR = GPIO_0_PIN;
|
||||
GPIO_0_DEV->PIO_SODR = GPIO_0_PIN;
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
case GPIO_1:
|
||||
return GPIO_1_DEV->PIO_SODR = GPIO_1_PIN;
|
||||
GPIO_1_DEV->PIO_SODR = GPIO_1_PIN;
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
case GPIO_2:
|
||||
return GPIO_2_DEV->PIO_SODR = GPIO_2_PIN;
|
||||
GPIO_2_DEV->PIO_SODR = GPIO_2_PIN;
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
case GPIO_3:
|
||||
return GPIO_3_DEV->PIO_SODR = GPIO_3_PIN;
|
||||
GPIO_3_DEV->PIO_SODR = GPIO_3_PIN;
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
case GPIO_4:
|
||||
return GPIO_4_DEV->PIO_SODR = GPIO_4_PIN;
|
||||
GPIO_4_DEV->PIO_SODR = GPIO_4_PIN;
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
case GPIO_5:
|
||||
return GPIO_5_DEV->PIO_SODR = GPIO_5_PIN;
|
||||
GPIO_5_DEV->PIO_SODR = GPIO_5_PIN;
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
case GPIO_6:
|
||||
return GPIO_6_DEV->PIO_SODR = GPIO_6_PIN;
|
||||
GPIO_6_DEV->PIO_SODR = GPIO_6_PIN;
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
case GPIO_7:
|
||||
return GPIO_7_DEV->PIO_SODR = GPIO_7_PIN;
|
||||
GPIO_7_DEV->PIO_SODR = GPIO_7_PIN;
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
case GPIO_8:
|
||||
return GPIO_8_DEV->PIO_SODR = GPIO_8_PIN;
|
||||
GPIO_8_DEV->PIO_SODR = GPIO_8_PIN;
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
case GPIO_9:
|
||||
return GPIO_9_DEV->PIO_SODR = GPIO_9_PIN;
|
||||
GPIO_9_DEV->PIO_SODR = GPIO_9_PIN;
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
case GPIO_10:
|
||||
return GPIO_10_DEV->PIO_SODR = GPIO_10_PIN;
|
||||
GPIO_10_DEV->PIO_SODR = GPIO_10_PIN;
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
case GPIO_11:
|
||||
return GPIO_11_DEV->PIO_SODR = GPIO_11_PIN;
|
||||
GPIO_11_DEV->PIO_SODR = GPIO_11_PIN;
|
||||
#endif
|
||||
#if GPIO_12_EN
|
||||
case GPIO_12:
|
||||
return GPIO_12_DEV->PIO_SODR = GPIO_12_PIN;
|
||||
GPIO_12_DEV->PIO_SODR = GPIO_12_PIN;
|
||||
#endif
|
||||
#if GPIO_13_EN
|
||||
case GPIO_13:
|
||||
return GPIO_13_DEV->PIO_SODR = GPIO_13_PIN;
|
||||
GPIO_13_DEV->PIO_SODR = GPIO_13_PIN;
|
||||
#endif
|
||||
#if GPIO_14_EN
|
||||
case GPIO_14:
|
||||
return GPIO_14_DEV->PIO_SODR = GPIO_14_PIN;
|
||||
GPIO_14_DEV->PIO_SODR = GPIO_14_PIN;
|
||||
#endif
|
||||
#if GPIO_15_EN
|
||||
case GPIO_15:
|
||||
return GPIO_15_DEV->PIO_SODR = GPIO_15_PIN;
|
||||
GPIO_15_DEV->PIO_SODR = GPIO_15_PIN;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_clear(gpio_t dev)
|
||||
void gpio_clear(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
case GPIO_0:
|
||||
return GPIO_0_DEV->PIO_CODR = GPIO_0_PIN;
|
||||
GPIO_0_DEV->PIO_CODR = GPIO_0_PIN;
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
case GPIO_1:
|
||||
return GPIO_1_DEV->PIO_CODR = GPIO_1_PIN;
|
||||
GPIO_1_DEV->PIO_CODR = GPIO_1_PIN;
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
case GPIO_2:
|
||||
return GPIO_2_DEV->PIO_CODR = GPIO_2_PIN;
|
||||
GPIO_2_DEV->PIO_CODR = GPIO_2_PIN;
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
case GPIO_3:
|
||||
return GPIO_3_DEV->PIO_CODR = GPIO_3_PIN;
|
||||
GPIO_3_DEV->PIO_CODR = GPIO_3_PIN;
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
case GPIO_4:
|
||||
return GPIO_4_DEV->PIO_CODR = GPIO_4_PIN;
|
||||
GPIO_4_DEV->PIO_CODR = GPIO_4_PIN;
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
case GPIO_5:
|
||||
return GPIO_5_DEV->PIO_CODR = GPIO_5_PIN;
|
||||
GPIO_5_DEV->PIO_CODR = GPIO_5_PIN;
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
case GPIO_6:
|
||||
return GPIO_6_DEV->PIO_CODR = GPIO_6_PIN;
|
||||
GPIO_6_DEV->PIO_CODR = GPIO_6_PIN;
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
case GPIO_7:
|
||||
return GPIO_7_DEV->PIO_CODR = GPIO_7_PIN;
|
||||
GPIO_7_DEV->PIO_CODR = GPIO_7_PIN;
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
case GPIO_8:
|
||||
return GPIO_8_DEV->PIO_CODR = GPIO_8_PIN;
|
||||
GPIO_8_DEV->PIO_CODR = GPIO_8_PIN;
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
case GPIO_9:
|
||||
return GPIO_9_DEV->PIO_CODR = GPIO_9_PIN;
|
||||
GPIO_9_DEV->PIO_CODR = GPIO_9_PIN;
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
case GPIO_10:
|
||||
return GPIO_10_DEV->PIO_CODR = GPIO_10_PIN;
|
||||
GPIO_10_DEV->PIO_CODR = GPIO_10_PIN;
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
case GPIO_11:
|
||||
return GPIO_11_DEV->PIO_CODR = GPIO_11_PIN;
|
||||
GPIO_11_DEV->PIO_CODR = GPIO_11_PIN;
|
||||
#endif
|
||||
#if GPIO_12_EN
|
||||
case GPIO_12:
|
||||
return GPIO_12_DEV->PIO_CODR = GPIO_12_PIN;
|
||||
GPIO_12_DEV->PIO_CODR = GPIO_12_PIN;
|
||||
#endif
|
||||
#if GPIO_13_EN
|
||||
case GPIO_13:
|
||||
return GPIO_13_DEV->PIO_CODR = GPIO_13_PIN;
|
||||
GPIO_13_DEV->PIO_CODR = GPIO_13_PIN;
|
||||
#endif
|
||||
#if GPIO_14_EN
|
||||
case GPIO_14:
|
||||
return GPIO_14_DEV->PIO_CODR = GPIO_14_PIN;
|
||||
GPIO_14_DEV->PIO_CODR = GPIO_14_PIN;
|
||||
#endif
|
||||
#if GPIO_15_EN
|
||||
case GPIO_15:
|
||||
return GPIO_15_DEV->PIO_CODR = GPIO_15_PIN;
|
||||
GPIO_15_DEV->PIO_CODR = GPIO_15_PIN;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_toggle(gpio_t dev)
|
||||
void gpio_toggle(gpio_t dev)
|
||||
{
|
||||
if (gpio_read(dev)) {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
} else {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_write(gpio_t dev, int value)
|
||||
void gpio_write(gpio_t dev, int value)
|
||||
{
|
||||
if (value) {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
} else {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* GPIO_NUMOF */
|
||||
|
@ -19,19 +19,25 @@
|
||||
*/
|
||||
|
||||
#include "cpu.h"
|
||||
#include "sched.h"
|
||||
#include "thread.h"
|
||||
#include "periph/gpio.h"
|
||||
#include "periph_conf.h"
|
||||
|
||||
/* guard file in case no GPIO devices are defined */
|
||||
#if GPIO_NUMOF
|
||||
|
||||
typedef struct {
|
||||
void (*cb)(void);
|
||||
gpio_cb_t cb;
|
||||
void *arg;
|
||||
} gpio_state_t;
|
||||
|
||||
static gpio_state_t config[GPIO_NUMOF];
|
||||
static gpio_state_t gpio_config[GPIO_NUMOF];
|
||||
|
||||
int gpio_init_out(gpio_t dev, gpio_pp_t pullup)
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
uint32_t pin;
|
||||
GPIO_TypeDef *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#ifdef GPIO_0_EN
|
||||
@ -118,9 +124,6 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pullup)
|
||||
pin = GPIO_11_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
port->MODER &= ~(2 << (2 * pin)); /* set pin to output mode */
|
||||
@ -136,8 +139,8 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pullup)
|
||||
|
||||
int gpio_init_in(gpio_t dev, gpio_pp_t pullup)
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
uint32_t pin;
|
||||
GPIO_TypeDef *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#ifdef GPIO_0_EN
|
||||
@ -224,9 +227,6 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pullup)
|
||||
pin = GPIO_11_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
port->MODER &= ~(3 << (2 * pin)); /* configure pin as input */
|
||||
@ -236,10 +236,10 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pullup)
|
||||
return 0; /* everything alright here */
|
||||
}
|
||||
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, void (*cb)(void))
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg)
|
||||
{
|
||||
int res;
|
||||
uint32_t pin;
|
||||
uint32_t pin = 0;
|
||||
|
||||
/* configure pin as input */
|
||||
res = gpio_init_in(dev, pullup);
|
||||
@ -353,13 +353,11 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, void (*cb)(v
|
||||
NVIC_EnableIRQ(GPIO_11_IRQ);
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* set callback */
|
||||
config[dev].cb = cb;
|
||||
gpio_config[dev].cb = cb;
|
||||
gpio_config[dev].arg = arg;
|
||||
|
||||
/* configure the event that triggers an interrupt */
|
||||
switch (flank) {
|
||||
@ -377,16 +375,150 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, void (*cb)(v
|
||||
break;
|
||||
}
|
||||
|
||||
/* clear any pending requests */
|
||||
EXTI->PR = (1 << pin);
|
||||
/* unmask the pins interrupt channel */
|
||||
EXTI->IMR |= (1 << pin);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gpio_irq_enable(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#ifdef GPIO_0_EN
|
||||
case GPIO_0:
|
||||
EXTI->IMR |= (1 << GPIO_0_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_1_EN
|
||||
case GPIO_1:
|
||||
EXTI->IMR |= (1 << GPIO_1_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_2_EN
|
||||
case GPIO_2:
|
||||
EXTI->IMR |= (1 << GPIO_2_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_3_EN
|
||||
case GPIO_3:
|
||||
EXTI->IMR |= (1 << GPIO_3_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_4_EN
|
||||
case GPIO_4:
|
||||
EXTI->IMR |= (1 << GPIO_4_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_5_EN
|
||||
case GPIO_5:
|
||||
EXTI->IMR |= (1 << GPIO_5_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_6_EN
|
||||
case GPIO_6:
|
||||
EXTI->IMR |= (1 << GPIO_6_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_7_EN
|
||||
case GPIO_7:
|
||||
EXTI->IMR |= (1 << GPIO_7_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_8_EN
|
||||
case GPIO_8:
|
||||
EXTI->IMR |= (1 << GPIO_8_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_9_EN
|
||||
case GPIO_9:
|
||||
EXTI->IMR |= (1 << GPIO_9_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_10_EN
|
||||
case GPIO_10:
|
||||
EXTI->IMR |= (1 << GPIO_10_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_11_EN
|
||||
case GPIO_11:
|
||||
EXTI->IMR |= (1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void gpio_irq_disable(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#ifdef GPIO_0_EN
|
||||
case GPIO_0:
|
||||
EXTI->IMR &= ~(1 << GPIO_0_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_1_EN
|
||||
case GPIO_1:
|
||||
EXTI->IMR &= ~(1 << GPIO_1_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_2_EN
|
||||
case GPIO_2:
|
||||
EXTI->IMR &= ~(1 << GPIO_2_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_3_EN
|
||||
case GPIO_3:
|
||||
EXTI->IMR &= ~(1 << GPIO_3_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_4_EN
|
||||
case GPIO_4:
|
||||
EXTI->IMR &= ~(1 << GPIO_4_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_5_EN
|
||||
case GPIO_5:
|
||||
EXTI->IMR &= ~(1 << GPIO_5_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_6_EN
|
||||
case GPIO_6:
|
||||
EXTI->IMR &= ~(1 << GPIO_6_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_7_EN
|
||||
case GPIO_7:
|
||||
EXTI->IMR &= ~(1 << GPIO_7_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_8_EN
|
||||
case GPIO_8:
|
||||
EXTI->IMR &= ~(1 << GPIO_8_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_9_EN
|
||||
case GPIO_9:
|
||||
EXTI->IMR &= ~(1 << GPIO_9_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_10_EN
|
||||
case GPIO_10:
|
||||
EXTI->IMR &= ~(1 << GPIO_10_PIN);
|
||||
break;
|
||||
#endif
|
||||
#ifdef GPIO_11_EN
|
||||
case GPIO_11:
|
||||
EXTI->IMR &= ~(1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_read(gpio_t dev)
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
uint32_t pin;
|
||||
GPIO_TypeDef *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#ifdef GPIO_0_EN
|
||||
@ -461,9 +593,6 @@ int gpio_read(gpio_t dev)
|
||||
pin = GPIO_11_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (port->MODER & (1 << (pin * 2))) { /* if configured as output */
|
||||
@ -473,7 +602,7 @@ int gpio_read(gpio_t dev)
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_set(gpio_t dev)
|
||||
void gpio_set(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#ifdef GPIO_0_EN
|
||||
@ -536,15 +665,10 @@ int gpio_set(gpio_t dev)
|
||||
GPIO_11_PORT->ODR |= (1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_clear(gpio_t dev)
|
||||
void gpio_clear(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#ifdef GPIO_0_EN
|
||||
@ -607,29 +731,24 @@ int gpio_clear(gpio_t dev)
|
||||
GPIO_11_PORT->ODR &= ~(1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_toggle(gpio_t dev)
|
||||
void gpio_toggle(gpio_t dev)
|
||||
{
|
||||
if (gpio_read(dev)) {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
} else {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_write(gpio_t dev, int value)
|
||||
void gpio_write(gpio_t dev, int value)
|
||||
{
|
||||
if (value) {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
} else {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
}
|
||||
}
|
||||
|
||||
@ -638,11 +757,14 @@ __attribute__((naked)) void isr_exti0_1(void)
|
||||
ISR_ENTER();
|
||||
if (EXTI->PR & EXTI_PR_PR0) {
|
||||
EXTI->PR |= EXTI_PR_PR0; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_0].cb();
|
||||
gpio_config[GPIO_IRQ_0].cb(gpio_config[GPIO_IRQ_0].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR1) {
|
||||
EXTI->PR |= EXTI_PR_PR1; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_1].cb();
|
||||
gpio_config[GPIO_IRQ_1].cb(gpio_config[GPIO_IRQ_1].arg);
|
||||
}
|
||||
if (sched_context_switch_request) {
|
||||
thread_yield();
|
||||
}
|
||||
ISR_EXIT();
|
||||
}
|
||||
@ -652,11 +774,14 @@ __attribute__((naked)) void isr_exti2_3(void)
|
||||
ISR_ENTER();
|
||||
if (EXTI->PR & EXTI_PR_PR2) {
|
||||
EXTI->PR |= EXTI_PR_PR2; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_2].cb();
|
||||
gpio_config[GPIO_IRQ_2].cb(gpio_config[GPIO_IRQ_2].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR3) {
|
||||
EXTI->PR |= EXTI_PR_PR3; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_3].cb();
|
||||
gpio_config[GPIO_IRQ_3].cb(gpio_config[GPIO_IRQ_3].arg);
|
||||
}
|
||||
if (sched_context_switch_request) {
|
||||
thread_yield();
|
||||
}
|
||||
ISR_EXIT();
|
||||
}
|
||||
@ -666,51 +791,56 @@ __attribute__((naked)) void isr_exti4_15(void)
|
||||
ISR_ENTER();
|
||||
if (EXTI->PR & EXTI_PR_PR4) {
|
||||
EXTI->PR |= EXTI_PR_PR4; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_4].cb();
|
||||
gpio_config[GPIO_IRQ_4].cb(gpio_config[GPIO_IRQ_4].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR5) {
|
||||
EXTI->PR |= EXTI_PR_PR5; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_5].cb();
|
||||
gpio_config[GPIO_IRQ_5].cb(gpio_config[GPIO_IRQ_5].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR6) {
|
||||
EXTI->PR |= EXTI_PR_PR6; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_6].cb();
|
||||
gpio_config[GPIO_IRQ_6].cb(gpio_config[GPIO_IRQ_6].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR7) {
|
||||
EXTI->PR |= EXTI_PR_PR7; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_7].cb();
|
||||
gpio_config[GPIO_IRQ_7].cb(gpio_config[GPIO_IRQ_7].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR8) {
|
||||
EXTI->PR |= EXTI_PR_PR8; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_8].cb();
|
||||
gpio_config[GPIO_IRQ_8].cb(gpio_config[GPIO_IRQ_8].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR9) {
|
||||
EXTI->PR |= EXTI_PR_PR9; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_9].cb();
|
||||
gpio_config[GPIO_IRQ_9].cb(gpio_config[GPIO_IRQ_9].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR10) {
|
||||
EXTI->PR |= EXTI_PR_PR10; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_10].cb();
|
||||
gpio_config[GPIO_IRQ_10].cb(gpio_config[GPIO_IRQ_10].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR11) {
|
||||
EXTI->PR |= EXTI_PR_PR11; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_11].cb();
|
||||
gpio_config[GPIO_IRQ_11].cb(gpio_config[GPIO_IRQ_11].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR12) {
|
||||
EXTI->PR |= EXTI_PR_PR12; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_12].cb();
|
||||
gpio_config[GPIO_IRQ_12].cb(gpio_config[GPIO_IRQ_12].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR13) {
|
||||
EXTI->PR |= EXTI_PR_PR13; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_13].cb();
|
||||
gpio_config[GPIO_IRQ_13].cb(gpio_config[GPIO_IRQ_13].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR14) {
|
||||
EXTI->PR |= EXTI_PR_PR14; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_14].cb();
|
||||
gpio_config[GPIO_IRQ_14].cb(gpio_config[GPIO_IRQ_14].arg);
|
||||
}
|
||||
else if (EXTI->PR & EXTI_PR_PR15) {
|
||||
EXTI->PR |= EXTI_PR_PR15; /* clear status bit by writing a 1 to it */
|
||||
config[GPIO_IRQ_15].cb();
|
||||
gpio_config[GPIO_IRQ_15].cb(gpio_config[GPIO_IRQ_15].arg);
|
||||
}
|
||||
if (sched_context_switch_request) {
|
||||
thread_yield();
|
||||
}
|
||||
ISR_EXIT();
|
||||
}
|
||||
|
||||
#endif /* GPIO_NUMOF */
|
||||
|
@ -24,19 +24,22 @@
|
||||
#include "periph/gpio.h"
|
||||
#include "periph_conf.h"
|
||||
|
||||
/* guard file in case no GPIO device is defined */
|
||||
#if GPIO_NUMOF
|
||||
|
||||
typedef struct {
|
||||
void (*cb)(void);
|
||||
gpio_cb_t cb; /**< callback called from GPIO interrupt */
|
||||
void *arg; /**< argument passed to the callback */
|
||||
} gpio_state_t;
|
||||
|
||||
static inline void irq_handler(gpio_t dev);
|
||||
|
||||
static gpio_state_t config[GPIO_NUMOF];
|
||||
|
||||
static gpio_state_t gpio_config[GPIO_NUMOF];
|
||||
|
||||
int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
uint32_t pin;
|
||||
GPIO_TypeDef *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -123,9 +126,6 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
||||
pin = GPIO_11_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
port->MODER &= ~(2 << (2 * pin)); /* set pin to output mode */
|
||||
@ -141,8 +141,8 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
||||
|
||||
int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
uint32_t pin;
|
||||
GPIO_TypeDef *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -229,9 +229,6 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
|
||||
pin = GPIO_11_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
port->MODER &= ~(3 << (2 * pin)); /* configure pin as input */
|
||||
@ -241,11 +238,11 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
|
||||
return 0; /* everything alright here */
|
||||
}
|
||||
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, void (*cb)(void))
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg)
|
||||
{
|
||||
uint32_t pin;
|
||||
uint32_t pin = 0;
|
||||
|
||||
int res = gpio_init_in(dev, pushpull);
|
||||
int res = gpio_init_in(dev, pullup);
|
||||
if (res < 0) {
|
||||
return res;
|
||||
}
|
||||
@ -362,13 +359,11 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, void (*cb)
|
||||
NVIC_EnableIRQ(GPIO_11_IRQ);
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* set callback */
|
||||
config[dev].cb = cb;
|
||||
gpio_config[dev].cb = cb;
|
||||
gpio_config[dev].arg = arg;
|
||||
|
||||
/* configure the active edges */
|
||||
switch (flank) {
|
||||
@ -384,16 +379,150 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, void (*cb)
|
||||
break;
|
||||
}
|
||||
|
||||
/* clear any pending requests */
|
||||
EXTI->PR = (1 << pin);
|
||||
/* enable interrupt for EXTI line */
|
||||
EXTI->IMR |= (1 << pin);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gpio_irq_enable(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
case GPIO_0:
|
||||
EXTI->IMR |= (1 << GPIO_0_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
case GPIO_1:
|
||||
EXTI->IMR |= (1 << GPIO_1_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
case GPIO_2:
|
||||
EXTI->IMR |= (1 << GPIO_2_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
case GPIO_3:
|
||||
EXTI->IMR |= (1 << GPIO_3_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
case GPIO_4:
|
||||
EXTI->IMR |= (1 << GPIO_4_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
case GPIO_5:
|
||||
EXTI->IMR |= (1 << GPIO_5_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
case GPIO_6:
|
||||
EXTI->IMR |= (1 << GPIO_6_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
case GPIO_7:
|
||||
EXTI->IMR |= (1 << GPIO_7_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
case GPIO_8:
|
||||
EXTI->IMR |= (1 << GPIO_8_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
case GPIO_9:
|
||||
EXTI->IMR |= (1 << GPIO_9_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
case GPIO_10:
|
||||
EXTI->IMR |= (1 << GPIO_10_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
case GPIO_11:
|
||||
EXTI->IMR |= (1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void gpio_irq_disable(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
case GPIO_0:
|
||||
EXTI->IMR &= ~(1 << GPIO_0_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
case GPIO_1:
|
||||
EXTI->IMR &= ~(1 << GPIO_1_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
case GPIO_2:
|
||||
EXTI->IMR &= ~(1 << GPIO_2_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
case GPIO_3:
|
||||
EXTI->IMR &= ~(1 << GPIO_3_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
case GPIO_4:
|
||||
EXTI->IMR &= ~(1 << GPIO_4_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
case GPIO_5:
|
||||
EXTI->IMR &= ~(1 << GPIO_5_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
case GPIO_6:
|
||||
EXTI->IMR &= ~(1 << GPIO_6_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
case GPIO_7:
|
||||
EXTI->IMR &= ~(1 << GPIO_7_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
case GPIO_8:
|
||||
EXTI->IMR &= ~(1 << GPIO_8_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
case GPIO_9:
|
||||
EXTI->IMR &= ~(1 << GPIO_9_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
case GPIO_10:
|
||||
EXTI->IMR &= ~(1 << GPIO_10_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
case GPIO_11:
|
||||
EXTI->IMR &= ~(1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_read(gpio_t dev)
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
uint32_t pin;
|
||||
GPIO_TypeDef *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -468,9 +597,6 @@ int gpio_read(gpio_t dev)
|
||||
pin = GPIO_11_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (port->MODER & (3 << (pin * 2))) { /* if configured as output */
|
||||
@ -481,7 +607,7 @@ int gpio_read(gpio_t dev)
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_set(gpio_t dev)
|
||||
void gpio_set(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -542,16 +668,12 @@ int gpio_set(gpio_t dev)
|
||||
#if GPIO_11_EN
|
||||
case GPIO_11:
|
||||
GPIO_11_PORT->BSRRL = (1 << GPIO_11_PIN);
|
||||
#endif
|
||||
break;
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_clear(gpio_t dev)
|
||||
void gpio_clear(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -614,36 +736,32 @@ int gpio_clear(gpio_t dev)
|
||||
GPIO_11_PORT->BSRRH = (1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_toggle(gpio_t dev)
|
||||
void gpio_toggle(gpio_t dev)
|
||||
{
|
||||
if (gpio_read(dev)) {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
}
|
||||
else {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_write(gpio_t dev, int value)
|
||||
void gpio_write(gpio_t dev, int value)
|
||||
{
|
||||
if (value) {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
}
|
||||
else {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void irq_handler(gpio_t dev)
|
||||
{
|
||||
config[dev].cb();
|
||||
gpio_config[dev].cb(gpio_config[dev].arg);
|
||||
if (sched_context_switch_request) {
|
||||
thread_yield();
|
||||
}
|
||||
@ -754,3 +872,5 @@ __attribute__((naked)) void isr_exti15_10(void)
|
||||
}
|
||||
ISR_EXIT();
|
||||
}
|
||||
|
||||
#endif /* GPIO_NUMOF */
|
||||
|
@ -24,8 +24,12 @@
|
||||
#include "periph/gpio.h"
|
||||
#include "periph_conf.h"
|
||||
|
||||
/* guard file in case no GPIO devices are defined */
|
||||
#if GPIO_NUMOF
|
||||
|
||||
typedef struct {
|
||||
void (*cb)(void);
|
||||
gpio_cb_t cb; /**< callback to call on GPIO interrupt */
|
||||
void *arg; /**< argument passed to the callback */
|
||||
} gpio_state_t;
|
||||
|
||||
/**
|
||||
@ -38,12 +42,12 @@ static inline void irq_handler(gpio_t dev);
|
||||
/**
|
||||
* @brief Hold one callback function pointer for each gpio device
|
||||
*/
|
||||
static gpio_state_t config[GPIO_NUMOF];
|
||||
static gpio_state_t gpio_config[GPIO_NUMOF];
|
||||
|
||||
int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
||||
int gpio_init_out(gpio_t dev, gpio_pp_t pullup)
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
uint32_t pin;
|
||||
GPIO_TypeDef *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -130,9 +134,6 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
||||
pin = GPIO_11_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
port->MODER &= ~(2 << (2 * pin)); /* set pin to output mode */
|
||||
@ -140,16 +141,16 @@ int gpio_init_out(gpio_t dev, gpio_pp_t pushpull)
|
||||
port->OTYPER &= ~(1 << pin); /* set to push-pull configuration */
|
||||
port->OSPEEDR |= (3 << (2 * pin)); /* set to high speed */
|
||||
port->PUPDR &= ~(3 << (2 * pin)); /* configure push-pull resistors */
|
||||
port->PUPDR |= (pushpull << (2 * pin));
|
||||
port->PUPDR |= (pullup << (2 * pin));
|
||||
port->ODR &= ~(1 << pin); /* set pin to low signal */
|
||||
|
||||
return 0; /* all OK */
|
||||
}
|
||||
|
||||
int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
|
||||
int gpio_init_in(gpio_t dev, gpio_pp_t pullup)
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
uint32_t pin;
|
||||
GPIO_TypeDef *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -236,24 +237,21 @@ int gpio_init_in(gpio_t dev, gpio_pp_t pushpull)
|
||||
pin = GPIO_11_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
port->MODER &= ~(3 << (2 * pin)); /* configure pin as input */
|
||||
port->PUPDR &= ~(3 << (2 * pin)); /* configure push-pull resistors */
|
||||
port->PUPDR |= (pushpull << (2 * pin));
|
||||
port->PUPDR |= (pullup << (2 * pin));
|
||||
|
||||
return 0; /* everything alright here */
|
||||
}
|
||||
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, void (*cb)(void))
|
||||
int gpio_init_int(gpio_t dev, gpio_pp_t pullup, gpio_flank_t flank, gpio_cb_t cb, void *arg)
|
||||
{
|
||||
int res;
|
||||
uint32_t pin;
|
||||
uint32_t pin = 0;
|
||||
|
||||
res = gpio_init_in(dev, pushpull);
|
||||
res = gpio_init_in(dev, pullup);
|
||||
if (res < 0) {
|
||||
return res;
|
||||
}
|
||||
@ -358,13 +356,11 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, void (*cb)
|
||||
NVIC_EnableIRQ(GPIO_11_IRQ);
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* set callback */
|
||||
config[dev].cb = cb;
|
||||
gpio_config[dev].cb = cb;
|
||||
gpio_config[dev].arg = arg;
|
||||
|
||||
/* configure the active edges */
|
||||
switch (flank) {
|
||||
@ -382,16 +378,150 @@ int gpio_init_int(gpio_t dev, gpio_pp_t pushpull, gpio_flank_t flank, void (*cb)
|
||||
break;
|
||||
}
|
||||
|
||||
/* clear any pending requests */
|
||||
EXTI->PR = (1 << pin);
|
||||
/* enable interrupt for EXTI line */
|
||||
EXTI->IMR |= (1 << pin);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void gpio_irq_enable(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
case GPIO_0:
|
||||
EXTI->IMR |= (1 << GPIO_0_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
case GPIO_1:
|
||||
EXTI->IMR |= (1 << GPIO_1_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
case GPIO_2:
|
||||
EXTI->IMR |= (1 << GPIO_2_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
case GPIO_3:
|
||||
EXTI->IMR |= (1 << GPIO_3_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
case GPIO_4:
|
||||
EXTI->IMR |= (1 << GPIO_4_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
case GPIO_5:
|
||||
EXTI->IMR |= (1 << GPIO_5_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
case GPIO_6:
|
||||
EXTI->IMR |= (1 << GPIO_6_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
case GPIO_7:
|
||||
EXTI->IMR |= (1 << GPIO_7_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
case GPIO_8:
|
||||
EXTI->IMR |= (1 << GPIO_8_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
case GPIO_9:
|
||||
EXTI->IMR |= (1 << GPIO_9_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
case GPIO_10:
|
||||
EXTI->IMR |= (1 << GPIO_10_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
case GPIO_11:
|
||||
EXTI->IMR |= (1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void gpio_irq_disable(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
case GPIO_0:
|
||||
EXTI->IMR &= ~(1 << GPIO_0_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_1_EN
|
||||
case GPIO_1:
|
||||
EXTI->IMR &= ~(1 << GPIO_1_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_2_EN
|
||||
case GPIO_2:
|
||||
EXTI->IMR &= ~(1 << GPIO_2_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_3_EN
|
||||
case GPIO_3:
|
||||
EXTI->IMR &= ~(1 << GPIO_3_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_4_EN
|
||||
case GPIO_4:
|
||||
EXTI->IMR &= ~(1 << GPIO_4_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_5_EN
|
||||
case GPIO_5:
|
||||
EXTI->IMR &= ~(1 << GPIO_5_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_6_EN
|
||||
case GPIO_6:
|
||||
EXTI->IMR &= ~(1 << GPIO_6_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_7_EN
|
||||
case GPIO_7:
|
||||
EXTI->IMR &= ~(1 << GPIO_7_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_8_EN
|
||||
case GPIO_8:
|
||||
EXTI->IMR &= ~(1 << GPIO_8_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_9_EN
|
||||
case GPIO_9:
|
||||
EXTI->IMR &= ~(1 << GPIO_9_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_10_EN
|
||||
case GPIO_10:
|
||||
EXTI->IMR &= ~(1 << GPIO_10_PIN);
|
||||
break;
|
||||
#endif
|
||||
#if GPIO_11_EN
|
||||
case GPIO_11:
|
||||
EXTI->IMR &= ~(1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_read(gpio_t dev)
|
||||
{
|
||||
GPIO_TypeDef *port;
|
||||
uint32_t pin;
|
||||
GPIO_TypeDef *port = 0;
|
||||
uint32_t pin = 0;
|
||||
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -466,9 +596,6 @@ int gpio_read(gpio_t dev)
|
||||
pin = GPIO_11_PIN;
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (port->MODER & (3 << (pin * 2))) { /* if configured as output */
|
||||
@ -478,7 +605,7 @@ int gpio_read(gpio_t dev)
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_set(gpio_t dev)
|
||||
void gpio_set(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -539,16 +666,12 @@ int gpio_set(gpio_t dev)
|
||||
#if GPIO_11_EN
|
||||
case GPIO_11:
|
||||
GPIO_11_PORT->ODR |= (1 << GPIO_11_PIN);
|
||||
#endif
|
||||
break;
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_clear(gpio_t dev)
|
||||
void gpio_clear(gpio_t dev)
|
||||
{
|
||||
switch (dev) {
|
||||
#if GPIO_0_EN
|
||||
@ -611,34 +734,30 @@ int gpio_clear(gpio_t dev)
|
||||
GPIO_11_PORT->ODR &= ~(1 << GPIO_11_PIN);
|
||||
break;
|
||||
#endif
|
||||
case GPIO_UNDEFINED:
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_toggle(gpio_t dev)
|
||||
void gpio_toggle(gpio_t dev)
|
||||
{
|
||||
if (gpio_read(dev)) {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
} else {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_write(gpio_t dev, int value)
|
||||
void gpio_write(gpio_t dev, int value)
|
||||
{
|
||||
if (value) {
|
||||
return gpio_set(dev);
|
||||
gpio_set(dev);
|
||||
} else {
|
||||
return gpio_clear(dev);
|
||||
gpio_clear(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void irq_handler(gpio_t dev)
|
||||
{
|
||||
config[dev].cb();
|
||||
gpio_config[dev].cb(gpio_config[dev].arg);
|
||||
if (sched_context_switch_request) {
|
||||
thread_yield();
|
||||
}
|
||||
@ -756,3 +875,5 @@ void isr_exti15_10(void)
|
||||
}
|
||||
ISR_EXIT();
|
||||
}
|
||||
|
||||
#endif /* GPIO_NUMOF */
|
||||
|
Loading…
Reference in New Issue
Block a user