blinking
[rapper.git] / bitbucket_lpc1768 / io-pin.h
diff --git a/bitbucket_lpc1768/io-pin.h b/bitbucket_lpc1768/io-pin.h
new file mode 100644 (file)
index 0000000..507ac4d
--- /dev/null
@@ -0,0 +1,140 @@
+/*
+ * IO functions for NXP LPC1768. (generated file, check io-pin.ss)
+ *
+ * See also: http://bitbucket.org/jpc/lpc1768/
+ *
+ * Copyright (c) 2010 LoEE - Jakub Piotr Cłapa
+ * This program is released under the new BSD license.
+ */
+#ifndef IO_PIN_H
+#define IO_PIN_H
+
+#include "CMSIS/LPC17xx.h"
+
+enum pin_port {
+P0 = 0,
+P1 = 32,
+P2 = 64,
+P3 = 96,
+P4 = 128,
+};
+
+enum pin_dir {
+  PIN_IN = 0,
+  PIN_OUT = 1,
+};
+
+extern void invalid_pin_error () __attribute__((error ("Invalid IO pin number.")));
+
+extern __inline__ __attribute__((always_inline))
+int pin_read (int pin_no)
+{
+  switch(pin_no) {
+    case 0 ... 31:
+      return LPC_GPIO0->FIOPIN & (1 << (pin_no - 0));
+    case 32 ... 63:
+      return LPC_GPIO1->FIOPIN & (1 << (pin_no - 32));
+    case 64 ... 95:
+      return LPC_GPIO2->FIOPIN & (1 << (pin_no - 64));
+    case 96 ... 127:
+      return LPC_GPIO3->FIOPIN & (1 << (pin_no - 96));
+    case 128 ... 159:
+      return LPC_GPIO4->FIOPIN & (1 << (pin_no - 128));
+    default:
+      invalid_pin_error ();
+      break;
+  }
+  return 0;
+}
+
+extern __inline__ __attribute__((always_inline))
+void pin_write (int pin_no, int value)
+{
+  switch(pin_no) {
+    case 0 ... 31:
+      if (value) {
+        LPC_GPIO0->FIOSET = (1 << (pin_no - 0));
+      } else {
+        LPC_GPIO0->FIOCLR = (1 << (pin_no - 0));
+      }
+      break;
+    case 32 ... 63:
+      if (value) {
+        LPC_GPIO1->FIOSET = (1 << (pin_no - 32));
+      } else {
+        LPC_GPIO1->FIOCLR = (1 << (pin_no - 32));
+      }
+      break;
+    case 64 ... 95:
+      if (value) {
+        LPC_GPIO2->FIOSET = (1 << (pin_no - 64));
+      } else {
+        LPC_GPIO2->FIOCLR = (1 << (pin_no - 64));
+      }
+      break;
+    case 96 ... 127:
+      if (value) {
+        LPC_GPIO3->FIOSET = (1 << (pin_no - 96));
+      } else {
+        LPC_GPIO3->FIOCLR = (1 << (pin_no - 96));
+      }
+      break;
+    case 128 ... 159:
+      if (value) {
+        LPC_GPIO4->FIOSET = (1 << (pin_no - 128));
+      } else {
+        LPC_GPIO4->FIOCLR = (1 << (pin_no - 128));
+      }
+      break;
+    default:
+      invalid_pin_error ();
+      break;
+  }
+}
+
+extern __inline__ __attribute__((always_inline))
+void pin_dir (int pin_no, enum pin_dir dir)
+{
+  switch(pin_no) {
+    case 0 ... 31:
+      if (dir == PIN_OUT) {
+        LPC_GPIO0->FIODIR |= (1 << (pin_no - 0));
+      } else {
+        LPC_GPIO0->FIODIR &= (1 << (pin_no - 0));
+      }
+      break;
+    case 32 ... 63:
+      if (dir == PIN_OUT) {
+        LPC_GPIO1->FIODIR |= (1 << (pin_no - 32));
+      } else {
+        LPC_GPIO1->FIODIR &= (1 << (pin_no - 32));
+      }
+      break;
+    case 64 ... 95:
+      if (dir == PIN_OUT) {
+        LPC_GPIO2->FIODIR |= (1 << (pin_no - 64));
+      } else {
+        LPC_GPIO2->FIODIR &= (1 << (pin_no - 64));
+      }
+      break;
+    case 96 ... 127:
+      if (dir == PIN_OUT) {
+        LPC_GPIO3->FIODIR |= (1 << (pin_no - 96));
+      } else {
+        LPC_GPIO3->FIODIR &= (1 << (pin_no - 96));
+      }
+      break;
+    case 128 ... 159:
+      if (dir == PIN_OUT) {
+        LPC_GPIO4->FIODIR |= (1 << (pin_no - 128));
+      } else {
+        LPC_GPIO4->FIODIR &= (1 << (pin_no - 128));
+      }
+      break;
+    default:
+      invalid_pin_error ();
+      break;
+  }
+}
+
+#endif
\ No newline at end of file