changeset 648:3229940734e5

loadagent: binary memload command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 02 Mar 2020 02:32:18 +0000
parents dfe6ba3611cd
children 141372e0d28f
files target-utils/loadagent/Makefile target-utils/loadagent/binload.c target-utils/loadagent/cmdtab.c target-utils/loadagent/serextra.S
diffstat 4 files changed, 93 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/target-utils/loadagent/Makefile	Mon Mar 02 00:23:37 2020 +0000
+++ b/target-utils/loadagent/Makefile	Mon Mar 02 02:32:18 2020 +0000
@@ -7,7 +7,7 @@
 INSTDIR=/opt/freecalypso/target-bin
 
 PROG=	loadagent
-OBJS=	crt0.o bindump.o cmdtab.o main.o sertimeout.o
+OBJS=	crt0.o bindump.o binload.o cmdtab.o main.o serextra.o sertimeout.o
 LIBS=	../libload/libload.a ../libcommon/libcommon.a ../libprintf/libprintf.a \
 	../libbase/libbase.a ../libc/libc.a
 LIBGCC=	`${CC} -print-file-name=libgcc.a`
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/loadagent/binload.c	Mon Mar 02 02:32:18 2020 +0000
@@ -0,0 +1,76 @@
+/*
+ * Here we are going to implement our new binary protocol for RAM loading
+ * for a faster version of fc-xram.
+ */
+
+#include "types.h"
+
+void
+cmd_binary_memload()
+{
+	int state, recptr, extlen, datalen;
+	u8 record[256], cksum;
+	u32 addr;
+	u16 rec_count;
+	int c, i;
+
+	rec_count = 0;
+	for (state = 0; ; ) {
+		switch (state) {
+		case 0:
+			c = serial_in_timeout(3000000);		/* 1.8 s */
+			if (c < 0 || c == 0x04)
+				return;
+			if (c == 0x05) {
+				serial_out(0x06);	/* ACK */
+				serial_out(rec_count >> 8);
+				serial_out(rec_count);
+				continue;
+			}
+			if (c >= 6) {
+				record[0] = c;
+				extlen = c + 1;
+				datalen = c - 5;
+				recptr = 1;
+				state = 1;
+				continue;
+			}
+			serial_out(0x15);	/* NAK */
+			state = 2;
+			continue;
+		case 1:
+			c = serial_in_timeout(1000000);		/* 0.6 s */
+			if (c < 0) {
+				serial_out(0x15);	/* NAK */
+				state = 2;
+				continue;
+			}
+			record[recptr++] = c;
+			if (recptr < extlen)
+				continue;
+			/* verify checksum */
+			cksum = 0;
+			for (i = 0; i < extlen; i++)
+				cksum += record[i];
+			if (cksum != 0xFF) {
+				serial_out(0x15);	/* NAK */
+				state = 2;
+				continue;
+			}
+			addr =  ((u32)record[1] << 24) |
+				((u32)record[2] << 16) |
+				((u32)record[3] << 8) |
+				 (u32)record[4];
+			memcpy(addr, record + 5, datalen);
+			rec_count++;
+			state = 0;
+			continue;
+		default:
+			c = serial_in_timeout(10000000);	/* 6.15 s */
+			if (c < 0)
+				return;
+			serial_out_if_empty(0x15);	/* NAK */
+			continue;
+		}
+	}
+}
--- a/target-utils/loadagent/cmdtab.c	Mon Mar 02 00:23:37 2020 +0000
+++ b/target-utils/loadagent/cmdtab.c	Mon Mar 02 02:32:18 2020 +0000
@@ -18,6 +18,7 @@
 extern void cmd_w32();
 
 extern void cmd_baud_switch();
+extern void cmd_binary_memload();
 extern void cmd_intel_rewrite_sector();
 extern void cmd_memdump_binary();
 extern void cmd_memdump_human();
@@ -32,6 +33,7 @@
 	{"AMFB", cmd_AMFB},
 	{"AMFW", cmd_AMFW},
 	{"BINDUMP", cmd_memdump_binary},
+	{"BINML", cmd_binary_memload},
 	{"DUMP", cmd_memdump_machine},
 	{"INFB", cmd_INFB},
 	{"INFW", cmd_INFW},
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/target-utils/loadagent/serextra.S	Mon Mar 02 02:32:18 2020 +0000
@@ -0,0 +1,14 @@
+#include "ns16550.h"
+
+@ extra serial I/O functions for loadagent binary operations
+
+	.text
+	.code	32
+	.globl	serial_out_if_empty
+serial_out_if_empty:
+	ldr	r1, =uart_base
+	ldr	r2, [r1]
+	ldrb	r3, [r2, #NS16550_LSR]
+	tst	r3, #NS16550_LSR_THRE
+	strneb	r0, [r2, #NS16550_THR]
+	bx	lr