HAL_ChibiOS: fixed GPIO interrupt port mapping

This commit is contained in:
Andrew Tridgell 2018-04-08 20:59:45 +10:00
parent 0f2a7108d3
commit 96cc657bd0
1 changed files with 30 additions and 1 deletions

View File

@ -130,8 +130,37 @@ extern const AP_HAL::HAL& hal;
bool GPIO::_attach_interrupt(ioline_t line, AP_HAL::Proc p, uint8_t mode) bool GPIO::_attach_interrupt(ioline_t line, AP_HAL::Proc p, uint8_t mode)
{ {
uint8_t pad = PAL_PAD(line); uint8_t pad = PAL_PAD(line);
stm32_gpio_t *pal_port = PAL_PORT(line);
uint8_t ext_port = 0xff;
const struct {
stm32_gpio_t *port;
uint8_t ext_port;
} port_mapping[] = {
{ GPIOA, EXT_MODE_GPIOA },
{ GPIOB, EXT_MODE_GPIOB },
{ GPIOC, EXT_MODE_GPIOC },
{ GPIOD, EXT_MODE_GPIOD },
{ GPIOE, EXT_MODE_GPIOE },
{ GPIOF, EXT_MODE_GPIOF },
#ifdef GPIOG
{ GPIOG, EXT_MODE_GPIOG },
#endif
#ifdef GPIOH
{ GPIOH, EXT_MODE_GPIOH },
#endif
#ifdef GPIOI
{ GPIOI, EXT_MODE_GPIOI },
#endif
};
// convert the line to a EXT_MODE_GPIOn value, this is STM32 specific // convert the line to a EXT_MODE_GPIOn value, this is STM32 specific
uint8_t ext_port = uint32_t(PAL_PORT(line)) >> 24; for (uint8_t i=0; i<ARRAY_SIZE_SIMPLE(port_mapping); i++) {
if (pal_port == port_mapping[i].port) {
ext_port = port_mapping[i].ext_port;
}
}
if (ext_port == 0xff) {
return false;
}
if (p && ext_irq[pad] != nullptr && ext_irq[pad] != p) { if (p && ext_irq[pad] != nullptr && ext_irq[pad] != p) {
// already used // already used
return false; return false;