-static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args)
-{
- int retval;
- scan_field_t *fields;
- int num_fields;
- int field_count = 0;
- int i, e;
- jtag_tap_t *tap;
- tap_state_t endstate;
-
- /* args[1] = device
- * args[2] = num_bits
- * args[3] = hex string
- * ... repeat num bits and hex string ...
- *
- * .. optionally:
- * args[N-2] = "-endstate"
- * args[N-1] = statename
- */
- if ((argc < 4) || ((argc % 2)!=0))
- {
- Jim_WrongNumArgs(interp, 1, args, "wrong arguments");
- return JIM_ERR;
- }
-
- endstate = TAP_IDLE;
-
- script_debug(interp, "drscan", argc, args);
-
- /* validate arguments as numbers */
- e = JIM_OK;
- for (i = 2; i < argc; i+=2)
- {
- long bits;
- const char *cp;
-
- e = Jim_GetLong(interp, args[i], &bits);
- /* If valid - try next arg */
- if( e == JIM_OK ){
- continue;
- }
-
- /* Not valid.. are we at the end? */
- if ( ((i+2) != argc) ){
- /* nope, then error */
- return e;
- }
-
- /* it could be: "-endstate FOO"
- * e.g. DRPAUSE so we can issue more instructions
- * before entering RUN/IDLE and executing them.
- */
-
- /* get arg as a string. */
- cp = Jim_GetString( args[i], NULL );
- /* is it the magic? */
- if( 0 == strcmp( "-endstate", cp ) ){
- /* is the statename valid? */
- cp = Jim_GetString( args[i+1], NULL );
-
- /* see if it is a valid state name */
- endstate = tap_state_by_name(cp);
- if( endstate < 0 ){
- /* update the error message */
- Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp );
- } else {
- if (!scan_is_safe(endstate))
- LOG_WARNING("drscan with unsafe "
- "endstate \"%s\"", cp);
-
- /* valid - so clear the error */
- e = JIM_OK;
- /* and remove the last 2 args */
- argc -= 2;
- }
- }
-
- /* Still an error? */
- if( e != JIM_OK ){
- return e; /* too bad */
- }
- } /* validate args */
-
- tap = jtag_tap_by_jim_obj( interp, args[1] );
- if( tap == NULL ){
- return JIM_ERR;
- }
-
- num_fields=(argc-2)/2;
- fields = malloc(sizeof(scan_field_t) * num_fields);
- for (i = 2; i < argc; i+=2)
- {
- long bits;
- int len;
- const char *str;
-
- Jim_GetLong(interp, args[i], &bits);
- str = Jim_GetString(args[i+1], &len);
-
- fields[field_count].tap = tap;
- fields[field_count].num_bits = bits;
- fields[field_count].out_value = malloc(CEIL(bits, 8));
- str_to_buf(str, len, fields[field_count].out_value, bits, 0);
- fields[field_count].in_value = fields[field_count].out_value;
- field_count++;
- }
-
- jtag_add_dr_scan(num_fields, fields, endstate);
-
- retval = jtag_execute_queue();
- if (retval != ERROR_OK)
- {
- Jim_SetResultString(interp, "drscan: jtag execute failed",-1);
- return JIM_ERR;
- }
-
- field_count=0;
- Jim_Obj *list = Jim_NewListObj(interp, NULL, 0);
- for (i = 2; i < argc; i+=2)
- {
- long bits;
- char *str;
-
- Jim_GetLong(interp, args[i], &bits);
- str = buf_to_str(fields[field_count].in_value, bits, 16);
- free(fields[field_count].out_value);
-
- Jim_ListAppendElement(interp, list, Jim_NewStringObj(interp, str, strlen(str)));
- free(str);
- field_count++;
- }
-
- Jim_SetResult(interp, list);
-
- free(fields);
-
- return JIM_OK;
-}
-
-
-static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *args)
-{
- tap_state_t states[8];
-
- if ((argc < 2) || ((size_t)argc > (sizeof(states)/sizeof(*states)+1)))
- {
- Jim_WrongNumArgs(interp, 1, args, "wrong arguments");
- return JIM_ERR;
- }
-
- script_debug(interp, "pathmove", argc, args);
-
- int i;
- for (i=0; i<argc-1; i++)
- {
- const char *cp;
- cp = Jim_GetString( args[i+1], NULL );
- states[i] = tap_state_by_name(cp);
- if( states[i] < 0 )
- {
- /* update the error message */
- Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp );
- return JIM_ERR;
- }
- }
-
- if ((jtag_add_statemove(states[0]) != ERROR_OK) || ( jtag_execute_queue()!= ERROR_OK))
- {
- Jim_SetResultString(interp, "pathmove: jtag execute failed",-1);
- return JIM_ERR;
- }
-
- jtag_add_pathmove(argc-2, states+1);
-
- if (jtag_execute_queue()!= ERROR_OK)
- {
- Jim_SetResultString(interp, "pathmove: failed",-1);
- return JIM_ERR;
- }
-
- return JIM_OK;
-}
-
-
-static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args)
-{
- script_debug(interp, "flush_count", argc, args);
-
- Jim_SetResult(interp, Jim_NewIntObj(interp, jtag_get_flush_queue_count()));
-
- return JIM_OK;
-}
-