hosted/ftdi: Autodetect ftdi cables with distinguishing feature.
This commit is contained in:
parent
a83e76bef9
commit
7b497302c0
|
@ -150,7 +150,8 @@ cable_desc_t cable_desc[] = {
|
||||||
.jtag.set_data_low = PIN6,
|
.jtag.set_data_low = PIN6,
|
||||||
.target_voltage_cmd = GET_BITS_HIGH,
|
.target_voltage_cmd = GET_BITS_HIGH,
|
||||||
.target_voltage_pin = ~PIN2,
|
.target_voltage_pin = ~PIN2,
|
||||||
.name = "ftdiswd"
|
.name = "ftdiswd",
|
||||||
|
.description = "FTDISWD"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.vendor = 0x15b1,
|
.vendor = 0x15b1,
|
||||||
|
@ -179,7 +180,8 @@ cable_desc_t cable_desc[] = {
|
||||||
.deassert_srst.data_low = ~PIN6,
|
.deassert_srst.data_low = ~PIN6,
|
||||||
.srst_get_port_cmd = GET_BITS_HIGH,
|
.srst_get_port_cmd = GET_BITS_HIGH,
|
||||||
.srst_get_pin = PIN0,
|
.srst_get_pin = PIN0,
|
||||||
.name = "turtelizer"
|
.name = "turtelizer",
|
||||||
|
.description = "Turtelizer JTAG/RS232 Adapter"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
/* https://reference.digilentinc.com/jtag_hs1/jtag_hs1
|
/* https://reference.digilentinc.com/jtag_hs1/jtag_hs1
|
||||||
|
@ -247,23 +249,25 @@ cable_desc_t cable_desc[] = {
|
||||||
.init.ddr_high = PIN4 | PIN3 | PIN1 | PIN0,
|
.init.ddr_high = PIN4 | PIN3 | PIN1 | PIN0,
|
||||||
.name = "arm-usb-ocd-h"
|
.name = "arm-usb-ocd-h"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
int ftdi_bmp_init(BMP_CL_OPTIONS_t *cl_opts, bmp_info_t *info)
|
int ftdi_bmp_init(BMP_CL_OPTIONS_t *cl_opts, bmp_info_t *info)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
unsigned index = 0;
|
cable_desc_t *cable = &cable_desc[0];
|
||||||
for(index = 0; index < sizeof(cable_desc)/sizeof(cable_desc[0]);
|
for(; cable->name; cable++) {
|
||||||
index++)
|
if (strcmp(cable->name, cl_opts->opt_cable) == 0)
|
||||||
if (strcmp(cable_desc[index].name, cl_opts->opt_cable) == 0)
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (index == sizeof(cable_desc)/sizeof(cable_desc[0])) {
|
if (!cable->name ) {
|
||||||
DEBUG_WARN( "No cable matching %s found\n", cl_opts->opt_cable);
|
DEBUG_WARN( "No cable matching found for %s\n", cl_opts->opt_cable);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
active_cable = &cable_desc[index];
|
active_cable = cable;
|
||||||
memcpy(&active_state, &active_cable->init, sizeof(data_desc_t));
|
memcpy(&active_state, &active_cable->init, sizeof(data_desc_t));
|
||||||
/* If swd_(read|write) is not given for the selected cable and
|
/* If swd_(read|write) is not given for the selected cable and
|
||||||
the 'r' command line argument is give, assume resistor SWD
|
the 'r' command line argument is give, assume resistor SWD
|
||||||
|
@ -282,7 +286,6 @@ int ftdi_bmp_init(BMP_CL_OPTIONS_t *cl_opts, bmp_info_t *info)
|
||||||
active_cable->mpsse_swd_write.set_data_low = MPSSE_DO;
|
active_cable->mpsse_swd_write.set_data_low = MPSSE_DO;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_WARN("Black Magic Probe for FTDI/MPSSE\n");
|
|
||||||
if(ftdic) {
|
if(ftdic) {
|
||||||
ftdi_usb_close(ftdic);
|
ftdi_usb_close(ftdic);
|
||||||
ftdi_free(ftdic);
|
ftdi_free(ftdic);
|
||||||
|
|
|
@ -98,6 +98,7 @@ typedef struct cable_desc_s {
|
||||||
char * name;
|
char * name;
|
||||||
}cable_desc_t;
|
}cable_desc_t;
|
||||||
|
|
||||||
|
extern cable_desc_t cable_desc[];
|
||||||
extern cable_desc_t *active_cable;
|
extern cable_desc_t *active_cable;
|
||||||
extern struct ftdi_context *ftdic;
|
extern struct ftdi_context *ftdic;
|
||||||
extern data_desc_t active_state;
|
extern data_desc_t active_state;
|
||||||
|
|
|
@ -98,6 +98,8 @@ static int find_debuggers( BMP_CL_OPTIONS_t *cl_opts,bmp_info_t *info)
|
||||||
char product[128];
|
char product[128];
|
||||||
bmp_type_t type = BMP_TYPE_NONE;
|
bmp_type_t type = BMP_TYPE_NONE;
|
||||||
bool access_problems = false;
|
bool access_problems = false;
|
||||||
|
char *active_cable = NULL;
|
||||||
|
bool ftdi_unknown = false;
|
||||||
rescan:
|
rescan:
|
||||||
found_debuggers = 0;
|
found_debuggers = 0;
|
||||||
for (int i = 0; devs[i]; i++) {
|
for (int i = 0; devs[i]; i++) {
|
||||||
|
@ -178,12 +180,43 @@ static int find_debuggers( BMP_CL_OPTIONS_t *cl_opts,bmp_info_t *info)
|
||||||
}
|
}
|
||||||
} else if (desc.idVendor == VENDOR_ID_SEGGER) {
|
} else if (desc.idVendor == VENDOR_ID_SEGGER) {
|
||||||
type = BMP_TYPE_JLINK;
|
type = BMP_TYPE_JLINK;
|
||||||
} else{
|
} else {
|
||||||
continue;
|
cable_desc_t *cable = &cable_desc[0];
|
||||||
|
for (; cable->name; cable++) {
|
||||||
|
bool found = false;
|
||||||
|
if ((cable->vendor != desc.idVendor) || (cable->product != desc.idProduct))
|
||||||
|
continue; /* VID/PID do not match*/
|
||||||
|
if (cl_opts->opt_cable) {
|
||||||
|
if (strcmp(cable->name, cl_opts->opt_cable))
|
||||||
|
continue; /* cable names do not match*/
|
||||||
|
else
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
if (cable->description) {
|
||||||
|
if (strcmp(cable->description, product))
|
||||||
|
continue; /* discriptions do not match*/
|
||||||
|
else
|
||||||
|
found = true;
|
||||||
|
} else { /* VID/PID fits, but no cl_opts->opt_cable and no description*/
|
||||||
|
if ((cable->vendor == 0x0403) && /* FTDI*/
|
||||||
|
((cable->product == 0x6010) || /* FT2232C/D/H*/
|
||||||
|
(cable->product == 0x6011) || /* FT4232H Quad HS USB-UART/FIFO IC */
|
||||||
|
(cable->product == 0x6014))) { /* FT232H Single HS USB-UART/FIFO IC */
|
||||||
|
ftdi_unknown = true;
|
||||||
|
continue; /* Cable name is needed */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
active_cable = cable->name;
|
||||||
|
type = BMP_TYPE_LIBFTDI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!cable->name)
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
found_debuggers ++;
|
|
||||||
if (report) {
|
if (report) {
|
||||||
DEBUG_WARN("%2d: %s, %s, %s\n", found_debuggers,
|
DEBUG_WARN("%2d: %s, %s, %s\n", found_debuggers + 1,
|
||||||
serial,
|
serial,
|
||||||
manufacturer,product);
|
manufacturer,product);
|
||||||
}
|
}
|
||||||
|
@ -194,11 +227,19 @@ static int find_debuggers( BMP_CL_OPTIONS_t *cl_opts,bmp_info_t *info)
|
||||||
strncpy(info->product, product, sizeof(info->product));
|
strncpy(info->product, product, sizeof(info->product));
|
||||||
strncpy(info->manufacturer, manufacturer, sizeof(info->manufacturer));
|
strncpy(info->manufacturer, manufacturer, sizeof(info->manufacturer));
|
||||||
if (cl_opts->opt_position &&
|
if (cl_opts->opt_position &&
|
||||||
(cl_opts->opt_position == found_debuggers)) {
|
(cl_opts->opt_position == (found_debuggers + 1))) {
|
||||||
found_debuggers = 1;
|
found_debuggers = 1;
|
||||||
break;
|
break;
|
||||||
|
} else {
|
||||||
|
found_debuggers++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ((found_debuggers == 0) && ftdi_unknown)
|
||||||
|
DEBUG_WARN("Generic FTDI MPSSE VID/PID found. Please specify exact type with \"-c <cable>\" !\n");
|
||||||
|
if ((found_debuggers == 1) && !cl_opts->opt_cable && (type == BMP_TYPE_LIBFTDI))
|
||||||
|
cl_opts->opt_cable = active_cable;
|
||||||
|
if (!found_debuggers && cl_opts->opt_list_only)
|
||||||
|
DEBUG_WARN("No usable debugger found\n");
|
||||||
if ((found_debuggers > 1) ||
|
if ((found_debuggers > 1) ||
|
||||||
((found_debuggers == 1) && (cl_opts->opt_list_only))) {
|
((found_debuggers == 1) && (cl_opts->opt_list_only))) {
|
||||||
if (!report) {
|
if (!report) {
|
||||||
|
@ -266,6 +307,8 @@ void platform_init(int argc, char **argv)
|
||||||
exit(-1);
|
exit(-1);
|
||||||
break;
|
break;
|
||||||
case BMP_TYPE_LIBFTDI:
|
case BMP_TYPE_LIBFTDI:
|
||||||
|
if (ftdi_bmp_init(&cl_opts, &info))
|
||||||
|
exit(-1);
|
||||||
break;
|
break;
|
||||||
case BMP_TYPE_JLINK:
|
case BMP_TYPE_JLINK:
|
||||||
if (jlink_init(&info))
|
if (jlink_init(&info))
|
||||||
|
|
Loading…
Reference in New Issue