From 6116e6b348867d20d8cb8d92a7c2f849a6a10b2d Mon Sep 17 00:00:00 2001 From: Bigbits Date: Sat, 13 Apr 2019 17:54:13 +0800 Subject: [PATCH] Fix interrupts bug. --- cores/arduino/WInterrupts.c | 15 ++++++++++++--- cores/arduino/WInterrupts.h | 4 +++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/cores/arduino/WInterrupts.c b/cores/arduino/WInterrupts.c index b42b302..fd123ca 100644 --- a/cores/arduino/WInterrupts.c +++ b/cores/arduino/WInterrupts.c @@ -3,11 +3,13 @@ #include "wiring_constants.h" #include "plic.h" -void attachInterrupt(uint8_t intnum, voidFuncPtr callback, uint8_t mode) +void attachInterrupt(uint8_t intnum, voidFuncPtr user_callback, uint8_t mode) { - plic_irq_callback_t _callback = (plic_irq_callback_t)callback; int gpionum = getGpio(intnum); if(gpionum >= 0){ + fpioa_function_t function = FUNC_GPIOHS0 + gpionum; + fpioa_set_function(intnum, function); + gpiohs_set_drive_mode(gpionum, GPIO_DM_INPUT_PULL_UP); switch(mode){ case LOW : gpiohs_set_pin_edge((uint8_t)gpionum, GPIO_PE_LOW); @@ -25,7 +27,7 @@ void attachInterrupt(uint8_t intnum, voidFuncPtr callback, uint8_t mode) gpiohs_set_pin_edge((uint8_t)gpionum, GPIO_PE_RISING); break; } - gpiohs_irq_register((uint8_t)gpionum, 10, _callback, NULL); + gpiohs_irq_register((uint8_t)gpionum, 10, gpiohs_callback, user_callback); sysctl_enable_irq(); } } @@ -37,3 +39,10 @@ void detachInterrupt(uint8_t intnum) gpiohs_irq_unregister((uint8_t)gpionum); } } + +int gpiohs_callback(void *ctx) +{ + voidFuncPtr user_callback = ctx; + user_callback(); + return 0; +} diff --git a/cores/arduino/WInterrupts.h b/cores/arduino/WInterrupts.h index 3bcb9b1..f95a15e 100644 --- a/cores/arduino/WInterrupts.h +++ b/cores/arduino/WInterrupts.h @@ -35,7 +35,7 @@ extern "C"{ #define DEFAULT 1 #define EXTERNAL 0 -#define digitalPinToInterrupt(Pin) Pin; +#define digitalPinToInterrupt(Pin) Pin typedef void (*voidFuncPtr)(void); /* * \brief Specifies a named Interrupt Service Routine (ISR) to call when an interrupt occurs. Use digitalPinToInterrupt(pin) to get the correct intnum. @@ -49,6 +49,8 @@ void attachInterrupt(uint8_t intnum, voidFuncPtr callback, uint8_t mode); */ void detachInterrupt(uint8_t intnum); +int gpiohs_callback(void *ctx); + #ifdef __cplusplus } // extern "C" #endif // __cplusplus