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.c72
1 files changed, 37 insertions, 35 deletions
diff --git a/src/libgpio/gpio.c b/src/libgpio/gpio.c
index fdc877c..522817f 100644
--- a/src/libgpio/gpio.c
+++ b/src/libgpio/gpio.c
@@ -2,77 +2,79 @@
#include <stdint.h>
+#define NOOPTIMIZE __attribute__((optimize(0)))
+
+NOOPTIMIZE
void gpioMode(gpio_pin_t pin, int mode)
{
- register uint32_t r1 __asm("r1") = pin;
- register uint32_t r2 __asm("r2") = mode;
- __asm("\
+ uint32_t args[2] = { (uint32_t)pin, mode };
+ __asm volatile("\
mov r0, 0; \
- mov r1, %0; \
- mov r2, %1; \
+ mov r1, 0; \
+ mov r2, %0; \
svc 1; \
- " :: "r" (r1), "r" (r2));
+ " :: "r" (args));
}
+NOOPTIMIZE
void gpioType(gpio_pin_t pin, int type)
{
- register uint32_t r1 __asm("r1") = pin;
- register uint32_t r2 __asm("r2") = type;
- __asm("\
+ uint32_t args[2] = { (uint32_t)pin, type };
+ __asm volatile("\
mov r0, 1; \
- mov r1, %0; \
- mov r2, %1; \
+ mov r1, 0; \
+ mov r2, %0; \
svc 1; \
- " :: "r" (r1), "r" (r2));
+ " :: "r" (args));
}
+NOOPTIMIZE
void gpioPuPd(gpio_pin_t pin, int pupd)
{
- register uint32_t r1 __asm("r1") = pin;
- register uint32_t r2 __asm("r2") = pupd;
- __asm("\
+ uint32_t args[2] = { (uint32_t)pin, pupd };
+ __asm volatile("\
mov r0, 2; \
- mov r1, %0; \
- mov r2, %1; \
+ mov r1, 0; \
+ mov r2, %0; \
svc 1; \
- " :: "r" (r1), "r" (r2));
+ " :: "r" (args));
}
+NOOPTIMIZE
void gpioSpeed(gpio_pin_t pin, int speed)
{
- register uint32_t r1 __asm("r1") = pin;
- register uint32_t r2 __asm("r2") = speed;
- __asm("\
+ uint32_t args[2] = { (uint32_t)pin, speed };
+ __asm volatile("\
mov r0, 3; \
- mov r1, %0; \
- mov r2, %1; \
+ mov r1, 0; \
+ mov r2, %0; \
svc 1; \
- " :: "r" (r1), "r" (r2));
+ " :: "r" (args));
}
+NOOPTIMIZE
void gpioWrite(gpio_pin_t pin, int value)
{
- register uint32_t r1 __asm("r1") = pin;
- register uint32_t r2 __asm("r2") = value;
- __asm("\
+ uint32_t args[2] = { (uint32_t)pin, value };
+ __asm volatile("\
mov r0, 4; \
- mov r1, %0; \
- mov r2, %1; \
+ mov r1, 0; \
+ mov r2, %0; \
svc 1; \
- " :: "r" (r1), "r" (r2));
+ " :: "r" (args));
}
+NOOPTIMIZE
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("\
+ volatile int ret = 0;
+ uint32_t args[1] = { (uint32_t)pin };
+ __asm volatile("\
mov r0, 5; \
mov r1, %0; \
mov r2, %1; \
svc 1; \
- " :: "r" (r1), "r" (r2));
+ " :: "r" (&ret), "r" (args));
return ret;
}