stm32: exti: exti_select_source: rework and use EXTI_EXTICR.
EXTICR on stm32g0 is in exti registers range. Previous chips used to have that gpio port exti mux configuration accessible via AFIO_EXTICR or SYSCFG_EXTICR. Also, the new chip now use 8 bits coded value instead of previously 4 for the extcr mux selection value (see AFIO/SYSCFG/EXTI_EXTICR_FIELDSIZE) Let's define two helpers: EXTICR_SELECTION_REG (to get proper AFIO/SYSCFG/ EXTI_EXTICR register) and EXTICR_SELECTION_FIELDSIZE (to get proper AFIO/SYSCFG/ EXTI_EXTICR_FIELDSIZE value), and use it them exti_select_source to determine exticr mux selection bits shift and mask.
This commit is contained in:
committed by
Karl Palsson
parent
553c876fa5
commit
b98dd8eee0
@@ -25,8 +25,17 @@
|
|||||||
|
|
||||||
#include <libopencm3/stm32/exti.h>
|
#include <libopencm3/stm32/exti.h>
|
||||||
#include <libopencm3/stm32/gpio.h>
|
#include <libopencm3/stm32/gpio.h>
|
||||||
#if !defined(AFIO_BASE)
|
|
||||||
# include <libopencm3/stm32/syscfg.h>
|
#if defined(EXTI_EXTICR)
|
||||||
|
#define EXTICR_SELECTION_FIELDSIZE EXTI_EXTICR_FIELDSIZE
|
||||||
|
#define EXTICR_SELECTION_REG(x) EXTI_EXTICR(x)
|
||||||
|
#elif defined(AFIO_EXTICR)
|
||||||
|
#define EXTICR_SELECTION_FIELDSIZE AFIO_EXTICR_FIELDSIZE
|
||||||
|
#define EXTICR_SELECTION_REG(x) AFIO_EXTICR(x)
|
||||||
|
#else
|
||||||
|
#include <libopencm3/stm32/syscfg.h>
|
||||||
|
#define EXTICR_SELECTION_FIELDSIZE SYSCFG_EXTICR_FIELDSIZE
|
||||||
|
#define EXTICR_SELECTION_REG(x) SYSCFG_EXTICR(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void exti_set_trigger(uint32_t extis, enum exti_trigger_type trig)
|
void exti_set_trigger(uint32_t extis, enum exti_trigger_type trig)
|
||||||
@@ -96,7 +105,7 @@ void exti_select_source(uint32_t exti, uint32_t gpioport)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t bits = 0, mask = 0x0F;
|
uint32_t bits = 0;
|
||||||
|
|
||||||
switch (gpioport) {
|
switch (gpioport) {
|
||||||
case GPIOA:
|
case GPIOA:
|
||||||
@@ -148,16 +157,11 @@ void exti_select_source(uint32_t exti, uint32_t gpioport)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t shift = (uint8_t)(4 * (line % 4));
|
uint8_t shift = (uint8_t)(EXTICR_SELECTION_FIELDSIZE * (line % 4));
|
||||||
|
uint32_t mask = ((1 << EXTICR_SELECTION_FIELDSIZE) - 1) << shift;
|
||||||
uint32_t reg = line / 4;
|
uint32_t reg = line / 4;
|
||||||
bits <<= shift;
|
|
||||||
mask <<= shift;
|
|
||||||
|
|
||||||
#if defined(AFIO_BASE)
|
EXTICR_SELECTION_REG(reg) = (EXTICR_SELECTION_REG(reg) & ~mask) | (bits << shift);
|
||||||
AFIO_EXTICR(reg) = (AFIO_EXTICR(reg) & ~mask) | bits;
|
|
||||||
#else
|
|
||||||
SYSCFG_EXTICR(reg) = (SYSCFG_EXTICR(reg) & ~mask) | bits;
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
/**@}*/
|
/**@}*/
|
||||||
|
|||||||
Reference in New Issue
Block a user