aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAtsushi Saitoh <lynxeyed@xj9.so-net.ne.jp>2012-03-14 08:23:26 -0700
committerAtsushi Saitoh <lynxeyed@xj9.so-net.ne.jp>2012-03-14 08:23:26 -0700
commit3441ce8cae40b246be79b4ba7b347937b5114f9c (patch)
treeb8c80644cb133435abb848c09a0c50a4637b2d26
parent00e50e29e28594f0920828f241f9372fe844c445 (diff)
parent74d6a6a3865a9f45cb9e1aa627eea869a1f79164 (diff)
Merge pull request #1 from nucho/myPrototype
attachInterrupt関数の追加
-rwxr-xr-xsrc/core/gpio.cpp135
-rwxr-xr-xsrc/core/gpio.h28
-rw-r--r--src/core/gpio_int.cpp153
3 files changed, 313 insertions, 3 deletions
diff --git a/src/core/gpio.cpp b/src/core/gpio.cpp
index 1a7b18e..b4e6b76 100755
--- a/src/core/gpio.cpp
+++ b/src/core/gpio.cpp
@@ -99,4 +99,139 @@ int digitalRead(int pin)
return 0;
}
+/*****************************************************************************
+ ** Function name: GPIOSetInterrupt
+ **
+ ** Descriptions: Set interrupt sense, event, etc.
+ ** edge or level, 0 is edge, 1 is level
+ ** single or double edge, 0 is single, 1 is double
+ ** active high or low, etc.
+ **
+ ** parameters: pin num, bit position, sense, single/doube, polarity
+ ** Returned value: None
+ **
+ *****************************************************************************/
+void GPIOSetInterrupt(int pin, int sense, int single, int event) {
+ if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19)
+ {
+ if (sense == 0) {
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IS &= ~(arduino_pinAssign[pin
+ * 2 + 1]);
+ /* single or double only applies when sense is 0(edge trigger). */
+ if (single == 0)
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE
+ &= ~(arduino_pinAssign[pin * 2 + 1]);
+ else
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IBE
+ |= (arduino_pinAssign[pin * 2 + 1]);
+ } else
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IS |= (arduino_pinAssign[pin
+ * 2 + 1]);
+
+ if (event == 0)
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV
+ &= ~(arduino_pinAssign[pin * 2 + 1]);
+ else
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IEV |= (arduino_pinAssign[pin
+ * 2 + 1]);
+ } else if (pin >= 20 && pin < 100) {
+ //(20~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ if (sense == 0) {
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IS &= ~(mary_pinAssign[pin * 2
+ + 1]);
+ /* single or double only applies when sense is 0(edge trigger). */
+ if (single == 0)
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IBE &= ~(mary_pinAssign[pin
+ * 2 + 1]);
+ else
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IBE |= (mary_pinAssign[pin
+ * 2 + 1]);
+ } else
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IS |= (mary_pinAssign[pin * 2
+ + 1]);
+
+ if (event == 0)
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IEV &= ~(mary_pinAssign[pin * 2
+ + 1]);
+ else
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IEV |= (mary_pinAssign[pin * 2
+ + 1]);
+ }
+
+ return;
+}
+
+void GPIOIntEnable(int pin) {
+ if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19)
+ {
+
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IE |= arduino_pinAssign[pin * 2
+ + 1];
+ } else if (pin >= 20 && pin < 100) { //(20~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IE |= mary_pinAssign[pin * 2 + 1];
+ }
+
+ return;
+}
+
+void GPIOIntDisable(int pin) {
+ if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19)
+ {
+
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IE &= ~(arduino_pinAssign[pin * 2
+ + 1]);
+ } else if (pin >= 20 && pin < 100) {//(20~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IE &= ~(mary_pinAssign[pin * 2 + 1]);
+ }
+ return;
+}
+
+int GPIOIntStatus(int pin) {
+ int regVal = 0;
+
+ if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19)
+ {
+ if (LPC_GPIO[arduino_pinAssign[pin * 2]]->MIS
+ & arduino_pinAssign[pin * 2 + 1]) {
+ regVal = 1;
+ }
+ } else if (pin >= 20 && pin < 100) { //(20~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+
+ if (LPC_GPIO[mary_pinAssign[pin * 2]]->MIS
+ & mary_pinAssign[pin * 2 + 1]) {
+ regVal = 1;
+ }
+ }
+
+ return regVal;
+}
+
+void GPIOIntClear(int pin) {
+ if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19)
+ {
+
+ LPC_GPIO[arduino_pinAssign[pin * 2]]->IC |= arduino_pinAssign[pin * 2
+ + 1];
+ } else if (pin >= 20 && pin < 100) { //(20~99:reserved)
+
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ LPC_GPIO[mary_pinAssign[pin * 2]]->IC |= mary_pinAssign[pin * 2 + 1];
+ }
+
+ return;
+}
diff --git a/src/core/gpio.h b/src/core/gpio.h
index 5b7c05c..56b8adb 100755
--- a/src/core/gpio.h
+++ b/src/core/gpio.h
@@ -9,6 +9,11 @@
//#if defined (__USE_CMSIS)
#include "LPC11xx.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
//#endif
//=======================================
// Define LPC_GPIO[4] (each top address)
@@ -182,13 +187,30 @@ const unsigned int arduino_pinAssign[] =
typedef enum {INPUT, OUTPUT}pinModeState;
-typedef enum {LOW, HIGH}digitalWriteState;
+typedef enum {LOW, HIGH,CHANGE, RISING, FALLING}digitalWriteState;
void pinMode(int pin,pinModeState state);
void digitalWrite(int pin,digitalWriteState state);
int digitalRead(int pin);
-
-
+void GPIOSetInterrupt(int pin, int sense, int single, int event);
+void GPIOIntEnable(int pin);
+void GPIOIntDisable(int pin);
+void GPIOIntClear(int pin);
+int GPIOIntStatus(int pin);
+
+void PIOINT0_IRQHandler (void);
+void PIOINT1_IRQHandler (void);
+void PIOINT2_IRQHandler (void);
+void PIOINT3_IRQHandler (void);
+void GPIO_IRQHandler(void);
+
+typedef void (* USER_GPIO_FUNC)(void);
+void attachInterrupt(int pin,USER_GPIO_FUNC func, digitalWriteState mode) ;
+void detachInterrupt(int pin);
+
+#ifdef __cplusplus
+ }
+#endif
#endif /* GPIO_H_ */
diff --git a/src/core/gpio_int.cpp b/src/core/gpio_int.cpp
new file mode 100644
index 0000000..8cb4541
--- /dev/null
+++ b/src/core/gpio_int.cpp
@@ -0,0 +1,153 @@
+#include "gpio.h"
+
+#define EXTERNAL_NUM_INTERRUPTS 20
+volatile static USER_GPIO_FUNC intFunc[EXTERNAL_NUM_INTERRUPTS];
+
+void attachInterrupt(int pin, USER_GPIO_FUNC func, digitalWriteState mode) {
+ pinMode(pin, INPUT);
+
+ switch (mode) {
+ case LOW:
+ GPIOSetInterrupt(pin, 1, 0, 0);
+ break;
+ case HIGH:
+ GPIOSetInterrupt(pin, 1, 0, 1);
+ break;
+ case CHANGE:
+ GPIOSetInterrupt(pin, 0, 1, 0);
+ break;
+ case RISING:
+ GPIOSetInterrupt(pin, 0, 0, 1);
+ break;
+ case FALLING:
+ GPIOSetInterrupt(pin, 0, 0, 0);
+ break;
+ default:
+ break;
+ }
+
+
+ if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19)
+ {
+ intFunc[pin] = func;
+
+ switch (arduino_pinAssign[pin * 2]) {
+ case 0:
+ NVIC_EnableIRQ(EINT0_IRQn);
+ break;
+ case 1:
+ NVIC_EnableIRQ(EINT1_IRQn);
+ break;
+ case 2:
+ NVIC_EnableIRQ(EINT2_IRQn);
+ break;
+ case 3:
+ NVIC_EnableIRQ(EINT3_IRQn);
+ break;
+ }
+ } else if (pin >= 20 && pin < 100) {
+ //(20~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ intFunc[pin] = func;
+
+ switch (mary_pinAssign[pin * 2]) {
+ case 0:
+ NVIC_EnableIRQ(EINT0_IRQn);
+ break;
+ case 1:
+ NVIC_EnableIRQ(EINT1_IRQn);
+ break;
+ case 2:
+ NVIC_EnableIRQ(EINT2_IRQn);
+ break;
+ case 3:
+ NVIC_EnableIRQ(EINT3_IRQn);
+ break;
+ }
+ }
+
+ GPIOIntEnable(pin);
+
+ return;
+}
+
+void detachInterrupt(int pin) {
+ GPIOIntDisable(pin);
+
+ if (pin >= 0 && pin < 20) //arduinoPinAssign(0~19)
+ {
+ intFunc[pin] = 0;
+ if (LPC_GPIO[arduino_pinAssign[pin * 2]]->IE == 0) {
+ switch (arduino_pinAssign[pin * 2]) {
+ case 0:
+ NVIC_DisableIRQ(EINT0_IRQn);
+ break;
+ case 1:
+ NVIC_DisableIRQ(EINT1_IRQn);
+ break;
+ case 2:
+ NVIC_DisableIRQ(EINT2_IRQn);
+ break;
+ case 3:
+ NVIC_DisableIRQ(EINT3_IRQn);
+ break;
+ }
+ }
+ }
+ else if (pin >= 20 && pin < 100) {//(20~99:reserved)
+ } else if (pin >= 100 && pin < 200) //maryPinAssign(100~119?)
+ {
+ pin = pin - 100;
+ intFunc[pin] = 0;
+ if (LPC_GPIO[mary_pinAssign[pin * 2]]->IE == 0) {
+ switch (mary_pinAssign[pin * 2]) {
+ case 0:
+ NVIC_DisableIRQ(EINT0_IRQn);
+ break;
+ case 1:
+ NVIC_DisableIRQ(EINT1_IRQn);
+ break;
+ case 2:
+ NVIC_DisableIRQ(EINT2_IRQn);
+ break;
+ case 3:
+ NVIC_DisableIRQ(EINT3_IRQn);
+ break;
+ }
+ }
+ }
+ return;
+}
+
+void GPIO_IRQHandler(void) {
+ for (int i = 0; i < EXTERNAL_NUM_INTERRUPTS; i++) {
+ if (GPIOIntStatus(i)) {
+ GPIOIntClear(i);
+
+ if (intFunc[i])
+ intFunc[i]();
+ }
+ }
+}
+
+void PIOINT0_IRQHandler(void) {
+ GPIO_IRQHandler();
+ return;
+}
+
+void PIOINT1_IRQHandler(void) {
+ GPIO_IRQHandler();
+ return;
+}
+
+void PIOINT2_IRQHandler(void) {
+ GPIO_IRQHandler();
+ return;
+}
+
+void PIOINT3_IRQHandler(void) {
+ GPIO_IRQHandler();
+ return;
+}