Skip to content

Commit 6116e6b

Browse files
committed
Fix interrupts bug.
1 parent fd93da2 commit 6116e6b

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

cores/arduino/WInterrupts.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33
#include "wiring_constants.h"
44
#include "plic.h"
55

6-
void attachInterrupt(uint8_t intnum, voidFuncPtr callback, uint8_t mode)
6+
void attachInterrupt(uint8_t intnum, voidFuncPtr user_callback, uint8_t mode)
77
{
8-
plic_irq_callback_t _callback = (plic_irq_callback_t)callback;
98
int gpionum = getGpio(intnum);
109
if(gpionum >= 0){
10+
fpioa_function_t function = FUNC_GPIOHS0 + gpionum;
11+
fpioa_set_function(intnum, function);
12+
gpiohs_set_drive_mode(gpionum, GPIO_DM_INPUT_PULL_UP);
1113
switch(mode){
1214
case LOW :
1315
gpiohs_set_pin_edge((uint8_t)gpionum, GPIO_PE_LOW);
@@ -25,7 +27,7 @@ void attachInterrupt(uint8_t intnum, voidFuncPtr callback, uint8_t mode)
2527
gpiohs_set_pin_edge((uint8_t)gpionum, GPIO_PE_RISING);
2628
break;
2729
}
28-
gpiohs_irq_register((uint8_t)gpionum, 10, _callback, NULL);
30+
gpiohs_irq_register((uint8_t)gpionum, 10, gpiohs_callback, user_callback);
2931
sysctl_enable_irq();
3032
}
3133
}
@@ -37,3 +39,10 @@ void detachInterrupt(uint8_t intnum)
3739
gpiohs_irq_unregister((uint8_t)gpionum);
3840
}
3941
}
42+
43+
int gpiohs_callback(void *ctx)
44+
{
45+
voidFuncPtr user_callback = ctx;
46+
user_callback();
47+
return 0;
48+
}

cores/arduino/WInterrupts.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ extern "C"{
3535
#define DEFAULT 1
3636
#define EXTERNAL 0
3737

38-
#define digitalPinToInterrupt(Pin) Pin;
38+
#define digitalPinToInterrupt(Pin) Pin
3939
typedef void (*voidFuncPtr)(void);
4040
/*
4141
* \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);
4949
*/
5050
void detachInterrupt(uint8_t intnum);
5151

52+
int gpiohs_callback(void *ctx);
53+
5254
#ifdef __cplusplus
5355
} // extern "C"
5456
#endif // __cplusplus

0 commit comments

Comments
 (0)