[realtek-ambz] Implement attachInterruptParam

This commit is contained in:
Kuba Szczodrzyński
2022-06-04 20:39:24 +02:00
parent e26972bd2f
commit 3217525873
5 changed files with 22 additions and 12 deletions

View File

@@ -18,6 +18,9 @@
#define FPSTR(pstr_pointer) (reinterpret_cast<const __FlashStringHelper *>(pstr_pointer))
#define PGM_VOID_P const void *
#define vsnprintf_P vsnprintf
#define OUTPUT_OPEN_DRAIN OUTPUT_OPENDRAIN
#define attachInterruptArg attachInterruptParam
#define voidFuncPtrArg voidFuncPtrParam
// FreeRTOS utilities
#if LT_HAS_FREERTOS

View File

@@ -4,22 +4,31 @@
#include <gpio_irq_ex_api.h>
extern void *gpio_pin_struct[PINS_COUNT];
extern void *gpio_irq_handler_list[PINS_COUNT];
static void *gpio_irq_handler_list[PINS_COUNT] = {NULL};
static void *gpio_irq_handler_args[PINS_COUNT] = {NULL};
extern bool pinInvalid(pin_size_t pinNumber);
extern void pinRemoveMode(pin_size_t pinNumber);
void gpioIrqHandler(uint32_t id, gpio_irq_event event) {
if (gpio_irq_handler_list[id] != NULL) {
((void (*)(uint32_t, uint32_t))gpio_irq_handler_list[id])(id, (uint32_t)event);
if (gpio_irq_handler_args[id] != NULL)
((voidFuncPtr)gpio_irq_handler_list[id])();
else
((voidFuncPtrParam)gpio_irq_handler_list[id])(gpio_irq_handler_args[id]);
}
}
void attachInterrupt(pin_size_t interruptNumber, voidFuncPtr callback, PinStatus mode) {
attachInterruptParam(interruptNumber, callback, mode, NULL);
}
void attachInterruptParam(pin_size_t interruptNumber, voidFuncPtrParam callback, PinStatus mode, void *param) {
if (pinInvalid(interruptNumber))
return;
gpio_irq_handler_list[interruptNumber] = callback;
gpio_irq_handler_args[interruptNumber] = param;
if (g_APinDescription[interruptNumber].ulPinType == PIO_GPIO_IRQ &&
g_APinDescription[interruptNumber].ulPinMode == mode)

View File

@@ -31,6 +31,8 @@ static __inline uint32_t __get_ipsr__(void) {
return (__regIPSR);
}
void *gpio_pin_struct[PINS_COUNT] = {NULL};
__attribute__((weak)) void init(void) {
// nop
}

View File

@@ -5,7 +5,6 @@
#include <pwmout_api.h>
extern void *gpio_pin_struct[PINS_COUNT];
extern void *gpio_irq_handler_list[PINS_COUNT];
bool pinInvalid(pin_size_t pinNumber) {
return pinNumber < 0 || pinNumber >= PINS_COUNT || g_APinDescription[pinNumber].pinname == NC;

View File

@@ -19,24 +19,21 @@ PinDescription g_APinDescription[PINS_COUNT] = {
{PA_15, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
// D4: PWM2, ext_32K
{PA_0, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
// D6: UART2_log_RXD, I2C0_SCL, PWM4
// D5: UART2_log_RXD, I2C0_SCL, PWM4
{PA_29, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
// D7: UART2_log_TXD, I2C0_SDA, PWM3, RTC_OUT
// D6: UART2_log_TXD, I2C0_SDA, PWM3, RTC_OUT
{PA_30, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
// D8: SDIO_SIDEBAND_INT, PWM4, WAKEUP_1
// D7: SDIO_SIDEBAND_INT, PWM4, WAKEUP_1
{PA_5, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
// D9: PWM3
// D8: PWM3
{PA_12, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
// D10: UART0_RXD, SPI1_CLK, SPI0_SCK, I2C1_SCL, SD_D2, TIMER4_TRIG, I2S_MCK, WAKEUP_0
// D9: UART0_RXD, SPI1_CLK, SPI0_SCK, I2C1_SCL, SD_D2, TIMER4_TRIG, I2S_MCK, WAKEUP_0
{PA_18, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ, NOT_INITIAL},
// D11: UART0_TXD, SPI1_MOSI, SPI0_MOSI, I2C1_SDA, SD_D1, PWM0, WAKEUP_3
// D10: UART0_TXD, SPI1_MOSI, SPI0_MOSI, I2C1_SDA, SD_D1, PWM0, WAKEUP_3
{PA_23, NOT_INITIAL, PIO_GPIO | PIO_GPIO_IRQ | PIO_PWM, NOT_INITIAL},
// A1: VBAT_MEAS, ADC2
{AD_2, NOT_INITIAL, PIO_ADC, NOT_INITIAL},
};
// clang-format on
void *gpio_pin_struct[PINS_COUNT] = {NULL};
void *gpio_irq_handler_list[PINS_COUNT] = {NULL};
} // extern C