|
50 | 50 |
|
51 | 51 | jtag_states = [s.value for s in St] |
52 | 52 |
|
| 53 | +# jump table for JTAG state machine, 0 = TMS=0, 1 = TMS=1 |
| 54 | +jtag_state_jumps = { |
| 55 | + # Intro "tree" |
| 56 | + St.TEST_LOGIC_RESET: [St.RUN_TEST_IDLE, St.TEST_LOGIC_RESET], |
| 57 | + St.RUN_TEST_IDLE: [St.RUN_TEST_IDLE, St.SELECT_DR_SCAN], |
| 58 | + # DR "tree" |
| 59 | + St.SELECT_DR_SCAN: [St.CAPTURE_DR, St.SELECT_IR_SCAN], |
| 60 | + St.CAPTURE_DR: [St.SHIFT_DR, St.EXIT1_DR], |
| 61 | + St.SHIFT_DR: [St.SHIFT_DR, St.EXIT1_DR], |
| 62 | + St.EXIT1_DR: [St.PAUSE_DR, St.UPDATE_DR], |
| 63 | + St.PAUSE_DR: [St.PAUSE_DR, St.EXIT2_DR], |
| 64 | + St.EXIT2_DR: [St.SHIFT_DR, St.UPDATE_DR], |
| 65 | + St.UPDATE_DR: [St.RUN_TEST_IDLE, St.SELECT_DR_SCAN], |
| 66 | + # IR "tree" |
| 67 | + St.SELECT_IR_SCAN: [St.CAPTURE_IR, St.TEST_LOGIC_RESET], |
| 68 | + St.CAPTURE_IR: [St.SHIFT_IR, St.EXIT1_IR], |
| 69 | + St.SHIFT_IR: [St.SHIFT_IR, St.EXIT1_IR], |
| 70 | + St.EXIT1_IR: [St.PAUSE_IR, St.UPDATE_IR], |
| 71 | + St.PAUSE_IR: [St.PAUSE_IR, St.EXIT2_IR], |
| 72 | + St.EXIT2_IR: [St.SHIFT_IR, St.UPDATE_IR], |
| 73 | + St.UPDATE_IR: [St.RUN_TEST_IDLE, St.SELECT_DR_SCAN], |
| 74 | +} |
| 75 | + |
| 76 | + |
53 | 77 | class Decoder(srd.Decoder): |
54 | 78 | api_version = 3 |
55 | 79 | id = 'jtag' |
@@ -118,52 +142,12 @@ def putx_bs(self, data): |
118 | 142 | def putp_bs(self, data): |
119 | 143 | self.put(self.ss_bitstring, self.es_bitstring, self.out_python, data) |
120 | 144 |
|
121 | | - def advance_state_machine(self, tms): |
122 | | - self.oldstate = self.state |
123 | | - |
124 | | - # Intro "tree" |
125 | | - if self.state == St.TEST_LOGIC_RESET: |
126 | | - self.state = St.TEST_LOGIC_RESET if (tms) else St.RUN_TEST_IDLE |
127 | | - elif self.state == St.RUN_TEST_IDLE: |
128 | | - self.state = St.SELECT_DR_SCAN if (tms) else St.RUN_TEST_IDLE |
129 | | - |
130 | | - # DR "tree" |
131 | | - elif self.state == St.SELECT_DR_SCAN: |
132 | | - self.state = St.SELECT_IR_SCAN if (tms) else St.CAPTURE_DR |
133 | | - elif self.state == St.CAPTURE_DR: |
134 | | - self.state = St.EXIT1_DR if (tms) else St.SHIFT_DR |
135 | | - elif self.state == St.SHIFT_DR: |
136 | | - self.state = St.EXIT1_DR if (tms) else St.SHIFT_DR |
137 | | - elif self.state == St.EXIT1_DR: |
138 | | - self.state = St.UPDATE_DR if (tms) else St.PAUSE_DR |
139 | | - elif self.state == St.PAUSE_DR: |
140 | | - self.state = St.EXIT2_DR if (tms) else St.PAUSE_DR |
141 | | - elif self.state == St.EXIT2_DR: |
142 | | - self.state = St.UPDATE_DR if (tms) else St.SHIFT_DR |
143 | | - elif self.state == St.UPDATE_DR: |
144 | | - self.state = St.SELECT_DR_SCAN if (tms) else St.RUN_TEST_IDLE |
145 | | - |
146 | | - # IR "tree" |
147 | | - elif self.state == St.SELECT_IR_SCAN: |
148 | | - self.state = St.TEST_LOGIC_RESET if (tms) else St.CAPTURE_IR |
149 | | - elif self.state == St.CAPTURE_IR: |
150 | | - self.state = St.EXIT1_IR if (tms) else St.SHIFT_IR |
151 | | - elif self.state == St.SHIFT_IR: |
152 | | - self.state = St.EXIT1_IR if (tms) else St.SHIFT_IR |
153 | | - elif self.state == St.EXIT1_IR: |
154 | | - self.state = St.UPDATE_IR if (tms) else St.PAUSE_IR |
155 | | - elif self.state == St.PAUSE_IR: |
156 | | - self.state = St.EXIT2_IR if (tms) else St.PAUSE_IR |
157 | | - elif self.state == St.EXIT2_IR: |
158 | | - self.state = St.UPDATE_IR if (tms) else St.SHIFT_IR |
159 | | - elif self.state == St.UPDATE_IR: |
160 | | - self.state = St.SELECT_DR_SCAN if (tms) else St.RUN_TEST_IDLE |
161 | | - |
162 | 145 | def handle_rising_tck_edge(self, pins): |
163 | 146 | (tdi, tdo, tck, tms, trst, srst, rtck) = pins |
164 | 147 |
|
165 | 148 | # Rising TCK edges always advance the state machine. |
166 | | - self.advance_state_machine(tms) |
| 149 | + self.oldstate = self.state |
| 150 | + self.state = jtag_state_jumps[self.state][tms] |
167 | 151 |
|
168 | 152 | if self.first: |
169 | 153 | # Save the start sample and item for later (no output yet). |
|
0 commit comments