jtag: linuxgpiod: drop extra parenthesis
[openocd.git] / src / jtag / interface.h
1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
7 * *
8 * Copyright (C) 2009 Zachary T Welch *
9 * zw@superlucidity.net *
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the GNU General Public License as published by *
13 * the Free Software Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * GNU General Public License for more details. *
20 * *
21 * You should have received a copy of the GNU General Public License *
22 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
23 ***************************************************************************/
24
25 #ifndef OPENOCD_JTAG_INTERFACE_H
26 #define OPENOCD_JTAG_INTERFACE_H
27
28 #include <jtag/jtag.h>
29 #include <target/armv7m_trace.h>
30
31 /* @file
32 * The "Cable Helper API" is what the cable drivers can use to help
33 * implement their "Cable API". So a Cable Helper API is a set of
34 * helper functions used by cable drivers, and this is different from a
35 * Cable API. A "Cable API" is what higher level code used to talk to a
36 * cable.
37 */
38
39
40 /** implementation of wrapper function tap_set_state() */
41 void tap_set_state_impl(tap_state_t new_state);
42
43 /**
44 * This function sets the state of a "state follower" which tracks the
45 * state of the TAPs connected to the cable. The state follower is
46 * hopefully always in the same state as the actual TAPs in the jtag
47 * chain, and will be so if there are no bugs in the tracking logic
48 * within that cable driver.
49 *
50 * All the cable drivers call this function to indicate the state they
51 * think the TAPs attached to their cables are in. Because this
52 * function can also log transitions, it will be helpful to call this
53 * function with every transition that the TAPs being manipulated are
54 * expected to traverse, not just end points of a multi-step state path.
55 *
56 * @param new_state The state we think the TAPs are currently in (or
57 * are about to enter).
58 */
59 #define tap_set_state(new_state) \
60 do { \
61 LOG_DEBUG_IO("tap_set_state(%s)", tap_state_name(new_state)); \
62 tap_set_state_impl(new_state); \
63 } while (0)
64
65 /**
66 * This function gets the state of the "state follower" which tracks the
67 * state of the TAPs connected to the cable. @see tap_set_state @return
68 * tap_state_t The state the TAPs are in now.
69 */
70 tap_state_t tap_get_state(void);
71
72 /**
73 * This function sets the state of an "end state follower" which tracks
74 * the state that any cable driver thinks will be the end (resultant)
75 * state of the current TAP SIR or SDR operation.
76 *
77 * At completion of that TAP operation this value is copied into the
78 * state follower via tap_set_state().
79 *
80 * @param new_end_state The state the TAPs should enter at completion of
81 * a pending TAP operation.
82 */
83 void tap_set_end_state(tap_state_t new_end_state);
84
85 /**
86 * For more information, @see tap_set_end_state
87 * @return tap_state_t - The state the TAPs should be in at completion of the current TAP operation.
88 */
89 tap_state_t tap_get_end_state(void);
90
91 /**
92 * This function provides a "bit sequence" indicating what has to be
93 * done with TMS during a sequence of seven TAP clock cycles in order to
94 * get from state \a "from" to state \a "to".
95 *
96 * The length of the sequence must be determined with a parallel call to
97 * tap_get_tms_path_len().
98 *
99 * @param from The starting state.
100 * @param to The desired final state.
101 * @return int The required TMS bit sequence, with the first bit in the
102 * sequence at bit 0.
103 */
104 int tap_get_tms_path(tap_state_t from, tap_state_t to);
105
106 /**
107 * Function int tap_get_tms_path_len
108 * returns the total number of bits that represents a TMS path
109 * transition as given by the function tap_get_tms_path().
110 *
111 * For at least one interface (JLink) it's not OK to simply "pad" TMS
112 * sequences to fit a whole byte. (I suspect this is a general TAP
113 * problem within OOCD.) Padding TMS causes all manner of instability
114 * that's not easily discovered. Using this routine we can apply
115 * EXACTLY the state transitions required to make something work - no
116 * more - no less.
117 *
118 * @param from is the starting state
119 * @param to is the resultant or final state
120 * @return int - the total number of bits in a transition.
121 */
122 int tap_get_tms_path_len(tap_state_t from, tap_state_t to);
123
124
125 /**
126 * Function tap_move_ndx
127 * when given a stable state, returns an index from 0-5. The index corresponds to a
128 * sequence of stable states which are given in this order: <p>
129 * { TAP_RESET, TAP_IDLE, TAP_DRSHIFT, TAP_DRPAUSE, TAP_IRSHIFT, TAP_IRPAUSE }
130 * <p>
131 * This sequence corresponds to look up tables which are used in some of the
132 * cable drivers.
133 * @param astate is the stable state to find in the sequence. If a non stable
134 * state is passed, this may cause the program to output an error message
135 * and terminate.
136 * @return int - the array (or sequence) index as described above
137 */
138 int tap_move_ndx(tap_state_t astate);
139
140 /**
141 * Function tap_is_state_stable
142 * returns true if the \a astate is stable.
143 */
144 bool tap_is_state_stable(tap_state_t astate);
145
146 /**
147 * Function tap_state_transition
148 * takes a current TAP state and returns the next state according to the tms value.
149 * @param current_state is the state of a TAP currently.
150 * @param tms is either zero or non-zero, just like a real TMS line in a jtag interface.
151 * @return tap_state_t - the next state a TAP would enter.
152 */
153 tap_state_t tap_state_transition(tap_state_t current_state, bool tms);
154
155 /** Allow switching between old and new TMS tables. @see tap_get_tms_path */
156 void tap_use_new_tms_table(bool use_new);
157 /** @returns True if new TMS table is active; false otherwise. */
158 bool tap_uses_new_tms_table(void);
159
160
161 /**
162 * @brief Prints verbose TAP state transitions for the given TMS/TDI buffers.
163 * @param tms_buf must points to a buffer containing the TMS bitstream.
164 * @param tdi_buf must points to a buffer containing the TDI bitstream.
165 * @param tap_len must specify the length of the TMS/TDI bitstreams.
166 * @param start_tap_state must specify the current TAP state.
167 * @returns the final TAP state; pass as @a start_tap_state in following call.
168 */
169 static inline tap_state_t jtag_debug_state_machine(const void *tms_buf,
170 const void *tdi_buf, unsigned tap_len, tap_state_t start_tap_state)
171 {
172 /* Private declaration */
173 tap_state_t jtag_debug_state_machine_(const void *tms_buf, const void *tdi_buf,
174 unsigned tap_len, tap_state_t start_tap_state);
175
176 if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO))
177 return jtag_debug_state_machine_(tms_buf, tdi_buf, tap_len, start_tap_state);
178 else
179 return start_tap_state;
180 }
181
182 /**
183 * Represents a driver for a debugging interface.
184 *
185 * @todo Rename; perhaps "debug_driver". This isn't an interface,
186 * it's a driver! Also, not all drivers support JTAG.
187 *
188 * @todo We need a per-instance structure too, and changes to pass
189 * that structure to the driver. Instances can for example be in
190 * either SWD or JTAG modes. This will help remove globals, and
191 * eventually to cope with systems which have more than one such
192 * debugging interface.
193 */
194 struct jtag_interface {
195 /**
196 * Bit vector listing capabilities exposed by this driver.
197 */
198 unsigned supported;
199 #define DEBUG_CAP_TMS_SEQ (1 << 0)
200
201 /**
202 * Execute queued commands.
203 * @returns ERROR_OK on success, or an error code on failure.
204 */
205 int (*execute_queue)(void);
206 };
207
208 /**
209 * Represents a driver for a debugging interface
210 *
211 * @todo We need a per-instance structure too, and changes to pass
212 * that structure to the driver. Instances can for example be in
213 * either SWD or JTAG modes. This will help remove globals, and
214 * eventually to cope with systems which have more than one such
215 * debugging interface.
216 */
217 struct adapter_driver {
218 /** The name of the interface driver. */
219 const char * const name;
220
221 /** transports supported in C code (NULL terminated vector) */
222 const char * const *transports;
223
224 /**
225 * The interface driver may register additional commands to expose
226 * additional features not covered by the standard command set.
227 */
228 const struct command_registration *commands;
229
230 /**
231 * Interface driver must initialize any resources and connect to a
232 * JTAG device.
233 *
234 * quit() is invoked if and only if init() succeeds. quit() is always
235 * invoked if init() succeeds. Same as malloc() + free(). Always
236 * invoke free() if malloc() succeeds and do not invoke free()
237 * otherwise.
238 *
239 * @returns ERROR_OK on success, or an error code on failure.
240 */
241 int (*init)(void);
242
243 /**
244 * Interface driver must tear down all resources and disconnect from
245 * the JTAG device.
246 *
247 * @returns ERROR_OK on success, or an error code on failure.
248 */
249 int (*quit)(void);
250
251 /**
252 * Control (assert/deassert) the signals SRST and TRST on the interface.
253 * This function is optional.
254 * Adapters that don't support resets can either not define this function
255 * or return an error code.
256 * Adapters that don't support one of the two reset should ignore the
257 * request to assert the missing signal and eventually log an error.
258 *
259 * @param srst 1 to assert SRST, 0 to deassert SRST.
260 * @param trst 1 to assert TRST, 0 to deassert TRST.
261 * @returns ERROR_OK on success, or an error code on failure.
262 */
263 int (*reset)(int srst, int trst);
264
265 /**
266 * Set the interface speed.
267 * @param speed The new interface speed setting.
268 * @returns ERROR_OK on success, or an error code on failure.
269 */
270 int (*speed)(int speed);
271
272 /**
273 * Returns JTAG maxium speed for KHz. 0 = RTCK. The function returns
274 * a failure if it can't support the KHz/RTCK.
275 *
276 * WARNING!!!! if RTCK is *slow* then think carefully about
277 * whether you actually want to support this in the driver.
278 * Many target scripts are written to handle the absence of RTCK
279 * and use a fallback kHz TCK.
280 * @returns ERROR_OK on success, or an error code on failure.
281 */
282 int (*khz)(int khz, int *jtag_speed);
283
284 /**
285 * Calculate the clock frequency (in KHz) for the given @a speed.
286 * @param speed The desired interface speed setting.
287 * @param khz On return, contains the speed in KHz (0 for RTCK).
288 * @returns ERROR_OK on success, or an error code if the
289 * interface cannot support the specified speed (KHz or RTCK).
290 */
291 int (*speed_div)(int speed, int *khz);
292
293 /**
294 * Read and clear the power dropout flag. Note that a power dropout
295 * can be transitionary, easily much less than a ms.
296 *
297 * To find out if the power is *currently* on, one must invoke this
298 * method twice. Once to clear the power dropout flag and a second
299 * time to read the current state. The default implementation
300 * never reports power dropouts.
301 *
302 * @returns ERROR_OK on success, or an error code on failure.
303 */
304 int (*power_dropout)(int *power_dropout);
305
306 /**
307 * Read and clear the srst asserted detection flag.
308 *
309 * Like power_dropout this does *not* read the current
310 * state. SRST assertion is transitionary and may be much
311 * less than 1ms, so the interface driver must watch for these
312 * events until this routine is called.
313 *
314 * @param srst_asserted On return, indicates whether SRST has
315 * been asserted.
316 * @returns ERROR_OK on success, or an error code on failure.
317 */
318 int (*srst_asserted)(int *srst_asserted);
319
320 /**
321 * Configure trace parameters for the adapter
322 *
323 * @param enabled Whether to enable trace
324 * @param pin_protocol Configured pin protocol
325 * @param port_size Trace port width for sync mode
326 * @param trace_freq A pointer to the configured trace
327 * frequency; if it points to 0, the adapter driver must write
328 * its maximum supported rate there
329 * @param traceclkin_freq TRACECLKIN frequency provided to the TPIU in Hz
330 * @param prescaler Pointer to the SWO prescaler calculated by the
331 * adapter
332 * @returns ERROR_OK on success, an error code on failure.
333 */
334 int (*config_trace)(bool enabled, enum tpiu_pin_protocol pin_protocol,
335 uint32_t port_size, unsigned int *trace_freq,
336 unsigned int traceclkin_freq, uint16_t *prescaler);
337
338 /**
339 * Poll for new trace data
340 *
341 * @param buf A pointer to buffer to store received data
342 * @param size A pointer to buffer size; must be filled with
343 * the actual amount of bytes written
344 *
345 * @returns ERROR_OK on success, an error code on failure.
346 */
347 int (*poll_trace)(uint8_t *buf, size_t *size);
348
349 /** Low-level JTAG APIs */
350 struct jtag_interface *jtag_ops;
351
352 /** Low-level SWD APIs */
353 const struct swd_driver *swd_ops;
354
355 /* DAP APIs over JTAG transport */
356 const struct dap_ops *dap_jtag_ops;
357
358 /* DAP APIs over SWD transport */
359 const struct dap_ops *dap_swd_ops;
360 };
361
362 extern const char * const jtag_only[];
363
364 int adapter_resets(int assert_trst, int assert_srst);
365 int adapter_assert_reset(void);
366 int adapter_deassert_reset(void);
367 int adapter_config_trace(bool enabled, enum tpiu_pin_protocol pin_protocol,
368 uint32_t port_size, unsigned int *trace_freq,
369 unsigned int traceclkin_freq, uint16_t *prescaler);
370 int adapter_poll_trace(uint8_t *buf, size_t *size);
371
372 #endif /* OPENOCD_JTAG_INTERFACE_H */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)