diff --git a/src/platforms/hosted/ftdi_bmp.c b/src/platforms/hosted/ftdi_bmp.c index 7ff6485..621ae5d 100644 --- a/src/platforms/hosted/ftdi_bmp.c +++ b/src/platforms/hosted/ftdi_bmp.c @@ -296,8 +296,11 @@ int ftdi_bmp_init(BMP_CL_OPTIONS_t *cl_opts, bmp_info_t *info) DEBUG_INFO("Using external resistor SWD\n"); active_cable->mpsse_swd_read.set_data_low = MPSSE_DO; active_cable->mpsse_swd_write.set_data_low = MPSSE_DO; - } - + } else if (!libftdi_swd_possible(NULL, NULL) && + !cl_opts->opt_usejtag) { + DEBUG_WARN("SWD with cable not possible, trying JTAG\n"); + cl_opts->opt_usejtag = true; + } if(ftdic) { ftdi_usb_close(ftdic); ftdi_free(ftdic); @@ -457,7 +460,7 @@ void libftdi_buffer_flush(void) { if (!bufptr) return; - DEBUG_WIRE("Flush\n"); + DEBUG_WIRE("Flush %d\n", bufptr); #if defined(USE_USB_VERSION_BIT) static struct ftdi_transfer_control *tc_write = NULL; if (tc_write) diff --git a/src/platforms/hosted/ftdi_bmp.h b/src/platforms/hosted/ftdi_bmp.h index fab102a..fc2a8de 100644 --- a/src/platforms/hosted/ftdi_bmp.h +++ b/src/platforms/hosted/ftdi_bmp.h @@ -113,6 +113,7 @@ int libftdi_buffer_read(uint8_t *data, int size); const char *libftdi_target_voltage(void); void libftdi_jtagtap_tdi_tdo_seq( uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int ticks); +bool libftdi_swd_possible(bool *do_mpsse, bool *direct_bb_swd); #define MPSSE_SK 1 #define PIN0 1 diff --git a/src/platforms/hosted/libftdi_swdptap.c b/src/platforms/hosted/libftdi_swdptap.c index 1a72aa6..575b713 100644 --- a/src/platforms/hosted/libftdi_swdptap.c +++ b/src/platforms/hosted/libftdi_swdptap.c @@ -127,7 +127,7 @@ static uint32_t swdptap_seq_in(int ticks); static void swdptap_seq_out(uint32_t MS, int ticks); static void swdptap_seq_out_parity(uint32_t MS, int ticks); -int libftdi_swdptap_init(swd_proc_t *swd_proc) +bool libftdi_swd_possible(bool *do_mpsse, bool *direct_bb_swd) { bool swd_read = active_cable->mpsse_swd_read.set_data_low || @@ -139,8 +139,10 @@ int libftdi_swdptap_init(swd_proc_t *swd_proc) active_cable->mpsse_swd_write.clr_data_low || active_cable->mpsse_swd_write.set_data_high || active_cable->mpsse_swd_write.clr_data_high; - do_mpsse = swd_read && swd_write; - if (!do_mpsse) { + bool mpsse = swd_read && swd_write; + if (do_mpsse) + *do_mpsse = mpsse; + if (!mpsse) { bool bb_swd_read = active_cable->bb_swd_read.set_data_low || active_cable->bb_swd_read.clr_data_low || @@ -155,13 +157,20 @@ int libftdi_swdptap_init(swd_proc_t *swd_proc) active_cable->bb_swdio_in_port_cmd == GET_BITS_LOW && active_cable->bb_swdio_in_pin == MPSSE_CS; if (!bb_swd_read && !bb_swd_write) { - if (bb_direct_possible) - direct_bb_swd = true; - else { - DEBUG_WARN("SWD not possible or missing item in cable description.\n"); - return -1; - } + if (!bb_direct_possible) + return false; } + if (direct_bb_swd) + *direct_bb_swd = true; + } + return true; +} + +int libftdi_swdptap_init(swd_proc_t *swd_proc) +{ + if (!libftdi_swd_possible(&do_mpsse, &direct_bb_swd)) { + DEBUG_WARN("SWD not possible or missing item in cable description.\n"); + return -1; } active_state.data_low |= MPSSE_CS | MPSSE_DI | MPSSE_DO; active_state.data_low &= MPSSE_SK;