From 42eff60714a32942b307d6b139aa400ca0df296a Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Fri, 30 Nov 2018 10:51:10 -0500 Subject: libgpio, better initrd structure --- src/libgpio/Makefile | 38 ++++++++++++++++++++++++ src/libgpio/gpio.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/libgpio/gpio.h | 57 ++++++++++++++++++++++++++++++++++++ src/libgpio/libgpio.a | Bin 0 -> 5772 bytes 4 files changed, 173 insertions(+) create mode 100644 src/libgpio/Makefile create mode 100644 src/libgpio/gpio.c create mode 100644 src/libgpio/gpio.h create mode 100644 src/libgpio/libgpio.a (limited to 'src/libgpio') diff --git a/src/libgpio/Makefile b/src/libgpio/Makefile new file mode 100644 index 0000000..a478974 --- /dev/null +++ b/src/libgpio/Makefile @@ -0,0 +1,38 @@ +## +# @file Makefile +# Script to build folder of source files +# +# Copyright (C) 2018 Clyne Sullivan +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +CFILES = $(wildcard *.c) +OFILES = $(patsubst %.c, %.o, $(CFILES)) + +CFLAGS += -fPIC + +all: $(OFILES) + @$(CROSS)ar rcu libgpio.a $(OFILES) + +%.o: %.c + @echo " CC " $< + @$(CROSS)$(CC) $(CFLAGS) -c $< -o $@ + +clean: + @echo " CLEAN" + @rm -f $(OFILES) + @rm -f libgpio.a + + 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 + +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; +} + diff --git a/src/libgpio/gpio.h b/src/libgpio/gpio.h new file mode 100644 index 0000000..7d7c8f7 --- /dev/null +++ b/src/libgpio/gpio.h @@ -0,0 +1,57 @@ +#ifndef STMOS_GPIO_H_ +#define STMOS_GPIO_H_ + +#define GP(a) ((a - 'A') << 4) + +/** + * Defines possible modes for a gpio pin. + */ +enum GPIO_MODE +{ + INPUT = 0, /**< digital input */ + OUTPUT, /**< digital output */ + ALTERNATE, /**< alternate function */ + ANALOG /**< analog function */ +}; + +/** + * Defines whether to use push-pull or open drain. + */ +enum GPIO_TYPE +{ + PUSHPULL = 0, /**< push-pull */ + OPENDRAIN /**< open drain */ +}; + +/** + * Defines the pin's speed + */ +enum GPIO_SPEED +{ + LOW = 0, /**< low */ + MEDIUM, /**< medium */ + HIGH, /**< high */ + VERYHIGH /**< very high/maximum */ +}; + +/** + * Defines if a pullup or pulldown should be used. + */ +enum GPIO_PUPD +{ + NOPUPD, /**< no pullup/pulldown */ + PULLUP, /**< use pullup */ + PULLDOWN /**< use pulldown */ +}; + + +typedef unsigned int gpio_pin_t; + +void gpioMode(gpio_pin_t pin, int mode); +void gpioType(gpio_pin_t pin, int type); +void gpioPuPd(gpio_pin_t pin, int pupd); +void gpioSpeed(gpio_pin_t pin, int speed); +void gpioWrite(gpio_pin_t pin, int value); +int gpioRead(gpio_pin_t pin); + +#endif // STMOS_GPIO_H_ diff --git a/src/libgpio/libgpio.a b/src/libgpio/libgpio.a new file mode 100644 index 0000000..b8c781d Binary files /dev/null and b/src/libgpio/libgpio.a differ -- cgit v1.2.3