mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-12-26 23:11:19 +01:00
Merge pull request #10007 from haukepetersen/fix_gpioirq_fe310
cpu/fe310/gpio: use gpio_irq feature
This commit is contained in:
commit
4e92c2a424
@ -32,34 +32,10 @@
|
||||
/* Num of GPIOs supported */
|
||||
#define GPIO_NUMOF (32)
|
||||
|
||||
#ifdef MODULE_PERIPH_GPIO_IRQ
|
||||
static gpio_flank_t isr_flank[GPIO_NUMOF];
|
||||
static gpio_isr_ctx_t isr_ctx[GPIO_NUMOF];
|
||||
|
||||
void gpio_isr(int num)
|
||||
{
|
||||
uint32_t pin = num - INT_GPIO_BASE;
|
||||
|
||||
/* Invoke callback function */
|
||||
if (isr_ctx[pin].cb) {
|
||||
isr_ctx[pin].cb(isr_ctx[pin].arg);
|
||||
}
|
||||
|
||||
/* Clear interupt */
|
||||
switch (isr_flank[pin]) {
|
||||
case GPIO_FALLING:
|
||||
GPIO_REG(GPIO_FALL_IP) |= (1 << pin);
|
||||
break;
|
||||
|
||||
case GPIO_RISING:
|
||||
GPIO_REG(GPIO_RISE_IP) |= (1 << pin);
|
||||
break;
|
||||
|
||||
case GPIO_BOTH:
|
||||
GPIO_REG(GPIO_FALL_IP) |= (1 << pin);
|
||||
GPIO_REG(GPIO_RISE_IP) |= (1 << pin);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int gpio_init(gpio_t pin, gpio_mode_t mode)
|
||||
{
|
||||
@ -99,6 +75,63 @@ int gpio_init(gpio_t pin, gpio_mode_t mode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_read(gpio_t pin)
|
||||
{
|
||||
return (GPIO_REG(GPIO_INPUT_VAL) & (1 << pin)) ? 1 : 0;
|
||||
}
|
||||
|
||||
void gpio_set(gpio_t pin)
|
||||
{
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin);
|
||||
}
|
||||
|
||||
void gpio_clear(gpio_t pin)
|
||||
{
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << pin);
|
||||
}
|
||||
|
||||
void gpio_toggle(gpio_t pin)
|
||||
{
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) ^= (1 << pin);
|
||||
}
|
||||
|
||||
void gpio_write(gpio_t pin, int value)
|
||||
{
|
||||
if (value) {
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin);
|
||||
}
|
||||
else {
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << pin);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MODULE_PERIPH_GPIO_IRQ
|
||||
void gpio_isr(int num)
|
||||
{
|
||||
uint32_t pin = num - INT_GPIO_BASE;
|
||||
|
||||
/* Invoke callback function */
|
||||
if (isr_ctx[pin].cb) {
|
||||
isr_ctx[pin].cb(isr_ctx[pin].arg);
|
||||
}
|
||||
|
||||
/* Clear interupt */
|
||||
switch (isr_flank[pin]) {
|
||||
case GPIO_FALLING:
|
||||
GPIO_REG(GPIO_FALL_IP) |= (1 << pin);
|
||||
break;
|
||||
|
||||
case GPIO_RISING:
|
||||
GPIO_REG(GPIO_RISE_IP) |= (1 << pin);
|
||||
break;
|
||||
|
||||
case GPIO_BOTH:
|
||||
GPIO_REG(GPIO_FALL_IP) |= (1 << pin);
|
||||
GPIO_REG(GPIO_RISE_IP) |= (1 << pin);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_init_int(gpio_t pin, gpio_mode_t mode, gpio_flank_t flank,
|
||||
gpio_cb_t cb, void *arg)
|
||||
{
|
||||
@ -182,33 +215,4 @@ void gpio_irq_disable(gpio_t pin)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int gpio_read(gpio_t pin)
|
||||
{
|
||||
return (GPIO_REG(GPIO_INPUT_VAL) & (1 << pin)) ? 1 : 0;
|
||||
}
|
||||
|
||||
void gpio_set(gpio_t pin)
|
||||
{
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin);
|
||||
}
|
||||
|
||||
void gpio_clear(gpio_t pin)
|
||||
{
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << pin);
|
||||
}
|
||||
|
||||
void gpio_toggle(gpio_t pin)
|
||||
{
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) ^= (1 << pin);
|
||||
}
|
||||
|
||||
void gpio_write(gpio_t pin, int value)
|
||||
{
|
||||
if (value) {
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) |= (1 << pin);
|
||||
}
|
||||
else {
|
||||
GPIO_REG(GPIO_OUTPUT_VAL) &= ~(1 << pin);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user