commit 2f98131b4b6e03f39c3b78e68951c73378c82a88
parent 64762c83f7aa8b11202a2c3584e3ca4f25326a43
Author: Roberto Vargas <roberto.vargas@arm.com>
Date: Mon, 26 Nov 2018 12:57:51 +0000
[drivers] Base version for drivers
Change-Id: Ibb7773fb56974339d5c4fda8681150558e0f0b60
Diffstat:
22 files changed, 500 insertions(+), 491 deletions(-)
diff --git a/Makefile b/Makefile
@@ -10,7 +10,7 @@ all: target
test $(TESTS): all FORCE
@+cd test/ && $(MAKE) $@
-target: src
+target: src drivers
src: lib bin
@@ -20,9 +20,14 @@ bin lib:
drivers src target: FORCE
+@cd $@ && $(MAKE)
+drivers: drivers/devs.mk
+
+drivers/devs.mk: $(TARGETDIR)/rcode
+ $(SCRIPTDIR)/mkdev $(TARGETDIR)/rcode
+
gen: FORCE
+@cd src && $(MAKE) gen
-clean:
+clean: drivers/devs.mk
$(FORALL)
rm -rf lib bin
diff --git a/drivers/.gitignore b/drivers/.gitignore
@@ -0,0 +1,2 @@
+devs.mk
+devc.c
diff --git a/drivers/Makefile b/drivers/Makefile
@@ -1,10 +1,18 @@
.POSIX:
PROJECTDIR=..
include $(PROJECTDIR)/scripts/rules.mk
+include devs.mk
-OBJS = uart.o
+OBJS = $(DEVS) \
+ devc.o \
-all: $(OBJS)
+all: builtin.o
+
+builtin.o: $(OBJS)
+ $(LD) $(RCODE_LDFLAGS) -r -o $@ $(OBJS)
+
+devc.c: $(TARGETDIR)/rcode
+ ./mkdevc $(TARGETDIR)/rcode
clean:
- rm -f $(OBJS)
+ rm -f devs.mk devc.c
diff --git a/drivers/dev.c b/drivers/dev.c
@@ -0,0 +1,297 @@
+#include <errno.h>
+#include <string.h>
+
+#include <rcode.h>
+
+#include "dev.h"
+
+static File *
+validfd(int fd)
+{
+ if (fd < 0 || fd >= NR_FILS) {
+ errno = 1;
+ return NULL;
+ }
+ return &bss->filtbl[fd];
+}
+
+static int
+dentry(const char **name, int *len)
+{
+ const char *t, *s = *name;
+
+ while (*s == '/')
+ ++s;
+ *name = s;
+
+ if (*s == '\0')
+ return 0;
+
+ for (t = s; *t != '/' && *t != '\0'; t++)
+ ;
+ *len = t - s;
+
+ return 1;
+}
+
+Walk *
+walk(const char *name, Walk *wp)
+{
+ const char *s;
+ Dev **dp;
+ char id;
+ int len;
+ extern Dev *devtab[];
+
+ if (*name != '#') {
+ id = '/';
+ } else {
+ id = name[1];
+ name += 2;
+ }
+ if (*name != '/') {
+ errno = 1;
+ return NULL;
+ }
+
+ for (dp = devtab; *dp && (*dp)->id != id; ++dp)
+ ;
+
+ if ((wp->dev = *dp) == NULL) {
+ errno = 1;
+ return NULL;
+ }
+
+ for (s = name; dentry(&s, &len); s+= len) {
+ if (len == 1 && *s == '.')
+ continue;
+ if (!(*wp->dev->walk)(wp, s, len))
+ break;
+ }
+ wp->remaning = s;
+
+ return wp;
+}
+
+int
+bind(const char *name, char *where)
+{
+ Walk w1, w2;
+ Entry *e1, *e2;
+
+ if (!walk(name, &w1) || !walk(where, &w2))
+ return -1;
+
+ if (!w1.entry) {
+ errno = 1;
+ return -1;
+ }
+
+ if (!w2.entry || (w2.entry->flags & ODIR) == 0) {
+ errno = 1;
+ return -1;
+ }
+
+ e1 = w1.entry;
+ e2 = w2.entry;
+ e2->dev = w1.dev;
+ e2->arg = e1->arg;
+ e2->flags = e1->flags;
+
+ return 0;
+}
+
+int
+open(const char *name, int flags)
+{
+ Walk w;
+ File *fp, *lim;
+ int (*fn)(File *fp, Walk *wp, int flags);
+
+ if (flags == 0 || (flags & ~(OREAD|OWRITE)) != 0) {
+ errno = 1;
+ return -1;
+ }
+
+
+ lim = &bss->filtbl[NR_FILS];
+ for (fp = bss->filtbl; fp < lim && !fp->dev; fp++)
+ ;
+
+ if (fp == lim) {
+ errno = 1;
+ return -1;
+ }
+
+ if (!walk(name, &w))
+ return -1;
+
+ if (w.remaning) {
+ errno = 1;
+ return -1;
+ }
+
+ fn = w.dev->open;
+ if (fn && (*fn)(fp, &w, flags) < 0)
+ return -1;
+
+ fp->off = 0;
+ fp->dev = w.dev;
+ fp->flags = flags;
+
+ return fp - bss->filtbl;
+}
+
+int
+close(int fd)
+{
+ File *fp;
+ int (*fn)(File *fp);
+
+ if ((fp = validfd(fd)) == NULL)
+ return -1;
+
+ fn = fp->dev->close;
+ if (fn && (*fn)(fp) < 0)
+ return -1;
+
+ fp->entry = NULL;
+ fp->off = 0;
+ fp->dev = NULL;
+ fp->flags = 0;
+
+ return 0;
+}
+
+int
+read(int fd, void *buf, int n)
+{
+ File *fp;
+ int (*fn)(File *fp, void *buf, int n);
+
+ if ((fp = validfd(fd)) == NULL)
+ return -1;
+
+ if ((fp->flags & OREAD) == 0) {
+ errno = 1;
+ return -1;
+ }
+
+ fn = fp->dev->read;
+ if (!fn) {
+ errno = 1;
+ return -1;
+ }
+
+ return (*fn)(fp, buf, n);
+}
+
+int
+write(int fd, void *buf, int n)
+{
+ File *fp;
+ int (*fn)(File *fp, void *buf, int n);
+
+ if ((fp = validfd(fd)) == NULL)
+ return -1;
+
+ if ((fp->flags & OWRITE) == 0) {
+ errno = 1;
+ return -1;
+ }
+
+ fn = fp->dev->write;
+ if (!fn) {
+ errno = 1;
+ return -1;
+ }
+
+ return (*fn)(fp, buf, n);
+}
+
+int
+seek(int fd, off_t off, int whence)
+{
+ File *fp;
+ int (*fn)(File *fp, off_t off, int whence);
+
+ if ((fp = validfd(fd)) == NULL)
+ return -1;
+
+ fn = fp->dev->seek;
+ if (!fn) {
+ errno = 1;
+ return -1;
+ }
+
+ return (*fn)(fp, off, whence);
+}
+
+static int
+validname(const char *name)
+{
+ const char *s;
+ size_t len;
+
+ if (!name)
+ return 0;
+
+ len = strlen(name);
+ if (len == 0 || len >= DIRLEN)
+ return 0;
+
+ for (s = name; *s; ++s) {
+ switch (*s) {
+ case '/':
+ case ' ':
+ case '\n':
+ case '\t':
+ return 0;
+ }
+ }
+ return 1;
+}
+
+int
+create(const char *name, int flags)
+{
+ Entry *ep, *lim;
+ Walk w;
+ int mode;
+
+ mode = flags & (OREAD|OWRITE);
+ if (mode == 0) {
+ errno = 1;
+ return -1;
+ }
+
+ if (!walk(name, &w))
+ return -1;
+
+ if (!validname(w.remaning)) {
+ errno = 2;
+ return -1;
+ }
+
+ if ((w.entry->flags & OCREATE) == 0) {
+ errno = 3;
+ return -1;
+ }
+
+ lim = &bss->enttbl[NR_ENTS];
+ for (ep = bss->enttbl; ep < lim && ep->dev ; ep++)
+ ;
+ if (ep == lim) {
+ errno = 4;
+ return -1;
+ }
+
+ ep->size = 0;
+ ep->flags = flags;
+ ep->arg = NULL;
+ ep->name = w.remaning;
+ ep->dev = w.dev;
+ ep->next = w.entry->arg;
+ w.entry->arg = ep;
+ return 0;
+}
diff --git a/drivers/dev.h b/drivers/dev.h
@@ -0,0 +1,27 @@
+#include <stddef.h>
+
+typedef int off_t;
+typedef struct dev Dev;
+typedef struct walk Walk;
+typedef struct entry Entry;
+typedef struct file File;
+
+struct walk {
+ const Dev *dev;
+ Entry *entry;
+ const char *remaning;
+};
+
+struct dev {
+ char id;
+ const char *name;
+ unsigned short flags;
+ int (*open)(File *fp, Walk *wp, int flags);
+ int (*close)(File *fp);
+ int (*read)(File *fp, void *buf, int n);
+ int (*write)(File *fp, void *buf, int n);
+ int (*seek)(File *fp, off_t off, int whence);
+ int (*walk)(Walk *wp, const char *name, int len);
+};
+
+extern Walk *walk(const char *name, Walk *wp);
diff --git a/drivers/devroot.c b/drivers/devroot.c
@@ -0,0 +1,97 @@
+#include <errno.h>
+#include <string.h>
+
+#include <libk.h>
+#include <rcode.h>
+
+#include "dev.h"
+
+static int
+ropen(File *fp, Walk *wp, int flags)
+{
+ fp->entry->arg = wp->entry->arg;
+ return 0;
+}
+
+static int
+rwalk(Walk *wp, const char *name, int len)
+{
+ Entry *ep;
+
+ for (ep = wp->entry->arg; ep; ep = ep->next) {
+ if (!strncmp(name, ep->name, len))
+ break;
+ }
+ if (!ep)
+ return 0;
+ wp->dev = ep->dev;
+ wp->entry = ep;
+
+ return 1;
+}
+
+static int
+rwrite(File *fp, void *buf, int n)
+{
+ Entry *ep;
+
+ ep = fp->entry->arg;
+ if (!ep)
+ return 0;
+
+ if ((ep->flags & OWRITE) == 0) {
+ errno = 1;
+ return -1;
+ }
+ return 0;
+}
+
+static int
+rread(File *fp, void *buf, int n)
+{
+ int len;
+ Entry *ep;
+ off_t off;
+
+ ep = fp->entry;
+ if ((fp->flags & OREAD) == 0) {
+ errno = 1;
+ return -1;
+ }
+
+ if ((ep->flags & ODIR) == 0) {
+ len = 0;
+ } else {
+ off = 0;
+ for (ep = ep->arg; ep; ep = ep->next) {
+ if (fp->off == off)
+ break;
+ off++;
+ }
+
+ if (!ep)
+ return 0;
+
+ len = ksnprint(buf, n,
+ "%c%c%c %s %llu",
+ (ep->flags & ODIR) ? 'd' : '-',
+ (ep->flags & OREAD) ? 'r' : '-',
+ (ep->flags & OWRITE) ? 'r' : '-',
+ ep->name,
+ (unsigned long long) ep->size);
+ if (len >= n) {
+ errno = 1;
+ return -1;
+ }
+ fp->off++;
+ }
+
+ return len;
+}
+
+Dev dirfs = {
+ .open = ropen,
+ .read = rread,
+ .write = rwrite,
+ .walk = rwalk,
+};
diff --git a/drivers/devuart.c b/drivers/devuart.c
@@ -0,0 +1,8 @@
+#include <uart.h>
+#include <rcode.h>
+
+#define NRETRY 10000
+
+#define CR 0x30
+#define FBRD 0x28
+#define IBRD 0x2
+\ No newline at end of file
diff --git a/drivers/mkdevc b/drivers/mkdevc
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+trap 'r=$?; rm -f $$.tmp; exit $r' EXIT HUP INT QUIT TERM
+
+sed -e 's/^#.*//' -e '/^[ \t]*$/d' $@ |
+awk '
+BEGIN {print "#include \"dev.h\"\n"}
+/^dev/ {dev = 1; next}
+/^[^ \t]/ {dev = 0; next}
+dev && /^[ \t]/ {devs["dev" $1] = 1}
+END {for (i in devs)
+ printf "extern Dev %s;\n", i
+ print "\nDev *const devtab[] = {"
+ for (i in devs)
+ printf "\t&%s,\n", i
+ print "};"}' > $$.tmp &&
+mv $$.tmp devc.c
diff --git a/drivers/uart.c b/drivers/pl011.c
diff --git a/include/rcode.h b/include/rcode.h
@@ -25,18 +25,18 @@ typedef struct rmucmd Rmucmd;
typedef int off_t;
typedef struct entry Entry; /* TODO: This must go away of here */
typedef struct file File; /* TODO: This must go away of here */
-typedef struct fs Filsys; /* TODO: This must go away of here */
+typedef struct dev Dev; /* TODO: This must go away of here */
-enum fsflags {
- FSCREATE = 1 << 0,
- FSREAD = 1 << 1,
- FSWRITE = 1 << 2,
- FSDIR = 1 << 3,
+enum devflags {
+ OCREATE = 1 << 0,
+ OREAD = 1 << 1,
+ OWRITE = 1 << 2,
+ ODIR = 1 << 3,
};
struct entry {
const char *name;
- const Filsys *fs;
+ const Dev *dev;
void *arg;
size_t size;
unsigned short flags;
@@ -45,7 +45,7 @@ struct entry {
struct file {
off_t off;
- const Filsys *fs;
+ const Dev *dev;
Entry *entry;
unsigned short flags;
};
@@ -125,14 +125,14 @@ extern noreturn void trap(struct trapframe *fp);
extern noreturn void badcmd(int error);
extern void rmc(Rmucmd *cmd);
extern int debug(void);
-extern void initfs(const struct tree *tree);
+
+/* driver functions */
extern int create(const char *name, int flags);
extern int open(const char *name, int flags);
extern int close(int fd);
extern int read(int fd, void *buf, int n);
extern int write(int fd, void *buf, int n);
extern int seek(int fd, off_t off, int whence);
-extern int chdir(const char *path);
extern int bind(const char *path, char *where);
/* architectural functions */
diff --git a/scripts/mkdev b/scripts/mkdev
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+sed 's/#.*//' $@ |
+awk '
+BEGIN {print "DEVS = dev.o\\"}
+/^[ \t]*$/ {next}
+/^dev/ {dev = 1; home = 1; next}
+/^misc/ {dev = 0; home = 1; next}
+/^[^ \t]/ {print "error: " $0; exit -1}
+/^[ \t]/ {printf "\t%s\\\n", (dev) ? "dev" $1 ".o" : $1 ".o"
+ for (i = 2; i <= NF; i++)
+ printf "\t%s.o\\\n", $i}' > drivers/devs.mk
diff --git a/scripts/rules.mk b/scripts/rules.mk
@@ -4,13 +4,14 @@ include $(PROJECTDIR)/config/$(CONF).mk
INCDIR = $(PROJECTDIR)/include
LIBDIR = $(PROJECTDIR)/lib
BINDIR = $(PROJECTDIR)/bin
-TARGETDIR = $(PROJECTDIR)/target/$(MODE)
+TARGETDIR = $(PROJECTDIR)/target/$(MODE)
DRVDIR = $(PROJECTDIR)/drivers
SRCDIR = $(PROJECTDIR)/src
SCRIPTDIR= $(PROJECTDIR)/scripts
CONFDIR = $(PROJECTDIR)/config
INCLUDES = -I$(INCDIR) -I$(INCDIR)/bits/$(ARCH)/ -I$(INCDIR)/bits/$(SYS)
LIBS = -lhdl -lrmu -lk -lc
+DRIVERS = $(PROJECTDIR)/drivers/builtin.o
LIBDEP = $(LIBDIR)/libhdl.a \
$(LIBDIR)/librmu.a \
diff --git a/src/romfw/Makefile b/src/romfw/Makefile
@@ -7,9 +7,6 @@ OBJS = ../rmc.o \
rmctbl.o \
rmu.o \
dlang.o \
- fs.o \
- drvfs.o \
- dirfs.o \
all: builtin.o
diff --git a/src/romfw/dirfs.c b/src/romfw/dirfs.c
@@ -1,98 +0,0 @@
-#include <errno.h>
-#include <string.h>
-
-#include <libk.h>
-#include <rcode.h>
-
-#include "fs.h"
-
-static int
-dirfs_open(File *fp, Walk *wp, int flags)
-{
- fp->entry->arg = wp->entry->arg;
- return 0;
-}
-
-static int
-dirfs_walk(Walk *wp, const char *name, int len)
-{
- Entry *ep;
-
- for (ep = wp->entry->arg; ep; ep = ep->next) {
- if (!strncmp(name, ep->name, len))
- break;
- }
- if (!ep)
- return 0;
- wp->fs = ep->fs;
- wp->entry = ep;
-
- return 1;
-}
-
-static int
-dirfs_write(File *fp, void *buf, int n)
-{
- Entry *ep;
-
- ep = fp->entry->arg;
- if (!ep)
- return 0;
-
- if ((ep->flags & FSWRITE) == 0) {
- errno = 1;
- return -1;
- }
- return 0;
-}
-
-static int
-dirfs_read(File *fp, void *buf, int n)
-{
- int len;
- Entry *ep;
- off_t off;
-
- ep = fp->entry;
- if ((fp->flags & FSREAD) == 0) {
- errno = 1;
- return -1;
- }
-
- if ((ep->flags & FSDIR) == 0) {
- len = 0;
- } else {
- off = 0;
- for (ep = ep->arg; ep; ep = ep->next) {
- if (fp->off == off)
- break;
- off++;
- }
-
- if (!ep)
- return 0;
-
- len = ksnprint(buf, n,
- "%c%c%c %s %llu",
- (ep->flags & FSDIR) ? 'd' : '-',
- (ep->flags & FSREAD) ? 'r' : '-',
- (ep->flags & FSWRITE) ? 'r' : '-',
- ep->name,
- (unsigned long long) ep->size);
- if (len >= n) {
- errno = 1;
- return -1;
- }
- fp->off++;
- }
-
- return len;
-}
-
-const Filsys dirfs = {
- .flags = FSCREATE | FSREAD | FSWRITE,
- .open = dirfs_open,
- .read = dirfs_read,
- .write = dirfs_write,
- .walk = dirfs_walk,
-};
diff --git a/src/romfw/dlang.c b/src/romfw/dlang.c
@@ -241,7 +241,7 @@ do_cat(const struct cmd *cmd, struct args *args)
int fd, n;
char buf[100];
- if ((fd = open(args->argv[1], FSREAD)) < 0)
+ if ((fd = open(args->argv[1], OREAD)) < 0)
return -1;
while ((n = read(fd, buf, sizeof(buf))) > 0)
@@ -256,7 +256,7 @@ do_cat(const struct cmd *cmd, struct args *args)
static int
do_chdir(const struct cmd *cmd, struct args *args)
{
- return chdir(args->argv[1]);
+ return 0;
}
static char *
diff --git a/src/romfw/drvfs.c b/src/romfw/drvfs.c
@@ -1,13 +0,0 @@
-#include <rcode.h>
-
-#include "fs.h"
-
-int
-drvfs_walk(Walk *wp, const char *name, int len)
-{
- return 0;
-}
-
-const Filsys drvfs = {
- .walk = drvfs_walk,
-};
diff --git a/src/romfw/fs.c b/src/romfw/fs.c
@@ -1,330 +0,0 @@
-#include <errno.h>
-#include <string.h>
-
-#include <rcode.h>
-
-#include "fs.h"
-
-static File *
-validfd(int fd)
-{
- if (fd < 0 || fd >= NR_FILS) {
- errno = 1;
- return NULL;
- }
- return &bss->filtbl[fd];
-}
-
-static const char *
-dentry(const char *s, int *len)
-{
- const char *t;
-
- while (*s == '/')
- ++s;
-
- if (*s == '\0')
- return NULL;
-
- for (t = s; *t != '/' && *t != '\0'; t++)
- ;
- *len = t - s;
-
- return s;
-}
-
-void
-walk(const char *name, Walk *wp)
-{
- const char *s;
- int len;
-
- switch (*name) {
- case '/':
- wp->fs = bss->root.fs;
- wp->entry = &bss->root;
- s = name + 1;
- break;
- case '#':
- wp->fs = bss->root.fs;
- wp->entry = &bss->driver;
- s = name + 1;
- break;
- default:
- wp->fs = bss->cwd->fs;
- wp->entry = bss->cwd;
- s = name;
- if (s[0] == '.' && s[1] == '\0')
- s++;
- break;
- }
-
- while ((s = dentry(s, &len)) != NULL) {
- if (!(*wp->fs->walk)(wp, s, len ))
- break;
- s += len;
- }
- wp->remaning = s;
-}
-
-int
-bind(const char *name, char *where)
-{
- Walk w1, w2;
- Entry *e1, *e2;
-
- walk(name, &w1);
- if (!w1.entry) {
- errno = 1;
- return -1;
- }
-
- walk(where, &w2);
- if (!w2.entry || (w2.entry->flags & FSDIR) == 0) {
- errno = 1;
- return -1;
- }
-
- e1 = w1.entry;
- e2 = w2.entry;
- e2->fs = w1.fs;
- e2->arg = e1->arg;
- e2->flags = e1->flags;
-
- return 0;
-}
-
-int
-chdir(const char *name)
-{
- Walk w;
- Entry *ep;
-
- walk(name, &w);
- ep = w.entry;
- if (!ep || (ep->flags & FSDIR) == 0) {
- errno = 1;
- return -1;
- }
- bss->cwd = ep;
-
- return 0;
-}
-
-int
-open(const char *name, int flags)
-{
- Walk w;
- File *fp, *lim;
- int (*fn)(File *fp, Walk *wp, int flags);
-
- if (flags == 0 || (flags & ~(FSREAD|FSWRITE)) != 0) {
- errno = 1;
- return -1;
- }
-
- walk(name, &w);
- if (w.remaning) {
- errno = 1;
- return -1;
- }
-
- if ((w.fs->flags & flags) != flags) {
- errno = 1;
- return 1;
- }
-
- lim = &bss->filtbl[NR_FILS];
- for (fp = bss->filtbl; fp < lim && fp->entry; fp++)
- ;
-
- if (fp == lim) {
- errno = 1;
- return -1;
- }
-
- fp->off = 0;
- fp->entry = w.entry;
- fp->fs = w.fs;
- fp->flags = flags;
-
- fn = w.entry->fs->open;
- if (fn && (*fn)(fp, &w, flags) < 0)
- return -1;
-
- return fp - bss->filtbl;
-}
-
-int
-close(int fd)
-{
- File *fp;
- int (*fn)(File *fp);
-
- if ((fp = validfd(fd)) == NULL)
- return -1;
-
- fn = fp->fs->close;
- if (fn && (*fn)(fp) < 0)
- return -1;
-
- fp->entry = NULL;
- fp->off = 0;
-
- return 0;
-}
-
-int
-read(int fd, void *buf, int n)
-{
- File *fp;
- int (*fn)(File *fp, void *buf, int n);
-
- if ((fp = validfd(fd)) == NULL)
- return -1;
-
- if ((fp->flags & FSREAD) == 0) {
- errno = 1;
- return -1;
- }
-
- fn = fp->fs->read;
- if (!fn) {
- errno = 1;
- return -1;
- }
-
- return (*fn)(fp, buf, n);
-}
-
-int
-write(int fd, void *buf, int n)
-{
- File *fp;
- int (*fn)(File *fp, void *buf, int n);
-
- if ((fp = validfd(fd)) == NULL)
- return -1;
-
- if ((fp->flags & FSWRITE) == 0) {
- errno = 1;
- return -1;
- }
-
- fn = fp->fs->write;
- if (!fn) {
- errno = 1;
- return -1;
- }
-
- return (*fn)(fp, buf, n);
-}
-
-int
-seek(int fd, off_t off, int whence)
-{
- File *fp;
- int (*fn)(File *fp, off_t off, int whence);
-
- if ((fp = validfd(fd)) == NULL)
- return -1;
-
- fn = fp->fs->seek;
- if (!fn) {
- errno = 1;
- return -1;
- }
-
- return (*fn)(fp, off, whence);
-}
-
-static int
-validname(const char *name)
-{
- const char *s;
- size_t len;
-
- if (!name)
- return 0;
-
- len = strlen(name);
- if (len == 0 || len >= DIRLEN)
- return 0;
-
- for (s = name; *s; ++s) {
- switch (*s) {
- case '/':
- case ' ':
- case '\n':
- case '\t':
- return 0;
- }
- }
- return 1;
-}
-
-int
-create(const char *name, int flags)
-{
- Entry *ep, *lim;
- Walk w;
- int mode;
-
- mode = flags & (FSREAD|FSWRITE);
- if (mode == 0) {
- errno = 1;
- return -1;
- }
-
- walk(name, &w);
- if (!validname(w.remaning)) {
- errno = 2;
- return -1;
- }
-
- if ((w.entry->flags & FSCREATE) == 0) {
- errno = 3;
- return -1;
- }
-
- lim = &bss->enttbl[NR_ENTS];
- for (ep = bss->enttbl; ep < lim && ep->fs ; ep++)
- ;
- if (ep == lim) {
- errno = 4;
- return -1;
- }
-
- ep->size = 0;
- ep->flags = flags;
- ep->arg = NULL;
- ep->name = w.remaning;
- ep->fs = w.fs;
- ep->next = w.entry->arg;
- w.entry->arg = ep;
- return 0;
-}
-
-void
-initfs(const struct tree *tree)
-{
- const struct tree *p;
- Entry *ep;
-
- ep = &bss->root;
- ep->fs = &dirfs;
- ep->arg = NULL;
- ep->flags = FSDIR | FSCREATE | FSREAD;
-
- ep = &bss->driver;
- ep->fs = &drvfs;
- ep->arg = NULL;
- ep->flags = FSREAD;
-
- for (p = tree; p->name; ++p) {
- if (create(p->name, p->flags) < 0)
- panic("initfs");
- }
-
- chdir("/");
-}
diff --git a/src/romfw/fs.h b/src/romfw/fs.h
@@ -1,25 +0,0 @@
-#include <stddef.h>
-
-typedef struct fs Filsys;
-typedef struct walk Walk;
-
-struct walk {
- const Filsys *fs;
- Entry *entry;
- const char *remaning;
-};
-
-struct fs {
- unsigned short flags;
- int (*open)(File *fp, Walk *wp, int flags);
- int (*close)(File *fp);
- int (*read)(File *fp, void *buf, int n);
- int (*write)(File *fp, void *buf, int n);
- int (*seek)(File *fp, off_t off, int whence);
- int (*walk)(Walk *wp, const char *name, int len);
-};
-
-extern void walk(const char *name, Walk *wp);
-
-extern const Filsys drvfs;
-extern const Filsys dirfs;
diff --git a/target/hosted/Makefile b/target/hosted/Makefile
@@ -5,6 +5,7 @@ include $(PROJECTDIR)/scripts/rules.mk
ROMOBJS = arch.o \
rom.o \
crt/crt.o \
+ $(DRVDIR)/builtin.o \
$(SRCDIR)/romfw/builtin.o \
RAMOBJS = arch.o \
diff --git a/target/hosted/rcode b/target/hosted/rcode
@@ -0,0 +1,2 @@
+dev
+ root
diff --git a/target/native/Makefile b/target/native/Makefile
@@ -10,7 +10,7 @@ ROMOBJS = rom-crt.o \
rom.o \
arch.o \
sysreg.o \
- $(DRVDIR)/uart.o \
+ $(DRVDIR)/builtin.o \
$(SRCDIR)/romfw/builtin.o \
cache.o \
@@ -18,10 +18,10 @@ RAMOBJS = ram-crt.o \
ram.o \
arch.o \
sysreg.o \
- $(DRVDIR)/uart.o \
+ $(DRVDIR)/builtin.o \
$(SRCDIR)/ramfw/builtin.o \
-TARGET = $(BINDIR)/romfw.bin $(BINDIR)/ramfw.bin
+TARGET = $(BINDIR)/romfw.bin
.SUFFIXES: .tst
.elf.tst:
diff --git a/target/native/rcode b/target/native/rcode
@@ -1,3 +1,3 @@
dev
root
- uart
+ uart pl011