aboutsummaryrefslogtreecommitdiff
path: root/bootloader
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2011-03-11 01:28:00 +0000
committerDimitri Sokolyuk <demon@dim13.org>2011-03-11 01:28:00 +0000
commitb8335062ae7d19bd27e6131fadcd7d3a116c4992 (patch)
tree3bd226885fb6f2ca24ee300a44d7b51ffb8d2706 /bootloader
DimOS RT
Diffstat (limited to 'bootloader')
-rw-r--r--bootloader/Makefile5
-rw-r--r--bootloader/Makefile.inc6
-rw-r--r--bootloader/bootloader.c94
-rw-r--r--bootloader/bootloader.h39
-rw-r--r--bootloader/bootloader/Makefile7
-rw-r--r--bootloader/dump.c60
-rw-r--r--bootloader/hexdump/Makefile7
-rw-r--r--bootloader/ihex.c93
-rw-r--r--bootloader/mem.c69
-rw-r--r--bootloader/memdump/Makefile7
-rw-r--r--bootloader/tty.c80
11 files changed, 467 insertions, 0 deletions
diff --git a/bootloader/Makefile b/bootloader/Makefile
new file mode 100644
index 0000000..ddf36a5
--- /dev/null
+++ b/bootloader/Makefile
@@ -0,0 +1,5 @@
+# $Id$
+
+SUBDIR= bootloader hexdump memdump
+
+.include <bsd.subdir.mk>
diff --git a/bootloader/Makefile.inc b/bootloader/Makefile.inc
new file mode 100644
index 0000000..772968c
--- /dev/null
+++ b/bootloader/Makefile.inc
@@ -0,0 +1,6 @@
+# $Id$
+
+.PATH: ${.CURDIR}/..
+CFLAGS+=-I${.CURDIR}/..
+DEBUG+= -Wall -ggdb
+NOMAN=
diff --git a/bootloader/bootloader.c b/bootloader/bootloader.c
new file mode 100644
index 0000000..d83db57
--- /dev/null
+++ b/bootloader/bootloader.c
@@ -0,0 +1,94 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2011 Dimitri Sokolyuk <demon@dim13.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include "bootloader.h"
+
+int
+transfer(int fd, struct page *p, int pages, int pagesize)
+{
+ int n, off;
+
+ fprintf(stderr, "trying to reboot device\n");
+ usleep(500);
+ put('R', fd); /* try to reboot */
+ usleep(500);
+
+ fprintf(stderr, "waiting for bootloader ");
+ do {
+ put('P', fd);
+ twiddle();
+ } while (get(fd) != 'p');
+
+ fprintf(stderr, "\nwriting: ");
+
+ for (n = 0; n < pages; n++) {
+ fprintf(stderr, "%c", ".o"[p[n].dirty]);
+ if (p[n].dirty) {
+ put('D', fd);
+ put(n, fd);
+ for (off = 0; off < pagesize; off++)
+ put(p[n].data[off], fd);
+ assert (get(fd) == 'd');
+ }
+ }
+ fprintf(stderr, "\nrebooting\n");
+ put('R', fd);
+
+ return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+ struct page *p;
+ char *dev = "/dev/ttyU0";
+ int c, fd;
+
+ while ((c = getopt(argc, argv, "f:")) != -1)
+ switch (c) {
+ case 'f':
+ dev = strdup(optarg);
+ break;
+ default:
+ break;
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (argc != 1)
+ return -1;
+
+ p = rdhex(argv[0], PAGENUM, PAGESIZE);
+ assert(p);
+ assert(p[120].dirty == 0); /* protect firmware */
+
+ fd = open_tty(dev);
+ if (fd == -1)
+ perror(dev);
+ transfer(fd, p, PAGENUM, PAGESIZE);
+ close(fd);
+
+ freehex(p, PAGENUM);
+
+ return 0;
+}
diff --git a/bootloader/bootloader.h b/bootloader/bootloader.h
new file mode 100644
index 0000000..1af5364
--- /dev/null
+++ b/bootloader/bootloader.h
@@ -0,0 +1,39 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2011 Dimitri Sokolyuk <demon@dim13.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __BOOTLOADER_H
+#define __BOOTLOADER_H
+
+#define PAGESIZE 64
+#define PAGENUM 128
+#define RAMEND 0x45F
+
+struct page {
+ unsigned char *data;
+ int dirty;
+};
+
+struct page *rdhex(char *, int, int);
+void freehex(struct page *, int);
+
+void put(unsigned char c, int fd);
+unsigned char get(int fd);
+void twiddle(void);
+int open_tty(char *dev);
+void close_tty(int fd);
+
+#endif
diff --git a/bootloader/bootloader/Makefile b/bootloader/bootloader/Makefile
new file mode 100644
index 0000000..d12e9fb
--- /dev/null
+++ b/bootloader/bootloader/Makefile
@@ -0,0 +1,7 @@
+# $Id$
+
+PROG= bootloader
+SRCS= bootloader.c ihex.c tty.c
+NOMAN=
+
+.include <bsd.prog.mk>
diff --git a/bootloader/dump.c b/bootloader/dump.c
new file mode 100644
index 0000000..3d675f4
--- /dev/null
+++ b/bootloader/dump.c
@@ -0,0 +1,60 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2011 Dimitri Sokolyuk <demon@dim13.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "bootloader.h"
+
+void
+dumphex(struct page *p, int pages, int pagesize)
+{
+ int n, off, used = 0;
+
+ for (n = 0; n < pages; n++) {
+ if (p[n].dirty) {
+ ++used;
+ printf("page %3d (%.4x)", n, n * pagesize);
+ for (off = 0; off < pagesize; off++) {
+ if (off % 16 == 0)
+ printf("\n");
+ printf("%3.2x", p[n].data[off]);
+ }
+ printf("\n");
+ }
+ }
+
+ printf("used: %3d/%3d (%5.2f%%)\n", used, pages,
+ 100 * used / (float)pages);
+}
+
+int
+main(int argc, char **argv)
+{
+ struct page *p;
+
+ if (argc != 2)
+ return -1;
+
+ p = rdhex(argv[1], PAGENUM, PAGESIZE);
+ assert(p);
+ dumphex(p, PAGENUM, PAGESIZE);
+ freehex(p, PAGENUM);
+
+ return 0;
+}
diff --git a/bootloader/hexdump/Makefile b/bootloader/hexdump/Makefile
new file mode 100644
index 0000000..c72213a
--- /dev/null
+++ b/bootloader/hexdump/Makefile
@@ -0,0 +1,7 @@
+# $Id$
+
+PROG= dump
+SRCS= dump.c ihex.c
+NOMAN=
+
+.include <bsd.prog.mk>
diff --git a/bootloader/ihex.c b/bootloader/ihex.c
new file mode 100644
index 0000000..4348910
--- /dev/null
+++ b/bootloader/ihex.c
@@ -0,0 +1,93 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2011 Dimitri Sokolyuk <demon@dim13.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "bootloader.h"
+
+int
+rdbyte(char **s, int *sum)
+{
+ int x;
+
+ sscanf(*s, "%2x", &x);
+
+ *s += 2;
+ *sum += x;
+
+ return x;
+}
+
+struct page *
+rdhex(char *fname, int pages, int pagesize)
+{
+ struct page *p;
+ FILE *fd;
+ uint i, length, addr, addrh, addrl, cksum, page, off;
+ char *s, buf[80];
+
+ fd = fopen(fname, "r");
+ if (!fd)
+ return NULL;
+
+ p = calloc(pages, sizeof(struct page));
+
+ while ((s = fgets(buf, sizeof(buf), fd)) != NULL) {
+ if (*s++ != ':')
+ continue;
+
+ cksum = 0;
+ length = rdbyte(&s, &cksum);
+ addrh = rdbyte(&s, &cksum);
+ addrl = rdbyte(&s, &cksum);
+ if (rdbyte(&s, &cksum)) /* type, has to be 0 (DATA) */
+ continue;
+
+ addr = (addrh << 8) | addrl;
+ for (i = 0; i < length; i++) {
+ page = (addr + i) / pagesize;
+ off = (addr + i) % pagesize;
+ if (!p[page].dirty) {
+ p[page].data = malloc(pagesize);
+ memset(p[page].data, 0xff, pagesize);
+ }
+ p[page].data[off] = rdbyte(&s, &cksum);
+ p[page].dirty = 1;
+ }
+
+ rdbyte(&s, &cksum); /* checksum, last byte */
+ if (cksum & 0xff)
+ return NULL;
+ }
+
+ fclose(fd);
+
+ return p;
+}
+
+void
+freehex(struct page *p, int pages)
+{
+ int i;
+
+ for (i = 0; i < pages; i++)
+ if (p[i].dirty)
+ free(p[i].data);
+
+ free(p);
+}
diff --git a/bootloader/mem.c b/bootloader/mem.c
new file mode 100644
index 0000000..3f6e564
--- /dev/null
+++ b/bootloader/mem.c
@@ -0,0 +1,69 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2011 Dimitri Sokolyuk <demon@dim13.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include "bootloader.h"
+
+int
+transfer(int fd, FILE *dump, int ramend)
+{
+ int n;
+
+ put('D', fd);
+
+ printf("reading mem: ");
+
+ for (n = 0; n <= ramend; n++) {
+ twiddle();
+ fputc(get(fd), dump);
+ }
+ printf("\n");
+
+ return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+ char *dev = "/dev/ttyU0";
+ int c, fd;
+ FILE *dump;
+
+ while ((c = getopt(argc, argv, "f:")) != -1)
+ switch (c) {
+ case 'f':
+ dev = strdup(optarg);
+ break;
+ default:
+ break;
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ dump = fopen("memdump", "w");
+ fd = open_tty(dev);
+ transfer(fd, dump, RAMEND);
+ close(fd);
+ fclose(dump);
+
+ return 0;
+}
diff --git a/bootloader/memdump/Makefile b/bootloader/memdump/Makefile
new file mode 100644
index 0000000..f958b94
--- /dev/null
+++ b/bootloader/memdump/Makefile
@@ -0,0 +1,7 @@
+# $Id$
+
+PROG= mem
+SRCS= mem.c tty.c
+NOMAN=
+
+.include <bsd.prog.mk>
diff --git a/bootloader/tty.c b/bootloader/tty.c
new file mode 100644
index 0000000..8cf20fb
--- /dev/null
+++ b/bootloader/tty.c
@@ -0,0 +1,80 @@
+/* $Id$ */
+/*
+ * Copyright (c) 2011 Dimitri Sokolyuk <demon@dim13.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <assert.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <string.h>
+#include "bootloader.h"
+
+void
+put(unsigned char c, int fd)
+{
+ while (write(fd, &c, 1) == -1)
+ ;
+}
+
+unsigned char
+get(int fd)
+{
+ unsigned char c;
+
+ while (read(fd, &c, 1) == -1)
+ ;
+
+ return c;
+}
+
+void
+twiddle(void)
+{
+ static int pos;
+
+ putchar("|/-\\"[pos++ & 3]);
+ putchar('\b');
+}
+
+
+int
+open_tty(char *dev)
+{
+ struct termios tio;
+ int fd;
+
+ fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK);
+ if (fd < 0)
+ return -1;
+
+ fprintf(stderr, "open done, trying to set raw\n");
+
+ bzero(&tio, sizeof(tio));
+ tio.c_cflag = CS8 | CREAD | CLOCAL;
+ tio.c_cc[VMIN] = 1;
+ tio.c_cc[VTIME] = 10;
+ cfsetspeed(&tio, B9600);
+ cfmakeraw(&tio);
+ if (tcsetattr(fd, TCSANOW, &tio) < 0)
+ fprintf(stderr, "cannot set raw mode\n");
+
+ usleep(500);
+
+ return fd;
+}