1 // SPDX-License-Identifier: GPL-2.0-or-later
3 /***************************************************************************
4 * Copyright (C) 2011 by Mathias Kuester *
5 * Mathias Kuester <kesmtp@freenet.de> *
7 * Copyright (C) 2012 by Spencer Oliver *
8 * spen@spen-soft.co.uk *
9 ***************************************************************************/
15 /* project specific includes */
16 #include <jtag/interface.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");
31 COMMAND_HANDLER(hl_transport_reset_command
)
33 return hl_interface_init_reset();
36 static const struct command_registration hl_swd_transport_subcommand_handlers
[] = {
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'] "
47 "['-ircapture' number] "
48 "['-ir-bypass' number] "
51 COMMAND_REGISTRATION_DONE
54 static const struct command_registration hl_swd_transport_command_handlers
[] = {
58 .help
= "SWD command group",
60 .chain
= hl_swd_transport_subcommand_handlers
,
62 COMMAND_REGISTRATION_DONE
65 static const struct command_registration hl_transport_jtag_subcommand_handlers
[] = {
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'] "
77 "['-ircapture' number] "
78 "['-ir-bypass' number] "
84 .handler
= hl_transport_jtag_command
,
90 .handler
= hl_transport_jtag_command
,
94 .name
= "arp_init-reset",
96 .handler
= hl_transport_reset_command
,
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).",
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.",
116 .name
= "tapdisable",
117 .mode
= COMMAND_EXEC
,
118 .handler
= hl_transport_jtag_command
,
123 .mode
= COMMAND_EXEC
,
124 .handler
= hl_transport_jtag_command
,
129 .mode
= COMMAND_EXEC
,
130 .handler
= handle_jtag_configure
,
136 .handler
= hl_transport_jtag_command
,
140 COMMAND_REGISTRATION_DONE
143 static const struct command_registration hl_jtag_transport_command_handlers
[] = {
147 .help
= "perform jtag tap actions",
149 .chain
= hl_transport_jtag_subcommand_handlers
,
152 .name
= "jtag_ntrst_delay",
154 .handler
= hl_transport_jtag_command
,
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
;
169 LOG_ERROR("no current target");
173 transport
= get_current_transport();
176 LOG_ERROR("no transport selected");
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
)
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
= {
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
= {
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)
241 t
= get_current_transport();
242 return t
== &hl_swd_transport
|| t
== &hl_jtag_transport
;