1 /*
2 * $Id$
3 *
4 * TAP state handling
5 * Copyright (C) 2002 ETC s.r.o.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 * 02111-1307, USA.
21 *
22 * Written by Marcel Telka <marcel@telka.sk>, 2002.
23 *
24 */
25
26 #include <urjtag/tap_state.h>
27 #include <urjtag/chain.h>
28
29 static const char *
urj_tap_state_name(int state)30 urj_tap_state_name (int state)
31 {
32 switch (state)
33 {
34 case URJ_TAP_STATE_UNKNOWN_STATE: return "UNKNOWN_STATE";
35 case URJ_TAP_STATE_TEST_LOGIC_RESET: return "TEST_LOGIC_RESET";
36 case URJ_TAP_STATE_RUN_TEST_IDLE: return "RUN_TEST_IDLE";
37 case URJ_TAP_STATE_SELECT_DR_SCAN: return "SELECT_DR_SCAN";
38 case URJ_TAP_STATE_CAPTURE_DR: return "CAPTURE_DR";
39 case URJ_TAP_STATE_SHIFT_DR: return "SHIFT_DR";
40 case URJ_TAP_STATE_EXIT1_DR: return "EXIT1_DR";
41 case URJ_TAP_STATE_PAUSE_DR: return "PAUSE_DR";
42 case URJ_TAP_STATE_EXIT2_DR: return "EXIT2_DR";
43 case URJ_TAP_STATE_UPDATE_DR: return "UPDATE_DR";
44 case URJ_TAP_STATE_SELECT_IR_SCAN: return "SELECT_IR_SCAN";
45 case URJ_TAP_STATE_CAPTURE_IR: return "CAPTURE_IR";
46 case URJ_TAP_STATE_SHIFT_IR: return "SHIFT_IR";
47 case URJ_TAP_STATE_EXIT1_IR: return "EXIT1_IR";
48 case URJ_TAP_STATE_PAUSE_IR: return "PAUSE_IR";
49 case URJ_TAP_STATE_EXIT2_IR: return "EXIT2_IR";
50 case URJ_TAP_STATE_UPDATE_IR: return "UPDATE_IR";
51 default: return "??????";
52 }
53 }
54
55 static void
urj_tap_state_dump(int state)56 urj_tap_state_dump (int state)
57 {
58 urj_log (URJ_LOG_LEVEL_DEBUG, "tap_state: %s\n",
59 urj_tap_state_name (state));
60 }
61
62 static void
urj_tap_state_dump_2(int state0,int state1,int tms)63 urj_tap_state_dump_2 (int state0, int state1, int tms)
64 {
65 urj_log (URJ_LOG_LEVEL_DEBUG, "tap_state: %16s =(tms:%d)=> %s\n",
66 urj_tap_state_name (state0), tms, urj_tap_state_name (state1));
67 }
68
69 int
urj_tap_state(urj_chain_t * chain)70 urj_tap_state (urj_chain_t *chain)
71 {
72 return chain->state;
73 }
74
75 int
urj_tap_state_init(urj_chain_t * chain)76 urj_tap_state_init (urj_chain_t *chain)
77 {
78 urj_tap_state_dump (URJ_TAP_STATE_UNKNOWN_STATE);
79 return chain->state = URJ_TAP_STATE_UNKNOWN_STATE;
80 }
81
82 int
urj_tap_state_done(urj_chain_t * chain)83 urj_tap_state_done (urj_chain_t *chain)
84 {
85 urj_tap_state_dump (URJ_TAP_STATE_UNKNOWN_STATE);
86 return chain->state = URJ_TAP_STATE_UNKNOWN_STATE;
87 }
88
89 int
urj_tap_state_reset(urj_chain_t * chain)90 urj_tap_state_reset (urj_chain_t *chain)
91 {
92 urj_tap_state_dump (URJ_TAP_STATE_TEST_LOGIC_RESET);
93 return chain->state = URJ_TAP_STATE_TEST_LOGIC_RESET;
94 }
95
96 int
urj_tap_state_set_trst(urj_chain_t * chain,int old_trst,int new_trst)97 urj_tap_state_set_trst (urj_chain_t *chain, int old_trst, int new_trst)
98 {
99 old_trst = old_trst ? 1 : 0;
100 new_trst = new_trst ? 1 : 0;
101
102 if (old_trst != new_trst)
103 {
104 if (new_trst)
105 chain->state = URJ_TAP_STATE_TEST_LOGIC_RESET;
106 else
107 chain->state = URJ_TAP_STATE_UNKNOWN_STATE;
108 }
109
110 urj_tap_state_dump (chain->state);
111 return chain->state;
112 }
113
114 int
urj_tap_state_clock(urj_chain_t * chain,int tms)115 urj_tap_state_clock (urj_chain_t *chain, int tms)
116 {
117 int oldstate = chain->state;
118
119 if (tms)
120 {
121 switch (chain->state)
122 {
123 case URJ_TAP_STATE_TEST_LOGIC_RESET:
124 break;
125 case URJ_TAP_STATE_RUN_TEST_IDLE:
126 case URJ_TAP_STATE_UPDATE_DR:
127 case URJ_TAP_STATE_UPDATE_IR:
128 chain->state = URJ_TAP_STATE_SELECT_DR_SCAN;
129 break;
130 case URJ_TAP_STATE_SELECT_DR_SCAN:
131 chain->state = URJ_TAP_STATE_SELECT_IR_SCAN;
132 break;
133 case URJ_TAP_STATE_CAPTURE_DR:
134 case URJ_TAP_STATE_SHIFT_DR:
135 chain->state = URJ_TAP_STATE_EXIT1_DR;
136 break;
137 case URJ_TAP_STATE_EXIT1_DR:
138 case URJ_TAP_STATE_EXIT2_DR:
139 chain->state = URJ_TAP_STATE_UPDATE_DR;
140 break;
141 case URJ_TAP_STATE_PAUSE_DR:
142 chain->state = URJ_TAP_STATE_EXIT2_DR;
143 break;
144 case URJ_TAP_STATE_SELECT_IR_SCAN:
145 chain->state = URJ_TAP_STATE_TEST_LOGIC_RESET;
146 break;
147 case URJ_TAP_STATE_CAPTURE_IR:
148 case URJ_TAP_STATE_SHIFT_IR:
149 chain->state = URJ_TAP_STATE_EXIT1_IR;
150 break;
151 case URJ_TAP_STATE_EXIT1_IR:
152 case URJ_TAP_STATE_EXIT2_IR:
153 chain->state = URJ_TAP_STATE_UPDATE_IR;
154 break;
155 case URJ_TAP_STATE_PAUSE_IR:
156 chain->state = URJ_TAP_STATE_EXIT2_IR;
157 break;
158 default:
159 chain->state = URJ_TAP_STATE_UNKNOWN_STATE;
160 break;
161 }
162 }
163 else
164 {
165 switch (chain->state)
166 {
167 case URJ_TAP_STATE_TEST_LOGIC_RESET:
168 case URJ_TAP_STATE_RUN_TEST_IDLE:
169 case URJ_TAP_STATE_UPDATE_DR:
170 case URJ_TAP_STATE_UPDATE_IR:
171 chain->state = URJ_TAP_STATE_RUN_TEST_IDLE;
172 break;
173 case URJ_TAP_STATE_SELECT_DR_SCAN:
174 chain->state = URJ_TAP_STATE_CAPTURE_DR;
175 break;
176 case URJ_TAP_STATE_CAPTURE_DR:
177 case URJ_TAP_STATE_SHIFT_DR:
178 case URJ_TAP_STATE_EXIT2_DR:
179 chain->state = URJ_TAP_STATE_SHIFT_DR;
180 break;
181 case URJ_TAP_STATE_EXIT1_DR:
182 case URJ_TAP_STATE_PAUSE_DR:
183 chain->state = URJ_TAP_STATE_PAUSE_DR;
184 break;
185 case URJ_TAP_STATE_SELECT_IR_SCAN:
186 chain->state = URJ_TAP_STATE_CAPTURE_IR;
187 break;
188 case URJ_TAP_STATE_CAPTURE_IR:
189 case URJ_TAP_STATE_SHIFT_IR:
190 case URJ_TAP_STATE_EXIT2_IR:
191 chain->state = URJ_TAP_STATE_SHIFT_IR;
192 break;
193 case URJ_TAP_STATE_EXIT1_IR:
194 case URJ_TAP_STATE_PAUSE_IR:
195 chain->state = URJ_TAP_STATE_PAUSE_IR;
196 break;
197 default:
198 chain->state = URJ_TAP_STATE_UNKNOWN_STATE;
199 break;
200 }
201 }
202
203 urj_tap_state_dump_2 (oldstate, chain->state, tms);
204 return chain->state;
205 }
206