diff --git a/src/ftdiJtagBitbang.cpp b/src/ftdiJtagBitbang.cpp index e16d1bb..1690fec 100644 --- a/src/ftdiJtagBitbang.cpp +++ b/src/ftdiJtagBitbang.cpp @@ -42,14 +42,14 @@ using namespace std; FtdiJtagBitBang::FtdiJtagBitBang(const FTDIpp_MPSSE::mpsse_bit_config &cable, const jtag_pins_conf_t *pin_conf, string dev, uint32_t clkHZ, bool verbose): - FTDIpp_MPSSE(dev, cable.interface, clkHZ, verbose), _bitmode(0), _nb_bit(0) + FTDIpp_MPSSE(cable, dev, clkHZ, verbose), _bitmode(0), _nb_bit(0) { init_internal(cable, pin_conf); } FtdiJtagBitBang::FtdiJtagBitBang(const FTDIpp_MPSSE::mpsse_bit_config &cable, const jtag_pins_conf_t *pin_conf, uint32_t clkHZ, bool verbose): - FTDIpp_MPSSE(cable.vid, cable.pid, cable.interface, clkHZ, verbose), + FTDIpp_MPSSE(cable, clkHZ, verbose), _bitmode(0), _nb_bit(0) { init_internal(cable, pin_conf); diff --git a/src/ftdiJtagMPSSE.cpp b/src/ftdiJtagMPSSE.cpp index ef017b4..b2e0427 100644 --- a/src/ftdiJtagMPSSE.cpp +++ b/src/ftdiJtagMPSSE.cpp @@ -42,14 +42,14 @@ using namespace std; FtdiJtagMPSSE::FtdiJtagMPSSE(const FTDIpp_MPSSE::mpsse_bit_config &cable, string dev, uint32_t clkHZ, bool verbose): - FTDIpp_MPSSE(dev, cable.interface, clkHZ, verbose), _ch552WA(false) + FTDIpp_MPSSE(cable, dev, clkHZ, verbose), _ch552WA(false) { init_internal(cable); } FtdiJtagMPSSE::FtdiJtagMPSSE(const FTDIpp_MPSSE::mpsse_bit_config &cable, uint32_t clkHZ, bool verbose): - FTDIpp_MPSSE(cable.vid, cable.pid, cable.interface, clkHZ, verbose), + FTDIpp_MPSSE(cable, clkHZ, verbose), _ch552WA(false) { init_internal(cable); diff --git a/src/ftdipp_mpsse.cpp b/src/ftdipp_mpsse.cpp index b8a9e9b..dd1ccee 100644 --- a/src/ftdipp_mpsse.cpp +++ b/src/ftdipp_mpsse.cpp @@ -18,14 +18,20 @@ using namespace std; #define display(...) \ do { if (_verbose) fprintf(stdout, __VA_ARGS__);}while(0) -FTDIpp_MPSSE::FTDIpp_MPSSE(const string &dev, unsigned char interface, +FTDIpp_MPSSE::FTDIpp_MPSSE(const mpsse_bit_config &cable, const string &dev, uint32_t clkHZ, bool verbose):_verbose(verbose), _vid(0), - _pid(0), _bus(-1), _addr(-1), _product(""), _interface(interface), + _pid(0), _bus(-1), _addr(-1), _product(""), + _interface(cable.interface), _clkHZ(clkHZ), _buffer_size(2*32768), _num(0) { - if (!search_with_dev(dev)) { - cerr << "No cable found" << endl; - throw std::exception(); + if (!dev.empty()) { + if (!search_with_dev(dev)) { + cerr << "No cable found" << endl; + throw std::exception(); + } + } else { + _vid = cable.vid; + _pid = cable.pid; } open_device(115200); @@ -38,10 +44,10 @@ FTDIpp_MPSSE::FTDIpp_MPSSE(const string &dev, unsigned char interface, } } -FTDIpp_MPSSE::FTDIpp_MPSSE(int vid, int pid, unsigned char interface, - uint32_t clkHZ, bool verbose):_verbose(verbose), _vid(vid), - _pid(pid), _bus(-1), - _addr(-1), _product(""), _interface(interface), +FTDIpp_MPSSE::FTDIpp_MPSSE(const mpsse_bit_config &cable, + uint32_t clkHZ, bool verbose):_verbose(verbose), + _vid(cable.vid), _pid(cable.pid), _bus(-1), + _addr(-1), _product(""), _interface(cable.interface), _clkHZ(clkHZ), _buffer_size(2*32768), _num(0) { open_device(115200); @@ -186,6 +192,9 @@ int FTDIpp_MPSSE::init(unsigned char latency, unsigned char bitmask_mode, mpsse_write(); } + ftdi_read_data_set_chunksize(_ftdi, _buffer_size); + ftdi_write_data_set_chunksize(_ftdi, _buffer_size); + return 0; } @@ -242,6 +251,7 @@ int FTDIpp_MPSSE::setClkFreq(uint32_t clkHZ, char use_divide_by_5) return -1; } ret = ftdi_read_data(_ftdi, buffer, 4); + ftdi_usb_purge_buffers(_ftdi); return real_freq; } diff --git a/src/ftdipp_mpsse.hpp b/src/ftdipp_mpsse.hpp index e8f665b..247ba25 100644 --- a/src/ftdipp_mpsse.hpp +++ b/src/ftdipp_mpsse.hpp @@ -5,12 +5,6 @@ class FTDIpp_MPSSE { public: - FTDIpp_MPSSE(const std::string &dev, unsigned char interface, - uint32_t clkHZ, bool verbose = false); - FTDIpp_MPSSE(int vid, int pid, unsigned char interface, - uint32_t clkHZ, bool verbose = false); - ~FTDIpp_MPSSE(); - typedef struct { int vid; int pid; @@ -21,6 +15,12 @@ class FTDIpp_MPSSE { int bit_high_dir; } mpsse_bit_config; + FTDIpp_MPSSE(const mpsse_bit_config &cable, const std::string &dev, + uint32_t clkHZ, bool verbose = false); + FTDIpp_MPSSE(const mpsse_bit_config &cablen, + uint32_t clkHZ, bool verbose = false); + ~FTDIpp_MPSSE(); + int init(unsigned char latency, unsigned char bitmask_mode, unsigned char mode, mpsse_bit_config &bit_conf); int setClkFreq(uint32_t clkHZ); diff --git a/src/ftdispi.cpp b/src/ftdispi.cpp index 92baaa6..913defe 100644 --- a/src/ftdispi.cpp +++ b/src/ftdispi.cpp @@ -62,11 +62,11 @@ void FtdiSpi::setMode(uint8_t mode) } static FTDIpp_MPSSE::mpsse_bit_config bit_conf = - {0x08, 0x0B, 0x08, 0x0B}; + {0x403, 0x6010, INTERFACE_B, 0x08, 0x0B, 0x08, 0x0B}; FtdiSpi::FtdiSpi(int vid, int pid, unsigned char interface, uint32_t clkHZ, bool verbose): - FTDIpp_MPSSE(vid, pid, interface, clkHZ, verbose) + FTDIpp_MPSSE(bit_conf, clkHZ, verbose) { setCSmode(SPI_CS_AUTO); setEndianness(SPI_MSB_FIRST); diff --git a/src/jtag.cpp b/src/jtag.cpp index 0090b6b..97e5372 100644 --- a/src/jtag.cpp +++ b/src/jtag.cpp @@ -80,7 +80,7 @@ Jtag::Jtag(cable_t &cable, const jtag_pins_conf_t *pin_conf, _tms_buffer_size(128), _num_tms(0), _board_name("nope") { - init_internal(cable, NULL, pin_conf, clkHZ); + init_internal(cable, "", pin_conf, clkHZ); } Jtag::~Jtag()