diff loadtools/chainload.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children 88962b111edc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loadtools/chainload.c	Sat Jun 11 00:13:35 2016 +0000
@@ -0,0 +1,114 @@
+/*
+ * 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;
+
+extern struct baudrate *current_baud_rate;
+extern struct baudrate *xram_run_baudrate;
+
+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);
+		}
+		if (!rec_count)
+			printf("Each \'.\' is 100 S-records\n");
+		make_ml_arg(xramimage.record, srecarg);
+		tpinterf_make_cmd(argv);
+		if (tpinterf_send_cmd())
+			exit(1);
+		if (tpinterf_pass_output(1))
+			exit(1);
+		rec_count++;
+		if (rec_count % 100 == 0) {
+			putchar('.');
+			fflush(stdout);
+		}
+	}
+	/* 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);
+	}
+	if (xram_run_baudrate != current_baud_rate) {
+		resp = loadagent_switch_baud(xram_run_baudrate);
+		if (resp)
+			exit(1);
+	}
+	printf("Sending jump command\n");
+	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);
+}