diff rvinterf/tmsh/etmbasic.c @ 260:c146f38d2b5f

rvinterf subdir structure made a little more sensible
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Wed, 05 Feb 2014 04:02:13 +0000
parents rvinterf/etm/etmbasic.c@c413e791595a
children 577291a2ad76
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/tmsh/etmbasic.c	Wed Feb 05 04:02:13 2014 +0000
@@ -0,0 +1,98 @@
+/*
+ * Basic ETM interaction
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include "pktmux.h"
+#include "limits.h"
+#include "etm.h"
+
+extern u_char rvi_msg[];
+extern int rvi_msg_len;
+
+void
+print_etm_pkt_raw(err)
+	char *err;
+{
+	char buf[MAX_PKT_FROM_TARGET*3+80], *dp;
+	int i;
+
+	sprintf(buf, "%s:", err);
+	dp = index(buf, '\0');
+	for (i = 2; i < rvi_msg_len; i++) {
+		sprintf(dp, " %02X", rvi_msg[i]);
+		dp += 3;
+	}
+	async_msg_output(buf);
+}
+
+void
+etm_packet_rx()
+{
+	int i, c;
+
+	if (rvi_msg_len < 4) {
+runt:		print_etm_pkt_raw("ETM Runt");
+		return;
+	}
+	c = 0;
+	for (i = 2; i < rvi_msg_len; i++)
+		c ^= rvi_msg[i];
+	if (c) {
+		print_etm_pkt_raw("BAD CKSUM");
+		return;
+	}
+	switch (rvi_msg[2]) {
+	case ETM_CORE:
+		if (rvi_msg_len < 6)
+			goto runt;
+		tmcore_msg_rx();
+		return;
+	case ETM_FFS1:
+		print_etm_pkt_raw("FFS1");
+		return;
+	case ETM_FFS2:
+		print_etm_pkt_raw("FFS2");
+		return;
+	default:
+		print_etm_pkt_raw("ETM Unknown");
+	}
+}
+
+void
+cmd_etmpkt(argc, argv)
+	char **argv;
+{
+	u_char pkt[MAX_PKT_TO_TARGET];
+	int di, c, b;
+	char **ap;
+
+	pkt[0] = RVT_TM_HEADER;
+	di = 1;
+	c = 0;
+	for (ap = argv + 1; *ap; ap++) {
+		b = strtoul(*ap, 0, 16);
+		pkt[di++] = b;
+		c ^= b;
+	}
+	pkt[di++] = c;
+	send_pkt_to_target(pkt, di);
+}
+
+void
+send_etm_cmd(buf, len)
+	u_char *buf;
+{
+	int i, c;
+
+	buf[0] = RVT_TM_HEADER;
+	c = 0;
+	for (i = 1; i <= len; i++)
+		c ^= buf[i];
+	buf[i] = c;
+	send_pkt_to_target(buf, len + 2);
+}