@@ -70,7 +70,12 @@ const DRAM_ATTR esp32_gpioMux_t esp32_gpioMux[GPIO_PIN_COUNT]={
7070};
7171
7272typedef void (* voidFuncPtr )(void );
73- static voidFuncPtr __pinInterruptHandlers [GPIO_PIN_COUNT ] = {0 ,};
73+ typedef void (* voidFuncPtrArg )(void * );
74+ typedef struct {
75+ voidFuncPtr fn ;
76+ void * arg ;
77+ } InterruptHandle_t ;
78+ static InterruptHandle_t __pinInterruptHandlers [GPIO_PIN_COUNT ] = {0 ,};
7479
7580#include "driver/rtc_io.h"
7681
@@ -193,7 +198,7 @@ extern int IRAM_ATTR __digitalRead(uint8_t pin)
193198
194199static intr_handle_t gpio_intr_handle = NULL ;
195200
196- static void IRAM_ATTR __onPinInterrupt (void * arg )
201+ static void IRAM_ATTR __onPinInterrupt ()
197202{
198203 uint32_t gpio_intr_status_l = 0 ;
199204 uint32_t gpio_intr_status_h = 0 ;
@@ -207,8 +212,12 @@ static void IRAM_ATTR __onPinInterrupt(void *arg)
207212 if (gpio_intr_status_l ) {
208213 do {
209214 if (gpio_intr_status_l & ((uint32_t )1 << pin )) {
210- if (__pinInterruptHandlers [pin ]) {
211- __pinInterruptHandlers [pin ]();
215+ if (__pinInterruptHandlers [pin ].fn ) {
216+ if (__pinInterruptHandlers [pin ].arg ){
217+ ((voidFuncPtrArg )__pinInterruptHandlers [pin ].fn )(__pinInterruptHandlers [pin ].arg );
218+ } else {
219+ __pinInterruptHandlers [pin ].fn ();
220+ }
212221 }
213222 }
214223 } while (++ pin < 32 );
@@ -217,23 +226,28 @@ static void IRAM_ATTR __onPinInterrupt(void *arg)
217226 pin = 32 ;
218227 do {
219228 if (gpio_intr_status_h & ((uint32_t )1 << (pin - 32 ))) {
220- if (__pinInterruptHandlers [pin ]) {
221- __pinInterruptHandlers [pin ]();
229+ if (__pinInterruptHandlers [pin ].fn ) {
230+ if (__pinInterruptHandlers [pin ].arg ){
231+ ((voidFuncPtrArg )__pinInterruptHandlers [pin ].fn )(__pinInterruptHandlers [pin ].arg );
232+ } else {
233+ __pinInterruptHandlers [pin ].fn ();
234+ }
222235 }
223236 }
224237 } while (++ pin < GPIO_PIN_COUNT );
225238 }
226239}
227240
228- extern void __attachInterrupt (uint8_t pin , voidFuncPtr userFunc , int intr_type )
241+ extern void __attachInterruptArg (uint8_t pin , voidFuncPtrArg userFunc , void * arg , int intr_type )
229242{
230243 static bool interrupt_initialized = false;
231244
232245 if (!interrupt_initialized ) {
233246 interrupt_initialized = true;
234247 esp_intr_alloc (ETS_GPIO_INTR_SOURCE , (int )ESP_INTR_FLAG_IRAM , __onPinInterrupt , NULL , & gpio_intr_handle );
235248 }
236- __pinInterruptHandlers [pin ] = userFunc ;
249+ __pinInterruptHandlers [pin ].fn = (voidFuncPtr )userFunc ;
250+ __pinInterruptHandlers [pin ].arg = arg ;
237251 esp_intr_disable (gpio_intr_handle );
238252 if (esp_intr_get_cpu (gpio_intr_handle )) { //APP_CPU
239253 GPIO .pin [pin ].int_ena = 1 ;
@@ -244,10 +258,15 @@ extern void __attachInterrupt(uint8_t pin, voidFuncPtr userFunc, int intr_type)
244258 esp_intr_enable (gpio_intr_handle );
245259}
246260
261+ extern void __attachInterrupt (uint8_t pin , voidFuncPtr userFunc , int intr_type ) {
262+ __attachInterruptArg (pin , (voidFuncPtrArg )userFunc , NULL , intr_type );
263+ }
264+
247265extern void __detachInterrupt (uint8_t pin )
248266{
249267 esp_intr_disable (gpio_intr_handle );
250- __pinInterruptHandlers [pin ] = NULL ;
268+ __pinInterruptHandlers [pin ].fn = NULL ;
269+ __pinInterruptHandlers [pin ].arg = NULL ;
251270 GPIO .pin [pin ].int_ena = 0 ;
252271 GPIO .pin [pin ].int_type = 0 ;
253272 esp_intr_enable (gpio_intr_handle );
@@ -258,5 +277,6 @@ extern void pinMode(uint8_t pin, uint8_t mode) __attribute__ ((weak, alias("__pi
258277extern void digitalWrite (uint8_t pin , uint8_t val ) __attribute__ ((weak , alias ("__digitalWrite" )));
259278extern int digitalRead (uint8_t pin ) __attribute__ ((weak , alias ("__digitalRead" )));
260279extern void attachInterrupt (uint8_t pin , voidFuncPtr handler , int mode ) __attribute__ ((weak , alias ("__attachInterrupt" )));
280+ extern void attachInterruptArg (uint8_t pin , voidFuncPtr handler , void * arg , int mode ) __attribute__ ((weak , alias ("__attachInterruptArg" )));
261281extern void detachInterrupt (uint8_t pin ) __attribute__ ((weak , alias ("__detachInterrupt" )));
262282
0 commit comments