I just noticed that there may be other problems with this; I question the need for both -I and #include "dirname/...". Seems like one or the other is enough, so there appears to be a new redundancy here.
On Wed, 2009-12-02 at 13:39 -0800, Zach Welch wrote: > Do not apply this until you fix the problem noted below. > > Thanks, > > Zach > > On Wed, 2009-12-02 at 14:38 +0100, Øyvind Harboe wrote: > > Fix 'regression' where jtag_add_dr_out() is no longer inlined > > after refactoring. > > > > The minidrivers strip away all the overhead and allow inner loops > > to communicate directly with a hardware FIFO. > > > > Signed-off-by: Øyvind Harboe <oyvind.har...@zylin.com> > > --- > > src/jtag/Makefile.am | 2 - > > src/jtag/core.c | 14 --------- > > src/jtag/driver.c | 10 +++++++ > > src/jtag/jtag.h | 37 +++---------------------- > > src/jtag/minidriver.h | 67 > > ++++++++++++++++++++++++++++++++++++++------- > > src/jtag/zy1000/zy1000.c | 3 +- > > 6 files changed, 73 insertions(+), 60 deletions(-) > > > > diff --git a/src/jtag/Makefile.am b/src/jtag/Makefile.am > > index 5254a2b..c762300 100644 > > --- a/src/jtag/Makefile.am > > +++ b/src/jtag/Makefile.am > > @@ -11,11 +11,9 @@ if MINIDRIVER > > > > if ZY1000 > > DRIVERFILES += zy1000/zy1000.c > > -AM_CPPFLAGS += -I$(srcdir)/zy1000 > > endif > > if MINIDRIVER_DUMMY > > DRIVERFILES += minidummy/minidummy.c commands.c > > -AM_CPPFLAGS += -I$(srcdir)/minidummy > > endif > > > > else > > diff --git a/src/jtag/core.c b/src/jtag/core.c > > index 9230cc2..cf14394 100644 > > --- a/src/jtag/core.c > > +++ b/src/jtag/core.c > > @@ -502,20 +502,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/driver.c b/src/jtag/driver.c > > index cadd88e..fe56369 100644 > > --- a/src/jtag/driver.c > > +++ b/src/jtag/driver.c > > @@ -525,3 +525,13 @@ 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); > > } > > > > +void interface_jtag_alloc_in_value32(struct scan_field *field) > > +{ > > + field->in_value = (uint8_t *)cmd_queue_alloc(4); > > +} > > + > > +void interface_jtag_add_scan_check_alloc(struct scan_field *field) > > +{ > > + unsigned num_bytes = DIV_ROUND_UP(field->num_bits, 8); > > + field->in_value = (uint8_t *)cmd_queue_alloc(num_bytes); > > +} > > diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h > > index ee96775..4b0e8b2 100644 > > --- a/src/jtag/jtag.h > > +++ b/src/jtag/jtag.h > > @@ -2,7 +2,7 @@ > > * Copyright (C) 2005 by Dominic Rath * > > * dominic.r...@gmx.de * > > * * > > -* Copyright (C) 2007,2008 Øyvind Harboe * > > +* Copyright (C) 2007-2009 Øyvind Harboe * > > * oyvind.har...@zylin.com * > > * * > > * This program is free software; you can redistribute it and/or modify * > > @@ -663,37 +663,6 @@ void jtag_sleep(uint32_t us); > > #define ERROR_JTAG_INIT_SOFT_FAIL (-110) > > > > /** > > - * jtag_add_dr_out() is a version of jtag_add_dr_scan() which > > - * only scans data out. It operates on 32 bit integers instead > > - * of 8 bit, which makes it a better impedance match with > > - * the calling code which often operate on 32 bit integers. > > - * > > - * Current or end_state can not be TAP_RESET. end_state can be TAP_INVALID > > - * > > - * num_bits[i] is the number of bits to clock out from value[i] LSB first. > > - * > > - * If the device is in bypass, then that is an error condition in > > - * the caller code that is not detected by this fn, whereas > > - * jtag_add_dr_scan() does detect it. Similarly if the device is not in > > - * bypass, data must be passed to it. > > - * > > - * If anything fails, then jtag_error will be set and jtag_execute() will > > - * return an error. There is no way to determine if there was a failure > > - * during this function call. > > - * > > - * This is an inline fn to speed up embedded hosts. Also note that > > - * interface_jtag_add_dr_out() can be a *small* inline function for > > - * embedded hosts. > > - * > > - * 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); > > - > > - > > -/** > > * Set the current JTAG core execution error, unless one was set > > * by a previous call previously. Driver or application code must > > * use jtag_error_clear to reset jtag_error once this routine has been > > @@ -725,4 +694,8 @@ bool jtag_poll_get_enabled(void); > > */ > > void jtag_poll_set_enabled(bool value); > > > > + > > +/* The minidriver contains inline versions of JTAG fn's */ > > +#include "minidriver.h" > > + > > This is bad, as you are creating a new layering violation that will need > to be removed. You should move this #include to somewhere other than > what should be our public API, probably inside the C files that need it. > Presently, this change exposes _more_ internals, not less. > > > #endif /* JTAG_H */ > > diff --git a/src/jtag/minidriver.h b/src/jtag/minidriver.h > > index 392a190..7c8dcd7 100644 > > --- a/src/jtag/minidriver.h > > +++ b/src/jtag/minidriver.h > > @@ -46,7 +46,14 @@ > > > > #ifdef HAVE_JTAG_MINIDRIVER_H > > > > -#include "jtag_minidriver.h" > > +#if BUILD_ZY1000 > > +#include "zy1000/jtag_minidriver.h" > > +#endif > > + > > +#if BUILD_MINIDRIVER_DUMMY > > +#include "minidummy/jtag_minidriver.h" > > +#endif > > + > > > > static inline void interface_jtag_alloc_in_value32(struct scan_field > > *field) > > { > > @@ -70,16 +77,8 @@ static inline void > > interface_jtag_add_scan_check_alloc(struct scan_field *field) > > > > #include "commands.h" > > > > -static inline void interface_jtag_alloc_in_value32(struct scan_field > > *field) > > -{ > > - field->in_value = (uint8_t *)cmd_queue_alloc(4); > > -} > > - > > -static inline void interface_jtag_add_scan_check_alloc(struct scan_field > > *field) > > -{ > > - unsigned num_bytes = DIV_ROUND_UP(field->num_bits, 8); > > - field->in_value = (uint8_t *)cmd_queue_alloc(num_bytes); > > -} > > +void interface_jtag_alloc_in_value32(struct scan_field *field); > > +void interface_jtag_add_scan_check_alloc(struct scan_field *field); > > > > void interface_jtag_add_dr_out(struct jtag_tap* tap, > > int num_fields, const int* num_bits, const uint32_t* value, > > @@ -130,4 +129,50 @@ int interface_jtag_execute_queue(void); > > */ > > int default_interface_jtag_execute_queue(void); > > > > +/** > > + * jtag_add_dr_out() is a version of jtag_add_dr_scan() which > > + * only scans data out. It operates on 32 bit integers instead > > + * of 8 bit, which makes it a better impedance match with > > + * the calling code which often operate on 32 bit integers. > > + * > > + * Current or end_state can not be TAP_RESET. end_state can be TAP_INVALID > > + * > > + * num_bits[i] is the number of bits to clock out from value[i] LSB first. > > + * > > + * If the device is in bypass, then that is an error condition in > > + * the caller code that is not detected by this fn, whereas > > + * jtag_add_dr_scan() does detect it. Similarly if the device is not in > > + * bypass, data must be passed to it. > > + * > > + * If anything fails, then jtag_error will be set and jtag_execute() will > > + * return an error. There is no way to determine if there was a failure > > + * during this function call. > > + * > > + * This is an inline fn to speed up embedded hosts. Also note that > > + * interface_jtag_add_dr_out() can be a *small* inline function for > > + * embedded hosts. > > + * > > + * There is no jtag_add_dr_outin() version of this fn that also allows > > + * clocking data back in. Patches gladly accepted! > > + */ > > + > > + > > +/* NB!!!! this must be inline in order to allow interface_jtag_add_dr_out() > > + * to be inlined! > > + */ > > +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) > > +{ > > + 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); > > +} > > + > > + > > #endif // MINIDRIVER_H > > diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c > > index 07d840f..c3c93ac 100644 > > --- a/src/jtag/zy1000/zy1000.c > > +++ b/src/jtag/zy1000/zy1000.c > > @@ -20,9 +20,10 @@ > > #include "config.h" > > #endif > > > > -#include "embeddedice.h" > > +#include "arm7_9_common.h" > > #include "minidriver.h" > > #include "interface.h" > > +#include "embeddedice.h" > > #include "zy1000_version.h" > > > > #include <cyg/hal/hal_io.h> // low level i/o > > -- > > 1.6.3.3 > > > > _______________________________________________ > > Openocd-development mailing list > > Openocd-development@lists.berlios.de > > https://lists.berlios.de/mailman/listinfo/openocd-development > > > _______________________________________________ > Openocd-development mailing list > Openocd-development@lists.berlios.de > https://lists.berlios.de/mailman/listinfo/openocd-development _______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development