def state_x(self, dst): """change the TAP state from self.state to dst""" if self.state == dst: return tms = tms_mpsse(tap.lookup(self.state, dst)) cmd = _MPSSE_WRITE_TMS | _MPSSE_BITMODE | _MPSSE_LSB | _MPSSE_WRITE_NEG self.write((cmd, tms[0], tms[1]), True) self.state = dst
def shift_data(self, tdi, tdo, end_state): """ write (and possibly read) a bit stream from the JTAGkey tdi - bit buffer of data to be written to the JTAG TDI pin tdo - bit buffer for the data read from the JTAG TDO pin (optional) end_state - leave the TAP state machine in this state """ wr = tdi.get() io_bits = tdi.n - 1 io_bytes = io_bits >> 3 io_bits &= 0x07 last_bit = (wr[io_bytes] << (7 - io_bits)) & 128 if tdo is not None: read_cmd = _MPSSE_DO_READ read_len = io_bytes + 1 if io_bits: read_len += 1 else: read_cmd = 0 read_len = 0 # write out the full bytes if io_bytes: cmd = read_cmd | _MPSSE_DO_WRITE | _MPSSE_LSB | _MPSSE_WRITE_NEG num = io_bytes - 1 self.write((cmd, _lsb(num), _msb(num))) self.write(wr[0:io_bytes]) # write out the remaining bits if io_bits: cmd = read_cmd | _MPSSE_DO_WRITE | _MPSSE_LSB | _MPSSE_BITMODE | _MPSSE_WRITE_NEG self.write((cmd, io_bits - 1, wr[io_bytes])) # the last bit of output data is bit 7 of the tms value (goes onto tdi) # continue to read to get the last bit of tdo data cmd = read_cmd | _MPSSE_WRITE_TMS | _MPSSE_BITMODE | _MPSSE_LSB | _MPSSE_WRITE_NEG tms = tms_mpsse(tap.lookup(self.state, end_state)) self.write((cmd, tms[0], tms[1] | last_bit)) self.state = end_state # if we are only writing, return if tdo is None: self.flush() return # make the ft2232 flush its data back to the PC self.write((Ftdi.SEND_IMMEDIATE, ), True) rd = self.ftdi.read_data_bytes(read_len, _READ_RETRIES) if io_bits: # the n partial bits are in the top n bits of the byte # move them down to the bottom rd[-2] >>= (8 - io_bits) # get the last bit from the tms response byte (last byte) last_bit = (rd[-1] >> (7 - tms[0])) & 1 last_bit <<= io_bits # add the last bit if io_bits: # drop the tms response byte del rd[-1] # or it onto the io_bits byte rd[-1] |= last_bit else: # replace the tms response byte rd[-1] = last_bit # copy to the bit buffer tdo.set(tdi.n, rd)
def shift_data(self, tdi, tdo, end_state): """ write (and possibly read) a bit stream from the JTAGkey tdi - bit buffer of data to be written to the JTAG TDI pin tdo - bit buffer for the data read from the JTAG TDO pin (optional) end_state - leave the TAP state machine in this state """ wr = tdi.get() io_bits = tdi.n - 1 io_bytes = io_bits >> 3 io_bits &= 0x07 last_bit = (wr[io_bytes] << (7 - io_bits)) & 128 if tdo is not None: read_cmd = _MPSSE_DO_READ read_len = io_bytes + 1 if io_bits: read_len += 1 else: read_cmd = 0 read_len = 0 # write out the full bytes if io_bytes: cmd = read_cmd | _MPSSE_DO_WRITE | _MPSSE_LSB | _MPSSE_WRITE_NEG num = io_bytes - 1 self.write((cmd, _lsb(num), _msb(num))) self.write(wr[0:io_bytes]) # write out the remaining bits if io_bits: cmd = read_cmd | _MPSSE_DO_WRITE | _MPSSE_LSB | _MPSSE_BITMODE | _MPSSE_WRITE_NEG self.write((cmd, io_bits - 1, wr[io_bytes])) # the last bit of output data is bit 7 of the tms value (goes onto tdi) # continue to read to get the last bit of tdo data cmd = read_cmd | _MPSSE_WRITE_TMS | _MPSSE_BITMODE | _MPSSE_LSB | _MPSSE_WRITE_NEG tms = tms_mpsse(tap.lookup(self.state, end_state)) self.write((cmd, tms[0], tms[1] | last_bit)) self.state = end_state # if we are only writing, return if tdo is None: self.flush() return # make the ft2232 flush its data back to the PC self.write((Ftdi.SEND_IMMEDIATE,), True) rd = self.ftdi.read_data_bytes(read_len, _READ_RETRIES) if io_bits: # the n partial bits are in the top n bits of the byte # move them down to the bottom rd[-2] >>= (8 - io_bits) # get the last bit from the tms response byte (last byte) last_bit = (rd[-1] >> (7 - tms[0])) & 1 last_bit <<= io_bits # add the last bit if io_bits: # drop the tms response byte del rd[-1] # or it onto the io_bits byte rd[-1] |= last_bit else: # replace the tms response byte rd[-1] = last_bit # copy to the bit buffer tdo.set(tdi.n, rd)