https://lists.berlios.de/pipermail/openocd-development/2009-August/009939.html
1. It can only be built with the FTD2XX driver. libftdi supports FT2232H/FT4232H
since version 0.16
2. A speed value of 0 is used as a RTCK request indicator. This clashes with the
valid clock division value 0 that provide the highest fixed clock frequency.
3. The ft2232_speed_div function return the maximum selectable frequency (30MHz)
when RTCK is activated. It should return 0.
4. The ft2232_khz function return ERROR_OK when RTCK is requested even for
devices lacking RTCK support. It should return ERROR_FAIL so the upper driver layers
can detect this and try to fallback to a fixed frequency.
5. FT2232H/FT4232H have a backward compatibility function that divide the clock
by 5 to get the same frequency range as FT2232D. There is no code that disable
this functionality. I can not find anything about if this is enabled or disabled by default.
I think it is safest to actively disable it.
git-svn-id: svn://svn.berlios.de/openocd/trunk@2591
b42882b7-edfa-0310-969c-
e2dbd0fdcd60
The INSTALL file contains generic instructions for running 'configure'
and compiling the OpenOCD source code. That file is provided by default
for all GNU automake packages. If you are not familiar with the GNU
The INSTALL file contains generic instructions for running 'configure'
and compiling the OpenOCD source code. That file is provided by default
for all GNU automake packages. If you are not familiar with the GNU
-autotools, then you should read those instructions first.
+autotools, then you should read those instructions first.
The remainder of this document tries to provide some instructions for
those looking for a quick-install.
The remainder of this document tries to provide some instructions for
those looking for a quick-install.
of commands:
./configure [with some options listed in the next section]
of commands:
./configure [with some options listed in the next section]
make install
The 'configure' step generates the Makefiles required to build OpenOCD,
make install
The 'configure' step generates the Makefiles required to build OpenOCD,
cross-compile on a x86 Linux host to run on Windows (MinGW32), you could
use the following configuration options:
cross-compile on a x86 Linux host to run on Windows (MinGW32), you could
use the following configuration options:
- ./configure --build=i686-pc-linux-gnu --host=i586-mingw32msvc ...
+ ./configure --build=i686-pc-linux-gnu --host=i586-mingw32msvc ...
Likewise, the following options allow OpenOCD to be cross-compiled for
an ARM target on the same x86 host:
Likewise, the following options allow OpenOCD to be cross-compiled for
an ARM target on the same x86 host:
FTD2XX
--enable-ft2232_ftd2xx Enable building support for FT2232 based devices
using the FTD2XX driver from ftdichip.com
FTD2XX
--enable-ft2232_ftd2xx Enable building support for FT2232 based devices
using the FTD2XX driver from ftdichip.com
- --enable-ftd2xx-highspeed
+ --enable-ft2232-highspeed
Enable building support for FT2232H and
Enable building support for FT2232H and
- FT4232H-based devices (requires >=libftd2xx-0.4.16)
+ FT4232H-based devices (requires >=libftd2xx-0.4.16
+ or >=libftdi-0.16)
--enable-gw16012 Enable building support for the Gateworks GW16012
JTAG Programmer
--enable-gw16012 Enable building support for the Gateworks GW16012
JTAG Programmer
option if you want to use giveio instead of ioperm parallel port access
method.
option if you want to use giveio instead of ioperm parallel port access
method.
-FT2232C Based USB Dongles
+FT2232C Based USB Dongles
-------------------------
There are 2 methods of using the FTD2232, either (1) using the
FTDICHIP.COM closed source driver, or (2) the open (and free) driver
-------------------------
There are 2 methods of using the FTD2232, either (1) using the
FTDICHIP.COM closed source driver, or (2) the open (and free) driver
Using LIBFTDI
-------------
Using LIBFTDI
-------------
speed (480 Mbps), you need libftdi version 0.16 or newer. Many Linux
distributions provide suitable packages for these libraries.
speed (480 Mbps), you need libftdi version 0.16 or newer. Many Linux
distributions provide suitable packages for these libraries.
-For Windows, libftdi is supported with versions 0.14 and later.
+For Windows, libftdi is supported with versions 0.14 and later.
With these prerequisites met, configure the libftdi solution like this:
With these prerequisites met, configure the libftdi solution like this:
The FTDICHIP drivers come as either a (win32) ZIP file, or a (Linux)
TAR.GZ file. You must unpack them ``some where'' convient. As of this
writing FTDICHIP does not supply means to install these files "in an
The FTDICHIP drivers come as either a (win32) ZIP file, or a (Linux)
TAR.GZ file. You must unpack them ``some where'' convient. As of this
writing FTDICHIP does not supply means to install these files "in an
If your distribution does not package these, there are several
'./configure' options to solve this problem:
If your distribution does not package these, there are several
'./configure' options to solve this problem:
Remember, this library is binary-only, while OpenOCD is licenced
according to GNU GPLv2 without any exceptions. That means that
_distributing_ copies of OpenOCD built with the FTDI code would violate
Remember, this library is binary-only, while OpenOCD is licenced
according to GNU GPLv2 without any exceptions. That means that
_distributing_ copies of OpenOCD built with the FTDI code would violate
-the OpenOCD licensing terms.
+the OpenOCD licensing terms.
************************************************
Building OpenOCD from a repository requires a recent version of the GNU
************************************************
Building OpenOCD from a repository requires a recent version of the GNU
-autotools (autoconf >= 2.59 and automake >= 1.9).
+autotools (autoconf >= 2.59 and automake >= 1.9).
1) Run './bootstrap' to create the 'configure' script and prepare
the build process for your host system.
1) Run './bootstrap' to create the 'configure' script and prepare
the build process for your host system.
# Nonstandard --prefix and/or --exec-prefix
# We have an override of some sort.
# use build specific install library dir
# Nonstandard --prefix and/or --exec-prefix
# We have an override of some sort.
# use build specific install library dir
LDFLAGS="$LDFLAGS -L$OCDxprefix/lib"
# RPATH becomes an issue on Linux only
if test $host_os = linux-gnu || test $host_os = linux ; then
LDFLAGS="$LDFLAGS -L$OCDxprefix/lib"
# RPATH becomes an issue on Linux only
if test $host_os = linux-gnu || test $host_os = linux ; then
The option: --with-ftd2xx=<PATH> has been removed.
On Linux, the new option is:
The option: --with-ftd2xx=<PATH> has been removed.
On Linux, the new option is:
--with-ftd2xx-linux-tardir=/path/to/files
Where <path> is the path the the directory where the "tar.gz" file
--with-ftd2xx-linux-tardir=/path/to/files
Where <path> is the path the the directory where the "tar.gz" file
AC_ARG_ENABLE(verbose,
AS_HELP_STRING([--enable-verbose],
AC_ARG_ENABLE(verbose,
AS_HELP_STRING([--enable-verbose],
- [Enable verbose JTAG I/O messages (for debugging).]),
+ [Enable verbose JTAG I/O messages (for debugging).]),
[
debug_jtag_io=$enableval
debug_usb_io=$enableval
[
debug_jtag_io=$enableval
debug_usb_io=$enableval
AC_ARG_ENABLE(verbose_jtag_io,
AS_HELP_STRING([--enable-verbose-jtag-io],
AC_ARG_ENABLE(verbose_jtag_io,
AS_HELP_STRING([--enable-verbose-jtag-io],
- [Enable verbose JTAG I/O messages (for debugging).]),
+ [Enable verbose JTAG I/O messages (for debugging).]),
[debug_jtag_io=$enableval], [])
AC_ARG_ENABLE(verbose_usb_io,
AS_HELP_STRING([--enable-verbose-usb-io],
[debug_jtag_io=$enableval], [])
AC_ARG_ENABLE(verbose_usb_io,
AS_HELP_STRING([--enable-verbose-usb-io],
- [Enable verbose USB I/O messages (for debugging)]),
+ [Enable verbose USB I/O messages (for debugging)]),
[debug_usb_io=$enableval], [])
AC_ARG_ENABLE(verbose_usb_comms,
AS_HELP_STRING([--enable-verbose-usb-comms],
[debug_usb_io=$enableval], [])
AC_ARG_ENABLE(verbose_usb_comms,
AS_HELP_STRING([--enable-verbose-usb-comms],
- [Enable verbose USB communication messages (for debugging)]),
+ [Enable verbose USB communication messages (for debugging)]),
[debug_usb_comms=$enableval], [])
AC_MSG_CHECKING([whether to enable verbose JTAG I/O messages]);
[debug_usb_comms=$enableval], [])
AC_MSG_CHECKING([whether to enable verbose JTAG I/O messages]);
debug_malloc=no
AC_ARG_ENABLE(malloc_logging,
AS_HELP_STRING([--enable-malloc-logging],
debug_malloc=no
AC_ARG_ENABLE(malloc_logging,
AS_HELP_STRING([--enable-malloc-logging],
- [Include free space in logging messages (requires malloc.h).]),
+ [Include free space in logging messages (requires malloc.h).]),
[debug_malloc=$enableval], [])
AC_MSG_CHECKING([whether to enable malloc free space logging]);
[debug_malloc=$enableval], [])
AC_MSG_CHECKING([whether to enable malloc free space logging]);
- AS_HELP_STRING([--enable-dummy], [Enable building the dummy port driver]),
+ AS_HELP_STRING([--enable-dummy], [Enable building the dummy port driver]),
[build_dummy=$enableval], [build_dummy=no])
AC_ARG_ENABLE(parport,
[build_dummy=$enableval], [build_dummy=no])
AC_ARG_ENABLE(parport,
- AS_HELP_STRING([--enable-parport], [Enable building the pc parallel port driver]),
+ AS_HELP_STRING([--enable-parport], [Enable building the pc parallel port driver]),
[build_parport=$enableval], [build_parport=no])
AC_ARG_ENABLE(parport_ppdev,
AS_HELP_STRING([--disable-parport-ppdev],
[build_parport=$enableval], [build_parport=no])
AC_ARG_ENABLE(parport_ppdev,
AS_HELP_STRING([--disable-parport-ppdev],
- [Disable use of ppdev (/dev/parportN) for parport (for x86 only)]),
+ [Disable use of ppdev (/dev/parportN) for parport (for x86 only)]),
[parport_use_ppdev=$enableval], [parport_use_ppdev=yes])
AC_ARG_ENABLE(parport_giveio,
AS_HELP_STRING([--enable-parport-giveio],
[parport_use_ppdev=$enableval], [parport_use_ppdev=yes])
AC_ARG_ENABLE(parport_giveio,
AS_HELP_STRING([--enable-parport-giveio],
- [Enable use of giveio for parport (for CygWin only)]),
+ [Enable use of giveio for parport (for CygWin only)]),
[parport_use_giveio=$enableval], [parport_use_giveio=])
[parport_use_giveio=$enableval], [parport_use_giveio=])
AC_ARG_ENABLE(ft2232_libftdi,
AC_ARG_ENABLE(ft2232_libftdi,
- AS_HELP_STRING([--enable-ft2232_libftdi], [Enable building support for FT2232 based devices using the libftdi driver, opensource alternate of FTD2XX]),
+ AS_HELP_STRING([--enable-ft2232_libftdi], [Enable building support for FT2232 based devices using the libftdi driver, opensource alternate of FTD2XX]),
[build_ft2232_libftdi=$enableval], [build_ft2232_libftdi=no])
AC_ARG_ENABLE(ft2232_ftd2xx,
[build_ft2232_libftdi=$enableval], [build_ft2232_libftdi=no])
AC_ARG_ENABLE(ft2232_ftd2xx,
- AS_HELP_STRING([--enable-ft2232_ftd2xx], [Enable building support for FT2232 based devices using the FTD2XX driver from ftdichip.com]),
+ AS_HELP_STRING([--enable-ft2232_ftd2xx], [Enable building support for FT2232 based devices using the FTD2XX driver from ftdichip.com]),
[build_ft2232_ftd2xx=$enableval], [build_ft2232_ftd2xx=no])
[build_ft2232_ftd2xx=$enableval], [build_ft2232_ftd2xx=no])
-AC_ARG_ENABLE(ftd2xx_highspeed,
- AS_HELP_STRING([--enable-ftd2xx-highspeed], [Enable building support for FT2232H and FT4232H-based devices (requires >=libftd2xx-0.4.16)]),
- [want_ftd2xx_highspeed=$enableval], [want_ftd2xx_highspeed=no])
-
+AC_ARG_ENABLE(ft2232_highspeed,
+ AS_HELP_STRING([--enable-ft2232-highspeed], [Enable building support for FT2232H and FT4232H-based devices (requires >=libftd2xx-0.4.16 or >=libftdi-0.16)]),
+ [want_ft2232_highspeed=$enableval], [want_ft2232_highspeed=no])
+
AC_ARG_ENABLE(amtjtagaccel,
AC_ARG_ENABLE(amtjtagaccel,
- AS_HELP_STRING([--enable-amtjtagaccel], [Enable building the Amontec JTAG-Accelerator driver]),
+ AS_HELP_STRING([--enable-amtjtagaccel], [Enable building the Amontec JTAG-Accelerator driver]),
[build_amtjtagaccel=$enableval], [build_amtjtagaccel=no])
AC_ARG_ENABLE(ecosboard,
[build_amtjtagaccel=$enableval], [build_amtjtagaccel=no])
AC_ARG_ENABLE(ecosboard,
- AS_HELP_STRING([--enable-ecosboard], [Enable building support for eCos based JTAG debugger]),
+ AS_HELP_STRING([--enable-ecosboard], [Enable building support for eCos based JTAG debugger]),
[build_ecosboard=$enableval], [build_ecosboard=no])
AC_ARG_ENABLE(zy1000,
[build_ecosboard=$enableval], [build_ecosboard=no])
AC_ARG_ENABLE(zy1000,
- AS_HELP_STRING([--enable-zy1000], [Enable ZY1000 interface]),
+ AS_HELP_STRING([--enable-zy1000], [Enable ZY1000 interface]),
[build_zy1000=$enableval], [build_zy1000=no])
AC_ARG_ENABLE(ioutil,
[build_zy1000=$enableval], [build_zy1000=no])
AC_ARG_ENABLE(ioutil,
- AS_HELP_STRING([--enable-ioutil], [Enable ioutil functions - useful for standalone OpenOCD implementations]),
+ AS_HELP_STRING([--enable-ioutil], [Enable ioutil functions - useful for standalone OpenOCD implementations]),
[build_ioutil=$enableval], [build_ioutil=no])
AC_ARG_ENABLE(httpd,
[build_ioutil=$enableval], [build_ioutil=no])
AC_ARG_ENABLE(httpd,
- AS_HELP_STRING([--enable-httpd], [Enable builtin httpd server - useful for standalone OpenOCD implementations]),
+ AS_HELP_STRING([--enable-httpd], [Enable builtin httpd server - useful for standalone OpenOCD implementations]),
[build_httpd=$enableval], [build_httpd=no])
[build_httpd=$enableval], [build_httpd=no])
arm*)
AC_ARG_ENABLE(ep93xx,
arm*)
AC_ARG_ENABLE(ep93xx,
- AS_HELP_STRING([--enable-ep93xx], [Enable building support for EP93xx based SBCs]),
+ AS_HELP_STRING([--enable-ep93xx], [Enable building support for EP93xx based SBCs]),
[build_ep93xx=$enableval], [build_ep93xx=no])
AC_ARG_ENABLE(at91rm9200,
AS_HELP_STRING([--enable-at91rm9200], [Enable building support for AT91RM9200 based SBCs]),
[build_at91rm9200=$enableval], [build_at91rm9200=no])
;;
[build_ep93xx=$enableval], [build_ep93xx=no])
AC_ARG_ENABLE(at91rm9200,
AS_HELP_STRING([--enable-at91rm9200], [Enable building support for AT91RM9200 based SBCs]),
[build_at91rm9200=$enableval], [build_at91rm9200=no])
;;
build_ep93xx=no
build_at91rm9200=no
;;
build_ep93xx=no
build_at91rm9200=no
;;
if test x$parport_use_ppdev = xno; then
AC_MSG_WARN([--disable-parport-ppdev is not supported by the host CPU])
fi
if test x$parport_use_ppdev = xno; then
AC_MSG_WARN([--disable-parport-ppdev is not supported by the host CPU])
fi
-case $host in
- *-cygwin*)
+case $host in
+ *-cygwin*)
is_win32=yes
parport_use_ppdev=no
is_win32=yes
parport_use_ppdev=no
AC_CHECK_HEADERS(sys/io.h,[],AC_MSG_ERROR([Please install the cygwin ioperm package]))
fi
fi
AC_CHECK_HEADERS(sys/io.h,[],AC_MSG_ERROR([Please install the cygwin ioperm package]))
fi
fi
AC_DEFINE(IS_WIN32, 1, [1 if building for Win32.])
AC_DEFINE(IS_DARWIN, 0, [0 if not building for Darwin.])
AC_DEFINE(IS_WIN32, 1, [1 if building for Win32.])
AC_DEFINE(IS_DARWIN, 0, [0 if not building for Darwin.])
is_mingw=yes
is_win32=yes
parport_use_ppdev=no
is_mingw=yes
is_win32=yes
parport_use_ppdev=no
AC_DEFINE(IS_MINGW, 1, [1 if building for MinGW.])
AC_DEFINE(IS_WIN32, 1, [1 if building for Win32.])
AC_DEFINE(IS_DARWIN, 0, [0 if not building for Darwin.])
AC_DEFINE(IS_MINGW, 1, [1 if building for MinGW.])
AC_DEFINE(IS_WIN32, 1, [1 if building for Win32.])
AC_DEFINE(IS_DARWIN, 0, [0 if not building for Darwin.])
AC_DEFINE(IS_WIN32, 0, [0 if not building for Win32.])
AC_DEFINE(IS_DARWIN, 1, [1 if building for Darwin.])
;;
AC_DEFINE(IS_WIN32, 0, [0 if not building for Win32.])
AC_DEFINE(IS_DARWIN, 1, [1 if building for Darwin.])
;;
if test x$parport_use_giveio = xyes; then
AC_MSG_WARN([--enable-parport-giveio cannot be used by ]$host[ hosts])
fi
if test x$parport_use_giveio = xyes; then
AC_MSG_WARN([--enable-parport-giveio cannot be used by ]$host[ hosts])
fi
])
AC_MSG_CHECKING([whether to build ftd2xx highspeed device support])
])
AC_MSG_CHECKING([whether to build ftd2xx highspeed device support])
-AC_MSG_RESULT([$want_ftd2xx_highspeed])
-if test $want_ftd2xx_highspeed != no; then
+AC_MSG_RESULT([$want_ft2232_highspeed])
+if test $want_ft2232_highspeed != no; then
AC_MSG_CHECKING([for ftd2xx highspeed device support])
AC_COMPILE_IFELSE([
#include "confdefs.h"
AC_MSG_CHECKING([for ftd2xx highspeed device support])
AC_COMPILE_IFELSE([
#include "confdefs.h"
#include <ftd2xx.h>
DWORD x = FT_DEVICE_4232H;
], [
#include <ftd2xx.h>
DWORD x = FT_DEVICE_4232H;
], [
- AC_DEFINE(BUILD_FTD2XX_HIGHSPEED, [1],
- [Support FT2232H/FT4232HS with FTD2XX.])
- build_ftd2xx_highspeed=yes
+ AC_DEFINE(BUILD_FT2232_HIGHSPEED, [1],
+ [Support FT2232H/FT4232HS with FTD2XX or libftdi.])
+ build_ft2232_highspeed=yes
- build_ftd2xx_highspeed=no
+ build_ft2232_highspeed=no
- AC_MSG_RESULT([$build_ftd2xx_highspeed])
+ AC_MSG_RESULT([$build_ft2232_highspeed])
- if test $want_ftd2xx_highspeed = yes -a $build_ftd2xx_highspeed = no; then
+ if test $want_ft2232_highspeed = yes -a $build_ft2232_highspeed = no; then
AC_MSG_ERROR([You need a newer FTD2XX driver (version 0.4.16 or later).])
fi
fi
AC_MSG_ERROR([You need a newer FTD2XX driver (version 0.4.16 or later).])
fi
fi
# We assume: the package is preinstalled in the proper place
# these present as 2 libraries..
LIBS="$LIBS -lftdi -lusb"
# We assume: the package is preinstalled in the proper place
# these present as 2 libraries..
LIBS="$LIBS -lftdi -lusb"
# Try to build a small program.
AC_MSG_CHECKING([Build & Link with libftdi...])
# Try to build a small program.
AC_MSG_CHECKING([Build & Link with libftdi...])
AC_MSG_RESULT([Skipping as we are cross-compiling])
])
AC_MSG_RESULT([Skipping as we are cross-compiling])
])
+ AC_MSG_CHECKING([whether to build libftdi highspeed device support])
+ AC_MSG_RESULT([$want_ft2232_highspeed])
+ if test $want_ft2232_highspeed != no; then
+ AC_MSG_CHECKING([for libftdi highspeed device support])
+ AC_COMPILE_IFELSE([
+#include <stdio.h>
+#include <ftdi.h>
+enum ftdi_chip_type x = TYPE_2232H;
+ ], [
+ AC_DEFINE(BUILD_FT2232_HIGHSPEED, [1],
+ [Support FT2232H/FT4232HS with FTD2XX or libftdi.])
+ build_ft2232_highspeed=yes
+ ], [
+ build_ft2232_highspeed=no
+ ])
+ AC_MSG_RESULT([$build_ft2232_highspeed])
+
+ if test $want_ft2232_highspeed = yes -a $build_ft2232_highspeed = no; then
+ AC_MSG_ERROR([You need a newer libftdi version (0.16 or later).])
+ fi
+ fi
+
# Restore the 'unexpanded ldflags'
LDFLAGS=$LDFLAGS_SAVE
CFLAGS=$CFLAGS_SAVE
# Restore the 'unexpanded ldflags'
LDFLAGS=$LDFLAGS_SAVE
CFLAGS=$CFLAGS_SAVE
# check for usb.h when a driver will require it
if test $build_jlink = yes -o $build_vsllink = yes -o $build_usbprog = yes -o \
$build_rlink = yes -o $build_armjtagew = yes
# check for usb.h when a driver will require it
if test $build_jlink = yes -o $build_vsllink = yes -o $build_usbprog = yes -o \
$build_rlink = yes -o $build_armjtagew = yes
AC_CHECK_HEADERS([usb.h],[],
[AC_MSG_ERROR([usb.h is required to build some OpenOCD driver(s)])])
fi
AC_CHECK_HEADERS([usb.h],[],
[AC_MSG_ERROR([usb.h is required to build some OpenOCD driver(s)])])
fi
])
if test "${has_environ}" != "yes" ; then
])
if test "${has_environ}" != "yes" ; then
- AC_MSG_FAILURE([Could not find 'environ' in unistd.h or available libraries.])
+ AC_MSG_FAILURE([Could not find 'environ' in unistd.h or available libraries.])
fi
AC_DEFINE([_GNU_SOURCE],[1],[Use GNU C library extensions (e.g. stdndup).])
fi
AC_DEFINE([_GNU_SOURCE],[1],[Use GNU C library extensions (e.g. stdndup).])
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
/* This code uses information contained in the MPSSE specification which was
* found here:
* http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf
/* This code uses information contained in the MPSSE specification which was
* found here:
* http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf
* http://www.ftdichip.com/Documents/DataSheets/DS_FT2232D.pdf
*/
* http://www.ftdichip.com/Documents/DataSheets/DS_FT2232D.pdf
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
/* max TCK for the high speed devices 30000 kHz */
#define FTDI_2232H_4232H_MAX_TCK 30000
/* max TCK for the high speed devices 30000 kHz */
#define FTDI_2232H_4232H_MAX_TCK 30000
+/* max TCK for the full speed devices 6000 kHz */
+#define FTDI_2232C_MAX_TCK 6000
+/* this speed value tells that RTCK is requested */
+#define RTCK_SPEED -1
static int ft2232_execute_queue(void);
static int ft2232_execute_queue(void);
static int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
static int ft2232_handle_latency_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
static int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
static int ft2232_handle_latency_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
/**
* Send out \a num_cycles on the TCK line while the TAP(s) are in a
* stable state. Calling code must ensure that current state is stable,
/**
* Send out \a num_cycles on the TCK line while the TAP(s) are in a
* stable state. Calling code must ensure that current state is stable,
*/
static int ft2232_stableclocks(int num_cycles, jtag_command_t* cmd);
*/
static int ft2232_stableclocks(int num_cycles, jtag_command_t* cmd);
-/* max TCK for the high speed devices 30000 kHz */
-#define FTDI_2232H_4232H_MAX_TCK 30000
-
static char * ft2232_device_desc_A = NULL;
static char* ft2232_device_desc = NULL;
static char* ft2232_serial = NULL;
static char* ft2232_layout = NULL;
static uint8_t ft2232_latency = 2;
static char * ft2232_device_desc_A = NULL;
static char* ft2232_device_desc = NULL;
static char* ft2232_serial = NULL;
static char* ft2232_layout = NULL;
static uint8_t ft2232_latency = 2;
-static unsigned ft2232_max_tck = 6000;
-
+static unsigned ft2232_max_tck = FTDI_2232C_MAX_TCK;
#define MAX_USB_IDS 8
/* vid = pid = 0 marks the end of the list */
#define MAX_USB_IDS 8
/* vid = pid = 0 marks the end of the list */
static FT_DEVICE ftdi_device = 0;
#elif BUILD_FT2232_LIBFTDI == 1
static struct ftdi_context ftdic;
static FT_DEVICE ftdi_device = 0;
#elif BUILD_FT2232_LIBFTDI == 1
static struct ftdi_context ftdic;
+static enum ftdi_chip_type ftdi_device;
static jtag_command_t* first_unsent; /* next command that has to be sent */
static int require_send;
static jtag_command_t* first_unsent; /* next command that has to be sent */
static int require_send;
/* http://urjtag.wiki.sourceforge.net/Cable + FT2232 says:
"There is a significant difference between libftdi and libftd2xx. The latter
/* http://urjtag.wiki.sourceforge.net/Cable + FT2232 says:
"There is a significant difference between libftdi and libftd2xx. The latter
return ft2232_buffer[ft2232_read_pointer++];
}
return ft2232_buffer[ft2232_read_pointer++];
}
/**
* Clocks out \a bit_count bits on the TMS line, starting with the least
* significant bit of tms_bits and progressing to more significant bits.
/**
* Clocks out \a bit_count bits on the TMS line, starting with the least
* significant bit of tms_bits and progressing to more significant bits.
-// LOG_DEBUG("mpsse cmd=%02x, tms_bits = 0x%08x, bit_count=%d", mpsse_cmd, tms_bits, tms_count);
+#if 0
+ LOG_DEBUG("mpsse cmd=%02x, tms_bits = 0x%08x, bit_count=%d", mpsse_cmd, tms_bits, tms_count);
+#endif
for (tms_byte = tms_ndx = i = 0; i < tms_count; ++i, tms_bits>>=1)
{
for (tms_byte = tms_ndx = i = 0; i < tms_count; ++i, tms_bits>>=1)
{
/**
* Function get_tms_buffer_requirements
* returns what clock_tms() will consume if called with
/**
* Function get_tms_buffer_requirements
* returns what clock_tms() will consume if called with
return ((bit_count + 6)/7) * 3;
}
return ((bit_count + 6)/7) * 3;
}
/**
* Function move_to_state
* moves the TAP controller from the current state to a
/**
* Function move_to_state
* moves the TAP controller from the current state to a
clock_tms(0x4b, tms_bits, tms_count, 0);
}
clock_tms(0x4b, tms_bits, tms_count, 0);
}
jtag_interface_t ft2232_interface =
{
.name = "ft2232",
jtag_interface_t ft2232_interface =
{
.name = "ft2232",
{
#if BUILD_FT2232_FTD2XX == 1
FT_STATUS status;
{
#if BUILD_FT2232_FTD2XX == 1
FT_STATUS status;
- DWORD dw_bytes_written;
+ DWORD dw_bytes_written;
if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK)
{
*bytes_written = dw_bytes_written;
if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK)
{
*bytes_written = dw_bytes_written;
static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read)
{
#if BUILD_FT2232_FTD2XX == 1
static int ft2232_read(uint8_t* buf, uint32_t size, uint32_t* bytes_read)
{
#if BUILD_FT2232_FTD2XX == 1
*bytes_read = 0;
while ((*bytes_read < size) && timeout--)
*bytes_read = 0;
while ((*bytes_read < size) && timeout--)
-#ifdef BUILD_FTD2XX_HIGHSPEED
static bool ft2232_device_is_highspeed(void)
{
static bool ft2232_device_is_highspeed(void)
{
+#ifdef BUILD_FT2232_HIGHSPEED
+ #if BUILD_FT2232_FTD2XX == 1
return (ftdi_device == FT_DEVICE_2232H) || (ftdi_device == FT_DEVICE_4232H);
return (ftdi_device == FT_DEVICE_2232H) || (ftdi_device == FT_DEVICE_4232H);
+ #elif BUILD_FT2232_LIBFTDI == 1
+ return (ftdi_device == TYPE_2232H || ftdi_device == TYPE_4232H);
+ #endif
+#else
+ return false;
+#endif
-static int ft2232_adaptive_clocking(int speed)
-{
- bool use_adaptive_clocking = FALSE;
- if (0 == speed)
- {
- if (ft2232_device_is_highspeed())
- use_adaptive_clocking = TRUE;
- else
- {
- LOG_ERROR("ft2232 device %lu does not support RTCK", ftdi_device);
- return ERROR_OK;
- }
- }
+/*
+ * Commands that only apply to the FT2232H and FT4232H devices.
+ * See chapter 6 in http://www.ftdichip.com/Documents/AppNotes/
+ * AN_108_Command_Processor_for_MPSSE_and_MCU_Host_Bus_Emulation_Modes.pdf
+ */
- uint8_t buf = use_adaptive_clocking ? 0x96 : 0x97;
+static int ft2232h_ft4232h_adaptive_clocking(bool enable)
+{
+ uint8_t buf = enable ? 0x96 : 0x97;
LOG_DEBUG("%2.2x", buf);
uint32_t bytes_written;
int retval = ft2232_write(&buf, 1, &bytes_written);
LOG_DEBUG("%2.2x", buf);
uint32_t bytes_written;
int retval = ft2232_write(&buf, 1, &bytes_written);
- if (ERROR_OK != retval || bytes_written != 1)
+ if ((ERROR_OK != retval) || (bytes_written != 1))
- LOG_ERROR("unable to set adative clocking: %d", retval);
+ LOG_ERROR("couldn't write command to %s adaptive clocking"
+ , enable ? "enable" : "disable");
return retval;
}
return ERROR_OK;
}
return retval;
}
return ERROR_OK;
}
-#else
-static int ft2232_adaptive_clocking(int speed)
+
+/**
+ * Enable/disable the clk divide by 5 of the 60MHz master clock.
+ * This result in a JTAG clock speed range of 91.553Hz-6MHz
+ * respective 457.763Hz-30MHz.
+ */
+static int ft2232h_ft4232h_clk_divide_by_5(bool enable)
- // not implemented on low-speed devices
- return speed ? ERROR_OK : -1234;
+ uint32_t bytes_written;
+ uint8_t buf = enable ? 0x8b : 0x8a;
+ int retval = ft2232_write(&buf, 1, &bytes_written);
+ if ((ERROR_OK != retval) || (bytes_written != 1))
+ {
+ LOG_ERROR("couldn't write command to %s clk divide by 5"
+ , enable ? "enable" : "disable");
+ return ERROR_JTAG_INIT_FAILED;
+ }
+ ft2232_max_tck = enable ? FTDI_2232C_MAX_TCK : FTDI_2232H_4232H_MAX_TCK;
+ LOG_INFO("max TCK change to: %u kHz", ft2232_max_tck);
+
+ return ERROR_OK;
static int ft2232_speed(int speed)
{
static int ft2232_speed(int speed)
{
int retval;
uint32_t bytes_written;
int retval;
uint32_t bytes_written;
- ft2232_adaptive_clocking(speed);
+ retval = ERROR_OK;
+ bool enable_adaptive_clocking = (RTCK_SPEED == speed);
+ if (ft2232_device_is_highspeed())
+ retval = ft2232h_ft4232h_adaptive_clocking(enable_adaptive_clocking);
+ else if (enable_adaptive_clocking)
+ {
+ LOG_ERROR("ft2232 device %lu does not support RTCK"
+ , (long unsigned int)ftdi_device);
+ return ERROR_FAIL;
+ }
+
+ if ((enable_adaptive_clocking) || (ERROR_OK != retval))
+ return retval;
- buf[0] = 0x86; /* command "set divisor" */
- buf[1] = speed & 0xff; /* valueL (0 = 6MHz, 1 = 3MHz, 2 = 2.0MHz, ...*/
- buf[2] = (speed >> 8) & 0xff; /* valueH */
+ buf[0] = 0x86; /* command "set divisor" */
+ buf[1] = speed & 0xff; /* valueL (0 = 6MHz, 1 = 3MHz, 2 = 2.0MHz, ...*/
+ buf[2] = (speed >> 8) & 0xff; /* valueH */
LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
if (((retval = ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
if (((retval = ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
static int ft2232_speed_div(int speed, int* khz)
{
/* Take a look in the FT2232 manual,
* AN2232C-01 Command Processor for
* MPSSE and MCU Host Bus. Chapter 3.8 */
static int ft2232_speed_div(int speed, int* khz)
{
/* Take a look in the FT2232 manual,
* AN2232C-01 Command Processor for
* MPSSE and MCU Host Bus. Chapter 3.8 */
- *khz = ft2232_max_tck / (1 + speed);
+ *khz = (RTCK_SPEED == speed) ? 0 : ft2232_max_tck / (1 + speed);
static int ft2232_khz(int khz, int* jtag_speed)
{
if (khz == 0)
{
static int ft2232_khz(int khz, int* jtag_speed)
{
if (khz == 0)
{
-#ifdef BUILD_FTD2XX_HIGHSPEED
- *jtag_speed = 0;
- return ERROR_OK;
-#else
- LOG_DEBUG("RCLK not supported");
- LOG_DEBUG("If you have a high-speed FTDI device, then "
- "OpenOCD may be built with --enable-ftd2xx-highspeed.");
- return ERROR_FAIL;
+ if (ft2232_device_is_highspeed())
+ {
+ *jtag_speed = RTCK_SPEED;
+ return ERROR_OK;
+ }
+ else
+ {
+ LOG_DEBUG("RCLK not supported");
+#ifndef BUILD_FT2232_HIGHSPEED
+ LOG_DEBUG("If you have a high-speed FTDI device, then "
+ "OpenOCD may be built with --enable-ft2232-highspeed.");
}
/* Take a look in the FT2232 manual,
}
/* Take a look in the FT2232 manual,
static int ft2232_register_commands(struct command_context_s* cmd_ctx)
{
register_command(cmd_ctx, NULL, "ft2232_device_desc", ft2232_handle_device_desc_command,
static int ft2232_register_commands(struct command_context_s* cmd_ctx)
{
register_command(cmd_ctx, NULL, "ft2232_device_desc", ft2232_handle_device_desc_command,
static void ft2232_end_state(tap_state_t state)
{
if (tap_is_state_stable(state))
static void ft2232_end_state(tap_state_t state)
{
if (tap_is_state_stable(state))
buffer[cur_byte] = (buffer[cur_byte] | (((buffer_read()) << 1) & 0x80)) >> (8 - bits_left);
}
buffer[cur_byte] = (buffer[cur_byte] | (((buffer_read()) << 1) & 0x80)) >> (8 - bits_left);
}
static void ft2232_debug_dump_buffer(void)
{
static void ft2232_debug_dump_buffer(void)
{
- int i;
- char line[256];
+ int i;
+ char line[256];
char* line_p = line;
for (i = 0; i < ft2232_buffer_size; i++)
char* line_p = line;
for (i = 0; i < ft2232_buffer_size; i++)
static int ft2232_send_and_recv(jtag_command_t* first, jtag_command_t* last)
{
jtag_command_t* cmd;
static int ft2232_send_and_recv(jtag_command_t* first, jtag_command_t* last)
{
jtag_command_t* cmd;
- uint8_t* buffer;
- int scan_size;
+ uint8_t* buffer;
+ int scan_size;
- int retval;
- uint32_t bytes_written = 0;
- uint32_t bytes_read = 0;
+ int retval;
+ uint32_t bytes_written = 0;
+ uint32_t bytes_read = 0;
#ifdef _DEBUG_USB_IO_
struct timeval start, inter, inter2, end;
#ifdef _DEBUG_USB_IO_
struct timeval start, inter, inter2, end;
/**
* Function ft2232_add_pathmove
* moves the TAP controller from the current state to a new state through the
/**
* Function ft2232_add_pathmove
* moves the TAP controller from the current state to a new state through the
tap_set_end_state(tap_get_state());
}
tap_set_end_state(tap_get_state());
}
static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_t* buffer, int scan_size)
{
int num_bytes = (scan_size + 7) / 8;
static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_t* buffer, int scan_size)
{
int num_bytes = (scan_size + 7) / 8;
static int ft2232_large_scan(scan_command_t* cmd, enum scan_type type, uint8_t* buffer, int scan_size)
{
int num_bytes = (scan_size + 7) / 8;
static int ft2232_large_scan(scan_command_t* cmd, enum scan_type type, uint8_t* buffer, int scan_size)
{
int num_bytes = (scan_size + 7) / 8;
static int ft2232_predict_scan_out(int scan_size, enum scan_type type)
{
int predicted_size = 3;
static int ft2232_predict_scan_out(int scan_size, enum scan_type type)
{
int predicted_size = 3;
if (tap_get_state() != TAP_DRSHIFT)
predicted_size += get_tms_buffer_requirements(tap_get_tms_path_len(tap_get_state(), TAP_DRSHIFT));
if (tap_get_state() != TAP_DRSHIFT)
predicted_size += get_tms_buffer_requirements(tap_get_tms_path_len(tap_get_state(), TAP_DRSHIFT));
- if (type == SCAN_IN) /* only from device to host */
+ if (type == SCAN_IN) /* only from device to host */
{
/* complete bytes */
predicted_size += CEIL(num_bytes, 65536) * 3;
{
/* complete bytes */
predicted_size += CEIL(num_bytes, 65536) * 3;
/* remaining bits - 1 (up to 7) */
predicted_size += ((scan_size - 1) % 8) ? 2 : 0;
}
/* remaining bits - 1 (up to 7) */
predicted_size += ((scan_size - 1) % 8) ? 2 : 0;
}
- else /* host to device, or bidirectional */
+ else /* host to device, or bidirectional */
{
/* complete bytes */
predicted_size += num_bytes + CEIL(num_bytes, 65536) * 3;
{
/* complete bytes */
predicted_size += num_bytes + CEIL(num_bytes, 65536) * 3;
static int ft2232_predict_scan_in(int scan_size, enum scan_type type)
{
int predicted_size = 0;
static int ft2232_predict_scan_in(int scan_size, enum scan_type type)
{
int predicted_size = 0;
static void usbjtag_reset(int trst, int srst)
{
enum reset_types jtag_reset_config = jtag_get_reset_config();
if (trst == 1)
{
if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
static void usbjtag_reset(int trst, int srst)
{
enum reset_types jtag_reset_config = jtag_get_reset_config();
if (trst == 1)
{
if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
- low_direction |= nTRSTnOE; /* switch to output pin (output is low) */
+ low_direction |= nTRSTnOE; /* switch to output pin (output is low) */
- low_output &= ~nTRST; /* switch output low */
+ low_output &= ~nTRST; /* switch output low */
}
else if (trst == 0)
{
if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
}
else if (trst == 0)
{
if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
- low_direction &= ~nTRSTnOE; /* switch to input pin (high-Z + internal and external pullup) */
+ low_direction &= ~nTRSTnOE; /* switch to input pin (high-Z + internal and external pullup) */
- low_output |= nTRST; /* switch output high */
+ low_output |= nTRST; /* switch output high */
}
if (srst == 1)
{
if (jtag_reset_config & RESET_SRST_PUSH_PULL)
}
if (srst == 1)
{
if (jtag_reset_config & RESET_SRST_PUSH_PULL)
- low_output &= ~nSRST; /* switch output low */
+ low_output &= ~nSRST; /* switch output low */
- low_direction |= nSRSTnOE; /* switch to output pin (output is low) */
+ low_direction |= nSRSTnOE; /* switch to output pin (output is low) */
}
else if (srst == 0)
{
if (jtag_reset_config & RESET_SRST_PUSH_PULL)
}
else if (srst == 0)
{
if (jtag_reset_config & RESET_SRST_PUSH_PULL)
- low_output |= nSRST; /* switch output high */
+ low_output |= nSRST; /* switch output high */
- low_direction &= ~nSRSTnOE; /* switch to input pin (high-Z) */
+ low_direction &= ~nSRSTnOE; /* switch to input pin (high-Z) */
}
/* command "set data bits low byte" */
}
/* command "set data bits low byte" */
buffer_write(low_direction);
}
buffer_write(low_direction);
}
static void jtagkey_reset(int trst, int srst)
{
enum reset_types jtag_reset_config = jtag_get_reset_config();
static void jtagkey_reset(int trst, int srst)
{
enum reset_types jtag_reset_config = jtag_get_reset_config();
static void olimex_jtag_reset(int trst, int srst)
{
enum reset_types jtag_reset_config = jtag_get_reset_config();
static void olimex_jtag_reset(int trst, int srst)
{
enum reset_types jtag_reset_config = jtag_get_reset_config();
static void axm0432_jtag_reset(int trst, int srst)
{
if (trst == 1)
static void axm0432_jtag_reset(int trst, int srst)
{
if (trst == 1)
static void flyswatter_reset(int trst, int srst)
{
if (trst == 1)
static void flyswatter_reset(int trst, int srst)
{
if (trst == 1)
LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
}
LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
}
static void turtle_reset(int trst, int srst)
{
trst = trst;
static void turtle_reset(int trst, int srst)
{
trst = trst;
LOG_DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", srst, low_output, low_direction);
}
LOG_DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", srst, low_output, low_direction);
}
static void comstick_reset(int trst, int srst)
{
if (trst == 1)
static void comstick_reset(int trst, int srst)
{
if (trst == 1)
static void stm32stick_reset(int trst, int srst)
{
if (trst == 1)
static void stm32stick_reset(int trst, int srst)
{
if (trst == 1)
static void sheevaplug_reset(int trst, int srst)
{
if (trst == 1)
static void sheevaplug_reset(int trst, int srst)
{
if (trst == 1)
static int ft2232_execute_runtest(jtag_command_t *cmd)
{
static int ft2232_execute_runtest(jtag_command_t *cmd)
{
int predicted_size = 0;
retval = ERROR_OK;
int predicted_size = 0;
retval = ERROR_OK;
static int ft2232_execute_statemove(jtag_command_t *cmd)
{
int predicted_size = 0;
static int ft2232_execute_statemove(jtag_command_t *cmd)
{
int predicted_size = 0;
DEBUG_JTAG_IO("pathmove: %i states, current: %s end: %s", num_states,
tap_state_name(tap_get_state()),
DEBUG_JTAG_IO("pathmove: %i states, current: %s end: %s", num_states,
tap_state_name(tap_get_state()),
- tap_state_name(path[num_states-1])
-);
+ tap_state_name(path[num_states-1]));
/* only send the maximum buffer size that FT2232C can handle */
predicted_size = 3 * CEIL(num_states, 7);
/* only send the maximum buffer size that FT2232C can handle */
predicted_size = 3 * CEIL(num_states, 7);
static int ft2232_execute_scan(jtag_command_t *cmd)
{
static int ft2232_execute_scan(jtag_command_t *cmd)
{
- uint8_t* buffer;
- int scan_size; /* size of IR or DR scan */
- int predicted_size = 0;
- int retval = ERROR_OK;
+ uint8_t* buffer;
+ int scan_size; /* size of IR or DR scan */
+ int predicted_size = 0;
+ int retval = ERROR_OK;
enum scan_type type = jtag_scan_type(cmd->cmd.scan);
enum scan_type type = jtag_scan_type(cmd->cmd.scan);
static int ft2232_execute_reset(jtag_command_t *cmd)
{
static int ft2232_execute_reset(jtag_command_t *cmd)
{
- int retval;
- int predicted_size = 0;
+ int retval;
+ int predicted_size = 0;
retval = ERROR_OK;
DEBUG_JTAG_IO("reset trst: %i srst %i",
retval = ERROR_OK;
DEBUG_JTAG_IO("reset trst: %i srst %i",
static int ft2232_execute_sleep(jtag_command_t *cmd)
{
static int ft2232_execute_sleep(jtag_command_t *cmd)
{
retval = ERROR_OK;
DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us);
retval = ERROR_OK;
DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us);
static int ft2232_execute_stableclocks(jtag_command_t *cmd)
{
static int ft2232_execute_stableclocks(jtag_command_t *cmd)
{
retval = ERROR_OK;
/* this is only allowed while in a stable state. A check for a stable
retval = ERROR_OK;
/* this is only allowed while in a stable state. A check for a stable
static int ft2232_execute_command(jtag_command_t *cmd)
{
static int ft2232_execute_command(jtag_command_t *cmd)
{
retval = ERROR_OK;
switch (cmd->type)
retval = ERROR_OK;
switch (cmd->type)
static int ft2232_execute_queue()
{
static int ft2232_execute_queue()
{
- jtag_command_t* cmd = jtag_command_queue; /* currently processed command */
- int retval;
+ jtag_command_t* cmd = jtag_command_queue; /* currently processed command */
+ int retval;
- first_unsent = cmd; /* next command that has to be sent */
+ first_unsent = cmd; /* next command that has to be sent */
require_send = 0;
/* return ERROR_OK, unless ft2232_send_and_recv reports a failed check
require_send = 0;
/* return ERROR_OK, unless ft2232_send_and_recv reports a failed check
#if BUILD_FT2232_FTD2XX == 1
static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_more)
{
#if BUILD_FT2232_FTD2XX == 1
static int ft2232_init_ftd2xx(uint16_t vid, uint16_t pid, int more, int* try_more)
{
status = FT_OpenEx(openex_string, openex_flags, &ftdih);
if (status != FT_OK) {
status = FT_OpenEx(openex_string, openex_flags, &ftdih);
if (status != FT_OK) {
- // under Win32, the FTD2XX driver appends an "A" to the end
- // of the description, if we tried by the desc, then
- // try by the alternate "A" description.
+ /* under Win32, the FTD2XX driver appends an "A" to the end
+ * of the description, if we tried by the desc, then
+ * try by the alternate "A" description. */
if (openex_string == ft2232_device_desc) {
if (openex_string == ft2232_device_desc) {
- // Try the alternate method.
+ /* Try the alternate method. */
openex_string = ft2232_device_desc_A;
status = FT_OpenEx(openex_string, openex_flags, &ftdih);
if (status == FT_OK) {
openex_string = ft2232_device_desc_A;
status = FT_OpenEx(openex_string, openex_flags, &ftdih);
if (status == FT_OK) {
- // yea, the "alternate" method worked!
+ /* yea, the "alternate" method worked! */
- // drat, give the user a meaningfull message.
- // telling the use we tried *BOTH* methods.
+ /* drat, give the user a meaningfull message.
+ * telling the use we tried *BOTH* methods. */
LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'\n",
ft2232_device_desc,
ft2232_device_desc_A);
LOG_WARNING("Unable to open FTDI Device tried: '%s' and '%s'\n",
ft2232_device_desc,
ft2232_device_desc_A);
- LOG_INFO("device: %lu", ftdi_device);
+ static const char* type_str[] =
+ {"BM", "AM", "100AX", "UNKNOWN", "2232C", "232R", "2232H", "4232H"};
+ unsigned no_of_known_types = sizeof(type_str) / sizeof(type_str[0]) - 1;
+ unsigned type_index = ((unsigned)ftdi_device < no_of_known_types)
+ ? ftdi_device : 3;
+ LOG_INFO("device: %lu \"%s\"", ftdi_device, type_str[type_index]);
LOG_INFO("deviceID: %lu", deviceID);
LOG_INFO("SerialNumber: %s", SerialNumber);
LOG_INFO("Description: %s", Description);
LOG_INFO("deviceID: %lu", deviceID);
LOG_INFO("SerialNumber: %s", SerialNumber);
LOG_INFO("Description: %s", Description);
-
-#ifdef BUILD_FTD2XX_HIGHSPEED
- if (ft2232_device_is_highspeed())
- {
- ft2232_max_tck = FTDI_2232H_4232H_MAX_TCK;
- LOG_INFO("max TCK change to: %u kHz", ft2232_max_tck);
- }
-#endif
static int ft2232_purge_ftd2xx(void)
{
FT_STATUS status;
static int ft2232_purge_ftd2xx(void)
{
FT_STATUS status;
#endif /* BUILD_FT2232_FTD2XX == 1 */
#if BUILD_FT2232_LIBFTDI == 1
#endif /* BUILD_FT2232_FTD2XX == 1 */
#if BUILD_FT2232_LIBFTDI == 1
ftdi_set_bitmode(&ftdic, 0x0b, 2); /* ctx, JTAG I/O mask */
ftdi_set_bitmode(&ftdic, 0x0b, 2); /* ctx, JTAG I/O mask */
+ ftdi_device = ftdic.type;
+ static const char* type_str[] =
+ {"AM", "BM", "2232C", "R", "2232H", "4232H", "Unknown"};
+ unsigned no_of_known_types = sizeof(type_str) / sizeof(type_str[0]) - 1;
+ unsigned type_index = ((unsigned)ftdi_device < no_of_known_types)
+ ? ftdi_device : no_of_known_types;
+ LOG_DEBUG("FTDI chip type: %i \"%s\"", (int)ftdi_device, type_str[type_index]);
static int ft2232_purge_libftdi(void)
{
if (ftdi_usb_purge_buffers(&ftdic) < 0)
static int ft2232_purge_libftdi(void)
{
if (ftdi_usb_purge_buffers(&ftdic) < 0)
#endif /* BUILD_FT2232_LIBFTDI == 1 */
static int ft2232_init(void)
#endif /* BUILD_FT2232_LIBFTDI == 1 */
static int ft2232_init(void)
if (layout->init() != ERROR_OK)
return ERROR_JTAG_INIT_FAILED;
if (layout->init() != ERROR_OK)
return ERROR_JTAG_INIT_FAILED;
+ if (ft2232_device_is_highspeed())
+ {
+ if (ft2232h_ft4232h_clk_divide_by_5(false) != ERROR_OK)
+ return ERROR_JTAG_INIT_FAILED;
+ }
+
ft2232_speed(jtag_get_speed());
buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
ft2232_speed(jtag_get_speed());
buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
static int usbjtag_init(void)
{
uint8_t buf[3];
static int usbjtag_init(void)
{
uint8_t buf[3];
static int axm0432_jtag_init(void)
{
uint8_t buf[3];
static int axm0432_jtag_init(void)
{
uint8_t buf[3];
static int jtagkey_init(void)
{
uint8_t buf[3];
static int jtagkey_init(void)
{
uint8_t buf[3];
static int olimex_jtag_init(void)
{
uint8_t buf[3];
static int olimex_jtag_init(void)
{
uint8_t buf[3];
static int flyswatter_init(void)
{
uint8_t buf[3];
static int flyswatter_init(void)
{
uint8_t buf[3];
static int turtle_init(void)
{
uint8_t buf[3];
static int turtle_init(void)
{
uint8_t buf[3];
static int comstick_init(void)
{
uint8_t buf[3];
static int comstick_init(void)
{
uint8_t buf[3];
static int stm32stick_init(void)
{
uint8_t buf[3];
static int stm32stick_init(void)
{
uint8_t buf[3];
static int sheevaplug_init(void)
{
uint8_t buf[3];
static int sheevaplug_init(void)
{
uint8_t buf[3];
buffer_write(high_direction);
}
buffer_write(high_direction);
}
static void flyswatter_jtag_blink(void)
{
/*
static void flyswatter_jtag_blink(void)
{
/*
buffer_write(high_direction);
}
buffer_write(high_direction);
}
static void turtle_jtag_blink(void)
{
/*
static void turtle_jtag_blink(void)
{
/*
buffer_write(high_direction);
}
buffer_write(high_direction);
}
static int ft2232_quit(void)
{
#if BUILD_FT2232_FTD2XX == 1
static int ft2232_quit(void)
{
#if BUILD_FT2232_FTD2XX == 1
static int ft2232_handle_device_desc_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
char *cp;
static int ft2232_handle_device_desc_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
char *cp;
{
ft2232_device_desc = strdup(args[0]);
cp = strchr(ft2232_device_desc, 0);
{
ft2232_device_desc = strdup(args[0]);
cp = strchr(ft2232_device_desc, 0);
- // under Win32, the FTD2XX driver appends an "A" to the end
- // of the description, this examines the given desc
- // and creates the 'missing' _A or non_A variable.
+ /* under Win32, the FTD2XX driver appends an "A" to the end
+ * of the description, this examines the given desc
+ * and creates the 'missing' _A or non_A variable. */
if ((cp[-1] == 'A') && (cp[-2]==' ')) {
if ((cp[-1] == 'A') && (cp[-2]==' ')) {
- // it was, so make this the "A" version.
+ /* it was, so make this the "A" version. */
ft2232_device_desc_A = ft2232_device_desc;
ft2232_device_desc_A = ft2232_device_desc;
- // and *CREATE* the non-A version.
+ /* and *CREATE* the non-A version. */
strcpy(buf, ft2232_device_desc);
cp = strchr(buf, 0);
cp[-2] = 0;
ft2232_device_desc = strdup(buf);
} else {
strcpy(buf, ft2232_device_desc);
cp = strchr(buf, 0);
cp[-2] = 0;
ft2232_device_desc = strdup(buf);
} else {
- // <space > A not defined
- // so create it
+ /* <space > A not defined
+ * so create it */
sprintf(buf, "%s A", ft2232_device_desc);
ft2232_device_desc_A = strdup(buf);
}
sprintf(buf, "%s A", ft2232_device_desc);
ft2232_device_desc_A = strdup(buf);
}
static int ft2232_handle_serial_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
if (argc == 1)
static int ft2232_handle_serial_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
if (argc == 1)
static int ft2232_handle_layout_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
if (argc == 0)
static int ft2232_handle_layout_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
if (argc == 0)
static int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
if (argc > MAX_USB_IDS * 2)
static int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
if (argc > MAX_USB_IDS * 2)
LOG_WARNING("incomplete ft2232_vid_pid configuration directive");
if (argc < 2)
return ERROR_COMMAND_SYNTAX_ERROR;
LOG_WARNING("incomplete ft2232_vid_pid configuration directive");
if (argc < 2)
return ERROR_COMMAND_SYNTAX_ERROR;
- // remove the incomplete trailing id
+ /* remove the incomplete trailing id */
static int ft2232_handle_latency_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
if (argc == 1)
static int ft2232_handle_latency_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
{
if (argc == 1)
static int ft2232_stableclocks(int num_cycles, jtag_command_t* cmd)
{
int retval = 0;
static int ft2232_stableclocks(int num_cycles, jtag_command_t* cmd)
{
int retval = 0;
/* ---------------------------------------------------------------------
* Support for IceBear JTAG adapter from Section5:
* http://section5.ch/icebear
/* ---------------------------------------------------------------------
* Support for IceBear JTAG adapter from Section5:
* http://section5.ch/icebear