Here's the patch against urjtag SVN r1672 I've been using. It's adapted
from the blackfin codebase for the gnICE+; I changed the VID/PID so it
detects the ARM-USB-TINY-H instead. Enjoy!
- a
Index: src/tap/cable.c
===================================================================
--- src/tap/cable.c (revision 1672)
+++ src/tap/cable.c (working copy)
@@ -51,6 +51,7 @@
extern urj_cable_driver_t urj_tap_cable_ft2232_jtagkey_driver;
extern urj_cable_driver_t urj_tap_cable_ft2232_armusbocd_driver;
extern urj_cable_driver_t urj_tap_cable_ft2232_gnice_driver;
+extern urj_cable_driver_t urj_tap_cable_ft2232_gniceplus_cable_driver;
extern urj_cable_driver_t urj_tap_cable_ft2232_oocdlinks_driver;
extern urj_cable_driver_t urj_tap_cable_ft2232_signalyzer_driver;
extern urj_cable_driver_t urj_tap_cable_ft2232_turtelizer2_driver;
@@ -92,6 +93,7 @@
&urj_tap_cable_ft2232_jtagkey_driver,
&urj_tap_cable_ft2232_armusbocd_driver,
&urj_tap_cable_ft2232_gnice_driver,
+ &urj_tap_cable_ft2232_gniceplus_cable_driver,
&urj_tap_cable_ft2232_oocdlinks_driver,
&urj_tap_cable_ft2232_signalyzer_driver,
&urj_tap_cable_ft2232_turtelizer2_driver,
Index: src/tap/cable/generic_usbconn.c
===================================================================
--- src/tap/cable/generic_usbconn.c (revision 1672)
+++ src/tap/cable/generic_usbconn.c (working copy)
@@ -49,6 +49,7 @@
extern urj_usbconn_cable_t urj_tap_cable_usbconn_armusbocd_ftd2xx;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_armusbocdtiny_ftd2xx;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_gnice_ftd2xx;
+extern urj_usbconn_cable_t urj_tap_cable_usbconn_gniceplus_ftd2xx;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_jtagkey_ftd2xx;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_oocdlinks_ftd2xx;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_turtelizer2_ftd2xx;
@@ -62,6 +63,7 @@
extern urj_usbconn_cable_t urj_tap_cable_usbconn_armusbocd_ftdi;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_armusbocdtiny_ftdi;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_gnice_ftdi;
+extern urj_usbconn_cable_t urj_tap_cable_usbconn_gniceplus_ftdi;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_jtagkey_ftdi;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_oocdlinks_ftdi;
extern urj_usbconn_cable_t urj_tap_cable_usbconn_turtelizer2_ftdi;
@@ -100,6 +102,7 @@
&urj_tap_cable_usbconn_armusbocd_ftd2xx,
&urj_tap_cable_usbconn_armusbocdtiny_ftd2xx,
&urj_tap_cable_usbconn_gnice_ftd2xx,
+ &urj_tap_cable_usbconn_gniceplus_ftd2xx,
&urj_tap_cable_usbconn_jtagkey_ftd2xx,
&urj_tap_cable_usbconn_oocdlinks_ftd2xx,
&urj_tap_cable_usbconn_turtelizer2_ftd2xx,
@@ -113,6 +116,7 @@
&urj_tap_cable_usbconn_armusbocd_ftdi,
&urj_tap_cable_usbconn_armusbocdtiny_ftdi,
&urj_tap_cable_usbconn_gnice_ftdi,
+ &urj_tap_cable_usbconn_gniceplus_ftdi,
&urj_tap_cable_usbconn_jtagkey_ftdi,
&urj_tap_cable_usbconn_oocdlinks_ftdi,
&urj_tap_cable_usbconn_turtelizer2_ftdi,
Index: src/tap/cable/ft2232.c
===================================================================
--- src/tap/cable/ft2232.c (revision 1672)
+++ src/tap/cable/ft2232.c (working copy)
@@ -45,6 +45,9 @@
/* Maximum TCK frequency of FT2232 */
#define FT2232_MAX_TCK_FREQ 6000000
+/* Maximum TCK frequency of FT2232H / FT4232H */
+#define FT2232H_MAX_TCK_FREQ 30000000
+
/* The default driver if not specified otherwise during connect */
#ifdef ENABLE_LOWLEVEL_FTD2XX
#define DEFAULT_DRIVER "ftd2xx-mpsse"
@@ -52,7 +55,6 @@
#define DEFAULT_DRIVER "ftdi-mpsse"
#endif
-
/* repeat the definitions for MPSSE command processor here
since we cannot rely on the existence of ftdi.h even though
they're defined there */
@@ -80,6 +82,9 @@
#define TCK_DIVISOR 0x86
#define SEND_IMMEDIATE 0x87
+/* FT2232H / FT4232H only commands */
+#define DISABLE_CLOCKDIV 0x8A /* Disables the clk divide by 5 to allow for a 60MHz master clock */
+#define ENABLE_CLOCKDIV 0x8B /* Enables the clk divide by 5 to allow for backward compatibility with FT2232D */
/* bit and bitmask definitions for GPIO commands */
#define BIT_TCK 0
@@ -228,30 +233,42 @@
static void
-ft2232_set_frequency (urj_cable_t *cable, uint32_t new_frequency)
+ft2232h_disable_clockdiv_by5( urj_cable_t *cable )
{
+ params_t *params = (params_t *)cable->params;
+ urj_tap_cable_cx_cmd_root_t *cmd_root = &(params->cmd_root);
+ urj_tap_cable_cx_cmd_queue( cmd_root, 0 );
+ urj_tap_cable_cx_cmd_push( cmd_root, DISABLE_CLOCKDIV );
+}
+
+static void
+ft2232_set_frequency_common (urj_cable_t *cable, uint32_t new_frequency, uint32_t max_frequency)
+{
params_t *params = (params_t *) cable->params;
urj_tap_cable_cx_cmd_root_t *cmd_root = &(params->cmd_root);
- if (!new_frequency || new_frequency > FT2232_MAX_TCK_FREQ)
- new_frequency = FT2232_MAX_TCK_FREQ;
+ if (!new_frequency || new_frequency > max_frequency)
+ new_frequency = max_frequency;
/* update ft2232 frequency if cable setting changed */
if (new_frequency != params->mpsse_frequency)
{
uint32_t div;
- div = FT2232_MAX_TCK_FREQ / new_frequency;
- if (FT2232_MAX_TCK_FREQ % new_frequency)
+ div = max_frequency / new_frequency;
+ if (max_frequency % new_frequency)
div++;
if (div >= (1 << 16))
{
div = (1 << 16) - 1;
- urj_warning (_("Setting lowest supported frequency for FT2232: %d\n"),
- FT2232_MAX_TCK_FREQ / div);
+ urj_warning( _("Warning: Setting lowest supported frequency for FT2232%s: %d\n"),
+ max_frequency == FT2232H_MAX_TCK_FREQ ? "H" : "", max_frequency/div );
}
+ if (max_frequency == FT2232H_MAX_TCK_FREQ)
+ ft2232h_disable_clockdiv_by5( cable );
+
/* send new divisor to device */
div -= 1;
urj_tap_cable_cx_cmd_queue (cmd_root, 0);
@@ -262,12 +279,24 @@
urj_tap_cable_cx_xfer (cmd_root, &imm_cmd, cable,
URJ_TAP_CABLE_COMPLETELY);
- params->mpsse_frequency = FT2232_MAX_TCK_FREQ / (div + 1);
+ params->mpsse_frequency = max_frequency / (div + 1);
cable->frequency = params->mpsse_frequency;
}
}
+static void
+ft2232_set_frequency( urj_cable_t *cable, uint32_t new_frequency )
+{
+ ft2232_set_frequency_common( cable, new_frequency, FT2232_MAX_TCK_FREQ);
+}
+
+static void
+ft2232h_set_frequency( urj_cable_t *cable, uint32_t new_frequency )
+{
+ ft2232_set_frequency_common( cable, new_frequency, FT2232H_MAX_TCK_FREQ);
+}
+
static int
ft2232_generic_init (urj_cable_t *cable)
{
@@ -419,7 +448,7 @@
static int
-ft2232_gnice_init (urj_cable_t *cable)
+ft2232_gnice_init_common (urj_cable_t *cable, uint32_t frequency)
{
params_t *params = (params_t *) cable->params;
urj_tap_cable_cx_cmd_root_t *cmd_root = &(params->cmd_root);
@@ -451,7 +480,7 @@
urj_tap_cable_cx_cmd_push (cmd_root, params->high_byte_value);
urj_tap_cable_cx_cmd_push (cmd_root, params->high_byte_dir);
- ft2232_set_frequency (cable, FT2232_MAX_TCK_FREQ);
+ ft2232_set_frequency (cable, frequency);
params->bit_trst = BIT_GNICE_nTRST + 8; /* member of HIGH byte */
params->bit_reset = -1; /* not used */
@@ -462,8 +491,19 @@
return URJ_STATUS_OK;
}
+static int
+ft2232_gnice_init( urj_cable_t *cable )
+{
+ return ft2232_gnice_init_common( cable, FT2232_MAX_TCK_FREQ );
+}
static int
+ft2232_gniceplus_init( urj_cable_t *cable )
+{
+ return ft2232_gnice_init_common( cable, FT2232H_MAX_TCK_FREQ );
+}
+
+static int
ft2232_oocdlinks_init (urj_cable_t *cable)
{
params_t *params = (params_t *) cable->params;
@@ -1767,6 +1807,7 @@
urj_usbconn_cable_t urj_tap_cable_usbconn_ft2232_ftdi;
urj_usbconn_cable_t urj_tap_cable_usbconn_armusbocd_ftdi;
urj_usbconn_cable_t urj_tap_cable_usbconn_gnice_ftdi;
+urj_usbconn_cable_t urj_tap_cable_usbconn_gniceplus_ftdi;
urj_usbconn_cable_t urj_tap_cable_usbconn_jtagkey_ftdi;
urj_usbconn_cable_t urj_tap_cable_usbconn_oocdlinks_ftdi;
urj_usbconn_cable_t urj_tap_cable_usbconn_turtelizer2_ftdi;
@@ -1787,6 +1828,9 @@
conn = &urj_tap_cable_usbconn_gnice_ftdi;
if (strcasecmp (conn->name, cablename) == 0)
goto found;
+ conn = &urj_tap_cable_usbconn_gniceplus_ftdi;
+ if (strcasecmp( conn->name, cablename ) == 0)
+ goto found;
conn = &urj_tap_cable_usbconn_jtagkey_ftdi;
if (strcasecmp (conn->name, cablename) == 0)
goto found;
@@ -1920,6 +1964,44 @@
ft2232_flush,
ft2232_usbcable_help
};
+urj_cable_driver_t urj_tap_cable_ft2232_gniceplus_cable_driver = {
+ "gnICE+",
+ N_("Analog Devices Blackfin gnICE+ (FT2232H) Cable (EXPERIMENTAL)"),
+ URJ_CABLE_DEVICE_USB,
+ { .usb = ft2232_connect, },
+ urj_tap_cable_generic_disconnect,
+ ft2232_cable_free,
+ ft2232_gniceplus_init,
+ ft2232_gnice_done,
+ ft2232h_set_frequency,
+ ft2232_clock,
+ ft2232_get_tdo,
+ ft2232_transfer,
+ ft2232_set_signal,
+ urj_tap_cable_generic_get_signal,
+ ft2232_flush,
+ ft2232_usbcable_help
+};
+
+urj_usbconn_cable_t urj_tap_cable_usbconn_gniceplus_ftdi = {
+ "gnICE+", /* cable name */
+ NULL, /* string pattern, not used */
+ "ftdi-mpsse", /* default usbconn driver */
+ // 0x0456, /* VID */
+ // 0xF001 /* PID */
+ 0x15BA,
+ 0x002A
+};
+urj_usbconn_cable_t usbconn_cable_gniceplus_ftd2xx = {
+ "gnICE+", /* cable name */
+ "", /* string pattern, not used */
+ "ftd2xx-mpsse", /* default usbconn driver */
+ //0x0456, /* VID */
+ //0xF001 /* PID */
+ 0x15BA,
+ 0x002A
+};
+
urj_usbconn_cable_t urj_tap_cable_usbconn_gnice_ftdi = {
"gnICE", /* cable name */
NULL, /* string pattern, not used */
@@ -2089,15 +2171,15 @@
"Signalyzer", /* cable name */
NULL, /* string pattern, not used */
"ftdi-mpsse", /* default usbconn driver */
- 0x0000, /* VID */
- 0x0000 /* PID */
+ 0x0403, /* VID */
+ 0xbca1 /* PID */
};
urj_usbconn_cable_t urj_tap_cable_usbconn_signalyzer_ftd2xx = {
"Signalyzer", /* cable name */
NULL, /* string pattern, not used */
"ftd2xx-mpsse", /* default usbconn driver */
- 0x0000, /* VID */
- 0x0000 /* PID */
+ 0x0403, /* VID */
+ 0xbca1 /* PID */
};
urj_cable_driver_t urj_tap_cable_ft2232_flyswatter_driver = {
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________
UrJTAG-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/urjtag-development