jtag: improving jtag chain detection: now searching for masked and unmasked idcode
This commit is contained in:
parent
54a555855f
commit
1f59dfd671
55
src/jtag.cpp
55
src/jtag.cpp
|
|
@ -135,34 +135,28 @@ int Jtag::detectChain(int max_dev)
|
||||||
tmp = 0;
|
tmp = 0;
|
||||||
for (int ii=0; ii < 4; ii++)
|
for (int ii=0; ii < 4; ii++)
|
||||||
tmp |= (rx_buff[ii] << (8*ii));
|
tmp |= (rx_buff[ii] << (8*ii));
|
||||||
|
|
||||||
|
/* search IDCODE in fpga_list and misc_dev_list
|
||||||
|
* since most device have idcode with high nibble masked
|
||||||
|
* we start to search sub IDCODE
|
||||||
|
* if IDCODE has no match: try the same with version unmasked
|
||||||
|
*/
|
||||||
if (tmp != 0 && tmp != 0xffffffff) {
|
if (tmp != 0 && tmp != 0xffffffff) {
|
||||||
|
bool found = false;
|
||||||
/* ckeck highest nibble to prevent confusion between Cologne Chip
|
/* ckeck highest nibble to prevent confusion between Cologne Chip
|
||||||
* GateMate and Efinix Trion T4/T8 devices
|
* GateMate and Efinix Trion T4/T8 devices
|
||||||
*/
|
*/
|
||||||
if (tmp != 0x20000001)
|
if (tmp != 0x20000001)
|
||||||
tmp &= 0x0fffffff;
|
found = search_and_insert_device_with_idcode(tmp & 0x0fffffff);
|
||||||
else
|
if (!found) /* if masked not found -> search for full */
|
||||||
tmp &= 0xffffffff;
|
found = search_and_insert_device_with_idcode(tmp);
|
||||||
_devices_list.insert(_devices_list.begin(), tmp);
|
|
||||||
|
|
||||||
/* search for irlength in fpga_list or misc_dev_list */
|
if (!found) {
|
||||||
uint16_t irlength = -1;
|
char error[256];
|
||||||
auto dev = fpga_list.find(tmp);
|
snprintf(error, 256, "Unknown device with IDCODE: 0x%08x",
|
||||||
if (dev == fpga_list.end()) {
|
tmp);
|
||||||
auto misc = misc_dev_list.find(tmp);
|
throw std::runtime_error(error);
|
||||||
if (misc != misc_dev_list.end()) {
|
|
||||||
irlength = misc->second.irlength;
|
|
||||||
} else {
|
|
||||||
char error[256];
|
|
||||||
snprintf(error, 256, "Unknown device with IDCODE: 0x%08x",
|
|
||||||
tmp);
|
|
||||||
throw std::runtime_error(error);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
irlength = dev->second.irlength;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_irlength_list.insert(_irlength_list.begin(), irlength);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
go_test_logic_reset();
|
go_test_logic_reset();
|
||||||
|
|
@ -170,6 +164,25 @@ int Jtag::detectChain(int max_dev)
|
||||||
return _devices_list.size();
|
return _devices_list.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Jtag::search_and_insert_device_with_idcode(uint32_t idcode)
|
||||||
|
{
|
||||||
|
int irlength = -1;
|
||||||
|
auto dev = fpga_list.find(idcode);
|
||||||
|
if (dev != fpga_list.end())
|
||||||
|
irlength = dev->second.irlength;
|
||||||
|
if (irlength == -1) {
|
||||||
|
auto misc = misc_dev_list.find(idcode);
|
||||||
|
if (misc != misc_dev_list.end())
|
||||||
|
irlength = misc->second.irlength;
|
||||||
|
}
|
||||||
|
if (irlength == -1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
_devices_list.insert(_devices_list.begin(), idcode);
|
||||||
|
_irlength_list.insert(_irlength_list.begin(), irlength);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t Jtag::device_select(uint16_t index)
|
uint16_t Jtag::device_select(uint16_t index)
|
||||||
{
|
{
|
||||||
if (index > (uint16_t) _devices_list.size())
|
if (index > (uint16_t) _devices_list.size())
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,14 @@ class Jtag {
|
||||||
void init_internal(cable_t &cable, const std::string &dev, const std::string &serial,
|
void init_internal(cable_t &cable, const std::string &dev, const std::string &serial,
|
||||||
const jtag_pins_conf_t *pin_conf, uint32_t clkHZ,
|
const jtag_pins_conf_t *pin_conf, uint32_t clkHZ,
|
||||||
const std::string &firmware_path);
|
const std::string &firmware_path);
|
||||||
|
/*!
|
||||||
|
* \brief search in fpga_list and misc_dev_list for a device with idcode
|
||||||
|
* if found insert idcode and irlength in _devices_list and
|
||||||
|
* _irlength_list
|
||||||
|
* \param[in] idcode: device idcode
|
||||||
|
* \return false if not found, true otherwise
|
||||||
|
*/
|
||||||
|
bool search_and_insert_device_with_idcode(uint32_t idcode);
|
||||||
int8_t _verbose;
|
int8_t _verbose;
|
||||||
int _state;
|
int _state;
|
||||||
int _tms_buffer_size;
|
int _tms_buffer_size;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue