This patch adds support for Signalyzer H2 (FT2232H) and Signalyzer H4
(FT4232H) to
OpenOCD using D2XX and/or libftdi drivers.

Signalyzer H relies on FTDI eeprom location read/write calls for the
extra functionality
built into the product, therefore patched version of libftdi must be
used implementing
eeprom location reads and writes.

--enable-signalyzer_h option must be used to include support for
Signalyzer H into compilation,
without this option openocd will compile and not require patched
version of libftdi.

I will also submit a simple patch to libftdi adding single eeprom
locations reads and writes to the library.
Please let me know if anyone needs this patch before it gets into the
libftdi trunk and I will happily post it here.

Many thanks,
Oleg
www.signalyzer.com
diff --git a/README b/README
index 33258e8..8d164e5 100644
--- a/README
+++ b/README
@@ -250,6 +250,8 @@ options may be available there:
   --enable-ecosboard      Enable building support for eCos based JTAG debugger
   --enable-zy1000         Enable ZY1000 interface
 
+  --enable-signalyzer_h   Enable building support for Xverve Signalyzer H2 and 
H4
+  
   --enable-minidriver-dummy
                           Enable the dummy minidriver.
 
diff --git a/configure.in b/configure.in
index 1d3f0ec..6e66b0f 100644
--- a/configure.in
+++ b/configure.in
@@ -396,6 +396,10 @@ AC_ARG_ENABLE(arm-jtag-ew,
   AS_HELP_STRING([--enable-arm-jtag-ew], [Enable building support for the 
Olimex ARM-JTAG-EW Programmer]),
   [build_armjtagew=$enableval], [build_armjtagew=no])
 
+AC_ARG_ENABLE(signalyzer_h,
+  AS_HELP_STRING([--enable-signalyzer-h], [Enable building support for the 
Xverve Signalyzer H2 and H4 Programmer]),
+  [build_signalyzer_h=$enableval], [build_signalyzer_h=no])
+  
 AC_ARG_ENABLE(minidriver_dummy,
   AS_HELP_STRING([--enable-minidriver-dummy], [Enable the dummy minidriver.]),
   [build_minidriver_dummy=$enableval], [build_minidriver_dummy=no])
@@ -661,6 +665,11 @@ else
   AC_DEFINE(BUILD_ARMJTAGEW, 0, [0 if you don't want the ARM-JTAG-EW JTAG 
driver.])
 fi
 
+if test $build_signalyzer_h = yes; then
+  AC_DEFINE(BUILD_SIGNALYZER_H, 1, [1 if you want the SIGNALYZER H2 and H4 
JTAG driver.])
+else
+  AC_DEFINE(BUILD_SIGNALYZER_H, 0, [0 if you don't want the SIGNALYZER H2 and 
H4 driver.])
+fi
 #-- Deal with MingW/Cygwin FTD2XX issues
 
 if test $is_win32 = yes; then
diff --git a/src/jtag/ft2232.c b/src/jtag/ft2232.c
index 839976f..52554cd 100644
--- a/src/jtag/ft2232.c
+++ b/src/jtag/ft2232.c
@@ -138,6 +138,10 @@ static int sheevaplug_init(void);
 static int icebear_jtag_init(void);
 static int cortino_jtag_init(void);
 
+#if BUILD_SIGNALYZER_H == 1
+static int signalyzer_h_init(void);
+#endif
+
 /* reset procedures for supported layouts */
 static void usbjtag_reset(int trst, int srst);
 static void jtagkey_reset(int trst, int srst);
@@ -150,11 +154,19 @@ static void axm0432_jtag_reset(int trst, int srst);
 static void sheevaplug_reset(int trst, int srst);
 static void icebear_jtag_reset(int trst, int srst);
 
+#if BUILD_SIGNALYZER_H == 1
+static void signalyzer_h_reset(int trst, int srst);
+#endif
+
 /* blink procedures for layouts that support a blinking led */
 static void olimex_jtag_blink(void);
 static void flyswatter_jtag_blink(void);
 static void turtle_jtag_blink(void);
 
+#if BUILD_SIGNALYZER_H == 1
+static void signalyzer_h_blink(void);
+#endif
+
 static const ft2232_layout_t  ft2232_layouts[] =
 {
        { "usbjtag",              usbjtag_init,              usbjtag_reset,     
 NULL                    },
@@ -173,6 +185,9 @@ static const ft2232_layout_t  ft2232_layouts[] =
        { "sheevaplug",           sheevaplug_init,           sheevaplug_reset,  
 NULL                    },
        { "icebear",              icebear_jtag_init,         
icebear_jtag_reset, NULL                    },
        { "cortino",              cortino_jtag_init,         comstick_reset, 
NULL                        },
+#if BUILD_SIGNALYZER_H == 1    
+       { "signalyzer-h",         signalyzer_h_init,         
signalyzer_h_reset, signalyzer_h_blink      },
+#endif 
        { NULL,                   NULL,                      NULL,              
 NULL                    },
 };
 
@@ -3071,3 +3086,876 @@ static void icebear_jtag_reset(int trst, int srst) {
 
        LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 
0x%2.2x", trst, srst, low_output, low_direction);
 }
+
+#if BUILD_SIGNALYZER_H == 1
+/* ---------------------------------------------------------------------
+ * Support for Signalyzer H2 and Signalyzer H4
+ * JTAG adapter from Xverve Technologies Inc.
+ * http://www.signalyzer.com or http://www.xverve.com
+ *
+ * Author: Oleg Seiljus, o...@signalyzer.com
+ */
+static unsigned char signalyzer_h_side;
+static unsigned int signalyzer_h_adapter_type;
+
+static int signalyzer_h_ctrl_write (int address, unsigned short value);
+static int signalyzer_h_ctrl_read (int address, unsigned short *value);
+static int signalyzer_h_led_set(unsigned char channel, unsigned char led, int 
on_time_ms, int off_time_ms, unsigned char cycles);
+ 
+#define SIGNALYZER_COMMAND_ADDR                                128
+#define SIGNALYZER_DATA_BUFFER_ADDR                    129
+
+#define SIGNALYZER_COMMAND_VERSION                     0x41
+#define SIGNALYZER_COMMAND_RESET                       0x42
+#define SIGNALYZER_COMMAND_POWERCONTROL_GET    0x50
+#define SIGNALYZER_COMMAND_POWERCONTROL_SET    0x51
+#define SIGNALYZER_COMMAND_PWM_SET                     0x52
+#define SIGNALYZER_COMMAND_LED_SET                     0x53
+#define SIGNALYZER_COMMAND_ADC                                 0x54
+#define SIGNALYZER_COMMAND_GPIO_STATE          0x55
+#define SIGNALYZER_COMMAND_GPIO_MODE           0x56
+#define SIGNALYZER_COMMAND_GPIO_PORT           0x57
+#define SIGNALYZER_COMMAND_I2C                                 0x58
+
+#define SIGNALYZER_CHAN_A                                      1       // 
Signalyzer Channel A
+#define SIGNALYZER_CHAN_B                                      2       // 
Signalyzer Channel B
+#define SIGNALYZER_CHAN_C                                      4       // 
Signalyzer Channel C center LEDs
+
+#define SIGNALYZER_LED_GREEN                           1
+#define SIGNALYZER_LED_RED                                     2
+
+#define SIGNALYZER_MODULE_TYPE_EM_LT16_A               0x0301
+#define SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG             0x0302
+#define SIGNALYZER_MODULE_TYPE_EM_JTAG                 0x0303
+#define SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P   0x0304
+#define SIGNALYZER_MODULE_TYPE_EM_JTAG_P               0x0305
+
+
+static int signalyzer_h_ctrl_write (int address, unsigned short value)
+{
+#if BUILD_FT2232_FTD2XX == 1
+       return FT_WriteEE (ftdih, address, value)
+#elif BUILD_FT2232_LIBFTDI == 1
+       return ftdi_write_eeprom_location(&ftdic, address, value);
+#endif
+}
+
+static int signalyzer_h_ctrl_read (int address, unsigned short *value)
+{
+#if BUILD_FT2232_FTD2XX == 1
+       return FT_ReadEE (ftdih, address, value)
+#elif BUILD_FT2232_LIBFTDI == 1
+       return ftdi_read_eeprom_location(&ftdic, address, value);
+#endif
+}
+
+static int signalyzer_h_led_set(unsigned char channel, unsigned char led, int 
on_time_ms, int off_time_ms, unsigned char cycles)
+{
+       unsigned char on_time;
+    unsigned char off_time;
+
+    if (on_time_ms < 0xFFFF)
+       on_time = (unsigned char)(on_time_ms / 62);
+    else
+       on_time = 0xFF;
+
+    off_time = (unsigned char)(off_time_ms / 62);
+       
+#if BUILD_FT2232_FTD2XX == 1
+       FT_STATUS status;
+
+       if ((status = signalyzer_h_ctrl_write (SIGNALYZER_DATA_BUFFER_ADDR, 
((uint32_t)(channel << 8) | led))) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write  returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((status = signalyzer_h_ctrl_write ((SIGNALYZER_DATA_BUFFER_ADDR + 
1), ((uint32_t)(on_time << 8) | off_time))) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write  returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((status = signalyzer_h_ctrl_write ((SIGNALYZER_DATA_BUFFER_ADDR + 
2), ((uint32_t)cycles))) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write  returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((status = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_LED_SET)) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write  returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+       
+       return ERROR_OK;
+#elif BUILD_FT2232_LIBFTDI == 1
+       int retval;
+
+       if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_DATA_BUFFER_ADDR, 
((uint32_t)(channel << 8) | led))) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((retval = signalyzer_h_ctrl_write ((SIGNALYZER_DATA_BUFFER_ADDR + 
1), ((uint32_t)(on_time << 8) | off_time))) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((retval = signalyzer_h_ctrl_write ((SIGNALYZER_DATA_BUFFER_ADDR + 
2), ((uint32_t)cycles))) < 0 )
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((retval = signalyzer_h_ctrl_write(SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_LED_SET)) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+       
+       return ERROR_OK;
+#endif
+}
+
+static int signalyzer_h_init(void)
+{
+#if BUILD_FT2232_FTD2XX == 1
+       FT_STATUS status;
+#elif BUILD_FT2232_LIBFTDI == 1
+       int retval;     
+#endif
+
+       char * end_of_desc;
+       int i;
+       uint16_t read_buf[12];
+       uint8_t  buf[3];
+       uint32_t bytes_written;
+
+       
+       // turn on center green led
+       signalyzer_h_led_set(SIGNALYZER_CHAN_C, SIGNALYZER_LED_GREEN, 0xFFFF, 
0x00, 0x00);
+
+       // determine what channel config wants to open
+       // TODO: change me... current implementation is made to work with 
openocd description parsing.
+       end_of_desc = strrchr(ft2232_device_desc, 0x00);
+
+       if (end_of_desc)
+       {
+               signalyzer_h_side = *(end_of_desc - 1);
+               if (signalyzer_h_side == 'B')
+                       signalyzer_h_side = SIGNALYZER_CHAN_B;
+               else
+                       signalyzer_h_side = SIGNALYZER_CHAN_A;
+       }
+       else
+       {
+               LOG_ERROR("No Channel was specified");
+               return ERROR_FAIL;
+       }
+
+       signalyzer_h_led_set(signalyzer_h_side, SIGNALYZER_LED_GREEN, 1000, 
1000, 0xFF);
+
+#if BUILD_FT2232_FTD2XX == 1
+       // read signalyzer versionining information
+       if ((status = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_VERSION)) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       for (i = 0; i < 10; i++)
+       {
+               if ((status = signalyzer_h_ctrl_read 
((SIGNALYZER_DATA_BUFFER_ADDR + i), &read_buf[i])) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_read returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+       }
+
+       LOG_INFO("Signalyzer: ID info: { %.4x %.4x %.4x %.4x %.4x %.4x %.4x }", 
+               read_buf[0], read_buf[1], read_buf[2], read_buf[3], 
read_buf[4], read_buf[5], read_buf[6]);
+
+       // set gpio register
+       if ((status = signalyzer_h_ctrl_write (SIGNALYZER_DATA_BUFFER_ADDR, 
(uint32_t)(signalyzer_h_side << 8))) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((status = signalyzer_h_ctrl_write (SIGNALYZER_DATA_BUFFER_ADDR + 1, 
0x8080)) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((status = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       // read adapter type information
+       if ((status = signalyzer_h_ctrl_write (SIGNALYZER_DATA_BUFFER_ADDR, 
((uint32_t)(signalyzer_h_side << 8) | 0x01))) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((status = signalyzer_h_ctrl_write ((SIGNALYZER_DATA_BUFFER_ADDR + 
1), 0xA000)) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((status = signalyzer_h_ctrl_write ((SIGNALYZER_DATA_BUFFER_ADDR + 
2), 0x0008)) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((status = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_I2C)) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       usleep(100000);
+
+       if ((status = signalyzer_h_ctrl_read (SIGNALYZER_COMMAND_ADDR, 
&read_buf[0])) != FT_OK)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_read returned: %lu", status);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if (read_buf[0] != 0x0498)
+       {
+               signalyzer_h_adapter_type = 0x0000;
+       }
+       else
+       {
+               for (i = 0; i < 4; i++)
+               {
+                       if ((status = signalyzer_h_ctrl_read 
((SIGNALYZER_DATA_BUFFER_ADDR + i), &read_buf[i])) != FT_OK)
+                       {
+                               LOG_ERROR("signalyzer_h_ctrl_read returned: 
%lu", status);
+                               return ERROR_JTAG_DEVICE_ERROR;
+                       }
+               }
+
+               signalyzer_h_adapter_type = read_buf[0];
+       }
+#elif BUILD_FT2232_LIBFTDI == 1
+       // read signalyzer versionining information
+       if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_VERSION)) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned:  %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       for (i = 0; i < 10; i++)
+       {
+               if ((retval = signalyzer_h_ctrl_read 
((SIGNALYZER_DATA_BUFFER_ADDR + i), &read_buf[i])) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_read returned:  %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+       }
+
+       LOG_INFO("Signalyzer: ID info: { %.4x %.4x %.4x %.4x %.4x %.4x %.4x }", 
+               read_buf[0], read_buf[1], read_buf[2], read_buf[3], 
read_buf[4], read_buf[5], read_buf[6]);
+
+       // set gpio register
+       if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_DATA_BUFFER_ADDR, 
(uint32_t)(signalyzer_h_side << 8))) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_DATA_BUFFER_ADDR + 1, 
0x8080)) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_STATE)) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       // read adapter type information
+       if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_DATA_BUFFER_ADDR, 
((uint32_t)(signalyzer_h_side << 8) | 0x01))) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((retval = signalyzer_h_ctrl_write ((SIGNALYZER_DATA_BUFFER_ADDR + 
1), 0xA000)) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((retval = signalyzer_h_ctrl_write ((SIGNALYZER_DATA_BUFFER_ADDR + 
2), 0x0008)) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_I2C)) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       usleep(100000);
+
+       if ((retval = signalyzer_h_ctrl_read (SIGNALYZER_COMMAND_ADDR, 
&read_buf[0])) < 0)
+       {
+               LOG_ERROR("signalyzer_h_ctrl_read returned: %s", 
ftdi_get_error_string(&ftdic));
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       if (read_buf[0] != 0x0498)
+       {
+               signalyzer_h_adapter_type = 0x0000;
+       }
+       else
+       {
+               for (i = 0; i < 4; i++)
+               {
+                       if ((retval = signalyzer_h_ctrl_read 
((SIGNALYZER_DATA_BUFFER_ADDR + i), &read_buf[i])) < 0)
+                       {
+                               LOG_ERROR("signalyzer_h_ctrl_read returned: 
%s", ftdi_get_error_string(&ftdic));
+                               return ERROR_JTAG_DEVICE_ERROR;
+                       }
+               }
+
+               signalyzer_h_adapter_type = read_buf[0];
+       }
+#endif
+
+       enum reset_types jtag_reset_config = jtag_get_reset_config();
+
+       // ADAPTOR: EM_LT16_A
+       if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A)
+       {
+               LOG_INFO("Signalyzer: EM-LT (16-channel level translator) 
detected. (HW: %2x).", (read_buf[1] >> 8));
+
+               nTRST    = 0x10;
+               nTRSTnOE = 0x10;
+               nSRST    = 0x20;
+               nSRSTnOE = 0x20;
+
+               low_output     = 0x08;
+               low_direction  = 0x1b;
+
+               high_output    = 0x0;
+               high_direction = 0x0;
+
+               if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
+               {
+                       low_direction &= ~nTRSTnOE; /* nTRST input */
+                       low_output    &= ~nTRST;    /* nTRST = 0 */
+               }
+               else
+               {
+                       low_direction |= nTRSTnOE;  /* nTRST output */
+                       low_output    |= nTRST;     /* nTRST = 1 */
+               }
+
+               if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+               {
+                       low_direction |= nSRSTnOE;  /* nSRST output */
+                       low_output    |= nSRST;     /* nSRST = 1 */
+               }
+               else
+               {
+                       low_direction &= ~nSRSTnOE; /* nSRST input */
+                       low_output    &= ~nSRST;    /* nSRST = 0 */
+               }
+
+#if BUILD_FT2232_FTD2XX == 1
+               // enable power to the module
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, ((uint32_t)(signalyzer_h_side << 8) | 0x01))) != 
FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_POWERCONTROL_SET)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // set gpio mode register
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_MODE)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // set gpio register
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x4040)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+#elif BUILD_FT2232_LIBFTDI == 1
+               // enable power to the module
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, ((uint32_t)(signalyzer_h_side << 8) | 0x01))) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_POWERCONTROL_SET)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // set gpio mode register
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_MODE)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // set gpio register
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x4040)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_STATE)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+#endif         
+       }
+
+       // ADAPTOR: EM_ARM_JTAG, EM_ARM_JTAG_P, EM_JTAG, EM_JTAG_P
+       else if ((signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG) ||
+                               (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) ||
+                               (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_JTAG)  ||
+                               (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_JTAG_P))
+       {
+               if(signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG)
+                       LOG_INFO("Signalyzer: EM-ARM-JTAG (ARM JTAG) detected. 
(HW: %2x).", (read_buf[1] >> 8));
+               else if (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P)
+                       LOG_INFO("Signalyzer: EM-ARM-JTAG_P (ARM JTAG with PSU) 
detected. (HW: %2x).", (read_buf[1] >> 8));
+               else if (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_JTAG)
+                       LOG_INFO("Signalyzer: EM-JTAG (Generic JTAG) detected. 
(HW: %2x).", (read_buf[1] >> 8));
+               else if (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_JTAG_P)
+                       LOG_INFO("Signalyzer: EM-JTAG-P (Generic JTAG with PSU) 
detected. (HW: %2x).", (read_buf[1] >> 8));
+
+               if ((signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) || (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_JTAG_P))
+                       LOG_INFO("Signalyzer: EM-ARM-JTAG-P and EM-JTAG-P 
modules have adjustable power supply with output voltage range from 1.00V to 
5.00V and current measurement capabilities. Presently support for power supply 
is not integrated into OpenOCD directly. Please visit http://www.signalyzer.com 
for alternative ways to control built-in power supply)");
+
+               nTRST          = 0x02;
+               nTRSTnOE       = 0x04;
+               nSRST          = 0x08;
+               nSRSTnOE       = 0x10;
+
+               low_output     = 0x08;
+               low_direction  = 0x1b;
+
+               high_output    = 0x0;
+               high_direction = 0x1f;
+
+               if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
+               {
+                       high_output |= nTRSTnOE;
+                       high_output &= ~nTRST;
+               }
+               else
+               {
+                       high_output &= ~nTRSTnOE;
+                       high_output |= nTRST;
+               }
+
+               if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+               {
+                       high_output &= ~nSRSTnOE;
+                       high_output |= nSRST;
+               }
+               else
+               {
+                       high_output |= nSRSTnOE;
+                       high_output &= ~nSRST;
+               }
+
+#if BUILD_FT2232_FTD2XX == 1
+               // enable power to the module
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, ((uint32_t)(signalyzer_h_side << 8) | 0x01))) != 
FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_POWERCONTROL_SET)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // set gpio mode register (IO_16 and IO_17 set as analog 
inputs, other is gpio)
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0060)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_MODE)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // set gpio register (all inputs, for -P modules, PSU will be 
turned off)
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((status = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_STATE)) != FT_OK)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %lu", 
status);
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // read and report Vtarget TODO: implement this in next release
+#elif BUILD_FT2232_LIBFTDI == 1
+               // enable power to the module
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, ((uint32_t)(signalyzer_h_side << 8) | 0x01))) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_POWERCONTROL_SET)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // set gpio mode register (IO_16 and IO_17 set as analog 
inputs, other is gpio)
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0060)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_MODE)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // set gpio register (all inputs, for -P modules, PSU will be 
turned off)
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR, (uint32_t)(signalyzer_h_side << 8))) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write 
(SIGNALYZER_DATA_BUFFER_ADDR + 1, 0x0000)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               if ((retval = signalyzer_h_ctrl_write (SIGNALYZER_COMMAND_ADDR, 
SIGNALYZER_COMMAND_GPIO_STATE)) < 0)
+               {
+                       LOG_ERROR("signalyzer_h_ctrl_write returned: %s", 
ftdi_get_error_string(&ftdic));
+                       return ERROR_JTAG_DEVICE_ERROR;
+               }
+
+               // read and report Vtarget TODO: implement this in next release
+#endif
+       }
+
+       else if (signalyzer_h_adapter_type == 0x0000)
+       {
+               LOG_INFO("Signalyzer: No external modules were detected.");
+
+               nTRST    = 0x10;
+               nTRSTnOE = 0x10;
+               nSRST    = 0x20;
+               nSRSTnOE = 0x20;
+
+               low_output     = 0x08;
+               low_direction  = 0x1b;
+
+               high_output    = 0x0;
+               high_direction = 0x0;
+
+               if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
+               {
+                       low_direction &= ~nTRSTnOE; /* nTRST input */
+                       low_output    &= ~nTRST;    /* nTRST = 0 */
+               }
+               else
+               {
+                       low_direction |= nTRSTnOE;  /* nTRST output */
+                       low_output    |= nTRST;     /* nTRST = 1 */
+               }
+
+               if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+               {
+                       low_direction |= nSRSTnOE;  /* nSRST output */
+                       low_output    |= nSRST;     /* nSRST = 1 */
+               }
+               else
+               {
+                       low_direction &= ~nSRSTnOE; /* nSRST input */
+                       low_output    &= ~nSRST;    /* nSRST = 0 */
+               }
+       }
+       else
+       {
+               LOG_ERROR("Unknown module type is detected: %.4x", 
signalyzer_h_adapter_type);
+               return ERROR_JTAG_DEVICE_ERROR;
+       }
+
+       // initialize low byte of controller for jtag operation
+       buf[0] = 0x80;
+       buf[1] = low_output;
+       buf[2] = low_direction;
+
+       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || 
(bytes_written != 3))
+       {
+               LOG_ERROR("couldn't initialize Signalyzer-H layout");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+#if BUILD_FT2232_FTD2XX == 1
+       if (ftdi_device == FT_DEVICE_2232H)
+       {
+               // initialize high byte of controller for jtag operation
+               buf[0] = 0x82;
+               buf[1] = high_output;
+               buf[2] = high_direction;
+
+               if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK) || 
(bytes_written != 3))
+               {
+                       LOG_ERROR("couldn't initialize Signalyzer-H layout");
+                       return ERROR_JTAG_INIT_FAILED;
+               }
+       }
+#elif BUILD_FT2232_LIBFTDI == 1
+       if (ftdi_device == TYPE_2232H)
+       {
+               // initialize high byte of controller for jtag operation
+               buf[0] = 0x82;
+               buf[1] = high_output;
+               buf[2] = high_direction;
+
+               if ((ft2232_write(buf, 3, &bytes_written) != ERROR_OK) || 
(bytes_written != 3))
+               {
+                       LOG_ERROR("couldn't initialize Signalyzer-H layout");
+                       return ERROR_JTAG_INIT_FAILED;
+               }
+       }
+#endif
+       return ERROR_OK;
+}
+
+static void signalyzer_h_reset(int trst, int srst)
+{
+       enum reset_types jtag_reset_config = jtag_get_reset_config();
+
+       // ADAPTOR: EM_LT16_A
+       if (signalyzer_h_adapter_type == SIGNALYZER_MODULE_TYPE_EM_LT16_A)
+       {
+               if (trst == 1)
+               {
+                       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
+                               low_direction |= nTRSTnOE;      /* switch to 
output pin (output is low) */
+                       else
+                               low_output &= ~nTRST;           /* switch 
output low */
+               }
+               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) */
+                       else
+                               low_output |= nTRST;            /* switch 
output high */
+               }
+
+               if (srst == 1)
+               {
+                       if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+                               low_output &= ~nSRST;           /* switch 
output low */
+                       else
+                               low_direction |= nSRSTnOE;      /* switch to 
output pin (output is low) */
+               }
+               else if (srst == 0)
+               {
+                       if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+                               low_output |= nSRST;            /* switch 
output high */
+                       else
+                               low_direction &= ~nSRSTnOE;     /* switch to 
input pin (high-Z) */
+               }
+
+               /* command "set data bits low byte" */
+               buffer_write(0x80);
+               buffer_write(low_output);
+               buffer_write(low_direction);
+               LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, 
low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
+       }
+       // ADAPTOR: EM_ARM_JTAG,  EM_ARM_JTAG_P, EM_JTAG, EM_JTAG_P
+       else if ((signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG) ||
+                               (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_ARM_JTAG_P) ||
+                               (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_JTAG)  ||
+                               (signalyzer_h_adapter_type == 
SIGNALYZER_MODULE_TYPE_EM_JTAG_P))
+       {
+               if (trst == 1)
+               {
+                       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
+                               high_output &= ~nTRSTnOE;
+                       else
+                               high_output &= ~nTRST;
+               }
+               else if (trst == 0)
+               {
+                       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
+                               high_output |= nTRSTnOE;
+                       else
+                               high_output |= nTRST;
+               }
+
+               if (srst == 1)
+               {
+                       if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+                               high_output &= ~nSRST;
+                       else
+                               high_output &= ~nSRSTnOE;
+               }
+               else if (srst == 0)
+               {
+                       if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+                               high_output |= nSRST;
+                       else
+                               high_output |= nSRSTnOE;
+               }
+
+               /* command "set data bits high byte" */
+               buffer_write(0x82);
+               buffer_write(high_output);
+               buffer_write(high_direction);
+               LOG_INFO("trst: %i, srst: %i, high_output: 0x%2.2x, 
high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
+       }
+       else if (signalyzer_h_adapter_type == 0x0000)
+       {
+               if (trst == 1)
+               {
+                       if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
+                               low_direction |= nTRSTnOE;      /* switch to 
output pin (output is low) */
+                       else
+                               low_output &= ~nTRST;           /* switch 
output low */
+               }
+               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) */
+                       else
+                               low_output |= nTRST;            /* switch 
output high */
+               }
+
+               if (srst == 1)
+               {
+                       if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+                               low_output &= ~nSRST;           /* switch 
output low */
+                       else
+                               low_direction |= nSRSTnOE;      /* switch to 
output pin (output is low) */
+               }
+               else if (srst == 0)
+               {
+                       if (jtag_reset_config & RESET_SRST_PUSH_PULL)
+                               low_output |= nSRST;            /* switch 
output high */
+                       else
+                               low_direction &= ~nSRSTnOE;     /* switch to 
input pin (high-Z) */
+               }
+
+               /* command "set data bits low byte" */
+               buffer_write(0x80);
+               buffer_write(low_output);
+               buffer_write(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 signalyzer_h_blink(void) 
+{
+       signalyzer_h_led_set(signalyzer_h_side, SIGNALYZER_LED_RED, 100, 0, 1);
+}
+#endif
\ No newline at end of file
diff --git a/tcl/interface/signalyzer.cfg b/tcl/interface/signalyzer.cfg
index ff5f125..b0581c5 100644
--- a/tcl/interface/signalyzer.cfg
+++ b/tcl/interface/signalyzer.cfg
@@ -1,7 +1,7 @@
 #
 # Xverve Signalyzer Tool (DT-USB-ST)
 #
-# 
http://www.signalyzer.com/products/development-tools/signalyzer-tool-dt-usb-st.html
+# http://www.signalyzer.com
 #
 
 interface ft2232
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to