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