2 # GoodFET Basic JTAG Client
4 import sys, binascii, struct
21 JTAG_RESET_TARGET = 0x83
22 JTAG_DETECT_IR_WIDTH = 0x84
23 JTAG_DETECT_CHAIN_LENGTH = 0x85
24 JTAG_GET_DEVICE_ID = 0x86
26 from GoodFET import GoodFET
27 from intelhex import IntelHex
29 class GoodFETJTAG(GoodFET):
31 """A GoodFET variant for basic JTAG'ing."""
36 def _check_return(self, verb, length=0):
37 if (self.app == self.APP) and \
38 (self.verb == verb) and \
39 (len(self.data) == length):
46 """Move the FET into the JTAG configuration."""
47 sys.stdout.write("Initializing JTAG...")
48 self.writecmd(self.APP, SETUP)
49 self._check_return(SETUP)
52 sys.stdout.write("Resetting TAP...")
53 self.writecmd(self.APP, JTAG_RESET_TAP)
54 self._check_return(JTAG_RESET_TAP)
56 def reset_target(self):
57 sys.stdout.write("Resseting target device...")
58 self.writecmd(self.APP, JTAG_RESET_TARGET)
59 self._check_return(JTAG_RESET_TARGET)
61 def detect_ir_width(self):
62 sys.stdout.write("Detecting IR width...")
63 self.writecmd(self.APP, JTAG_DETECT_IR_WIDTH)
64 self._check_return(JTAG_DETECT_IR_WIDTH, 2)
65 width = struct.unpack("!H", self.data)[0]
68 def detect_chain_length(self):
69 sys.stdout.write("Detecting chain length...")
70 self.writecmd(self.APP, JTAG_DETECT_CHAIN_LENGTH)
71 self._check_return(JTAG_DETECT_CHAIN_LENGTH, 2)
72 length = struct.unpack("!H", self.data)[0]
75 def get_device_id(self, chip):
76 sys.stdout.write("Getting ID for device %d..." % chip)
77 self.writecmd(self.APP, JTAG_GET_DEVICE_ID, 2, struct.pack("!H", chip))
78 self._check_return(JTAG_GET_DEVICE_ID, 4)
79 id = struct.unpack("!L", self.data)[0]