summaryrefslogtreecommitdiffstats
path: root/quantum
diff options
context:
space:
mode:
authorWez Furlong <wez@fb.com>2016-11-28 07:43:11 +0100
committerWez Furlong <wez@fb.com>2016-11-28 07:58:34 +0100
commit8485bb34d2e291db5b6c81f892850da1cdca37ba (patch)
tree17ba7e60725d028fb7a1c6ba54b1a73bac768af9 /quantum
parentbe4e75423a232d9d328bb23835e0fa5152292c95 (diff)
downloadqmk_firmware-8485bb34d2e291db5b6c81f892850da1cdca37ba.tar.gz
qmk_firmware-8485bb34d2e291db5b6c81f892850da1cdca37ba.tar.xz
Add arduino-alike GPIO pin control helpers
Unlike the arduino functions, these don't take abstract pin numbers, they take pin labels like `B0`. Also, rather than taking very generic parameter names, these take slightly more descriptive enum values. These improve the clarity of code that would otherwise be inscrutable bit manipulation in tersely named port register names.
Diffstat (limited to 'quantum')
-rw-r--r--quantum/pincontrol.h37
1 files changed, 37 insertions, 0 deletions
diff --git a/quantum/pincontrol.h b/quantum/pincontrol.h
new file mode 100644
index 000000000..36ce29ef2
--- /dev/null
+++ b/quantum/pincontrol.h
@@ -0,0 +1,37 @@
+#pragma once
+// Some helpers for controlling gpio pins
+#include <avr/io.h>
+
+enum {
+ PinDirectionInput = 0,
+ PinDirectionOutput = 1,
+ PinLevelHigh = 1,
+ PinLevelLow = 0,
+};
+
+// ex: pinMode(B0, PinDirectionOutput);
+static inline void pinMode(uint8_t pin, int mode) {
+ uint8_t bv = _BV(pin & 0xf);
+ if (mode == PinDirectionOutput) {
+ _SFR_IO8((pin >> 4) + 1) |= bv;
+ } else {
+ _SFR_IO8((pin >> 4) + 1) &= ~bv;
+ _SFR_IO8((pin >> 4) + 2) &= ~bv;
+ }
+}
+
+// ex: digitalWrite(B0, PinLevelHigh);
+static inline void digitalWrite(uint8_t pin, int mode) {
+ uint8_t bv = _BV(pin & 0xf);
+ if (mode == PinLevelHigh) {
+ _SFR_IO8((pin >> 4) + 2) |= bv;
+ } else {
+ _SFR_IO8((pin >> 4) + 2) &= ~bv;
+ }
+}
+
+// Return true if the pin is HIGH
+// digitalRead(B0)
+static inline bool digitalRead(uint8_t pin) {
+ return _SFR_IO8(pin >> 4) & _BV(pin & 0xf);
+}