X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fft2232.c;h=621da8e21807ee3b579ed7b0fbfbb287628063e1;hp=1997aeb6525159aa981089dc0fdbd40eb877c7bb;hb=f60d42b0e2d7c1bde4f75cf5fcaeddf11d21f7ed;hpb=951d1850494a404f775c141e44376d42760563c9
diff --git a/src/jtag/drivers/ft2232.c b/src/jtag/drivers/ft2232.c
index 1997aeb652..621da8e218 100644
--- a/src/jtag/drivers/ft2232.c
+++ b/src/jtag/drivers/ft2232.c
@@ -22,9 +22,7 @@
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
-* along with this program; if not, write to the *
-* Free Software Foundation, Inc., *
-* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+* along with this program. If not, see . *
***************************************************************************/
/**
@@ -135,7 +133,7 @@ enum ftdi_interface {
#if BUILD_FT2232_FTD2XX == 1
enum { FT_DEVICE_2232H = 6, FT_DEVICE_4232H, FT_DEVICE_232H };
#elif BUILD_FT2232_LIBFTDI == 1
- enum { TYPE_2232H = 4, TYPE_4232H = 5, TYPE_232H = 6 };
+ enum ftdi_chip_type { TYPE_2232H = 4, TYPE_4232H = 5, TYPE_232H = 6 };
#endif
#endif
@@ -156,6 +154,7 @@ static char *ft2232_device_desc;
static char *ft2232_serial;
static uint8_t ft2232_latency = 2;
static unsigned ft2232_max_tck = FTDI_2232C_MAX_TCK;
+static int ft2232_channel = INTERFACE_ANY;
#define MAX_USB_IDS 8
/* vid = pid = 0 marks the end of the list */
@@ -163,7 +162,7 @@ static uint16_t ft2232_vid[MAX_USB_IDS + 1] = { 0x0403, 0 };
static uint16_t ft2232_pid[MAX_USB_IDS + 1] = { 0x6010, 0 };
struct ft2232_layout {
- char *name;
+ const char *name;
int (*init)(void);
void (*reset)(int trst, int srst);
void (*blink)(void);
@@ -1060,7 +1059,8 @@ static void ft2232_add_scan(bool ir_scan, enum scan_type type, uint8_t *buffer,
/* LOG_DEBUG("added TDI bits (i %i)", bits_left - 1); */
}
buffer_write(0x0);
- buffer_write(last_bit);
+ if (type != SCAN_IN)
+ buffer_write(last_bit);
} else {
int tms_bits;
int tms_count;
@@ -1106,6 +1106,11 @@ static int ft2232_large_scan(struct scan_command *cmd,
int retval;
int thisrun_read = 0;
+ if (!receive_buffer) {
+ LOG_ERROR("failed to allocate memory");
+ exit(-1);
+ }
+
if (cmd->ir_scan) {
LOG_ERROR("BUG: large IR scans are not supported");
exit(-1);
@@ -1271,6 +1276,8 @@ static int ft2232_large_scan(struct scan_command *cmd,
(int)bytes_read);
}
+ free(receive_buffer);
+
return ERROR_OK;
}
@@ -1502,7 +1509,8 @@ static void minimodule_reset(int trst, int srst)
static void turtle_reset(int trst, int srst)
{
- trst = trst;
+ if (trst == 1)
+ LOG_ERROR("Can't assert TRST: the adapter lacks this signal");
if (srst == 1)
low_output |= nSRST;
@@ -2331,6 +2339,11 @@ static int ft2232_init(void)
int retval;
uint32_t bytes_written;
+ LOG_WARNING("Using DEPRECATED interface driver 'ft2232'");
+#if BUILD_FTDI
+ LOG_INFO("Consider using the 'ftdi' interface driver, with configuration files in interface/ftdi/...");
+#endif
+
if (tap_get_tms_path_len(TAP_IRPAUSE, TAP_IRPAUSE) == 7)
LOG_DEBUG("ft2232 interface using 7 step jtag state transitions");
else
@@ -2358,7 +2371,7 @@ static int ft2232_init(void)
more, &try_more);
#elif BUILD_FT2232_LIBFTDI == 1
retval = ft2232_init_libftdi(ft2232_vid[i], ft2232_pid[i],
- more, &try_more, layout->channel);
+ more, &try_more, ft2232_channel);
#endif
if (retval >= 0)
break;
@@ -3132,9 +3145,8 @@ static void flossjtag_blink(void)
static int ft2232_quit(void)
{
#if BUILD_FT2232_FTD2XX == 1
- FT_STATUS status;
- status = FT_Close(ftdih);
+ FT_Close(ftdih);
#elif BUILD_FT2232_LIBFTDI == 1
ftdi_usb_close(&ftdic);
@@ -3203,6 +3215,7 @@ COMMAND_HANDLER(ft2232_handle_layout_command)
for (const struct ft2232_layout *l = ft2232_layouts; l->name; l++) {
if (strcmp(l->name, CMD_ARGV[0]) == 0) {
layout = l;
+ ft2232_channel = l->channel;
return ERROR_OK;
}
}
@@ -3251,6 +3264,18 @@ COMMAND_HANDLER(ft2232_handle_latency_command)
return ERROR_OK;
}
+COMMAND_HANDLER(ft2232_handle_channel_command)
+{
+ if (CMD_ARGC == 1) {
+ ft2232_channel = atoi(CMD_ARGV[0]);
+ if (ft2232_channel < 0 || ft2232_channel > 4)
+ LOG_ERROR("ft2232_channel must be in the 0 to 4 range");
+ } else
+ LOG_ERROR("expected exactly one argument to ft2232_channel ");
+
+ return ERROR_OK;
+}
+
static int ft2232_stableclocks(int num_cycles, struct jtag_command *cmd)
{
int retval = 0;
@@ -4258,6 +4283,13 @@ static const struct command_registration ft2232_command_handlers[] = {
.help = "set the FT2232 latency timer to a new value",
.usage = "value",
},
+ {
+ .name = "ft2232_channel",
+ .handler = &ft2232_handle_channel_command,
+ .mode = COMMAND_CONFIG,
+ .help = "set the FT2232 channel to a new value",
+ .usage = "value",
+ },
COMMAND_REGISTRATION_DONE
};