diff options
Diffstat (limited to 'src/libgpio/gpio.c')
-rw-r--r-- | src/libgpio/gpio.c | 72 |
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; } |