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