mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-11-23 13:03:13 +00:00
FuriHal: various GPIO improvements (#3260)
* FuriHal: add alternative gpio pulls that covers special cases, extra checks and crash on inalid parameters. * FuriHal: optimize pwr_XX selection in gpio_init * FuriHal: cleanup gpio param validation crash routine
This commit is contained in:
parent
7b85e04462
commit
e2e3663524
1 changed files with 34 additions and 12 deletions
|
@ -3,14 +3,21 @@
|
||||||
#include <furi_hal_version.h>
|
#include <furi_hal_version.h>
|
||||||
#include <furi_hal_resources.h>
|
#include <furi_hal_resources.h>
|
||||||
#include <stm32wbxx_ll_comp.h>
|
#include <stm32wbxx_ll_comp.h>
|
||||||
|
#include <stm32wbxx_ll_pwr.h>
|
||||||
|
|
||||||
#define GET_SYSCFG_EXTI_PORT(gpio) \
|
static uint32_t furi_hal_gpio_invalid_argument_crash() {
|
||||||
(((gpio) == (GPIOA)) ? LL_SYSCFG_EXTI_PORTA : \
|
furi_crash("Invalid argument");
|
||||||
((gpio) == (GPIOB)) ? LL_SYSCFG_EXTI_PORTB : \
|
return 0;
|
||||||
((gpio) == (GPIOC)) ? LL_SYSCFG_EXTI_PORTC : \
|
}
|
||||||
((gpio) == (GPIOD)) ? LL_SYSCFG_EXTI_PORTD : \
|
|
||||||
((gpio) == (GPIOE)) ? LL_SYSCFG_EXTI_PORTE : \
|
#define GPIO_PORT_MAP(port, prefix) \
|
||||||
LL_SYSCFG_EXTI_PORTH)
|
(((port) == (GPIOA)) ? prefix##A : \
|
||||||
|
((port) == (GPIOB)) ? prefix##B : \
|
||||||
|
((port) == (GPIOC)) ? prefix##C : \
|
||||||
|
((port) == (GPIOD)) ? prefix##D : \
|
||||||
|
((port) == (GPIOE)) ? prefix##E : \
|
||||||
|
((port) == (GPIOH)) ? prefix##H : \
|
||||||
|
furi_hal_gpio_invalid_argument_crash())
|
||||||
|
|
||||||
#define GPIO_PIN_MAP(pin, prefix) \
|
#define GPIO_PIN_MAP(pin, prefix) \
|
||||||
(((pin) == (LL_GPIO_PIN_0)) ? prefix##0 : \
|
(((pin) == (LL_GPIO_PIN_0)) ? prefix##0 : \
|
||||||
|
@ -28,11 +35,16 @@
|
||||||
((pin) == (LL_GPIO_PIN_12)) ? prefix##12 : \
|
((pin) == (LL_GPIO_PIN_12)) ? prefix##12 : \
|
||||||
((pin) == (LL_GPIO_PIN_13)) ? prefix##13 : \
|
((pin) == (LL_GPIO_PIN_13)) ? prefix##13 : \
|
||||||
((pin) == (LL_GPIO_PIN_14)) ? prefix##14 : \
|
((pin) == (LL_GPIO_PIN_14)) ? prefix##14 : \
|
||||||
prefix##15)
|
((pin) == (LL_GPIO_PIN_15)) ? prefix##15 : \
|
||||||
|
furi_hal_gpio_invalid_argument_crash())
|
||||||
|
|
||||||
|
#define GET_SYSCFG_EXTI_PORT(port) GPIO_PORT_MAP(port, LL_SYSCFG_EXTI_PORT)
|
||||||
#define GET_SYSCFG_EXTI_LINE(pin) GPIO_PIN_MAP(pin, LL_SYSCFG_EXTI_LINE)
|
#define GET_SYSCFG_EXTI_LINE(pin) GPIO_PIN_MAP(pin, LL_SYSCFG_EXTI_LINE)
|
||||||
#define GET_EXTI_LINE(pin) GPIO_PIN_MAP(pin, LL_EXTI_LINE_)
|
#define GET_EXTI_LINE(pin) GPIO_PIN_MAP(pin, LL_EXTI_LINE_)
|
||||||
|
|
||||||
|
#define GET_PWR_PORT(port) GPIO_PORT_MAP(port, LL_PWR_GPIO_)
|
||||||
|
#define GET_PWR_PIN(pin) GPIO_PIN_MAP(pin, LL_PWR_GPIO_BIT_)
|
||||||
|
|
||||||
static volatile GpioInterrupt gpio_interrupt[GPIO_NUMBER];
|
static volatile GpioInterrupt gpio_interrupt[GPIO_NUMBER];
|
||||||
|
|
||||||
static uint8_t furi_hal_gpio_get_pin_num(const GpioPin* gpio) {
|
static uint8_t furi_hal_gpio_get_pin_num(const GpioPin* gpio) {
|
||||||
|
@ -65,9 +77,11 @@ void furi_hal_gpio_init_ex(
|
||||||
const GpioPull pull,
|
const GpioPull pull,
|
||||||
const GpioSpeed speed,
|
const GpioSpeed speed,
|
||||||
const GpioAltFn alt_fn) {
|
const GpioAltFn alt_fn) {
|
||||||
uint32_t sys_exti_port = GET_SYSCFG_EXTI_PORT(gpio->port);
|
const uint32_t sys_exti_port = GET_SYSCFG_EXTI_PORT(gpio->port);
|
||||||
uint32_t sys_exti_line = GET_SYSCFG_EXTI_LINE(gpio->pin);
|
const uint32_t sys_exti_line = GET_SYSCFG_EXTI_LINE(gpio->pin);
|
||||||
uint32_t exti_line = GET_EXTI_LINE(gpio->pin);
|
const uint32_t exti_line = GET_EXTI_LINE(gpio->pin);
|
||||||
|
const uint32_t pwr_port = GET_PWR_PORT(gpio->port);
|
||||||
|
const uint32_t pwr_pin = GET_PWR_PIN(gpio->pin);
|
||||||
|
|
||||||
// Configure gpio with interrupts disabled
|
// Configure gpio with interrupts disabled
|
||||||
FURI_CRITICAL_ENTER();
|
FURI_CRITICAL_ENTER();
|
||||||
|
@ -92,13 +106,21 @@ void furi_hal_gpio_init_ex(
|
||||||
switch(pull) {
|
switch(pull) {
|
||||||
case GpioPullNo:
|
case GpioPullNo:
|
||||||
LL_GPIO_SetPinPull(gpio->port, gpio->pin, LL_GPIO_PULL_NO);
|
LL_GPIO_SetPinPull(gpio->port, gpio->pin, LL_GPIO_PULL_NO);
|
||||||
|
LL_PWR_DisableGPIOPullUp(pwr_port, pwr_pin);
|
||||||
|
LL_PWR_DisableGPIOPullDown(pwr_port, pwr_pin);
|
||||||
break;
|
break;
|
||||||
case GpioPullUp:
|
case GpioPullUp:
|
||||||
LL_GPIO_SetPinPull(gpio->port, gpio->pin, LL_GPIO_PULL_UP);
|
LL_GPIO_SetPinPull(gpio->port, gpio->pin, LL_GPIO_PULL_UP);
|
||||||
|
LL_PWR_DisableGPIOPullDown(pwr_port, pwr_pin);
|
||||||
|
LL_PWR_EnableGPIOPullUp(pwr_port, pwr_pin);
|
||||||
break;
|
break;
|
||||||
case GpioPullDown:
|
case GpioPullDown:
|
||||||
LL_GPIO_SetPinPull(gpio->port, gpio->pin, LL_GPIO_PULL_DOWN);
|
LL_GPIO_SetPinPull(gpio->port, gpio->pin, LL_GPIO_PULL_DOWN);
|
||||||
|
LL_PWR_DisableGPIOPullUp(pwr_port, pwr_pin);
|
||||||
|
LL_PWR_EnableGPIOPullDown(pwr_port, pwr_pin);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
furi_crash("Incorrect GpioPull");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set gpio mode
|
// Set gpio mode
|
||||||
|
@ -166,7 +188,7 @@ void furi_hal_gpio_init_ex(
|
||||||
LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_ANALOG);
|
LL_GPIO_SetPinMode(gpio->port, gpio->pin, LL_GPIO_MODE_ANALOG);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
furi_crash("Incorrect GpioMode");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FURI_CRITICAL_EXIT();
|
FURI_CRITICAL_EXIT();
|
||||||
|
|
Loading…
Reference in a new issue