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_tcl.h>
22 #include <jtag/hla/hla_transport.h>
23 #include <jtag/hla/hla_interface.h>
25 COMMAND_HANDLER(hl_transport_jtag_command
)
27 LOG_DEBUG("hl_transport_jtag_command");
32 COMMAND_HANDLER(hl_transport_reset_command
)
34 return hl_interface_init_reset();
37 static const struct command_registration hl_swd_transport_subcommand_handlers
[] = {
40 .mode
= COMMAND_CONFIG
,
41 .jim_handler
= jim_hl_newtap
,
42 .help
= "declare a new SWD DAP",
44 COMMAND_REGISTRATION_DONE
47 static const struct command_registration hl_swd_transport_command_handlers
[] = {
51 .help
= "SWD command group",
53 .chain
= hl_swd_transport_subcommand_handlers
,
55 COMMAND_REGISTRATION_DONE
58 static const struct command_registration hl_transport_jtag_subcommand_handlers
[] = {
61 .mode
= COMMAND_CONFIG
,
62 .jim_handler
= jim_hl_newtap
,
63 .help
= "Create a new TAP instance named basename.tap_type, "
64 "and appends it to the scan chain.",
65 .usage
= "basename tap_type '-irlen' count "
66 "['-expected_id' number]",
71 .handler
= hl_transport_jtag_command
,
77 .handler
= hl_transport_jtag_command
,
81 .name
= "arp_init-reset",
83 .handler
= hl_transport_reset_command
,
87 .name
= "tapisenabled",
89 .jim_handler
= jim_jtag_tap_enabler
,
94 .jim_handler
= jim_jtag_tap_enabler
,
99 .handler
= hl_transport_jtag_command
,
104 .mode
= COMMAND_EXEC
,
105 .handler
= hl_transport_jtag_command
,
110 .mode
= COMMAND_EXEC
,
111 .jim_handler
= jim_jtag_configure
,
116 .handler
= hl_transport_jtag_command
,
120 COMMAND_REGISTRATION_DONE
123 static const struct command_registration hl_jtag_transport_command_handlers
[] = {
127 .help
= "perform jtag tap actions",
129 .chain
= hl_transport_jtag_subcommand_handlers
,
132 .name
= "jtag_ntrst_delay",
134 .handler
= hl_transport_jtag_command
,
137 COMMAND_REGISTRATION_DONE
141 static int hl_transport_init(struct command_context
*cmd_ctx
)
143 LOG_DEBUG("hl_transport_init");
144 struct target
*t
= get_current_target(cmd_ctx
);
145 struct transport
*transport
;
146 enum hl_transports tr
;
149 LOG_ERROR("no current target");
153 transport
= get_current_transport();
156 LOG_ERROR("no transport selected");
160 LOG_DEBUG("current transport %s", transport
->name
);
162 /* get selected transport as enum */
163 tr
= HL_TRANSPORT_UNKNOWN
;
165 if (strcmp(transport
->name
, "hla_swd") == 0)
166 tr
= HL_TRANSPORT_SWD
;
167 else if (strcmp(transport
->name
, "hla_jtag") == 0)
168 tr
= HL_TRANSPORT_JTAG
;
170 int retval
= hl_interface_open(tr
);
172 if (retval
!= ERROR_OK
)
175 return hl_interface_init_target(t
);
178 static int hl_jtag_transport_select(struct command_context
*cmd_ctx
)
180 LOG_DEBUG("hl_jtag_transport_select");
182 /* NOTE: interface init must already have been done.
183 * That works with only C code ... no Tcl glue required.
186 return register_commands(cmd_ctx
, NULL
, hl_jtag_transport_command_handlers
);
189 static int hl_swd_transport_select(struct command_context
*cmd_ctx
)
191 LOG_DEBUG("hl_swd_transport_select");
192 return register_commands(cmd_ctx
, NULL
, hl_swd_transport_command_handlers
);
195 static struct transport hl_swd_transport
= {
197 .select
= hl_swd_transport_select
,
198 .init
= hl_transport_init
,
199 .override_target
= hl_interface_override_target
,
202 static struct transport hl_jtag_transport
= {
204 .select
= hl_jtag_transport_select
,
205 .init
= hl_transport_init
,
206 .override_target
= hl_interface_override_target
,
209 const char *hl_transports
[] = { "hla_swd", "hla_jtag", NULL
};
211 static void hl_constructor(void) __attribute__ ((constructor
));
212 static void hl_constructor(void)
214 transport_register(&hl_swd_transport
);
215 transport_register(&hl_jtag_transport
);
218 bool transport_is_hla(void)
221 t
= get_current_transport();
222 return t
== &hl_swd_transport
|| t
== &hl_jtag_transport
;