1 /***************************************************************************
2 * Copyright (C) 2013 by Andes Technology *
3 * Hsiangkai Wang <hkwang@andestech.com> *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 ***************************************************************************/
23 /* project specific includes */
24 #include <jtag/interface.h>
26 #include <transport/transport.h>
27 #include <target/target.h>
28 #include <jtag/aice/aice_interface.h>
29 #include <jtag/aice/aice_transport.h>
33 static int jim_newtap_expected_id(struct jim_nvp *n, struct jim_getopt_info *goi,
37 int e = jim_getopt_wide(goi, &w);
39 Jim_SetResultFormatted(goi->interp, "option: %s bad parameter",
44 unsigned expected_len = sizeof(uint32_t) * tap->expected_ids_cnt;
45 uint32_t *new_expected_ids = malloc(expected_len + sizeof(uint32_t));
46 if (!new_expected_ids) {
47 Jim_SetResultFormatted(goi->interp, "no memory");
51 assert(tap->expected_ids);
52 memcpy(new_expected_ids, tap->expected_ids, expected_len);
54 new_expected_ids[tap->expected_ids_cnt] = w;
56 free(tap->expected_ids);
57 tap->expected_ids = new_expected_ids;
58 tap->expected_ids_cnt++;
63 #define NTAP_OPT_EXPECTED_ID 0
66 static int jim_aice_newtap_cmd(struct jim_getopt_info *goi)
73 const struct jim_nvp opts[] = {
74 {.name = "-expected-id", .value = NTAP_OPT_EXPECTED_ID},
75 {.name = NULL, .value = -1},
78 tap = calloc(1, sizeof(struct jtag_tap));
80 Jim_SetResultFormatted(goi->interp, "no memory");
85 * we expect CHIP + TAP + OPTIONS
88 Jim_SetResultFormatted(goi->interp,
89 "Missing CHIP TAP OPTIONS ....");
95 jim_getopt_string(goi, &tmp, NULL);
96 tap->chip = strdup(tmp);
98 jim_getopt_string(goi, &tmp, NULL);
99 tap->tapname = strdup(tmp);
101 /* name + dot + name + null */
102 x = strlen(tap->chip) + 1 + strlen(tap->tapname) + 1;
104 sprintf(cp, "%s.%s", tap->chip, tap->tapname);
105 tap->dotted_name = cp;
107 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
108 tap->chip, tap->tapname, tap->dotted_name, goi->argc);
111 e = jim_getopt_nvp(goi, opts, &n);
113 jim_getopt_nvp_unknown(goi, opts, 0);
118 LOG_DEBUG("Processing option: %s", n->name);
120 case NTAP_OPT_EXPECTED_ID:
121 e = jim_newtap_expected_id(n, goi, tap);
128 } /* switch (n->value) */
129 } /* while (goi->argc) */
131 /* default is enabled-after-reset */
132 tap->enabled = !tap->disabled_after_reset;
139 static int jim_aice_newtap(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
141 struct jim_getopt_info goi;
142 jim_getopt_setup(&goi, interp, argc - 1, argv + 1);
143 return jim_aice_newtap_cmd(&goi);
147 COMMAND_HANDLER(handle_aice_init_command)
150 return ERROR_COMMAND_SYNTAX_ERROR;
152 static bool jtag_initialized;
153 if (jtag_initialized) {
154 LOG_INFO("'jtag init' has already been called");
157 jtag_initialized = true;
159 LOG_DEBUG("Initializing jtag devices...");
160 return jtag_init(CMD_CTX);
163 COMMAND_HANDLER(handle_scan_chain_command)
165 struct jtag_tap *tap;
166 char expected_id[12];
168 aice_scan_jtag_chain();
169 tap = jtag_all_taps();
171 " TapName Enabled IdCode Expected IrLen IrCap IrMask");
173 "-- ------------------- -------- ---------- ---------- ----- ----- ------");
176 uint32_t expected, expected_mask, ii;
178 snprintf(expected_id, sizeof(expected_id), "0x%08x",
179 (unsigned)((tap->expected_ids_cnt > 0)
180 ? tap->expected_ids[0]
182 if (tap->ignore_version)
183 expected_id[2] = '*';
185 expected = buf_get_u32(tap->expected, 0, tap->ir_length);
186 expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length);
189 "%2d %-18s %c 0x%08x %s %5d 0x%02x 0x%02x",
190 tap->abs_chain_position,
192 tap->enabled ? 'Y' : 'n',
193 (unsigned int)(tap->idcode),
195 (unsigned int)(tap->ir_length),
196 (unsigned int)(expected),
197 (unsigned int)(expected_mask));
199 for (ii = 1; ii < tap->expected_ids_cnt; ii++) {
200 snprintf(expected_id, sizeof(expected_id), "0x%08x",
201 (unsigned) tap->expected_ids[ii]);
202 if (tap->ignore_version)
203 expected_id[2] = '*';
216 static int jim_aice_arp_init(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
218 LOG_DEBUG("No implement: jim_aice_arp_init");
224 static int aice_init_reset(struct command_context *cmd_ctx)
226 LOG_DEBUG("Initializing with hard TRST+SRST reset");
229 enum reset_types jtag_reset_config = jtag_get_reset_config();
231 jtag_add_reset(1, 0); /* TAP_RESET */
232 if (jtag_reset_config & RESET_HAS_SRST) {
233 jtag_add_reset(1, 1);
234 if ((jtag_reset_config & RESET_SRST_PULLS_TRST) == 0)
235 jtag_add_reset(0, 1);
237 jtag_add_reset(0, 0);
238 retval = jtag_execute_queue();
239 if (retval != ERROR_OK)
246 static int jim_aice_arp_init_reset(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
249 struct jim_getopt_info goi;
250 jim_getopt_setup(&goi, interp, argc - 1, argv + 1);
252 Jim_WrongNumArgs(goi.interp, 1, goi.argv - 1, "(no params)");
255 struct command_context *context = current_command_context(interp);
256 e = aice_init_reset(context);
259 Jim_Obj *obj = Jim_NewIntObj(goi.interp, e);
260 Jim_SetResultFormatted(goi.interp, "error: %#s", obj);
266 static int jim_aice_names(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
268 struct jim_getopt_info goi;
269 jim_getopt_setup(&goi, interp, argc - 1, argv + 1);
271 Jim_WrongNumArgs(goi.interp, 1, goi.argv, "Too many parameters");
274 Jim_SetResult(goi.interp, Jim_NewListObj(goi.interp, NULL, 0));
275 struct jtag_tap *tap;
277 for (tap = jtag_all_taps(); tap; tap = tap->next_tap)
278 Jim_ListAppendElement(goi.interp,
279 Jim_GetResult(goi.interp),
280 Jim_NewStringObj(goi.interp,
281 tap->dotted_name, -1));
287 static const struct command_registration aice_transport_jtag_subcommand_handlers[] = {
291 .handler = handle_aice_init_command,
292 .help = "initialize jtag scan chain",
298 .jim_handler = jim_aice_arp_init,
299 .help = "Validates JTAG scan chain against the list of "
303 .name = "arp_init-reset",
305 .jim_handler = jim_aice_arp_init_reset,
306 .help = "Uses TRST and SRST to try resetting everything on "
307 "the JTAG scan chain, then performs 'jtag arp_init'."
311 .mode = COMMAND_CONFIG,
312 .jim_handler = jim_aice_newtap,
313 .help = "Create a new TAP instance named basename.tap_type, "
314 "and appends it to the scan chain.",
315 .usage = "basename tap_type ['-expected_id' number]"
318 .name = "tapisenabled",
319 .mode = COMMAND_EXEC,
320 .jim_handler = jim_jtag_tap_enabler,
321 .help = "Returns a Tcl boolean (0/1) indicating whether "
322 "the TAP is enabled (1) or not (0).",
327 .mode = COMMAND_EXEC,
328 .jim_handler = jim_jtag_tap_enabler,
329 .help = "Try to enable the specified TAP using the "
330 "'tap-enable' TAP event.",
334 .name = "tapdisable",
335 .mode = COMMAND_EXEC,
336 .jim_handler = jim_jtag_tap_enabler,
337 .help = "Try to disable the specified TAP using the "
338 "'tap-disable' TAP event.",
344 .jim_handler = jim_jtag_configure,
345 .help = "Provide a Tcl handler for the specified "
347 .usage = "tap_name '-event' event_name handler",
351 .mode = COMMAND_EXEC,
352 .jim_handler = jim_jtag_configure,
353 .help = "Return any Tcl handler for the specified "
355 .usage = "tap_name '-event' event_name",
360 .jim_handler = jim_aice_names,
361 .help = "Returns list of all JTAG tap names.",
364 .name = "scan_chain",
365 .handler = handle_scan_chain_command,
367 .help = "print current scan chain configuration",
371 COMMAND_REGISTRATION_DONE
375 static const struct command_registration aice_transport_command_handlers[] = {
380 .chain = aice_transport_jtag_subcommand_handlers,
382 COMMAND_REGISTRATION_DONE
387 static int aice_transport_register_commands(struct command_context *cmd_ctx)
389 return register_commands(cmd_ctx, NULL, aice_transport_command_handlers);
393 static int aice_transport_init(struct command_context *cmd_ctx)
395 LOG_DEBUG("aice_transport_init");
396 struct target *t = get_current_target(cmd_ctx);
397 struct transport *transport;
400 LOG_ERROR("no current target");
404 transport = get_current_transport();
407 LOG_ERROR("no transport selected");
411 LOG_DEBUG("current transport %s", transport->name);
413 return aice_init_targets();
417 static int aice_transport_select(struct command_context *ctx)
419 LOG_DEBUG("aice_transport_select");
423 retval = aice_transport_register_commands(ctx);
425 if (retval != ERROR_OK)
431 static struct transport aice_jtag_transport = {
433 .select = aice_transport_select,
434 .init = aice_transport_init,
437 const char *aice_transports[] = { "aice_jtag", NULL };
439 static void aice_constructor(void) __attribute__((constructor));
440 static void aice_constructor(void)
442 transport_register(&aice_jtag_transport);