From 97de520bc02f96f31063175fbc9cad034e84055d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Harboe?= Date: Fri, 4 Dec 2009 16:00:43 +0100 Subject: [PATCH] minidriver: fix inline capability of minidriver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .gitignore | 4 ++++ src/jtag/Makefile.am | 32 +++++++++++++++++++++------- src/jtag/commands.c | 1 + src/jtag/commands.h | 2 -- src/jtag/core.c | 27 ----------------------- src/jtag/drivers/driver.c | 31 ++++++++++++++++++++++++++- src/jtag/drivers/minidriver_imp.h | 11 +++++++++- src/jtag/jtag.h | 12 +++++------ src/jtag/minidriver.h | 2 +- src/jtag/minidriver/minidriver_imp.h | 19 ++++++++++++++++- src/jtag/minidummy/minidummy.c | 1 + 11 files changed, 94 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index 114fc0578..9928129ea 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 da2edddcb..3f132d477 100644 --- a/src/jtag/Makefile.am +++ b/src/jtag/Makefile.am @@ -9,33 +9,49 @@ SUBDIRS = DRIVERFILES = libjtag_la_LIBADD = -if MINIDRIVER +CLEANFILES = -# for minidriver_imp.h -AM_CPPFLAGS += -I$(srcdir)/minidriver +BUILT_SOURCES = + +BUILT_SOURCES += minidriver_imp.h +CLEANFILES += minidriver_imp.h + +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 4e8ce40f1..6951f0317 100644 --- a/src/jtag/commands.c +++ b/src/jtag/commands.c @@ -31,6 +31,7 @@ #include "config.h" #endif +#include #include "commands.h" struct cmd_queue_page { diff --git a/src/jtag/commands.h b/src/jtag/commands.h index 86ded1520..b10b54536 100644 --- a/src/jtag/commands.h +++ b/src/jtag/commands.h @@ -26,8 +26,6 @@ #ifndef JTAG_COMMANDS_H #define JTAG_COMMANDS_H -#include - /** * 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 373dd7e28..77cf48ac2 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 7fa9eade3..c57386a4b 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 #include +#include #include #include @@ -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 1efd2428b..76cf9dd56 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 * - * Copyright (C) 2007,2008 Øyvind Harboe * + * Copyright (C) 2007-2009 Øyvind Harboe * * Copyright (C) 2009 Zachary T Welch * * * * 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 eaa0c7c7a..fece65210 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 + #endif /* JTAG_H */ diff --git a/src/jtag/minidriver.h b/src/jtag/minidriver.h index ea780faf9..2109c75f6 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 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 e37151405..b6cdbead5 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 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 e60e832e9..9c608cdbb 100644 --- a/src/jtag/minidummy/minidummy.c +++ b/src/jtag/minidummy/minidummy.c @@ -20,6 +20,7 @@ #include "config.h" #endif +#include #include #include #include