Hey all,

I just committed the following patch to assist future development of the
JTAG interface driver modules, encapsulating this into its own source
file separate from everything else.  This simply moves lines of codes
and adds some documentation, and the new files will allow developing a
patch series to implement this functionality in isolation from the core.

To finish this task, the following more invasive changes are needed:

1) build system improvements:
   a) add AC_ARG_ENABLE(modules, ...) to build with/without modules
   b) add AM_CONDITIONAL to use for building modules or not
   c) use new conditional to build drivers as modules or not
   d) use additional magic to build both ft2232/presto driver variants

2) implement jtag_interface_modules_load
   a) use libltdl to try loading shared library files from a path
   b) look for its well iterface symbol (i.e. "<module name>_interface")
   c) if library loaded and symbol found, add it to jtag_interfaces.

I hope this provides sufficient design and implementation details for
others to consider how we can implement this for targets as well.  These
are fairly straightforward technical details in my eyes, though there
are some additional issues that may need to be sorted out along the way.

Note: any modules must still be GPL, because they will be derived from
the GPL'd interface type specification loaded into jtag_interfaces.
Likewise, such a feature would not allow closed-source target support.

Of course, we have hashed out how an implementation of a "socket driver"
of some sort could workaround this problem.  In those cases, that will
mean suffering the performance penalties that come along with such
abstractions, but -- as someone recently pointed out -- patches to do
this would be legal to develop and use even if the maintainers do not
accept them into the repository.

In summary, the community should work to ensure that these features are
implemented in the best possible manner.  The code cannot violate the
GPL itself -- only the binaries; we should not look to restrict the
freedom of _users_, rather we should enable them to use it in the manner
that they want.  It is important to remember that it is always be
possible to _use_ OpenOCD on closed targets and distribute the source
code to do so; binary distribution is another matter entirely.

Cheers,

Zach

-------- Forwarded Message --------
Subject: [Openocd-svn] r2413 - trunk/src/jtag
Date: Mon, 29 Jun 2009 02:01:05 +0200

Author: zwelch
Date: 2009-06-29 02:00:50 +0200 (Mon, 29 Jun 2009)
New Revision: 2413

Added:
   trunk/src/jtag/interfaces.c
   trunk/src/jtag/interfaces.h
Modified:
   trunk/src/jtag/Makefile.am
   trunk/src/jtag/tcl.c
Log:
Move JTAG interface list to new files.
- Adds new source files to encapsulate static/dynamic module handling.
- Further work should implement the jtag_interface_modules_load routine,
  to populate the jtag_interfaces list from shared libraries in a path.


Modified: trunk/src/jtag/Makefile.am
===================================================================
--- trunk/src/jtag/Makefile.am  2009-06-28 18:46:51 UTC (rev 2412)
+++ trunk/src/jtag/Makefile.am  2009-06-29 00:00:50 UTC (rev 2413)
@@ -75,12 +75,14 @@
 
 libjtag_la_SOURCES = \
        core.c \
+       interface.c \
+       interfaces.c \
        tcl.c \
-       interface.c \
        $(DRIVERFILES)
 
 noinst_HEADERS = \
        interface.h \
+       interfaces.h \
        commands.h \
        minidriver.h \
        bitbang.h \

Added: trunk/src/jtag/interfaces.c
===================================================================
--- trunk/src/jtag/interfaces.c 2009-06-28 18:46:51 UTC (rev 2412)
+++ trunk/src/jtag/interfaces.c 2009-06-29 00:00:50 UTC (rev 2413)
@@ -0,0 +1,155 @@
+/***************************************************************************
+ *   Copyright (C) 2005 by Dominic Rath                                    *
+ *   dominic.r...@gmx.de                                                   *
+ *                                                                         *
+ *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   oyvind.har...@zylin.com                                               *
+ *                                                                         *
+ *   Copyright (C) 2009 SoftPLC Corporation                                *
+ *       http://softplc.com                                                *
+ *   d...@softplc.com                                                      *
+ *                                                                         *
+ *   Copyright (C) 2009 Zachary T Welch                                    *
+ *   z...@superlucidity.net                                                  *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "interfaces.h"
+
+/**
+ * @file This file includes declarations for all built-in jtag interfaces,
+ *  which are then listed in the jtag_interfaces array.
+ *
+ *  Dynamic loading can be implemented be searching for shared libraries
+ *  that contain a jtag_interface structure that can added to this list.
+ */
+
+#if BUILD_ZY1000 == 1
+extern jtag_interface_t zy1000_interface;
+#elif defined(BUILD_MINIDRIVER_DUMMY)
+extern jtag_interface_t minidummy_interface;
+#else // standard drivers
+#if BUILD_PARPORT == 1
+extern jtag_interface_t parport_interface;
+#endif
+#if BUILD_DUMMY == 1
+extern jtag_interface_t dummy_interface;
+#endif
+#if BUILD_FT2232_FTD2XX == 1
+extern jtag_interface_t ft2232_interface;
+#endif
+#if BUILD_FT2232_LIBFTDI == 1
+extern jtag_interface_t ft2232_interface;
+#endif
+#if BUILD_AMTJTAGACCEL == 1
+extern jtag_interface_t amt_jtagaccel_interface;
+#endif
+#if BUILD_EP93XX == 1
+extern jtag_interface_t ep93xx_interface;
+#endif
+#if BUILD_AT91RM9200 == 1
+extern jtag_interface_t at91rm9200_interface;
+#endif
+#if BUILD_GW16012 == 1
+extern jtag_interface_t gw16012_interface;
+#endif
+#if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
+extern jtag_interface_t presto_interface;
+#endif
+#if BUILD_USBPROG == 1
+extern jtag_interface_t usbprog_interface;
+#endif
+#if BUILD_JLINK == 1
+extern jtag_interface_t jlink_interface;
+#endif
+#if BUILD_VSLLINK == 1
+extern jtag_interface_t vsllink_interface;
+#endif
+#if BUILD_RLINK == 1
+extern jtag_interface_t rlink_interface;
+#endif
+#if BUILD_ARMJTAGEW == 1
+extern jtag_interface_t armjtagew_interface;
+#endif
+#endif // standard drivers
+
+/**
+ * The list of built-in JTAG interfaces, containing entries for those
+ * drivers that were enabled by the @c configure script.
+ *
+ * The list should be defined to contain either one minidriver interface
+ * or some number of standard driver interfaces, never both.
+ */
+jtag_interface_t *jtag_interfaces[] = {
+#if BUILD_ZY1000 == 1
+               &zy1000_interface,
+#elif defined(BUILD_MINIDRIVER_DUMMY)
+               &minidummy_interface,
+#else // standard drivers
+#if BUILD_PARPORT == 1
+               &parport_interface,
+#endif
+#if BUILD_DUMMY == 1
+               &dummy_interface,
+#endif
+#if BUILD_FT2232_FTD2XX == 1
+               &ft2232_interface,
+#endif
+#if BUILD_FT2232_LIBFTDI == 1
+               &ft2232_interface,
+#endif
+#if BUILD_AMTJTAGACCEL == 1
+               &amt_jtagaccel_interface,
+#endif
+#if BUILD_EP93XX == 1
+               &ep93xx_interface,
+#endif
+#if BUILD_AT91RM9200 == 1
+               &at91rm9200_interface,
+#endif
+#if BUILD_GW16012 == 1
+               &gw16012_interface,
+#endif
+#if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
+               &presto_interface,
+#endif
+#if BUILD_USBPROG == 1
+               &usbprog_interface,
+#endif
+#if BUILD_JLINK == 1
+               &jlink_interface,
+#endif
+#if BUILD_VSLLINK == 1
+               &vsllink_interface,
+#endif
+#if BUILD_RLINK == 1
+               &rlink_interface,
+#endif
+#if BUILD_ARMJTAGEW == 1
+               &armjtagew_interface,
+#endif
+#endif // standard drivers
+               NULL,
+       };
+
+void jtag_interface_modules_load(const char *path)
+{
+       // @todo: implement dynamic module loading for JTAG interface drivers
+}


Property changes on: trunk/src/jtag/interfaces.c
___________________________________________________________________
Name: svn:eol-style
   + native

Added: trunk/src/jtag/interfaces.h
===================================================================
--- trunk/src/jtag/interfaces.h 2009-06-28 18:46:51 UTC (rev 2412)
+++ trunk/src/jtag/interfaces.h 2009-06-29 00:00:50 UTC (rev 2413)
@@ -0,0 +1,45 @@
+/***************************************************************************
+ *   Copyright (C) 2005 by Dominic Rath                                    *
+ *   dominic.r...@gmx.de                                                   *
+ *                                                                         *
+ *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   oyvind.har...@zylin.com                                               *
+ *                                                                         *
+ *   Copyright (C) 2009 SoftPLC Corporation                                *
+ *       http://softplc.com                                                *
+ *   d...@softplc.com                                                      *
+ *                                                                         *
+ *   Copyright (C) 2009 Zachary T Welch                                    *
+ *   z...@superlucidity.net                                                  *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+ ***************************************************************************/
+#ifndef OPENOCD_JTAG_INTERFACES_H
+#define OPENOCD_JTAG_INTERFACES_H
+
+/**
+ * @file Exports the list of JTAG interface drivers, along with routines
+ * for loading and unloading them dynamically from shared libraries.
+ */
+
+#include "interface.h"
+
+/// Dynamically load all JTAG interface modules from specified directory.
+void jtag_interface_modules_load(const char *path);
+
+extern jtag_interface_t *jtag_interfaces[];
+
+#endif // OPENOCD_JTAG_INTERFACES_H


Property changes on: trunk/src/jtag/interfaces.h
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: trunk/src/jtag/tcl.c
===================================================================
--- trunk/src/jtag/tcl.c        2009-06-28 18:46:51 UTC (rev 2412)
+++ trunk/src/jtag/tcl.c        2009-06-29 00:00:50 UTC (rev 2413)
@@ -34,6 +34,7 @@
 #include "jtag.h"
 #include "minidriver.h"
 #include "interface.h"
+#include "interfaces.h"
 
 #ifdef HAVE_STRINGS_H
 #include <strings.h>
@@ -46,130 +47,6 @@
        { .name = NULL, .value = -1 }
 };
 
-/* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
- */
-
-#if BUILD_ZY1000 == 1
-       extern jtag_interface_t zy1000_interface;
-#elif defined(BUILD_MINIDRIVER_DUMMY)
-       extern jtag_interface_t minidummy_interface;
-#else // standard drivers
-#if BUILD_PARPORT == 1
-       extern jtag_interface_t parport_interface;
-#endif
-
-#if BUILD_DUMMY == 1
-       extern jtag_interface_t dummy_interface;
-#endif
-
-#if BUILD_FT2232_FTD2XX == 1
-       extern jtag_interface_t ft2232_interface;
-#endif
-
-#if BUILD_FT2232_LIBFTDI == 1
-       extern jtag_interface_t ft2232_interface;
-#endif
-
-#if BUILD_AMTJTAGACCEL == 1
-       extern jtag_interface_t amt_jtagaccel_interface;
-#endif
-
-#if BUILD_EP93XX == 1
-       extern jtag_interface_t ep93xx_interface;
-#endif
-
-#if BUILD_AT91RM9200 == 1
-       extern jtag_interface_t at91rm9200_interface;
-#endif
-
-#if BUILD_GW16012 == 1
-       extern jtag_interface_t gw16012_interface;
-#endif
-
-#if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
-       extern jtag_interface_t presto_interface;
-#endif
-
-#if BUILD_USBPROG == 1
-       extern jtag_interface_t usbprog_interface;
-#endif
-
-#if BUILD_JLINK == 1
-       extern jtag_interface_t jlink_interface;
-#endif
-
-#if BUILD_VSLLINK == 1
-       extern jtag_interface_t vsllink_interface;
-#endif
-
-#if BUILD_RLINK == 1
-       extern jtag_interface_t rlink_interface;
-#endif
-
-#if BUILD_ARMJTAGEW == 1
-       extern jtag_interface_t armjtagew_interface;
-#endif
-#endif // standard drivers
-
-/**
- * The list of built-in JTAG interfaces, containing entries for those
- * drivers that were enabled by the @c configure script.
- *
- * The list should be defined to contain either one minidriver interface
- * or some number of standard driver interfaces, never both.
- */
-jtag_interface_t *jtag_interfaces[] = {
-#if BUILD_ZY1000 == 1
-       &zy1000_interface,
-#elif defined(BUILD_MINIDRIVER_DUMMY)
-       &minidummy_interface,
-#else // standard drivers
-#if BUILD_PARPORT == 1
-       &parport_interface,
-#endif
-#if BUILD_DUMMY == 1
-       &dummy_interface,
-#endif
-#if BUILD_FT2232_FTD2XX == 1
-       &ft2232_interface,
-#endif
-#if BUILD_FT2232_LIBFTDI == 1
-       &ft2232_interface,
-#endif
-#if BUILD_AMTJTAGACCEL == 1
-       &amt_jtagaccel_interface,
-#endif
-#if BUILD_EP93XX == 1
-       &ep93xx_interface,
-#endif
-#if BUILD_AT91RM9200 == 1
-       &at91rm9200_interface,
-#endif
-#if BUILD_GW16012 == 1
-       &gw16012_interface,
-#endif
-#if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
-       &presto_interface,
-#endif
-#if BUILD_USBPROG == 1
-       &usbprog_interface,
-#endif
-#if BUILD_JLINK == 1
-       &jlink_interface,
-#endif
-#if BUILD_VSLLINK == 1
-       &vsllink_interface,
-#endif
-#if BUILD_RLINK == 1
-       &rlink_interface,
-#endif
-#if BUILD_ARMJTAGEW == 1
-       &armjtagew_interface,
-#endif
-#endif // standard drivers
-       NULL,
-};
-
 extern jtag_interface_t *jtag_interface;
 
 /* jtag commands */

_______________________________________________
Openocd-svn mailing list
openocd-...@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-svn
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to