[lightning-ln882h] Fix GPIO interrupt support (#326)

* fix interrupt handling for the ln882h

- all GPIOS can generate interrupts
- added calls to NVIC_SetPriority/NVIC_EnableIRQ/NVIC_DisableIRQ

* fix clang formatting error

* only call NVIC_DisableIRQ if no other gpio is using an interrupt

* fix (again) clang-format errors

* add IRQ capability on all pins

* don't bother with NVIC_DisableIRQ

* use pin->gpio instead of interruptNumber, use macro GPIO_GET_PORT for clarity

* Mark interrupts as supported for the LN882H

---------

Co-authored-by: lamauny <pub.elc@free.fr>
This commit is contained in:
Luca Olivetti
2025-09-19 22:25:03 +02:00
committed by GitHub
parent 9114bc4c49
commit 895b6e89c5
6 changed files with 38 additions and 23 deletions

View File

@@ -49,6 +49,7 @@
"12": { "12": {
"C_NAME": "PA_4", "C_NAME": "PA_4",
"GPIO": "PA04", "GPIO": "PA04",
"IRQ": null,
"ADC": 4, "ADC": 4,
"SWD": "CLK", "SWD": "CLK",
"I2C": [ "I2C": [
@@ -89,6 +90,7 @@
"16": { "16": {
"C_NAME": "PA_8", "C_NAME": "PA_8",
"GPIO": "PA08", "GPIO": "PA08",
"IRQ": null,
"CTRL": "BOOT0", "CTRL": "BOOT0",
"SD": "CMD", "SD": "CMD",
"I2S": "0_WS", "I2S": "0_WS",
@@ -100,6 +102,7 @@
"17": { "17": {
"C_NAME": "PA_9", "C_NAME": "PA_9",
"GPIO": "PA09", "GPIO": "PA09",
"IRQ": null,
"CTRL": "BOOT1", "CTRL": "BOOT1",
"SD": "CLK", "SD": "CLK",
"I2S": "0_SCLK", "I2S": "0_SCLK",
@@ -111,6 +114,7 @@
"21": { "21": {
"C_NAME": "PA_10", "C_NAME": "PA_10",
"GPIO": "PA10", "GPIO": "PA10",
"IRQ": null,
"SD": "D0", "SD": "D0",
"I2S": "0_TX", "I2S": "0_TX",
"I2C": [ "I2C": [
@@ -121,6 +125,7 @@
"22": { "22": {
"C_NAME": "PA_11", "C_NAME": "PA_11",
"GPIO": "PA11", "GPIO": "PA11",
"IRQ": null,
"SD": "D1", "SD": "D1",
"I2C": [ "I2C": [
"0_SCL", "0_SCL",
@@ -130,6 +135,7 @@
"23": { "23": {
"C_NAME": "PA_12", "C_NAME": "PA_12",
"GPIO": "PA12", "GPIO": "PA12",
"IRQ": null,
"I2C": [ "I2C": [
"0_SCL", "0_SCL",
"0_SDA" "0_SDA"
@@ -139,6 +145,7 @@
"C_NAME": "PB_3", "C_NAME": "PB_3",
"GPIO": "PB03", "GPIO": "PB03",
"GPIONUM": 19, "GPIONUM": 19,
"IRQ": null,
"ADC": 5, "ADC": 5,
"I2C": [ "I2C": [
"0_SCL", "0_SCL",
@@ -149,6 +156,7 @@
"C_NAME": "PB_4", "C_NAME": "PB_4",
"GPIO": "PB04", "GPIO": "PB04",
"GPIONUM": 20, "GPIONUM": 20,
"IRQ": null,
"ADC": 6, "ADC": 6,
"I2C": [ "I2C": [
"0_SCL", "0_SCL",
@@ -159,6 +167,7 @@
"C_NAME": "PB_5", "C_NAME": "PB_5",
"GPIO": "PB05", "GPIO": "PB05",
"GPIONUM": 21, "GPIONUM": 21,
"IRQ": null,
"ADC": 7, "ADC": 7,
"I2C": [ "I2C": [
"0_SCL", "0_SCL",
@@ -169,6 +178,7 @@
"C_NAME": "PB_6", "C_NAME": "PB_6",
"GPIO": "PB06", "GPIO": "PB06",
"GPIONUM": 22, "GPIONUM": 22,
"IRQ": null,
"I2C": [ "I2C": [
"0_SCL", "0_SCL",
"0_SDA" "0_SDA"
@@ -178,6 +188,7 @@
"C_NAME": "PB_7", "C_NAME": "PB_7",
"GPIO": "PB07", "GPIO": "PB07",
"GPIONUM": 23, "GPIONUM": 23,
"IRQ": null,
"I2C": [ "I2C": [
"0_SCL", "0_SCL",
"0_SDA" "0_SDA"
@@ -187,6 +198,7 @@
"C_NAME": "PB_8", "C_NAME": "PB_8",
"GPIO": "PB08", "GPIO": "PB08",
"GPIONUM": 24, "GPIONUM": 24,
"IRQ": null,
"UART": "1_RX", "UART": "1_RX",
"I2C": [ "I2C": [
"0_SCL", "0_SCL",

View File

@@ -17,7 +17,7 @@ PinInfo lt_arduino_pin_info_list[PINS_COUNT] = {
// D3: PA03, UART0_RX, I2C0_SCL, I2C0_SDA // D3: PA03, UART0_RX, I2C0_SCL, I2C0_SDA
{PA_3, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_3, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D4: PA04, ADC4, SWCLK, I2C0_SCL, I2C0_SDA // D4: PA04, ADC4, SWCLK, I2C0_SCL, I2C0_SDA
{PA_4, PIN_SWD | PIN_I2C | PIN_ADC | PIN_GPIO, PIN_NONE, 0}, {PA_4, PIN_SWD | PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D5: PA05, I2C0_SCL, I2C0_SDA // D5: PA05, I2C0_SCL, I2C0_SDA
{PA_5, PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_5, PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D6: PA06, SD_D2, I2C0_SCL, I2C0_SDA // D6: PA06, SD_D2, I2C0_SCL, I2C0_SDA
@@ -25,27 +25,27 @@ PinInfo lt_arduino_pin_info_list[PINS_COUNT] = {
// D7: PA07, SD_D3, I2S0_RX, I2C0_SCL, I2C0_SDA // D7: PA07, SD_D3, I2S0_RX, I2C0_SCL, I2C0_SDA
{PA_7, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_7, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D8: PA08, BOOT0, SD_CMD, I2S0_WS, I2C0_SCL, I2C0_SDA // D8: PA08, BOOT0, SD_CMD, I2S0_WS, I2C0_SCL, I2C0_SDA
{PA_8, PIN_I2S | PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_8, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D9: PA09, BOOT1, SD_CLK, I2S0_SCLK, I2C0_SCL, I2C0_SDA // D9: PA09, BOOT1, SD_CLK, I2S0_SCLK, I2C0_SCL, I2C0_SDA
{PA_9, PIN_I2S | PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_9, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D10: PA10, SD_D0, I2S0_TX, I2C0_SCL, I2C0_SDA // D10: PA10, SD_D0, I2S0_TX, I2C0_SCL, I2C0_SDA
{PA_10, PIN_I2S | PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_10, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D11: PA11, SD_D1, I2C0_SCL, I2C0_SDA // D11: PA11, SD_D1, I2C0_SCL, I2C0_SDA
{PA_11, PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_11, PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D12: PA12, I2C0_SCL, I2C0_SDA // D12: PA12, I2C0_SCL, I2C0_SDA
{PA_12, PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_12, PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D13: PB03, ADC5, I2C0_SCL, I2C0_SDA // D13: PB03, ADC5, I2C0_SCL, I2C0_SDA
{PB_3, PIN_I2C | PIN_ADC | PIN_GPIO, PIN_NONE, 0}, {PB_3, PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D14: PB04, ADC6, I2C0_SCL, I2C0_SDA // D14: PB04, ADC6, I2C0_SCL, I2C0_SDA
{PB_4, PIN_I2C | PIN_ADC | PIN_GPIO, PIN_NONE, 0}, {PB_4, PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D15: PB05, ADC7, I2C0_SCL, I2C0_SDA // D15: PB05, ADC7, I2C0_SCL, I2C0_SDA
{PB_5, PIN_I2C | PIN_ADC | PIN_GPIO, PIN_NONE, 0}, {PB_5, PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D16: PB06, I2C0_SCL, I2C0_SDA // D16: PB06, I2C0_SCL, I2C0_SDA
{PB_6, PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PB_6, PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D17: PB07, I2C0_SCL, I2C0_SDA // D17: PB07, I2C0_SCL, I2C0_SDA
{PB_7, PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PB_7, PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D18: PB08, UART1_RX, I2C0_SCL, I2C0_SDA // D18: PB08, UART1_RX, I2C0_SCL, I2C0_SDA
{PB_8, PIN_UART | PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PB_8, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D19: PB09, UART1_TX, I2C0_SCL, I2C0_SDA // D19: PB09, UART1_TX, I2C0_SCL, I2C0_SDA
{PB_9, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PB_9, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
}; };

View File

@@ -9,13 +9,13 @@
// clang-format off // clang-format off
PinInfo lt_arduino_pin_info_list[PINS_COUNT] = { PinInfo lt_arduino_pin_info_list[PINS_COUNT] = {
// D0: PA11, SD_D1, I2C0_SCL, I2C0_SDA // D0: PA11, SD_D1, I2C0_SCL, I2C0_SDA
{PA_11, PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_11, PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D1: PB03, ADC5, I2C0_SCL, I2C0_SDA // D1: PB03, ADC5, I2C0_SCL, I2C0_SDA
{PB_3, PIN_I2C | PIN_ADC | PIN_GPIO, PIN_NONE, 0}, {PB_3, PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D2: PA03, UART0_RX, I2C0_SCL, I2C0_SDA // D2: PA03, UART0_RX, I2C0_SCL, I2C0_SDA
{PA_3, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_3, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D3: PB08, UART1_RX, I2C0_SCL, I2C0_SDA // D3: PB08, UART1_RX, I2C0_SCL, I2C0_SDA
{PB_8, PIN_UART | PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PB_8, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D4: PA02, UART0_TX, I2C0_SCL, I2C0_SDA // D4: PA02, UART0_TX, I2C0_SCL, I2C0_SDA
{PA_2, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_2, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D5: PB09, UART1_TX, I2C0_SCL, I2C0_SDA // D5: PB09, UART1_TX, I2C0_SCL, I2C0_SDA
@@ -25,7 +25,7 @@ PinInfo lt_arduino_pin_info_list[PINS_COUNT] = {
// D7: PA00, ADC2, I2C0_SCL, I2C0_SDA // D7: PA00, ADC2, I2C0_SCL, I2C0_SDA
{PA_0, PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_0, PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D8: PA09, BOOT1, SD_CLK, I2S0_SCLK, I2C0_SCL, I2C0_SDA // D8: PA09, BOOT1, SD_CLK, I2S0_SCLK, I2C0_SCL, I2C0_SDA
{PA_9, PIN_I2S | PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_9, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
}; };
PinInfo *lt_arduino_pin_gpio_map[] = { PinInfo *lt_arduino_pin_gpio_map[] = {

View File

@@ -11,23 +11,23 @@ PinInfo lt_arduino_pin_info_list[PINS_COUNT] = {
// D0: PA07, SD_D3, I2S0_RX, I2C0_SCL, I2C0_SDA // D0: PA07, SD_D3, I2S0_RX, I2C0_SCL, I2C0_SDA
{PA_7, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_7, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D1: PA12, I2C0_SCL, I2C0_SDA // D1: PA12, I2C0_SCL, I2C0_SDA
{PA_12, PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_12, PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D2: PA03, UART0_RX, I2C0_SCL, I2C0_SDA // D2: PA03, UART0_RX, I2C0_SCL, I2C0_SDA
{PA_3, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_3, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D3: PA10, SD_D0, I2S0_TX, I2C0_SCL, I2C0_SDA // D3: PA10, SD_D0, I2S0_TX, I2C0_SCL, I2C0_SDA
{PA_10, PIN_I2S | PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_10, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D4: PA02, UART0_TX, I2C0_SCL, I2C0_SDA // D4: PA02, UART0_TX, I2C0_SCL, I2C0_SDA
{PA_2, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_2, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D5: PA00, ADC2, I2C0_SCL, I2C0_SDA // D5: PA00, ADC2, I2C0_SCL, I2C0_SDA
{PA_0, PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PA_0, PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D6: PB03, ADC5, I2C0_SCL, I2C0_SDA // D6: PB03, ADC5, I2C0_SCL, I2C0_SDA
{PB_3, PIN_I2C | PIN_ADC | PIN_GPIO, PIN_NONE, 0}, {PB_3, PIN_I2C | PIN_ADC | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D7: PA11, SD_D1, I2C0_SCL, I2C0_SDA // D7: PA11, SD_D1, I2C0_SCL, I2C0_SDA
{PA_11, PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_11, PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D8: PA09, BOOT1, SD_CLK, I2S0_SCLK, I2C0_SCL, I2C0_SDA // D8: PA09, BOOT1, SD_CLK, I2S0_SCLK, I2C0_SCL, I2C0_SDA
{PA_9, PIN_I2S | PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PA_9, PIN_I2S | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D9: PB08, UART1_RX, I2C0_SCL, I2C0_SDA // D9: PB08, UART1_RX, I2C0_SCL, I2C0_SDA
{PB_8, PIN_UART | PIN_I2C | PIN_GPIO, PIN_NONE, 0}, {PB_8, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D10: PB09, UART1_TX, I2C0_SCL, I2C0_SDA // D10: PB09, UART1_TX, I2C0_SCL, I2C0_SDA
{PB_9, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0}, {PB_9, PIN_UART | PIN_I2C | PIN_IRQ | PIN_GPIO, PIN_NONE, 0},
// D11: PA05, I2C0_SCL, I2C0_SDA // D11: PA05, I2C0_SCL, I2C0_SDA

View File

@@ -81,6 +81,9 @@ void attachInterruptParam(pin_size_t interruptNumber, voidFuncPtrParam callback,
hal_gpio_pin_it_cfg(data->gpio_base, data->gpio->pin, event); hal_gpio_pin_it_cfg(data->gpio_base, data->gpio->pin, event);
hal_gpio_pin_it_en(data->gpio_base, data->gpio->pin, HAL_ENABLE); hal_gpio_pin_it_en(data->gpio_base, data->gpio->pin, HAL_ENABLE);
uint16_t IRQForPin = GPIO_GET_PORT(pin->gpio) == PORT_A ? GPIOA_IRQn : GPIOB_IRQn;
NVIC_SetPriority(IRQForPin, 1);
NVIC_EnableIRQ(IRQForPin);
} }
void detachInterrupt(pin_size_t interruptNumber) { void detachInterrupt(pin_size_t interruptNumber) {

View File

@@ -49,7 +49,7 @@ Watchdog timer | ✔️ | ✔️ | ✔️ | ❓
**PERIPHERALS** (Wiring) | | | | | | **PERIPHERALS** (Wiring) | | | | | |
Digital I/O | ✔️ | ✔️ | ✔️ | ❓ | ❓ | ✔️ Digital I/O | ✔️ | ✔️ | ✔️ | ❓ | ❓ | ✔️
PWM | ✔️ | ✔️ | ✔️ | ❓ | ❓ | ❌ PWM | ✔️ | ✔️ | ✔️ | ❓ | ❓ | ❌
Interrupts | ✔️ | ✔️ | ✔️ | ❓ | ❓ | Interrupts | ✔️ | ✔️ | ✔️ | ❓ | ❓ | ✔️
Analog input (ADC) | ✔️ | ✔️ | ✔️ | ❓ | ❓ | ✔️ Analog input (ADC) | ✔️ | ✔️ | ✔️ | ❓ | ❓ | ✔️
`Wire` (I²C) | ❌ | ❌ | ❗ | ❌ | ❌ | ❓ `Wire` (I²C) | ❌ | ❌ | ❗ | ❌ | ❌ | ❓
`SPI` | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ `SPI` | ❌ | ❌ | ❌ | ❌ | ❌ | ❌