flash/nor/nrf5: handle ERROR_WAIT during nRF91 flash erase
[openocd.git] / src / jtag / hla / hla_transport.c
blobb826eb0fe6ace341c5aae5136b7ee5662b51dfd7
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /***************************************************************************
4 * Copyright (C) 2011 by Mathias Kuester *
5 * Mathias Kuester <kesmtp@freenet.de> *
6 * *
7 * Copyright (C) 2012 by Spencer Oliver *
8 * spen@spen-soft.co.uk *
9 ***************************************************************************/
11 #ifdef HAVE_CONFIG_H
12 #include "config.h"
13 #endif
15 /* project specific includes */
16 #include <jtag/interface.h>
17 #include <jtag/tcl.h>
18 #include <transport/transport.h>
19 #include <helper/time_support.h>
20 #include <target/target.h>
21 #include <jtag/hla/hla_transport.h>
22 #include <jtag/hla/hla_interface.h>
24 COMMAND_HANDLER(hl_transport_jtag_command)
26 LOG_DEBUG("hl_transport_jtag_command");
28 return ERROR_OK;
31 COMMAND_HANDLER(hl_transport_reset_command)
33 return hl_interface_init_reset();
36 static const struct command_registration hl_swd_transport_subcommand_handlers[] = {
38 .name = "newdap",
39 .mode = COMMAND_CONFIG,
40 .handler = handle_jtag_newtap,
41 .help = "declare a new SWD DAP",
42 .usage = "basename dap_type ['-irlen' count] "
43 "['-enable'|'-disable'] "
44 "['-expected_id' number] "
45 "['-ignore-version'] "
46 "['-ignore-bypass'] "
47 "['-ircapture' number] "
48 "['-ir-bypass' number] "
49 "['-mask' number]",
51 COMMAND_REGISTRATION_DONE
54 static const struct command_registration hl_swd_transport_command_handlers[] = {
56 .name = "swd",
57 .mode = COMMAND_ANY,
58 .help = "SWD command group",
59 .usage = "",
60 .chain = hl_swd_transport_subcommand_handlers,
62 COMMAND_REGISTRATION_DONE
65 static const struct command_registration hl_transport_jtag_subcommand_handlers[] = {
67 .name = "newtap",
68 .mode = COMMAND_CONFIG,
69 .handler = handle_jtag_newtap,
70 .help = "Create a new TAP instance named basename.tap_type, "
71 "and appends it to the scan chain.",
72 .usage = "basename tap_type '-irlen' count "
73 "['-enable'|'-disable'] "
74 "['-expected_id' number] "
75 "['-ignore-version'] "
76 "['-ignore-bypass'] "
77 "['-ircapture' number] "
78 "['-ir-bypass' number] "
79 "['-mask' number]",
82 .name = "init",
83 .mode = COMMAND_ANY,
84 .handler = hl_transport_jtag_command,
85 .usage = ""
88 .name = "arp_init",
89 .mode = COMMAND_ANY,
90 .handler = hl_transport_jtag_command,
91 .usage = ""
94 .name = "arp_init-reset",
95 .mode = COMMAND_ANY,
96 .handler = hl_transport_reset_command,
97 .usage = ""
100 .name = "tapisenabled",
101 .mode = COMMAND_EXEC,
102 .handler = handle_jtag_tap_enabler,
103 .help = "Returns a Tcl boolean (0/1) indicating whether "
104 "the TAP is enabled (1) or not (0).",
105 .usage = "tap_name",
108 .name = "tapenable",
109 .mode = COMMAND_EXEC,
110 .handler = handle_jtag_tap_enabler,
111 .help = "Try to enable the specified TAP using the "
112 "'tap-enable' TAP event.",
113 .usage = "tap_name",
116 .name = "tapdisable",
117 .mode = COMMAND_EXEC,
118 .handler = hl_transport_jtag_command,
119 .usage = "",
122 .name = "configure",
123 .mode = COMMAND_EXEC,
124 .handler = hl_transport_jtag_command,
125 .usage = "",
128 .name = "cget",
129 .mode = COMMAND_EXEC,
130 .handler = handle_jtag_configure,
131 .usage = "",
134 .name = "names",
135 .mode = COMMAND_ANY,
136 .handler = hl_transport_jtag_command,
137 .usage = "",
140 COMMAND_REGISTRATION_DONE
143 static const struct command_registration hl_jtag_transport_command_handlers[] = {
145 .name = "jtag",
146 .mode = COMMAND_ANY,
147 .help = "perform jtag tap actions",
148 .usage = "",
149 .chain = hl_transport_jtag_subcommand_handlers,
152 .name = "jtag_ntrst_delay",
153 .mode = COMMAND_ANY,
154 .handler = hl_transport_jtag_command,
155 .usage = "",
157 COMMAND_REGISTRATION_DONE
161 static int hl_transport_init(struct command_context *cmd_ctx)
163 LOG_DEBUG("hl_transport_init");
164 struct target *t = get_current_target(cmd_ctx);
165 struct transport *transport;
166 enum hl_transports tr;
168 if (!t) {
169 LOG_ERROR("no current target");
170 return ERROR_FAIL;
173 transport = get_current_transport();
175 if (!transport) {
176 LOG_ERROR("no transport selected");
177 return ERROR_FAIL;
180 LOG_DEBUG("current transport %s", transport->name);
182 /* get selected transport as enum */
183 tr = HL_TRANSPORT_UNKNOWN;
185 if (strcmp(transport->name, "hla_swd") == 0)
186 tr = HL_TRANSPORT_SWD;
187 else if (strcmp(transport->name, "hla_jtag") == 0)
188 tr = HL_TRANSPORT_JTAG;
190 int retval = hl_interface_open(tr);
192 if (retval != ERROR_OK)
193 return retval;
195 return hl_interface_init_target(t);
198 static int hl_jtag_transport_select(struct command_context *cmd_ctx)
200 LOG_DEBUG("hl_jtag_transport_select");
202 /* NOTE: interface init must already have been done.
203 * That works with only C code ... no Tcl glue required.
206 return register_commands(cmd_ctx, NULL, hl_jtag_transport_command_handlers);
209 static int hl_swd_transport_select(struct command_context *cmd_ctx)
211 LOG_DEBUG("hl_swd_transport_select");
212 return register_commands(cmd_ctx, NULL, hl_swd_transport_command_handlers);
215 static struct transport hl_swd_transport = {
216 .name = "hla_swd",
217 .select = hl_swd_transport_select,
218 .init = hl_transport_init,
219 .override_target = hl_interface_override_target,
222 static struct transport hl_jtag_transport = {
223 .name = "hla_jtag",
224 .select = hl_jtag_transport_select,
225 .init = hl_transport_init,
226 .override_target = hl_interface_override_target,
229 const char *hl_transports[] = { "hla_swd", "hla_jtag", NULL };
231 static void hl_constructor(void) __attribute__ ((constructor));
232 static void hl_constructor(void)
234 transport_register(&hl_swd_transport);
235 transport_register(&hl_jtag_transport);
238 bool transport_is_hla(void)
240 struct transport *t;
241 t = get_current_transport();
242 return t == &hl_swd_transport || t == &hl_jtag_transport;