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 tx_len;
|
||||
int tx_end;
|
||||
Jtag::tapState_t tx_end;
|
||||
|
||||
for (int i=0; i < byte_length; i+=xfer_len) {
|
||||
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,
|
||||
int end_state, bool debug)
|
||||
Jtag::tapState_t end_state, bool debug)
|
||||
{
|
||||
(void) debug;
|
||||
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
|
||||
*/
|
||||
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 _spiOverJtagPath; /**< spiOverJtag explicit path */
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ void Anlogic::program(unsigned int offset, bool unprotect_flash)
|
|||
const uint8_t *ptr = data;
|
||||
while (len > 0) {
|
||||
int xfer_len = (len > 512)?512:len;
|
||||
int tx_end;
|
||||
Jtag::tapState_t tx_end;
|
||||
if (len - xfer_len == 0)
|
||||
tx_end = Jtag::RUN_TEST_IDLE;
|
||||
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)
|
||||
{
|
||||
int xfer_len = 512, tx_end;
|
||||
int xfer_len = 512;
|
||||
Jtag::tapState_t tx_end;
|
||||
uint8_t tx[512];
|
||||
|
||||
if (_fpga_family == TITANIUM_FAMILY)
|
||||
|
|
|
|||
|
|
@ -632,7 +632,8 @@ bool Gowin::connectJtagToMCU()
|
|||
/* TN653 p. 9 */
|
||||
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;
|
||||
|
||||
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
|
||||
|
|
|
|||
|
|
@ -317,7 +317,7 @@ void Jtag::toggleClk(int nb)
|
|||
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
|
||||
* 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;
|
||||
}
|
||||
|
||||
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) {
|
||||
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);
|
||||
}
|
||||
|
||||
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__);
|
||||
int bypass_after = 0;
|
||||
|
|
|
|||
32
src/jtag.hpp
32
src/jtag.hpp
|
|
@ -67,22 +67,6 @@ class Jtag {
|
|||
* \return a pointer instance of JtagInterface
|
||||
*/
|
||||
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 {
|
||||
TEST_LOGIC_RESET = 0,
|
||||
RUN_TEST_IDLE = 1,
|
||||
|
|
@ -102,6 +86,22 @@ class Jtag {
|
|||
UPDATE_IR = 15,
|
||||
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);
|
||||
|
||||
/* utilities */
|
||||
|
|
|
|||
|
|
@ -338,7 +338,7 @@ bool Lattice::program_mem()
|
|||
|
||||
uint8_t tmp[1024];
|
||||
int size = 1024;
|
||||
int next_state = Jtag::SHIFT_DR;
|
||||
Jtag::tapState_t next_state = Jtag::SHIFT_DR;
|
||||
|
||||
ProgressBar progress("Loading", length, 50, _quiet);
|
||||
|
||||
|
|
@ -433,7 +433,7 @@ bool Lattice::program_intFlash(ConfigBitstreamParser *_cbp)
|
|||
|
||||
if(ufm_start > 2045) {
|
||||
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;
|
||||
}
|
||||
} else if (note == "END CONFIG DATA") {
|
||||
|
|
@ -1308,7 +1308,7 @@ uint16_t Lattice::getUFMStartPageFromJEDEC(JedParser *_jed, int id)
|
|||
addres.
|
||||
TODO: In any case, JEDEC files don't carry part information. Verify against
|
||||
IDCODE read previously? */
|
||||
|
||||
|
||||
if(raw_page_offset > 9211) {
|
||||
return raw_page_offset - 9211 - 1; // 7000
|
||||
} 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;
|
||||
} else if (!vstr[0].compare("ENDDR")) {
|
||||
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")) {
|
||||
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")) {
|
||||
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")) {
|
||||
parse_runtest(vstr);
|
||||
} else if (!vstr[0].compare("HIR")) {
|
||||
|
|
@ -284,7 +284,7 @@ void SVF_jtag::handle_instruction(vector<string> const &vstr)
|
|||
parse_XYR(vstr, sir);
|
||||
if (_verbose) {
|
||||
for (auto &&t : vstr)
|
||||
cout << t << " ";
|
||||
cout << t << " ";
|
||||
cout << endl;
|
||||
cout << "\tlen : " << sir.len << 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),
|
||||
_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"])
|
||||
|
||||
{
|
||||
|
|
|
|||
|
|
@ -58,8 +58,8 @@ class SVF_jtag {
|
|||
bool _verbose;
|
||||
|
||||
uint32_t _freq_hz;
|
||||
int _enddr;
|
||||
int _endir;
|
||||
Jtag::tapState_t _enddr;
|
||||
Jtag::tapState_t _endir;
|
||||
int _run_state;
|
||||
int _end_state;
|
||||
svf_XYR hdr;
|
||||
|
|
|
|||
|
|
@ -571,7 +571,8 @@ void Xilinx::program_mem(ConfigBitstreamParser *bitfile)
|
|||
/* GGM: TODO */
|
||||
int byte_length = bitfile->getLength() / 8;
|
||||
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;
|
||||
|
||||
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 burst_len = byte_length / 100;
|
||||
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);
|
||||
|
||||
flow_enable();
|
||||
|
|
@ -1081,7 +1083,7 @@ bool Xilinx::xcf_program(ConfigBitstreamParser *bitfile)
|
|||
uint32_t data_len = bitfile->getLength() / 8;
|
||||
uint32_t xfer_len, offset = 0;
|
||||
uint32_t addr = 0;
|
||||
int xfer_end;
|
||||
Jtag::tapState_t xfer_end;
|
||||
|
||||
/* limit JTAG clock frequency to 15MHz */
|
||||
if (_jtag->getClkFreq() > 15e6)
|
||||
|
|
|
|||
Loading…
Reference in New Issue