all cable: always display real used frequency
This commit is contained in:
parent
3d29fb79fe
commit
5c49b1465a
|
|
@ -83,10 +83,6 @@ AnlogicCable::AnlogicCable(uint32_t clkHZ, bool verbose):
|
||||||
throw std::exception();
|
throw std::exception();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clkHZ > 6000000) {
|
|
||||||
printInfo("Anlogic JTAG probe limited to 6MHz");
|
|
||||||
clkHZ = 6000000;
|
|
||||||
}
|
|
||||||
if (setClkFreq(clkHZ) < 0) {
|
if (setClkFreq(clkHZ) < 0) {
|
||||||
cerr << "Fail to set frequency" << endl;
|
cerr << "Fail to set frequency" << endl;
|
||||||
throw std::exception();
|
throw std::exception();
|
||||||
|
|
@ -104,24 +100,41 @@ AnlogicCable::~AnlogicCable()
|
||||||
int AnlogicCable::setClkFreq(uint32_t clkHZ)
|
int AnlogicCable::setClkFreq(uint32_t clkHZ)
|
||||||
{
|
{
|
||||||
int actual_length;
|
int actual_length;
|
||||||
int ret;
|
int ret, req_freq = clkHZ;
|
||||||
|
|
||||||
uint8_t buf[] = {ANLOGICCABLE_FREQ_CMD, 0};
|
uint8_t buf[] = {ANLOGICCABLE_FREQ_CMD, 0};
|
||||||
if (clkHZ >= 6000000)
|
|
||||||
|
if (clkHZ > 6000000) {
|
||||||
|
printWarn("Anlogic JTAG probe limited to 6MHz");
|
||||||
|
clkHZ = 6000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clkHZ >= 6000000) {
|
||||||
buf[1] = ANLOGICCABLE_FREQ_6M;
|
buf[1] = ANLOGICCABLE_FREQ_6M;
|
||||||
else if (clkHZ >= 3000000)
|
clkHZ = 6000000;
|
||||||
|
} else if (clkHZ >= 3000000) {
|
||||||
buf[1] = ANLOGICCABLE_FREQ_3M;
|
buf[1] = ANLOGICCABLE_FREQ_3M;
|
||||||
else if (clkHZ >= 1000000)
|
clkHZ = 3000000;
|
||||||
|
} else if (clkHZ >= 1000000) {
|
||||||
buf[1] = ANLOGICCABLE_FREQ_1M;
|
buf[1] = ANLOGICCABLE_FREQ_1M;
|
||||||
else if (clkHZ >= 600000)
|
clkHZ = 1000000;
|
||||||
|
} else if (clkHZ >= 600000) {
|
||||||
buf[1] = ANLOGICCABLE_FREQ_600K;
|
buf[1] = ANLOGICCABLE_FREQ_600K;
|
||||||
else if (clkHZ >= 400000)
|
clkHZ = 600000;
|
||||||
|
} else if (clkHZ >= 400000) {
|
||||||
buf[1] = ANLOGICCABLE_FREQ_400K;
|
buf[1] = ANLOGICCABLE_FREQ_400K;
|
||||||
else if (clkHZ >= 200000)
|
clkHZ = 400000;
|
||||||
|
} else if (clkHZ >= 200000) {
|
||||||
buf[1] = ANLOGICCABLE_FREQ_200K;
|
buf[1] = ANLOGICCABLE_FREQ_200K;
|
||||||
else if (clkHZ >= 100000)
|
clkHZ = 200000;
|
||||||
|
} else if (clkHZ >= 100000) {
|
||||||
buf[1] = ANLOGICCABLE_FREQ_100K;
|
buf[1] = ANLOGICCABLE_FREQ_100K;
|
||||||
else if (clkHZ >= 90000)
|
clkHZ = 100000;
|
||||||
|
} else if (clkHZ >= 90000) {
|
||||||
buf[1] = ANLOGICCABLE_FREQ_90K;
|
buf[1] = ANLOGICCABLE_FREQ_90K;
|
||||||
|
clkHZ = 90000;
|
||||||
|
}
|
||||||
|
|
||||||
ret = libusb_bulk_transfer(dev_handle, ANLOGICCABLE_CONF_EP,
|
ret = libusb_bulk_transfer(dev_handle, ANLOGICCABLE_CONF_EP,
|
||||||
buf, 2, &actual_length, 1000);
|
buf, 2, &actual_length, 1000);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
@ -129,6 +142,9 @@ int AnlogicCable::setClkFreq(uint32_t clkHZ)
|
||||||
return -EXIT_FAILURE;
|
return -EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printWarn("Jtag frequency : requested " + std::to_string(req_freq) +
|
||||||
|
"Hz -> real " + std::to_string(clkHZ) + "Hz");
|
||||||
|
|
||||||
return clkHZ;
|
return clkHZ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -79,10 +79,6 @@ DirtyJtag::DirtyJtag(uint32_t clkHZ, bool verbose):
|
||||||
throw std::exception();
|
throw std::exception();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clkHZ > 600000) {
|
|
||||||
printInfo("DirtyJTAG probe limited to 600kHz");
|
|
||||||
clkHZ = 600000;
|
|
||||||
}
|
|
||||||
if (setClkFreq(clkHZ) < 0) {
|
if (setClkFreq(clkHZ) < 0) {
|
||||||
cerr << "Fail to set frequency" << endl;
|
cerr << "Fail to set frequency" << endl;
|
||||||
throw std::exception();
|
throw std::exception();
|
||||||
|
|
@ -100,7 +96,16 @@ DirtyJtag::~DirtyJtag()
|
||||||
int DirtyJtag::setClkFreq(uint32_t clkHZ)
|
int DirtyJtag::setClkFreq(uint32_t clkHZ)
|
||||||
{
|
{
|
||||||
int actual_length;
|
int actual_length;
|
||||||
int ret;
|
int ret, req_freq = clkHZ;
|
||||||
|
|
||||||
|
if (clkHZ > 600000) {
|
||||||
|
printWarn("DirtyJTAG probe limited to 600kHz");
|
||||||
|
clkHZ = 600000;
|
||||||
|
}
|
||||||
|
|
||||||
|
printInfo("Jtag frequency : requested " + std::to_string(req_freq) +
|
||||||
|
"Hz -> real " + std::to_string(clkHZ) + "Hz");
|
||||||
|
|
||||||
uint8_t buf[] = {CMD_FREQ,
|
uint8_t buf[] = {CMD_FREQ,
|
||||||
static_cast<uint8_t>(0xff & ((clkHZ / 1000) >> 8)),
|
static_cast<uint8_t>(0xff & ((clkHZ / 1000) >> 8)),
|
||||||
static_cast<uint8_t>(0xff & ((clkHZ / 1000) )),
|
static_cast<uint8_t>(0xff & ((clkHZ / 1000) )),
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include "display.hpp"
|
||||||
#include "ftdiJtagBitbang.hpp"
|
#include "ftdiJtagBitbang.hpp"
|
||||||
#include "ftdipp_mpsse.hpp"
|
#include "ftdipp_mpsse.hpp"
|
||||||
|
|
||||||
|
|
@ -87,8 +88,13 @@ FtdiJtagBitBang::~FtdiJtagBitBang()
|
||||||
|
|
||||||
int FtdiJtagBitBang::setClkFreq(uint32_t clkHZ)
|
int FtdiJtagBitBang::setClkFreq(uint32_t clkHZ)
|
||||||
{
|
{
|
||||||
if (clkHZ > 3000000)
|
uint32_t user_clk = clkHZ;
|
||||||
|
if (clkHZ > 3000000) {
|
||||||
|
printWarn("Jtag probe limited to 3MHz");
|
||||||
clkHZ = 3000000;
|
clkHZ = 3000000;
|
||||||
|
}
|
||||||
|
printInfo("Jtag frequency : requested " + std::to_string(user_clk) +
|
||||||
|
"Hz -> real " + std::to_string(clkHZ) + "Hz");
|
||||||
int ret = ftdi_set_baudrate(_ftdi, clkHZ);
|
int ret = ftdi_set_baudrate(_ftdi, clkHZ);
|
||||||
printf("ret %d\n", ret);
|
printf("ret %d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
#endif
|
#endif
|
||||||
#include <libusb.h>
|
#include <libusb.h>
|
||||||
|
|
||||||
|
#include "display.hpp"
|
||||||
#include "ftdipp_mpsse.hpp"
|
#include "ftdipp_mpsse.hpp"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
@ -222,31 +223,40 @@ int FTDIpp_MPSSE::setClkFreq(uint32_t clkHZ, char use_divide_by_5)
|
||||||
use_divide_by_5 = false;
|
use_divide_by_5 = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((use_divide_by_5 && _clkHZ > 6000000) || _clkHZ > 30000000) {
|
if (use_divide_by_5) {
|
||||||
fprintf(stderr, "Error: too fast frequency\n");
|
if (_clkHZ > 6000000) {
|
||||||
return -1;
|
printWarn("Jtag probe limited to 60MHz");
|
||||||
}
|
_clkHZ = 6000000;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (_clkHZ > 30000000) {
|
||||||
|
printWarn("Jtag probe limited to 30MHz");
|
||||||
|
_clkHZ = 3000000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
presc = (base_freq /(_clkHZ * 2)) -1;
|
presc = (base_freq /(_clkHZ * 2)) -1;
|
||||||
real_freq = base_freq / ((1+presc)*2);
|
real_freq = base_freq / ((1+presc)*2);
|
||||||
if (real_freq > clkHZ)
|
if (real_freq > _clkHZ)
|
||||||
presc ++;
|
presc ++;
|
||||||
real_freq = base_freq / ((1+presc)*2);
|
real_freq = base_freq / ((1+presc)*2);
|
||||||
display("presc : %d input freq : %d requested freq : %d real freq : %d\n",
|
printInfo("Jtag frequency : requested " + std::to_string(clkHZ) +
|
||||||
|
"Hz -> real " + std::to_string(real_freq) + "Hz");
|
||||||
|
display("presc : %d input freq : %d requested freq : %d real freq : %d\n",
|
||||||
presc, base_freq, _clkHZ, real_freq);
|
presc, base_freq, _clkHZ, real_freq);
|
||||||
buffer[1] = presc & 0xff;
|
buffer[1] = presc & 0xff;
|
||||||
buffer[2] = (presc >> 8) & 0xff;
|
buffer[2] = (presc >> 8) & 0xff;
|
||||||
|
|
||||||
mpsse_store(buffer, 3);
|
mpsse_store(buffer, 3);
|
||||||
ret = mpsse_write();
|
ret = mpsse_write();
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
fprintf(stderr, "Error: write for frequency return %d\n", ret);
|
fprintf(stderr, "Error: write for frequency return %d\n", ret);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
ret = ftdi_read_data(_ftdi, buffer, 4);
|
ret = ftdi_read_data(_ftdi, buffer, 4);
|
||||||
ftdi_usb_purge_buffers(_ftdi);
|
ftdi_usb_purge_buffers(_ftdi);
|
||||||
|
|
||||||
return real_freq;
|
return real_freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
int FTDIpp_MPSSE::mpsse_store(unsigned char c)
|
int FTDIpp_MPSSE::mpsse_store(unsigned char c)
|
||||||
|
|
@ -622,11 +632,11 @@ bool FTDIpp_MPSSE::search_with_dev(const string &device)
|
||||||
|
|
||||||
/* Get closest usb device parent (we need VIP/PID) */
|
/* Get closest usb device parent (we need VIP/PID) */
|
||||||
usbdeviceparent =
|
usbdeviceparent =
|
||||||
udev_device_get_parent_with_subsystem_devtype(dev, "usb",
|
udev_device_get_parent_with_subsystem_devtype(dev, "usb",
|
||||||
"usb_device");
|
"usb_device");
|
||||||
if (!usbdeviceparent) {
|
if (!usbdeviceparent) {
|
||||||
printf
|
printf
|
||||||
("Unable to find parent usb device! Is this actually an USB device ?\n");
|
("Unable to find parent usb device! Is this actually an USB device ?\n");
|
||||||
udev_device_unref(dev);
|
udev_device_unref(dev);
|
||||||
udev_unref(udev);
|
udev_unref(udev);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ class FTDIpp_MPSSE {
|
||||||
/* gpio */
|
/* gpio */
|
||||||
bool __gpio_write(bool low_pins);
|
bool __gpio_write(bool low_pins);
|
||||||
protected:
|
protected:
|
||||||
int _clkHZ;
|
uint32_t _clkHZ;
|
||||||
struct ftdi_context *_ftdi;
|
struct ftdi_context *_ftdi;
|
||||||
int _buffer_size;
|
int _buffer_size;
|
||||||
int _num;
|
int _num;
|
||||||
|
|
|
||||||
|
|
@ -118,6 +118,7 @@ void UsbBlaster::init_internal()
|
||||||
int UsbBlaster::setClkFreq(uint32_t clkHZ)
|
int UsbBlaster::setClkFreq(uint32_t clkHZ)
|
||||||
{
|
{
|
||||||
(void) clkHZ;
|
(void) clkHZ;
|
||||||
|
printWarn("USB-Blaster has a 24MHz fixed frequency");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue