Commit 4a64820f authored by Mariano Alvira's avatar Mariano Alvira Committed by David Brownell
Browse files

ft2232: add a mechanism to specify channel in layout structs



FT2232-family chips have two or more MPSSE modules.   FTDI documentation
calls these channels.  JTAG adapter drivers thus need to be able to choose
which channel to use.  (For example, one channel may connect to a board's
microcontroller, while another connects to a CPLD.)

Since each channel has its own USB interface, libftdi (somewhat confusingly)
identifies channels using INTERFACE_* symbols.  Most boards use INTERFACE_A
for JTAG, which is the default in OpenOCD.  But some wire up a different one.

Note that there are two facets of what makes a wiring "layout":

 - The mapping between debug signals map and channel signals ... embedded
   in C functions.

 - Label used in Tcl configuration scripts ... part of the "layout" structure.

By letting the channel be part of the layout struct, we permit sharing the C
functions between Tcl-visible layouts, when those signal mappings are reused.
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
parent 79010bf3
...@@ -145,6 +145,7 @@ struct ft2232_layout { ...@@ -145,6 +145,7 @@ struct ft2232_layout {
int (*init)(void); int (*init)(void);
void (*reset)(int trst, int srst); void (*reset)(int trst, int srst);
void (*blink)(void); void (*blink)(void);
int channel;
}; };
/* init procedures for supported layouts */ /* init procedures for supported layouts */
...@@ -2062,7 +2063,7 @@ static int ft2232_purge_ftd2xx(void) ...@@ -2062,7 +2063,7 @@ static int ft2232_purge_ftd2xx(void)
#endif /* BUILD_FT2232_FTD2XX == 1 */ #endif /* BUILD_FT2232_FTD2XX == 1 */
#if BUILD_FT2232_LIBFTDI == 1 #if BUILD_FT2232_LIBFTDI == 1
static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int* try_more) static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int* try_more, int channel)
{ {
uint8_t latency_timer; uint8_t latency_timer;
...@@ -2072,7 +2073,10 @@ static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int* try_mo ...@@ -2072,7 +2073,10 @@ static int ft2232_init_libftdi(uint16_t vid, uint16_t pid, int more, int* try_mo
if (ftdi_init(&ftdic) < 0) if (ftdi_init(&ftdic) < 0)
return ERROR_JTAG_INIT_FAILED; return ERROR_JTAG_INIT_FAILED;
if (ftdi_set_interface(&ftdic, INTERFACE_A) < 0) /* default to INTERFACE_A */
if(channel == INTERFACE_ANY) { channel = INTERFACE_A; }
if (ftdi_set_interface(&ftdic, channel) < 0)
{ {
LOG_ERROR("unable to select FT2232 channel A: %s", ftdic.error_str); LOG_ERROR("unable to select FT2232 channel A: %s", ftdic.error_str);
return ERROR_JTAG_INIT_FAILED; return ERROR_JTAG_INIT_FAILED;
...@@ -2197,7 +2201,7 @@ static int ft2232_init(void) ...@@ -2197,7 +2201,7 @@ static int ft2232_init(void)
more, &try_more); more, &try_more);
#elif BUILD_FT2232_LIBFTDI == 1 #elif BUILD_FT2232_LIBFTDI == 1
retval = ft2232_init_libftdi(ft2232_vid[i], ft2232_pid[i], retval = ft2232_init_libftdi(ft2232_vid[i], ft2232_pid[i],
more, &try_more); more, &try_more, cur_layout->channel);
#endif #endif
if (retval >= 0) if (retval >= 0)
break; break;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment