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>
32 static int jim_newtap_expected_id(Jim_Nvp
*n
, Jim_GetOptInfo
*goi
,
33 struct jtag_tap
*pTap
)
36 int e
= Jim_GetOpt_Wide(goi
, &w
);
38 Jim_SetResultFormatted(goi
->interp
, "option: %s bad parameter",
43 unsigned expected_len
= sizeof(uint32_t) * pTap
->expected_ids_cnt
;
44 uint32_t *new_expected_ids
= malloc(expected_len
+ sizeof(uint32_t));
45 if (new_expected_ids
== NULL
) {
46 Jim_SetResultFormatted(goi
->interp
, "no memory");
50 memcpy(new_expected_ids
, pTap
->expected_ids
, expected_len
);
52 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
54 free(pTap
->expected_ids
);
55 pTap
->expected_ids
= new_expected_ids
;
56 pTap
->expected_ids_cnt
++;
61 #define NTAP_OPT_EXPECTED_ID 0
64 static int jim_aice_newtap_cmd(Jim_GetOptInfo
*goi
)
66 struct jtag_tap
*pTap
;
71 const Jim_Nvp opts
[] = {
72 {.name
= "-expected-id", .value
= NTAP_OPT_EXPECTED_ID
},
73 {.name
= NULL
, .value
= -1},
76 pTap
= calloc(1, sizeof(struct jtag_tap
));
78 Jim_SetResultFormatted(goi
->interp
, "no memory");
83 * we expect CHIP + TAP + OPTIONS
86 Jim_SetResultFormatted(goi
->interp
,
87 "Missing CHIP TAP OPTIONS ....");
93 Jim_GetOpt_String(goi
, &tmp
, NULL
);
94 pTap
->chip
= strdup(tmp
);
96 Jim_GetOpt_String(goi
, &tmp
, NULL
);
97 pTap
->tapname
= strdup(tmp
);
99 /* name + dot + name + null */
100 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
102 sprintf(cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
103 pTap
->dotted_name
= cp
;
105 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
106 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
109 e
= Jim_GetOpt_Nvp(goi
, opts
, &n
);
111 Jim_GetOpt_NvpUnknown(goi
, opts
, 0);
116 LOG_DEBUG("Processing option: %s", n
->name
);
118 case NTAP_OPT_EXPECTED_ID
:
119 e
= jim_newtap_expected_id(n
, goi
, pTap
);
126 } /* switch (n->value) */
127 } /* while (goi->argc) */
129 /* default is enabled-after-reset */
130 pTap
->enabled
= !pTap
->disabled_after_reset
;
137 static int jim_aice_newtap(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
140 Jim_GetOpt_Setup(&goi
, interp
, argc
- 1, argv
+ 1);
141 return jim_aice_newtap_cmd(&goi
);
145 COMMAND_HANDLER(handle_aice_init_command
)
148 return ERROR_COMMAND_SYNTAX_ERROR
;
150 static bool jtag_initialized
;
151 if (jtag_initialized
) {
152 LOG_INFO("'jtag init' has already been called");
155 jtag_initialized
= true;
157 LOG_DEBUG("Initializing jtag devices...");
158 return jtag_init(CMD_CTX
);
161 static int jim_aice_arp_init(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
163 LOG_DEBUG("No implement: jim_aice_arp_init");
169 static int aice_init_reset(struct command_context
*cmd_ctx
)
171 LOG_DEBUG("Initializing with hard TRST+SRST reset");
174 enum reset_types jtag_reset_config
= jtag_get_reset_config();
176 jtag_add_reset(1, 0); /* TAP_RESET */
177 if (jtag_reset_config
& RESET_HAS_SRST
) {
178 jtag_add_reset(1, 1);
179 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
) == 0)
180 jtag_add_reset(0, 1);
182 jtag_add_reset(0, 0);
183 retval
= jtag_execute_queue();
184 if (retval
!= ERROR_OK
)
191 static int jim_aice_arp_init_reset(Jim_Interp
*interp
, int argc
, Jim_Obj
* const *argv
)
195 Jim_GetOpt_Setup(&goi
, interp
, argc
- 1, argv
+ 1);
197 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
- 1, "(no params)");
200 struct command_context
*context
= current_command_context(interp
);
201 e
= aice_init_reset(context
);
204 Jim_Obj
*eObj
= Jim_NewIntObj(goi
.interp
, e
);
205 Jim_SetResultFormatted(goi
.interp
, "error: %#s", eObj
);
206 Jim_FreeNewObj(goi
.interp
, eObj
);
212 static int jim_aice_names(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
215 Jim_GetOpt_Setup(&goi
, interp
, argc
- 1, argv
+ 1);
217 Jim_WrongNumArgs(goi
.interp
, 1, goi
.argv
, "Too many parameters");
220 Jim_SetResult(goi
.interp
, Jim_NewListObj(goi
.interp
, NULL
, 0));
221 struct jtag_tap
*tap
;
223 for (tap
= jtag_all_taps(); tap
; tap
= tap
->next_tap
)
224 Jim_ListAppendElement(goi
.interp
,
225 Jim_GetResult(goi
.interp
),
226 Jim_NewStringObj(goi
.interp
,
227 tap
->dotted_name
, -1));
233 static const struct command_registration
234 aice_transport_jtag_subcommand_handlers
[] = {
238 .handler
= handle_aice_init_command
,
239 .help
= "initialize jtag scan chain",
245 .jim_handler
= jim_aice_arp_init
,
246 .help
= "Validates JTAG scan chain against the list of "
250 .name
= "arp_init-reset",
252 .jim_handler
= jim_aice_arp_init_reset
,
253 .help
= "Uses TRST and SRST to try resetting everything on "
254 "the JTAG scan chain, then performs 'jtag arp_init'."
258 .mode
= COMMAND_CONFIG
,
259 .jim_handler
= jim_aice_newtap
,
260 .help
= "Create a new TAP instance named basename.tap_type, "
261 "and appends it to the scan chain.",
262 .usage
= "basename tap_type ['-expected_id' number]"
265 .name
= "tapisenabled",
266 .mode
= COMMAND_EXEC
,
267 .jim_handler
= jim_jtag_tap_enabler
,
268 .help
= "Returns a Tcl boolean (0/1) indicating whether "
269 "the TAP is enabled (1) or not (0).",
274 .mode
= COMMAND_EXEC
,
275 .jim_handler
= jim_jtag_tap_enabler
,
276 .help
= "Try to enable the specified TAP using the "
277 "'tap-enable' TAP event.",
281 .name
= "tapdisable",
282 .mode
= COMMAND_EXEC
,
283 .jim_handler
= jim_jtag_tap_enabler
,
284 .help
= "Try to disable the specified TAP using the "
285 "'tap-disable' TAP event.",
290 .mode
= COMMAND_EXEC
,
291 .jim_handler
= jim_jtag_configure
,
292 .help
= "Provide a Tcl handler for the specified "
294 .usage
= "tap_name '-event' event_name handler",
298 .mode
= COMMAND_EXEC
,
299 .jim_handler
= jim_jtag_configure
,
300 .help
= "Return any Tcl handler for the specified "
302 .usage
= "tap_name '-event' event_name",
307 .jim_handler
= jim_aice_names
,
308 .help
= "Returns list of all JTAG tap names.",
311 COMMAND_REGISTRATION_DONE
315 static const struct command_registration aice_transport_command_handlers
[] = {
320 .chain
= aice_transport_jtag_subcommand_handlers
,
322 COMMAND_REGISTRATION_DONE
327 static int aice_transport_register_commands(struct command_context
*cmd_ctx
)
329 return register_commands(cmd_ctx
, NULL
,
330 aice_transport_command_handlers
);
334 static int aice_transport_init(struct command_context
*cmd_ctx
)
336 LOG_DEBUG("aice_transport_init");
337 struct target
*t
= get_current_target(cmd_ctx
);
338 struct transport
*transport
;
341 LOG_ERROR("no current target");
345 transport
= get_current_transport();
348 LOG_ERROR("no transport selected");
352 LOG_DEBUG("current transport %s", transport
->name
);
354 return aice_init_targets();
358 static int aice_transport_select(struct command_context
*ctx
)
360 LOG_DEBUG("aice_transport_select");
364 retval
= aice_transport_register_commands(ctx
);
366 if (retval
!= ERROR_OK
)
372 static struct transport aice_jtag_transport
= {
374 .select
= aice_transport_select
,
375 .init
= aice_transport_init
,
378 const char *aice_transports
[] = { "aice_jtag", NULL
};
380 static void aice_constructor(void) __attribute__((constructor
));
381 static void aice_constructor(void)
383 transport_register(&aice_jtag_transport
);