diff loadtools/chainload.c @ 42:5da0cbee2b89

fc-xram tool written, compiles, now needs to be debugged
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Mon, 17 Jun 2013 07:18:04 +0000
parents
children 5ca0ad4003a0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loadtools/chainload.c	Mon Jun 17 07:18:04 2013 +0000
@@ -0,0 +1,101 @@
+/*
+ * This module implements the chain-loading of XRAM images via loadagent.
+ */
+
+#include <sys/types.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "srecreader.h"
+
+struct srecreader xramimage;
+
+static void
+make_ml_arg(rec, buf)
+	u_char *rec;
+	char *buf;
+{
+	register int i, len;
+	register char *s;
+
+	len = rec[0] + 1;
+	s = buf;
+	for (i = 0; i < len; i++) {
+		sprintf(s, "%02X", rec[i]);
+		s += 2;
+	}
+	*s = '\0';
+}
+
+perform_chain_load()
+{
+	int resp;
+	unsigned long rec_count;
+	char *argv[3], srecarg[516];
+
+	if (open_srec_file(&xramimage) < 0)
+		exit(1);
+	argv[0] = "ML";
+	argv[1] = srecarg;
+	argv[2] = 0;
+	for (rec_count = 0; ; ) {
+		if (read_s_record(&xramimage) < 0)
+			exit(1);
+		switch (xramimage.record_type) {
+		case '0':
+			if (xramimage.lineno == 1)
+				continue;
+			fprintf(stderr,
+		"%s: S0 record found in line %d (expected in line 1 only)\n",
+				xramimage.filename, xramimage.lineno);
+			exit(1);
+		case '3':
+		case '7':
+			if (s3s7_get_addr_data(&xramimage) < 0)
+				exit(1);
+			break;
+		default:
+			fprintf(stderr,
+				"%s line %d: S%c record type not supported\n",
+				xramimage.filename, xramimage.lineno,
+				xramimage.record_type);
+			exit(1);
+		}
+		if (xramimage.record_type == '7')
+			break;
+		/* must be S3 */
+		if (xramimage.datalen < 1) {
+			fprintf(stderr,
+				"%s line %d: S3 record has zero data length\n",
+				xramimage.filename, xramimage.lineno);
+			exit(1);
+		}
+		make_ml_arg(xramimage.record, srecarg);
+		tpinterf_make_cmd(argv);
+		if (tpinterf_send_cmd())
+			exit(1);
+		if (tpinterf_pass_output(1))
+			exit(1);
+		putchar('.');
+		fflush(stdout);
+		rec_count++;
+	}
+	/* got S7 */
+	fclose(xramimage.openfile);
+	if (!rec_count) {
+		fprintf(stderr,
+		"%s line %d: S7 without any preceding S3 data records\n",
+			xramimage.filename, xramimage.lineno);
+		exit(1);
+	}
+	sprintf(srecarg, "%lX", (u_long) xramimage.addr);
+	argv[0] = "jump";
+	tpinterf_make_cmd(argv);
+	if (tpinterf_send_cmd())
+		exit(1);
+	printf("Sent \"%s %s\": XRAM image should now be running!\n",
+		argv[0], argv[1]);
+	return(0);
+}