diff --git a/src/ftdiJtagMPSSE.cpp b/src/ftdiJtagMPSSE.cpp index 85a88a6..15635a7 100644 --- a/src/ftdiJtagMPSSE.cpp +++ b/src/ftdiJtagMPSSE.cpp @@ -61,20 +61,9 @@ FtdiJtagMPSSE::~FtdiJtagMPSSE() void FtdiJtagMPSSE::init_internal(const FTDIpp_MPSSE::mpsse_bit_config &cable) { - /* search for iProduct -> need to have - * ftdi->usb_dev (libusb_device_handler) -> libusb_device -> - * libusb_device_descriptor - */ - struct libusb_device * usb_dev = libusb_get_device(_ftdi->usb_dev); - struct libusb_device_descriptor usb_desc; - unsigned char iProduct[200]; - libusb_get_device_descriptor(usb_dev, &usb_desc); - libusb_get_string_descriptor_ascii(_ftdi->usb_dev, usb_desc.iProduct, - iProduct, 200); + display("iProduct : %s\n", _iproduct); - display("iProduct : %s\n", iProduct); - - if (!strncmp((const char *)iProduct, "Sipeed-Debug", 12)) { + if (!strncmp((const char *)_iproduct, "Sipeed-Debug", 12)) { _ch552WA = true; } @@ -96,12 +85,21 @@ int FtdiJtagMPSSE::setClkFreq(uint32_t clkHZ) { void FtdiJtagMPSSE::config_edge() { - if (FTDIpp_MPSSE::getClkFreq() < 15000000) { + /* at high (>15MHz) with digilent cable (arty) + * opposite edges must be used. + * Not required with classic FT2232 + */ + if (!strncmp((const char *)_iproduct, "Digilent USB Device", 19)) { + if (FTDIpp_MPSSE::getClkFreq() < 15000000) { + _write_mode = MPSSE_WRITE_NEG; + _read_mode = 0; + } else { + _write_mode = 0; + _read_mode = MPSSE_READ_NEG; + } + } else { _write_mode = MPSSE_WRITE_NEG; _read_mode = 0; - } else { - _write_mode = 0; - _read_mode = MPSSE_READ_NEG; } } diff --git a/src/ftdipp_mpsse.cpp b/src/ftdipp_mpsse.cpp index 3990a64..6bf8102 100644 --- a/src/ftdipp_mpsse.cpp +++ b/src/ftdipp_mpsse.cpp @@ -52,6 +52,16 @@ FTDIpp_MPSSE::FTDIpp_MPSSE(const mpsse_bit_config &cable, const string &dev, cout << "_buffer malloc failed" << endl; throw std::runtime_error("_buffer malloc failed"); } + + /* search for iProduct -> need to have + * ftdi->usb_dev (libusb_device_handler) -> libusb_device -> + * libusb_device_descriptor + */ + struct libusb_device * usb_dev = libusb_get_device(_ftdi->usb_dev); + struct libusb_device_descriptor usb_desc; + libusb_get_device_descriptor(usb_dev, &usb_desc); + libusb_get_string_descriptor_ascii(_ftdi->usb_dev, usb_desc.iProduct, + _iproduct, 200); } FTDIpp_MPSSE::~FTDIpp_MPSSE() diff --git a/src/ftdipp_mpsse.hpp b/src/ftdipp_mpsse.hpp index 4d4e8eb..9919329 100644 --- a/src/ftdipp_mpsse.hpp +++ b/src/ftdipp_mpsse.hpp @@ -84,6 +84,7 @@ class FTDIpp_MPSSE { int _buffer_size; int _num; unsigned char *_buffer; + uint8_t _iproduct[200]; }; #endif