jtag: shiftxR: don't try to move to shift when not required

This commit is contained in:
Gwenhael Goavec-Merou 2021-05-15 09:05:48 +02:00
parent 5da47a0200
commit a242168e7f
2 changed files with 42 additions and 17 deletions

View File

@ -65,9 +65,6 @@ void Altera::programMem()
/* write */ /* write */
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet); ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
/* 2.2.6.5 */
_jtag->set_state(Jtag::SHIFT_DR);
int xfer_len = 512; int xfer_len = 512;
int tx_len; int tx_len;
int tx_end; int tx_end;
@ -75,12 +72,12 @@ void Altera::programMem()
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
tx_len = (byte_length - i) * 8; tx_len = (byte_length - i) * 8;
tx_end = 1; // to move in EXIT1_DR tx_end = Jtag::EXIT1_DR;
} else { } else {
tx_len = xfer_len * 8; tx_len = xfer_len * 8;
tx_end = 0; tx_end = Jtag::SHIFT_DR;
} }
_jtag->read_write(data+i, NULL, tx_len, tx_end); _jtag->shiftDR(data+i, NULL, tx_len, tx_end);
progress.display(i); progress.display(i);
} }
progress.done(); progress.done();

View File

@ -203,13 +203,25 @@ void Jtag::toggleClk(int nb)
int Jtag::shiftDR(unsigned char *tdi, unsigned char *tdo, int drlen, int end_state) int Jtag::shiftDR(unsigned char *tdi, unsigned char *tdo, int drlen, int end_state)
{ {
set_state(SHIFT_DR); /* if current state not shift DR
// force transmit tms state * move to this state
flushTMS(false); */
// currently don't care about multiple device in the chain if (_state != SHIFT_DR) {
read_write(tdi, tdo, drlen, 1);// 1 since only one device set_state(SHIFT_DR);
flushTMS(false); // force transmit tms state
}
/* write tdi (and read tdo) to the selected device
* end (ie TMS high) is used when
* a state change must
* be done
*/
read_write(tdi, tdo, drlen, end_state != SHIFT_DR);
set_state(end_state); /* if it's asked to move in FSM */
if (end_state != SHIFT_DR) {
/* move to end_state */
set_state(end_state);
}
return 0; return 0;
} }
@ -225,14 +237,30 @@ int Jtag::shiftIR(unsigned char tdi, int irlen, int 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, int end_state)
{ {
display("%s: avant shiftIR\n", __func__); display("%s: avant shiftIR\n", __func__);
set_state(SHIFT_IR);
flushTMS(false); /* if not in SHIFT IR move to this state */
// currently don't care about multiple device in the chain if (_state != SHIFT_IR) {
set_state(SHIFT_IR);
/* force flush */
flushTMS(false);
}
display("%s: envoi ircode\n", __func__); display("%s: envoi ircode\n", __func__);
read_write(tdi, tdo, irlen, 1); // 1 since only one device
set_state(end_state); /* write tdi (and read tdo) to the selected device
* end (ie TMS high) is used only when
* a state change must
* be done
*/
read_write(tdi, tdo, irlen, end_state != SHIFT_IR);
/* it's asked to move out of SHIFT IR state */
if (end_state != SHIFT_IR) {
/* move to the requested state */
set_state(end_state);
}
return 0; return 0;
} }