mirror of https://github.com/ARMmbed/mbed-os.git
* updated with GPIO IRQ code. Tested and working.
parent
6a23ca1da4
commit
2412fd2667
|
@ -24,101 +24,20 @@
|
||||||
#include "PeripheralPins.h"
|
#include "PeripheralPins.h"
|
||||||
#include "port.h"
|
#include "port.h"
|
||||||
|
|
||||||
|
#define IRQ_RISE_POSITION 1
|
||||||
|
#define IRQ_FALL_POSITION 2
|
||||||
#define CHANNEL_NUM 16
|
#define CHANNEL_NUM 16
|
||||||
#define pEXT_CONF(obj) (obj->config_extint_chan)
|
#define pEXT_CONF(obj) (obj->config_extint_chan)
|
||||||
static uint32_t channel_ids[CHANNEL_NUM] = {0};
|
static uint32_t channel_ids[CHANNEL_NUM] = {0};
|
||||||
static gpio_irq_handler irq_handler;
|
static gpio_irq_handler irq_handler;
|
||||||
uint8_t ext_int_pins[EIC_NUMBER_OF_INTERRUPTS] = {0xFF};
|
uint8_t ext_int_pins[EIC_NUMBER_OF_INTERRUPTS] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
|
||||||
uint8_t fallcount = 0;
|
|
||||||
uint8_t risecount = 0;
|
|
||||||
|
|
||||||
int get_extint_channel(PinName pin)
|
|
||||||
{
|
|
||||||
switch (pin) {
|
|
||||||
case PA16:
|
|
||||||
case PB00:
|
|
||||||
case PB16:
|
|
||||||
case PA00:
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case PA17:
|
|
||||||
case PB17:
|
|
||||||
case PA01:
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
case PA18:
|
|
||||||
case PA02:
|
|
||||||
return 2;
|
|
||||||
|
|
||||||
case PA19:
|
|
||||||
case PB03:
|
|
||||||
return 3;
|
|
||||||
|
|
||||||
case PA04:
|
|
||||||
case PA20:
|
|
||||||
return 4;
|
|
||||||
|
|
||||||
case PA05:
|
|
||||||
return 5;
|
|
||||||
|
|
||||||
case PA06:
|
|
||||||
case PA22:
|
|
||||||
case PB22:
|
|
||||||
return 6;
|
|
||||||
|
|
||||||
case PA07:
|
|
||||||
case PA23:
|
|
||||||
case PB28:
|
|
||||||
return 7;
|
|
||||||
|
|
||||||
case PA28:
|
|
||||||
case PB08:
|
|
||||||
return 8;
|
|
||||||
|
|
||||||
case PA09:
|
|
||||||
case PB09:
|
|
||||||
return 9;
|
|
||||||
|
|
||||||
case PA10:
|
|
||||||
case PA30:
|
|
||||||
return 10;
|
|
||||||
|
|
||||||
case PA11:
|
|
||||||
case PA31:
|
|
||||||
return 11;
|
|
||||||
|
|
||||||
case PA12:
|
|
||||||
case PA24:
|
|
||||||
return 12;
|
|
||||||
|
|
||||||
case PA13:
|
|
||||||
case PA25:
|
|
||||||
return 13;
|
|
||||||
|
|
||||||
case PB14:
|
|
||||||
case PB30:
|
|
||||||
case PA14:
|
|
||||||
return 14;
|
|
||||||
|
|
||||||
case PA15:
|
|
||||||
case PA27:
|
|
||||||
case PB15:
|
|
||||||
case PB31:
|
|
||||||
return 15;
|
|
||||||
|
|
||||||
default :
|
|
||||||
return 0xFF;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t find_peripheral_index (PinName pin, const PinMap* map)
|
uint32_t find_peripheral_index (PinName pin, const PinMap* map)
|
||||||
{
|
{
|
||||||
uint8_t count = 0;
|
|
||||||
while (map->pin != NC) {
|
while (map->pin != NC) {
|
||||||
if (map->pin == pin)
|
if (map->pin == pin)
|
||||||
return map[count].peripheral;
|
return map->peripheral;
|
||||||
map++;
|
map++;
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
return (uint32_t)NC;
|
return (uint32_t)NC;
|
||||||
}
|
}
|
||||||
|
@ -154,10 +73,8 @@ void gpio_irq(void)
|
||||||
mask = gpio_set(ext_int_pins[current_channel]);
|
mask = gpio_set(ext_int_pins[current_channel]);
|
||||||
if ((port_base->IN.reg & mask) != 0) {
|
if ((port_base->IN.reg & mask) != 0) {
|
||||||
event = IRQ_RISE;
|
event = IRQ_RISE;
|
||||||
risecount++;
|
|
||||||
} else {
|
} else {
|
||||||
event = IRQ_FALL;
|
event = IRQ_FALL;
|
||||||
fallcount++;
|
|
||||||
}
|
}
|
||||||
if (event != IRQ_NONE) {
|
if (event != IRQ_NONE) {
|
||||||
index = find_pin_index(ext_int_pins[current_channel], PinMap_EXTINT);
|
index = find_pin_index(ext_int_pins[current_channel], PinMap_EXTINT);
|
||||||
|
@ -181,8 +98,8 @@ int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32
|
||||||
pEXT_CONF(obj).gpio_pin = (uint32_t)pin;
|
pEXT_CONF(obj).gpio_pin = (uint32_t)pin;
|
||||||
pEXT_CONF(obj).gpio_pin_mux = 0; // mux setting for ext int is 0
|
pEXT_CONF(obj).gpio_pin_mux = 0; // mux setting for ext int is 0
|
||||||
pEXT_CONF(obj).gpio_pin_pull = EXTINT_PULL_NONE;
|
pEXT_CONF(obj).gpio_pin_pull = EXTINT_PULL_NONE;
|
||||||
pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_BOTH;
|
pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_NONE;
|
||||||
int_channel = get_extint_channel(pin);
|
int_channel = find_peripheral_index(pin, PinMap_EXTINT);
|
||||||
if (int_channel != 0xFF) {
|
if (int_channel != 0xFF) {
|
||||||
extint_chan_set_config(int_channel, &pEXT_CONF(obj));
|
extint_chan_set_config(int_channel, &pEXT_CONF(obj));
|
||||||
}
|
}
|
||||||
|
@ -206,24 +123,45 @@ void gpio_irq_free(gpio_irq_t *obj)
|
||||||
void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
|
void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
|
||||||
{
|
{
|
||||||
Eic *const eic = _extint_get_eic_from_channel(obj->ch);
|
Eic *const eic = _extint_get_eic_from_channel(obj->ch);
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_BOTH;
|
if (event == IRQ_RISE) {
|
||||||
extint_chan_set_config(obj->ch, &pEXT_CONF(obj));
|
obj->irqmask |= IRQ_RISE_POSITION;
|
||||||
|
} else if (event == IRQ_FALL) {
|
||||||
|
obj->irqmask |= IRQ_FALL_POSITION;
|
||||||
|
}
|
||||||
eic->INTENSET.reg = (1UL << obj->ch);
|
eic->INTENSET.reg = (1UL << obj->ch);
|
||||||
} else {
|
} else {
|
||||||
pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_BOTH;
|
if (event == IRQ_RISE) {
|
||||||
extint_chan_set_config(obj->ch, &pEXT_CONF(obj));
|
obj->irqmask &= ~IRQ_RISE_POSITION;
|
||||||
// channel_ids[obj->ch] = 0;
|
} else if (event == IRQ_FALL) {
|
||||||
|
obj->irqmask &= ~IRQ_FALL_POSITION;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj->irqmask == (IRQ_RISE_POSITION | IRQ_FALL_POSITION)) {
|
||||||
|
pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_BOTH;
|
||||||
|
} else if (obj->irqmask == IRQ_RISE_POSITION) {
|
||||||
|
pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_RISING;
|
||||||
|
} else if (obj->irqmask == IRQ_FALL_POSITION) {
|
||||||
|
pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_FALLING;
|
||||||
|
} else {
|
||||||
|
pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_NONE;
|
||||||
|
eic->INTENCLR.reg = (1UL << obj->ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
extint_chan_set_config(obj->ch, &pEXT_CONF(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
void gpio_irq_enable(gpio_irq_t *obj)
|
void gpio_irq_enable(gpio_irq_t *obj)
|
||||||
{
|
{
|
||||||
// NVIC_EnableIRQ(EIC_IRQn);
|
Eic *const eic = _extint_get_eic_from_channel(obj->ch);
|
||||||
|
NVIC_EnableIRQ(EIC_IRQn);
|
||||||
|
eic->INTENSET.reg = (1UL << obj->ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gpio_irq_disable(gpio_irq_t *obj)
|
void gpio_irq_disable(gpio_irq_t *obj)
|
||||||
{
|
{
|
||||||
// NVIC_DisableIRQ(EIC_IRQn);
|
Eic *const eic = _extint_get_eic_from_channel(obj->ch);
|
||||||
|
eic->INTENCLR.reg = (1UL << obj->ch);
|
||||||
|
NVIC_DisableIRQ(EIC_IRQn);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct gpio_irq_s {
|
struct gpio_irq_s {
|
||||||
|
uint8_t irqmask;
|
||||||
uint32_t port;
|
uint32_t port;
|
||||||
uint32_t pin;
|
uint32_t pin;
|
||||||
uint32_t ch;
|
uint32_t ch;
|
||||||
|
|
Loading…
Reference in New Issue