diff target-utils/loadagent/binload.c @ 648:3229940734e5

loadagent: binary memload command implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 02 Mar 2020 02:32:18 +0000
parents
children
line wrap: on
line diff
--- /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;
+		}
+	}
+}