9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
MMakefile | 9+++++++--
Adrivers/.gitignore | 2++
Mdrivers/Makefile | 14+++++++++++---
Adrivers/dev.c | 297+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adrivers/dev.h | 27+++++++++++++++++++++++++++
Adrivers/devroot.c | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adrivers/devuart.c | 9+++++++++
Adrivers/mkdevc | 17+++++++++++++++++
Rdrivers/uart.c -> drivers/pl011.c | 0
Minclude/rcode.h | 20++++++++++----------
Ascripts/mkdev | 12++++++++++++
Mscripts/rules.mk | 3++-
Msrc/romfw/Makefile | 3---
Dsrc/romfw/dirfs.c | 98-------------------------------------------------------------------------------
Msrc/romfw/dlang.c | 4++--
Dsrc/romfw/drvfs.c | 13-------------
Dsrc/romfw/fs.c | 330-------------------------------------------------------------------------------
Dsrc/romfw/fs.h | 25-------------------------
Mtarget/hosted/Makefile | 1+
Atarget/hosted/rcode | 2++
Mtarget/native/Makefile | 6+++---
Mtarget/native/rcode | 2+-
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