Use JTAG state
This commit is contained in:
parent
1908ccd83b
commit
8976404b78
|
|
@ -101,7 +101,7 @@ void Altera::programMem(RawParser &_bit)
|
||||||
|
|
||||||
int xfer_len = 512;
|
int xfer_len = 512;
|
||||||
int tx_len;
|
int tx_len;
|
||||||
int tx_end;
|
Jtag::tapState_t tx_end;
|
||||||
|
|
||||||
for (int i=0; i < byte_length; i+=xfer_len) {
|
for (int i=0; i < byte_length; i+=xfer_len) {
|
||||||
if (i + xfer_len > byte_length) { // last packet with some size
|
if (i + xfer_len > byte_length) { // last packet with some size
|
||||||
|
|
@ -352,7 +352,7 @@ void Altera::shiftVIR(uint32_t reg)
|
||||||
}
|
}
|
||||||
|
|
||||||
void Altera::shiftVDR(uint8_t * tx, uint8_t * rx, uint32_t len,
|
void Altera::shiftVDR(uint8_t * tx, uint8_t * rx, uint32_t len,
|
||||||
int end_state, bool debug)
|
Jtag::tapState_t end_state, bool debug)
|
||||||
{
|
{
|
||||||
(void) debug;
|
(void) debug;
|
||||||
uint8_t tx_ir[2] = {USER0, 0};
|
uint8_t tx_ir[2] = {USER0, 0};
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ class Altera: public Device, SPIInterface {
|
||||||
* \param[in] end_state: next state at the end of xfer
|
* \param[in] end_state: next state at the end of xfer
|
||||||
*/
|
*/
|
||||||
void shiftVDR(uint8_t * tx, uint8_t * rx, uint32_t len,
|
void shiftVDR(uint8_t * tx, uint8_t * rx, uint32_t len,
|
||||||
int end_state = Jtag::UPDATE_DR, bool debug = false);
|
Jtag::tapState_t end_state = Jtag::UPDATE_DR, bool debug = false);
|
||||||
|
|
||||||
std::string _device_package;
|
std::string _device_package;
|
||||||
std::string _spiOverJtagPath; /**< spiOverJtag explicit path */
|
std::string _spiOverJtagPath; /**< spiOverJtag explicit path */
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ void Anlogic::program(unsigned int offset, bool unprotect_flash)
|
||||||
const uint8_t *ptr = data;
|
const uint8_t *ptr = data;
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
int xfer_len = (len > 512)?512:len;
|
int xfer_len = (len > 512)?512:len;
|
||||||
int tx_end;
|
Jtag::tapState_t tx_end;
|
||||||
if (len - xfer_len == 0)
|
if (len - xfer_len == 0)
|
||||||
tx_end = Jtag::RUN_TEST_IDLE;
|
tx_end = Jtag::RUN_TEST_IDLE;
|
||||||
else
|
else
|
||||||
|
|
|
||||||
|
|
@ -291,7 +291,8 @@ void Efinix::programSPI(unsigned int offset, const uint8_t *data,
|
||||||
|
|
||||||
void Efinix::programJTAG(const uint8_t *data, const int length)
|
void Efinix::programJTAG(const uint8_t *data, const int length)
|
||||||
{
|
{
|
||||||
int xfer_len = 512, tx_end;
|
int xfer_len = 512;
|
||||||
|
Jtag::tapState_t tx_end;
|
||||||
uint8_t tx[512];
|
uint8_t tx[512];
|
||||||
|
|
||||||
if (_fpga_family == TITANIUM_FAMILY)
|
if (_fpga_family == TITANIUM_FAMILY)
|
||||||
|
|
|
||||||
|
|
@ -632,7 +632,8 @@ bool Gowin::connectJtagToMCU()
|
||||||
/* TN653 p. 9 */
|
/* TN653 p. 9 */
|
||||||
bool Gowin::flashSRAM(const uint8_t *data, int length)
|
bool Gowin::flashSRAM(const uint8_t *data, int length)
|
||||||
{
|
{
|
||||||
int tx_len, tx_end;
|
int tx_len;
|
||||||
|
Jtag::tapState_t tx_end;
|
||||||
int byte_length = length / 8;
|
int byte_length = length / 8;
|
||||||
|
|
||||||
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
|
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
|
||||||
|
|
|
||||||
|
|
@ -317,7 +317,7 @@ void Jtag::toggleClk(int nb)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Jtag::shiftDR(const uint8_t *tdi, unsigned char *tdo, int drlen, int end_state)
|
int Jtag::shiftDR(const uint8_t *tdi, unsigned char *tdo, int drlen, tapState_t end_state)
|
||||||
{
|
{
|
||||||
/* get number of devices in the JTAG chain
|
/* get number of devices in the JTAG chain
|
||||||
* after the selected one
|
* after the selected one
|
||||||
|
|
@ -370,7 +370,7 @@ int Jtag::shiftDR(const uint8_t *tdi, unsigned char *tdo, int drlen, int end_sta
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Jtag::shiftIR(unsigned char tdi, int irlen, int end_state)
|
int Jtag::shiftIR(unsigned char tdi, int irlen, tapState_t end_state)
|
||||||
{
|
{
|
||||||
if (irlen > 8) {
|
if (irlen > 8) {
|
||||||
cerr << "Error: this method this direct char don't support more than 1 byte" << endl;
|
cerr << "Error: this method this direct char don't support more than 1 byte" << endl;
|
||||||
|
|
@ -379,7 +379,7 @@ int Jtag::shiftIR(unsigned char tdi, int irlen, int end_state)
|
||||||
return shiftIR(&tdi, NULL, irlen, end_state);
|
return shiftIR(&tdi, NULL, irlen, end_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Jtag::shiftIR(unsigned char *tdi, unsigned char *tdo, int irlen, int end_state)
|
int Jtag::shiftIR(unsigned char *tdi, unsigned char *tdo, int irlen, tapState_t end_state)
|
||||||
{
|
{
|
||||||
display("%s: avant shiftIR\n", __func__);
|
display("%s: avant shiftIR\n", __func__);
|
||||||
int bypass_after = 0;
|
int bypass_after = 0;
|
||||||
|
|
|
||||||
32
src/jtag.hpp
32
src/jtag.hpp
|
|
@ -67,22 +67,6 @@ class Jtag {
|
||||||
* \return a pointer instance of JtagInterface
|
* \return a pointer instance of JtagInterface
|
||||||
*/
|
*/
|
||||||
JtagInterface *get_ll_class() {return _jtag;}
|
JtagInterface *get_ll_class() {return _jtag;}
|
||||||
|
|
||||||
int shiftIR(unsigned char *tdi, unsigned char *tdo, int irlen,
|
|
||||||
int end_state = RUN_TEST_IDLE);
|
|
||||||
int shiftIR(unsigned char tdi, int irlen,
|
|
||||||
int end_state = RUN_TEST_IDLE);
|
|
||||||
int shiftDR(const uint8_t *tdi, unsigned char *tdo, int drlen,
|
|
||||||
int end_state = RUN_TEST_IDLE);
|
|
||||||
int read_write(const uint8_t *tdi, unsigned char *tdo, int len, char last);
|
|
||||||
|
|
||||||
void toggleClk(int nb);
|
|
||||||
void go_test_logic_reset();
|
|
||||||
void set_state(int newState);
|
|
||||||
int flushTMS(bool flush_buffer = false);
|
|
||||||
void flush() {flushTMS(); _jtag->flush();}
|
|
||||||
void setTMS(unsigned char tms);
|
|
||||||
|
|
||||||
enum tapState_t {
|
enum tapState_t {
|
||||||
TEST_LOGIC_RESET = 0,
|
TEST_LOGIC_RESET = 0,
|
||||||
RUN_TEST_IDLE = 1,
|
RUN_TEST_IDLE = 1,
|
||||||
|
|
@ -102,6 +86,22 @@ class Jtag {
|
||||||
UPDATE_IR = 15,
|
UPDATE_IR = 15,
|
||||||
UNKNOWN = 999
|
UNKNOWN = 999
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int shiftIR(unsigned char *tdi, unsigned char *tdo, int irlen,
|
||||||
|
Jtag::tapState_t end_state = RUN_TEST_IDLE);
|
||||||
|
int shiftIR(unsigned char tdi, int irlen,
|
||||||
|
Jtag::tapState_t end_state = RUN_TEST_IDLE);
|
||||||
|
int shiftDR(const uint8_t *tdi, unsigned char *tdo, int drlen,
|
||||||
|
Jtag::tapState_t end_state = RUN_TEST_IDLE);
|
||||||
|
int read_write(const uint8_t *tdi, unsigned char *tdo, int len, char last);
|
||||||
|
|
||||||
|
void toggleClk(int nb);
|
||||||
|
void go_test_logic_reset();
|
||||||
|
void set_state(int newState);
|
||||||
|
int flushTMS(bool flush_buffer = false);
|
||||||
|
void flush() {flushTMS(); _jtag->flush();}
|
||||||
|
void setTMS(unsigned char tms);
|
||||||
|
|
||||||
const char *getStateName(tapState_t s);
|
const char *getStateName(tapState_t s);
|
||||||
|
|
||||||
/* utilities */
|
/* utilities */
|
||||||
|
|
|
||||||
|
|
@ -338,7 +338,7 @@ bool Lattice::program_mem()
|
||||||
|
|
||||||
uint8_t tmp[1024];
|
uint8_t tmp[1024];
|
||||||
int size = 1024;
|
int size = 1024;
|
||||||
int next_state = Jtag::SHIFT_DR;
|
Jtag::tapState_t next_state = Jtag::SHIFT_DR;
|
||||||
|
|
||||||
ProgressBar progress("Loading", length, 50, _quiet);
|
ProgressBar progress("Loading", length, 50, _quiet);
|
||||||
|
|
||||||
|
|
@ -433,7 +433,7 @@ bool Lattice::program_intFlash(ConfigBitstreamParser *_cbp)
|
||||||
|
|
||||||
if(ufm_start > 2045) {
|
if(ufm_start > 2045) {
|
||||||
printError("UFM section detected in JEDEC file, but "
|
printError("UFM section detected in JEDEC file, but "
|
||||||
"calculated flash start address was out of bounds");
|
"calculated flash start address was out of bounds");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (note == "END CONFIG DATA") {
|
} else if (note == "END CONFIG DATA") {
|
||||||
|
|
@ -1308,7 +1308,7 @@ uint16_t Lattice::getUFMStartPageFromJEDEC(JedParser *_jed, int id)
|
||||||
addres.
|
addres.
|
||||||
TODO: In any case, JEDEC files don't carry part information. Verify against
|
TODO: In any case, JEDEC files don't carry part information. Verify against
|
||||||
IDCODE read previously? */
|
IDCODE read previously? */
|
||||||
|
|
||||||
if(raw_page_offset > 9211) {
|
if(raw_page_offset > 9211) {
|
||||||
return raw_page_offset - 9211 - 1; // 7000
|
return raw_page_offset - 9211 - 1; // 7000
|
||||||
} else if(raw_page_offset > 5758) {
|
} else if(raw_page_offset > 5758) {
|
||||||
|
|
|
||||||
|
|
@ -245,13 +245,13 @@ void SVF_jtag::handle_instruction(vector<string> const &vstr)
|
||||||
if (_verbose) cout << "trst value : " << vstr[1] << endl;
|
if (_verbose) cout << "trst value : " << vstr[1] << endl;
|
||||||
} else if (!vstr[0].compare("ENDDR")) {
|
} else if (!vstr[0].compare("ENDDR")) {
|
||||||
if (_verbose) cout << "enddr value : " << vstr[1] << endl;
|
if (_verbose) cout << "enddr value : " << vstr[1] << endl;
|
||||||
_enddr = fsm_state[vstr[1]];
|
_enddr = (Jtag::tapState_t)fsm_state[vstr[1]];
|
||||||
} else if (!vstr[0].compare("ENDIR")) {
|
} else if (!vstr[0].compare("ENDIR")) {
|
||||||
if (_verbose) cout << "endir value : " << vstr[1] << endl;
|
if (_verbose) cout << "endir value : " << vstr[1] << endl;
|
||||||
_endir = fsm_state[vstr[1]];
|
_endir = (Jtag::tapState_t)fsm_state[vstr[1]];
|
||||||
} else if (!vstr[0].compare("STATE")) {
|
} else if (!vstr[0].compare("STATE")) {
|
||||||
if (_verbose) cout << "state value : " << vstr[1] << endl;
|
if (_verbose) cout << "state value : " << vstr[1] << endl;
|
||||||
_jtag->set_state(fsm_state[vstr[1]]);
|
_jtag->set_state((Jtag::tapState_t)fsm_state[vstr[1]]);
|
||||||
} else if (!vstr[0].compare("RUNTEST")) {
|
} else if (!vstr[0].compare("RUNTEST")) {
|
||||||
parse_runtest(vstr);
|
parse_runtest(vstr);
|
||||||
} else if (!vstr[0].compare("HIR")) {
|
} else if (!vstr[0].compare("HIR")) {
|
||||||
|
|
@ -284,7 +284,7 @@ void SVF_jtag::handle_instruction(vector<string> const &vstr)
|
||||||
parse_XYR(vstr, sir);
|
parse_XYR(vstr, sir);
|
||||||
if (_verbose) {
|
if (_verbose) {
|
||||||
for (auto &&t : vstr)
|
for (auto &&t : vstr)
|
||||||
cout << t << " ";
|
cout << t << " ";
|
||||||
cout << endl;
|
cout << endl;
|
||||||
cout << "\tlen : " << sir.len << endl;
|
cout << "\tlen : " << sir.len << endl;
|
||||||
cout << "\ttdo : " << sir.tdo.size()*4 << endl;
|
cout << "\ttdo : " << sir.tdo.size()*4 << endl;
|
||||||
|
|
@ -335,7 +335,7 @@ void SVF_jtag::handle_instruction(vector<string> const &vstr)
|
||||||
}
|
}
|
||||||
|
|
||||||
SVF_jtag::SVF_jtag(Jtag *jtag, bool verbose):_verbose(verbose), _freq_hz(0),
|
SVF_jtag::SVF_jtag(Jtag *jtag, bool verbose):_verbose(verbose), _freq_hz(0),
|
||||||
_enddr(fsm_state["IDLE"]), _endir(fsm_state["IDLE"]),
|
_enddr((Jtag::tapState_t)fsm_state["IDLE"]), _endir((Jtag::tapState_t)fsm_state["IDLE"]),
|
||||||
_run_state(fsm_state["IDLE"]), _end_state(fsm_state["IDLE"])
|
_run_state(fsm_state["IDLE"]), _end_state(fsm_state["IDLE"])
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -58,8 +58,8 @@ class SVF_jtag {
|
||||||
bool _verbose;
|
bool _verbose;
|
||||||
|
|
||||||
uint32_t _freq_hz;
|
uint32_t _freq_hz;
|
||||||
int _enddr;
|
Jtag::tapState_t _enddr;
|
||||||
int _endir;
|
Jtag::tapState_t _endir;
|
||||||
int _run_state;
|
int _run_state;
|
||||||
int _end_state;
|
int _end_state;
|
||||||
svf_XYR hdr;
|
svf_XYR hdr;
|
||||||
|
|
|
||||||
|
|
@ -571,7 +571,8 @@ void Xilinx::program_mem(ConfigBitstreamParser *bitfile)
|
||||||
/* GGM: TODO */
|
/* GGM: TODO */
|
||||||
int byte_length = bitfile->getLength() / 8;
|
int byte_length = bitfile->getLength() / 8;
|
||||||
const uint8_t *data = bitfile->getData();
|
const uint8_t *data = bitfile->getData();
|
||||||
int tx_len, tx_end;
|
int tx_len;
|
||||||
|
Jtag::tapState_t tx_end;
|
||||||
int burst_len = byte_length / 100;
|
int burst_len = byte_length / 100;
|
||||||
|
|
||||||
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
|
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
|
||||||
|
|
@ -728,7 +729,8 @@ bool Xilinx::xc3s_flow_program(ConfigBitstreamParser *bit)
|
||||||
int byte_length = bit->getLength() / 8;
|
int byte_length = bit->getLength() / 8;
|
||||||
int burst_len = byte_length / 100;
|
int burst_len = byte_length / 100;
|
||||||
const uint8_t *data = bit->getData();
|
const uint8_t *data = bit->getData();
|
||||||
int tx_len = burst_len * 8, tx_end = Jtag::SHIFT_DR;
|
int tx_len = burst_len * 8;
|
||||||
|
Jtag::tapState_t tx_end = Jtag::SHIFT_DR;
|
||||||
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
|
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
|
||||||
|
|
||||||
flow_enable();
|
flow_enable();
|
||||||
|
|
@ -1081,7 +1083,7 @@ bool Xilinx::xcf_program(ConfigBitstreamParser *bitfile)
|
||||||
uint32_t data_len = bitfile->getLength() / 8;
|
uint32_t data_len = bitfile->getLength() / 8;
|
||||||
uint32_t xfer_len, offset = 0;
|
uint32_t xfer_len, offset = 0;
|
||||||
uint32_t addr = 0;
|
uint32_t addr = 0;
|
||||||
int xfer_end;
|
Jtag::tapState_t xfer_end;
|
||||||
|
|
||||||
/* limit JTAG clock frequency to 15MHz */
|
/* limit JTAG clock frequency to 15MHz */
|
||||||
if (_jtag->getClkFreq() > 15e6)
|
if (_jtag->getClkFreq() > 15e6)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue