commit 83aa34743767503bf7fda6e9113814003ec3e500
parent a156bc18e08a648a7c073008af3fa8b4aeb0ef3b
Author: Brian Swetland <swetland@frotz.net>
Date:   Wed,  7 May 2014 18:53:35 -0700
debug: handle "generic" debug interface
Diffstat:
| M | Makefile |  |  | 8 | ++++++-- | 
| A | debug.c |  |  | 76 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 
2 files changed, 82 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile
@@ -2,7 +2,7 @@
 CFLAGS := -g -Wall -O2
 LIBS := -lusb-1.0
 
-all: jtag i2c wri2c rdi2c
+all: jtag i2c wri2c rdi2c debug
 
 jtag.c: jtag.h
 jtag-mpsse.c: jtag.h
@@ -22,5 +22,9 @@ RDI2C_OBJS := rdi2c.o i2c_core.o jtag-mpsse.o
 rdi2c: $(RDI2C_OBJS)
 	$(CC) -o rdi2c $(RDI2C_OBJS) $(LIBS)
 
+DEBUG_OBJS := debug.o jtag-mpsse.o
+debug: $(DEBUG_OBJS)
+	$(CC) -o debug $(DEBUG_OBJS) $(LIBS)
+
 clean::
-	rm -f jtag *.o i2c wri2c rdi2c
+	rm -f jtag *.o i2c wri2c rdi2c debug
diff --git a/debug.c b/debug.c
@@ -0,0 +1,76 @@
+/* Copyright 2014 Brian Swetland <swetland@frotz.net>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "jtag.h"
+#include "zynq.h"
+
+static JTAG *jtag;
+
+void jconnect(void) {
+	if (!(jtag = jtag_open())) {
+		fprintf(stderr, "jconnect: cannot open usb jtag ifc\n");
+		exit(-1);
+	}
+	if (jtag_enumerate(jtag) <= 0) {
+		fprintf(stderr, "jconnect: cannot enumerate jtag devices\n");
+		exit(-1);
+	}
+	if (jtag_select(jtag, 0x13722093)) {
+		fprintf(stderr, "jconnect: cannot connect to ZYNQ\n");
+		exit(-1);
+	}
+
+	jtag_ir_wr(jtag, XIL_USER4);
+}
+
+u32 jrd(u32 addr) {
+	u64 u;
+	jtag_dr_io(jtag, 4, addr & 7, &u);
+	jtag_dr_io(jtag, 36, 0, &u);
+	return (u32) u;
+}
+
+void jwr(u32 addr, u32 val) {
+	u64 u = ((u64)val) | (((u64) (addr & 7)) << 32) | 0x800000000ULL;
+	jtag_dr_io(jtag, 36, u, &u);
+}
+
+int main(int argc, char **argv) {
+
+	if (argc == 3) {
+		u32 addr = strtoul(argv[1], 0, 0);
+		u32 val = strtoul(argv[2], 0, 0);
+		jconnect();
+		jwr(addr, val);
+		return 0;
+	} else if (argc == 2) {
+		u32 addr = strtoul(argv[1], 0, 0);
+		u32 val;
+		jconnect();
+ 		val = jrd(addr);
+		printf("%08x\n", val);
+		return 0;
+	} else {
+		fprintf(stderr,
+			"usage:\n"
+			"  write:  debug <addr> <val>\n"
+			"   read:  debug <addr>\n");
+		return -1;
+	}
+}