diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2018-11-30 10:51:10 -0500 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2018-11-30 10:51:10 -0500 |
commit | 42eff60714a32942b307d6b139aa400ca0df296a (patch) | |
tree | 7258326a1e2b1c0d6f42dbc744a9f1aac14068e6 /src | |
parent | cef5647a1542ac8520df07f15216a35ee35881ac (diff) |
libgpio, better initrd structure
Diffstat (limited to 'src')
-rw-r--r-- | src/initrd/Makefile | 25 | ||||
-rwxr-xr-x | src/initrd/files/init | bin | 0 -> 12788 bytes | |||
-rw-r--r-- | src/initrd/init.c | 24 | ||||
-rw-r--r-- | src/kernel/gpio.c | 5 | ||||
-rw-r--r-- | src/kernel/svc.c | 1 | ||||
-rw-r--r-- | src/libgpio/Makefile | 38 | ||||
-rw-r--r-- | src/libgpio/gpio.c | 78 | ||||
-rw-r--r-- | src/libgpio/gpio.h | 57 | ||||
-rw-r--r-- | src/libgpio/libgpio.a | bin | 0 -> 5772 bytes |
9 files changed, 227 insertions, 1 deletions
diff --git a/src/initrd/Makefile b/src/initrd/Makefile new file mode 100644 index 0000000..82785f4 --- /dev/null +++ b/src/initrd/Makefile @@ -0,0 +1,25 @@ +## +# A simple Makefile for building executables loadable by stmos. +# + +CC = gcc -mcpu=cortex-m4 -mthumb -fsigned-char +CFLAGS = -Os -fPIE -I../libgpio + +CFILES = $(wildcard *.c) +OFILES = $(patsubst %.c, files/%, $(CFILES)) + +all: $(OFILES) + @../../tools/rba initrd.img $$(find files/*) + @$(CROSS)$(OBJCOPY) -B arm -I binary -O elf32-littlearm initrd.img \ + initrd.img.o + +files/%: %.c + @echo " CC " $< + @$(CROSS)$(CC) $(CFLAGS) $< ../libgpio/libgpio.a -o $@ + @$(CROSS)strip $@ + +clean: + @echo " CLEAN" + @rm -f $(OFILES) + @rm -f initrd.img initrd.img.o + diff --git a/src/initrd/files/init b/src/initrd/files/init Binary files differnew file mode 100755 index 0000000..13ce410 --- /dev/null +++ b/src/initrd/files/init diff --git a/src/initrd/init.c b/src/initrd/init.c new file mode 100644 index 0000000..dc88ff8 --- /dev/null +++ b/src/initrd/init.c @@ -0,0 +1,24 @@ +/** + * @file test.c + * Basic userland code to be loaded by stmos for program load testing. + */ + +#include <stdio.h> +#include <gpio.h> +#include <syscalls.h> + +int main(void) +{ + gpioMode(5, OUTPUT); + + printf("Hello, world!\n"); + + while (1) { + gpioWrite(5, 1); + delay(1000); + gpioWrite(5, 0); + delay(500); + } + return 0; +} + diff --git a/src/kernel/gpio.c b/src/kernel/gpio.c index 0932e51..33423b9 100644 --- a/src/kernel/gpio.c +++ b/src/kernel/gpio.c @@ -27,7 +27,7 @@ static GPIO_TypeDef *gpio_ports[8] = { void gpio_svc(uint32_t *args) { - GPIO_TypeDef *port = gpio_ports[args[1] / 16]; + GPIO_TypeDef *port = gpio_ports[args[1] >> 4]; uint32_t pin = args[1] & 0xF; switch (args[0]) { @@ -46,6 +46,9 @@ void gpio_svc(uint32_t *args) case 4: gpio_dout(port, pin, args[2]); break; + case 5: + *((int *)args[2]) = gpio_din(port, pin); + break; } } diff --git a/src/kernel/svc.c b/src/kernel/svc.c index 1455841..9044141 100644 --- a/src/kernel/svc.c +++ b/src/kernel/svc.c @@ -59,6 +59,7 @@ void SVC_Handler(void) { * 2 - gpio_pupd * 3 - gpio_speed * 4 - gpio_dout + * 5 - gpio_din */ gpio_svc(args); break; 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 <https://www.gnu.org/licenses/>. +# + +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 <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; +} + 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 Binary files differnew file mode 100644 index 0000000..b8c781d --- /dev/null +++ b/src/libgpio/libgpio.a |