aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2009-12-04 16:00:43 +0100
committerØyvind Harboe <oyvind.harboe@zylin.com>2009-12-08 10:29:58 +0100
commit97de520bc02f96f31063175fbc9cad034e84055d (patch)
treeaf141babaa1d5e09f15e53cc5806b98ecbf7b217
parent304af6e7d87af60a4c807b940ff6102243d465a4 (diff)
minidriver: fix inline capability of minidriver
Low latency low CPU processing power systems(embedded) will benefit greatly from being able to inline certain jtag_add_xxx() fn's. The trick is that this has to be done in such a way as to allow implementing an OpenOCD API with a shared library(eventually) on a PC hosted OpenOCD. Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
-rw-r--r--.gitignore4
-rw-r--r--src/jtag/Makefile.am32
-rw-r--r--src/jtag/commands.c1
-rw-r--r--src/jtag/commands.h2
-rw-r--r--src/jtag/core.c27
-rw-r--r--src/jtag/drivers/driver.c31
-rw-r--r--src/jtag/drivers/minidriver_imp.h11
-rw-r--r--src/jtag/jtag.h12
-rw-r--r--src/jtag/minidriver.h2
-rw-r--r--src/jtag/minidriver/minidriver_imp.h19
-rw-r--r--src/jtag/minidummy/minidummy.c1
11 files changed, 94 insertions, 48 deletions
diff --git a/.gitignore b/.gitignore
index 114fc057..9928129e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,10 @@
*.la
*.in
+# generated source files
+src/jtag/minidriver_imp.h
+src/jtag/jtag_minidriver.h
+
# editor files
*.swp
diff --git a/src/jtag/Makefile.am b/src/jtag/Makefile.am
index da2edddc..3f132d47 100644
--- a/src/jtag/Makefile.am
+++ b/src/jtag/Makefile.am
@@ -9,33 +9,49 @@ SUBDIRS =
DRIVERFILES =
libjtag_la_LIBADD =
-if MINIDRIVER
+CLEANFILES =
+
+BUILT_SOURCES =
+
+BUILT_SOURCES += minidriver_imp.h
+CLEANFILES += minidriver_imp.h
-# for minidriver_imp.h
-AM_CPPFLAGS += -I$(srcdir)/minidriver
+if MINIDRIVER
if ZY1000
DRIVERFILES += zy1000/zy1000.c
-AM_CPPFLAGS += -I$(srcdir)/zy1000
+JTAG_MINIDRIVER_DIR = $(srcdir)/zy1000
endif
if MINIDRIVER_DUMMY
DRIVERFILES += minidummy/minidummy.c commands.c
-AM_CPPFLAGS += -I$(srcdir)/minidummy
+JTAG_MINIDRIVER_DIR = $(srcdir)/minidummy
endif
+MINIDRIVER_IMP_DIR = $(srcdir)/minidriver
+
+jtag_minidriver.h: $(JTAG_MINIDRIVER_DIR)/jtag_minidriver.h
+ cp $< $@
+
+BUILT_SOURCES += jtag_minidriver.h
+
+CLEANFILES += jtag_minidriver.h
+
else
+MINIDRIVER_IMP_DIR = $(srcdir)/drivers
DRIVERFILES += commands.c
SUBDIRS += drivers
libjtag_la_LIBADD += $(top_builddir)/src/jtag/drivers/libocdjtagdrivers.la
-# for minidriver_imp.h
-AM_CPPFLAGS += -I$(srcdir)/drivers
-
endif
+
# endif // MINIDRIVER
+minidriver_imp.h: $(MINIDRIVER_IMP_DIR)/minidriver_imp.h
+ cp $< $@
+
+
libjtag_la_SOURCES = \
core.c \
interface.c \
diff --git a/src/jtag/commands.c b/src/jtag/commands.c
index 4e8ce40f..6951f031 100644
--- a/src/jtag/commands.c
+++ b/src/jtag/commands.c
@@ -31,6 +31,7 @@
#include "config.h"
#endif
+#include <jtag/jtag.h>
#include "commands.h"
struct cmd_queue_page {
diff --git a/src/jtag/commands.h b/src/jtag/commands.h
index 86ded152..b10b5453 100644
--- a/src/jtag/commands.h
+++ b/src/jtag/commands.h
@@ -26,8 +26,6 @@
#ifndef JTAG_COMMANDS_H
#define JTAG_COMMANDS_H
-#include <jtag/jtag.h>
-
/**
* The inferred type of a scan_command_s structure, indicating whether
* the command has the host scan in from the device, the host scan out
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 373dd7e2..77cf48ac 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -32,7 +32,6 @@
#endif
#include "jtag.h"
-#include "minidriver.h"
#include "interface.h"
#ifdef HAVE_STRINGS_H
@@ -398,18 +397,6 @@ void jtag_add_plain_ir_scan(int in_num_fields, const struct scan_field *in_field
jtag_set_error(retval);
}
-void jtag_add_callback(jtag_callback1_t f, jtag_callback_data_t data0)
-{
- interface_jtag_add_callback(f, data0);
-}
-
-void jtag_add_callback4(jtag_callback_t f, jtag_callback_data_t data0,
- jtag_callback_data_t data1, jtag_callback_data_t data2,
- jtag_callback_data_t data3)
-{
- interface_jtag_add_callback4(f, data0, data1, data2, data3);
-}
-
static int jtag_check_value_inner(uint8_t *captured, uint8_t *in_check_value,
uint8_t *in_check_mask, int num_bits);
@@ -491,20 +478,6 @@ void jtag_add_plain_dr_scan(int in_num_fields, const struct scan_field *in_field
jtag_set_error(retval);
}
-void jtag_add_dr_out(struct jtag_tap* tap,
- int num_fields, const int* num_bits, const uint32_t* value,
- tap_state_t end_state)
-{
- assert(end_state != TAP_RESET);
- assert(end_state != TAP_INVALID);
-
- cmd_queue_cur_state = end_state;
-
- interface_jtag_add_dr_out(tap,
- num_fields, num_bits, value,
- end_state);
-}
-
void jtag_add_tlr(void)
{
jtag_prelude(TAP_RESET);
diff --git a/src/jtag/drivers/driver.c b/src/jtag/drivers/driver.c
index 7fa9eade..c57386a4 100644
--- a/src/jtag/drivers/driver.c
+++ b/src/jtag/drivers/driver.c
@@ -2,7 +2,7 @@
* Copyright (C) 2005 by Dominic Rath *
* Dominic.Rath@gmx.de *
* *
- * Copyright (C) 2007,2008 Øyvind Harboe *
+ * Copyright (C) 2007-2009 Øyvind Harboe *
* oyvind.harboe@zylin.com *
* *
* Copyright (C) 2009 SoftPLC Corporation *
@@ -31,7 +31,9 @@
#include "config.h"
#endif
+#include <jtag/jtag.h>
#include <jtag/interface.h>
+#include <jtag/commands.h>
#include <jtag/minidriver.h>
#include <helper/command.h>
@@ -525,3 +527,30 @@ void interface_jtag_add_callback(jtag_callback1_t callback, jtag_callback_data_t
jtag_add_callback4(jtag_convert_to_callback4, data0, (jtag_callback_data_t)callback, 0, 0);
}
+
+/* A minidriver can use use an inline versions of this API level fn */
+void jtag_add_dr_out(struct jtag_tap* tap,
+ int num_fields, const int* num_bits, const uint32_t* value,
+ tap_state_t end_state)
+{
+ assert(end_state != TAP_RESET);
+ assert(end_state != TAP_INVALID);
+
+ cmd_queue_cur_state = end_state;
+
+ interface_jtag_add_dr_out(tap,
+ num_fields, num_bits, value,
+ end_state);
+}
+
+void jtag_add_callback(jtag_callback1_t f, jtag_callback_data_t data0)
+{
+ interface_jtag_add_callback(f, data0);
+}
+
+void jtag_add_callback4(jtag_callback_t f, jtag_callback_data_t data0,
+ jtag_callback_data_t data1, jtag_callback_data_t data2,
+ jtag_callback_data_t data3)
+{
+ interface_jtag_add_callback4(f, data0, data1, data2, data3);
+}
diff --git a/src/jtag/drivers/minidriver_imp.h b/src/jtag/drivers/minidriver_imp.h
index 1efd2428..76cf9dd5 100644
--- a/src/jtag/drivers/minidriver_imp.h
+++ b/src/jtag/drivers/minidriver_imp.h
@@ -1,6 +1,6 @@
/***************************************************************************
* Copyright (C) 2005 by Dominic Rath <Dominic.Rath@gmx.de> *
- * Copyright (C) 2007,2008 Øyvind Harboe <oyvind.harboe@zylin.com> *
+ * Copyright (C) 2007-2009 Øyvind Harboe <oyvind.harboe@zylin.com> *
* Copyright (C) 2009 Zachary T Welch <zw@superlucidity.net> *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -44,4 +44,13 @@ void interface_jtag_add_callback4(jtag_callback_t f, jtag_callback_data_t data0,
jtag_callback_data_t data1, jtag_callback_data_t data2,
jtag_callback_data_t data3);
+void jtag_add_dr_out(struct jtag_tap* tap,
+ int num_fields, const int* num_bits, const uint32_t* value,
+ tap_state_t end_state);
+
+
+void jtag_add_callback4(jtag_callback_t f, jtag_callback_data_t data0,
+ jtag_callback_data_t data1, jtag_callback_data_t data2,
+ jtag_callback_data_t data3);
+
#endif // MINIDRIVER_IMP_H
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index eaa0c7c7..fece6521 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -461,10 +461,6 @@ typedef int (*jtag_callback_t)(jtag_callback_data_t data0,
* @param data3 An integer big enough to use as an @c int or a pointer.
*
*/
-void jtag_add_callback4(jtag_callback_t f, jtag_callback_data_t data0,
- jtag_callback_data_t data1, jtag_callback_data_t data2,
- jtag_callback_data_t data3);
-
/**
* Run a TAP_RESET reset where the end state is TAP_RESET,
@@ -688,9 +684,6 @@ void jtag_sleep(uint32_t us);
* There is no jtag_add_dr_outin() version of this fn that also allows
* clocking data back in. Patches gladly accepted!
*/
-void jtag_add_dr_out(struct jtag_tap* tap,
- int num_fields, const int* num_bits, const uint32_t* value,
- tap_state_t end_state);
/**
@@ -725,4 +718,9 @@ bool jtag_poll_get_enabled(void);
*/
void jtag_poll_set_enabled(bool value);
+
+/* The minidriver may have inline versions of some of the low
+ * level APIs that are used in inner loops. */
+#include <jtag/minidriver.h>
+
#endif /* JTAG_H */
diff --git a/src/jtag/minidriver.h b/src/jtag/minidriver.h
index ea780faf..2109c75f 100644
--- a/src/jtag/minidriver.h
+++ b/src/jtag/minidriver.h
@@ -47,7 +47,7 @@
// this header will be provided by the minidriver implementation,
// and it may provide additional declarations that must be defined.
-#include "minidriver_imp.h"
+#include <jtag/minidriver_imp.h>
int interface_jtag_add_ir_scan(
int num_fields, const struct scan_field* fields,
diff --git a/src/jtag/minidriver/minidriver_imp.h b/src/jtag/minidriver/minidriver_imp.h
index e3715140..b6cdbead 100644
--- a/src/jtag/minidriver/minidriver_imp.h
+++ b/src/jtag/minidriver/minidriver_imp.h
@@ -21,7 +21,7 @@
#ifndef MINIDRIVER_IMP_H
#define MINIDRIVER_IMP_H
-#include "jtag_minidriver.h"
+#include <jtag/jtag_minidriver.h>
static inline void interface_jtag_alloc_in_value32(struct scan_field *field)
{
@@ -41,4 +41,21 @@ static inline void interface_jtag_add_scan_check_alloc(struct scan_field *field)
field->in_value = field->intmp;
}
+static inline void jtag_add_dr_out(struct jtag_tap* tap,
+ int num_fields, const int* num_bits, const uint32_t* value,
+ tap_state_t end_state)
+{
+ cmd_queue_cur_state = end_state;
+
+ interface_jtag_add_dr_out(tap,
+ num_fields, num_bits, value,
+ end_state);
+}
+
+#define jtag_add_callback(callback, in) interface_jtag_add_callback(callback, in)
+
+#define jtag_add_callback4(callback, in, data1, data2, data3) interface_jtag_add_callback4(callback, in, data1, data2, data3)
+
+
+
#endif // MINIDRIVER_IMP_H
diff --git a/src/jtag/minidummy/minidummy.c b/src/jtag/minidummy/minidummy.c
index e60e832e..9c608cdb 100644
--- a/src/jtag/minidummy/minidummy.c
+++ b/src/jtag/minidummy/minidummy.c
@@ -20,6 +20,7 @@
#include "config.h"
#endif
+#include <jtag/jtag.h>
#include <target/embeddedice.h>
#include <jtag/minidriver.h>
#include <jtag/interface.h>