1
0
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:
Hauke Petersen 2014-07-28 16:23:24 +02:00
parent aa3e40c9b1
commit 13894fa70c
7 changed files with 654 additions and 380 deletions

View File

@ -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
* @{

View File

@ -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
* @{

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */

View File

@ -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 */