aboutsummaryrefslogtreecommitdiffstats
path: root/src/libgpio/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libgpio/gpio.c')
-rw-r--r--src/libgpio/gpio.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/libgpio/gpio.c b/src/libgpio/gpio.c
new file mode 100644
index 0000000..fdc877c
--- /dev/null
+++ b/src/libgpio/gpio.c
@@ -0,0 +1,78 @@
+#include "gpio.h"
+
+#include <stdint.h>
+
+void gpioMode(gpio_pin_t pin, int mode)
+{
+ register uint32_t r1 __asm("r1") = pin;
+ register uint32_t r2 __asm("r2") = mode;
+ __asm("\
+ mov r0, 0; \
+ mov r1, %0; \
+ mov r2, %1; \
+ svc 1; \
+ " :: "r" (r1), "r" (r2));
+}
+
+void gpioType(gpio_pin_t pin, int type)
+{
+ register uint32_t r1 __asm("r1") = pin;
+ register uint32_t r2 __asm("r2") = type;
+ __asm("\
+ mov r0, 1; \
+ mov r1, %0; \
+ mov r2, %1; \
+ svc 1; \
+ " :: "r" (r1), "r" (r2));
+}
+
+void gpioPuPd(gpio_pin_t pin, int pupd)
+{
+ register uint32_t r1 __asm("r1") = pin;
+ register uint32_t r2 __asm("r2") = pupd;
+ __asm("\
+ mov r0, 2; \
+ mov r1, %0; \
+ mov r2, %1; \
+ svc 1; \
+ " :: "r" (r1), "r" (r2));
+}
+
+void gpioSpeed(gpio_pin_t pin, int speed)
+{
+ register uint32_t r1 __asm("r1") = pin;
+ register uint32_t r2 __asm("r2") = speed;
+ __asm("\
+ mov r0, 3; \
+ mov r1, %0; \
+ mov r2, %1; \
+ svc 1; \
+ " :: "r" (r1), "r" (r2));
+}
+
+void gpioWrite(gpio_pin_t pin, int value)
+{
+ register uint32_t r1 __asm("r1") = pin;
+ register uint32_t r2 __asm("r2") = value;
+ __asm("\
+ mov r0, 4; \
+ mov r1, %0; \
+ mov r2, %1; \
+ svc 1; \
+ " :: "r" (r1), "r" (r2));
+}
+
+int gpioRead(gpio_pin_t pin)
+{
+ int ret = 0;
+ register uint32_t r1 __asm("r1") = pin;
+ register uint32_t r2 __asm("r2") = (uint32_t)&ret;
+ __asm("\
+ mov r0, 5; \
+ mov r1, %0; \
+ mov r2, %1; \
+ svc 1; \
+ " :: "r" (r1), "r" (r2));
+ return ret;
+}
+