From 998b3ac86e3b3f926d81e768f1200815e9e3d148 Mon Sep 17 00:00:00 2001 From: tcsullivan Date: Thu, 18 Jul 2019 18:43:22 -0400 Subject: Fixed syscalls, initrd program works --- src/libgpio/gpio.c | 72 ++++++++++++++++++++++++++------------------------ src/libgpio/libgpio.a | Bin 5772 -> 5808 bytes 2 files changed, 37 insertions(+), 35 deletions(-) (limited to 'src/libgpio') 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 +#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; } diff --git a/src/libgpio/libgpio.a b/src/libgpio/libgpio.a index b8c781d..36cb0e8 100644 Binary files a/src/libgpio/libgpio.a and b/src/libgpio/libgpio.a differ -- cgit v1.2.3