* Copyright (C) 2005 by Dominic Rath *
* Dominic.Rath@gmx.de *
* *
- * Copyright (C) 2007,2008 Øyvind Harboe *
+ * Copyright (C) 2007,2008 Øyvind Harboe *
* oyvind.harboe@zylin.com *
* *
* This program is free software; you can redistribute it and/or modify *
void jtag_add_end_state(enum tap_state endstate);
void jtag_add_sleep(u32 us);
int jtag_execute_queue(void);
-int jtag_cancel_queue(void);
+
/* jtag commands */
int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
return t + offset;
}
-void cmd_queue_free()
+void cmd_queue_free(void)
{
cmd_queue_page_t *page = cmd_queue_pages;
cmd_queue_pages = NULL;
}
-static void jtag_prelude1()
+static void jtag_prelude1(void)
{
if (jtag_trst == 1)
{
return ERROR_OK;
}
-void jtag_add_tlr()
+void jtag_add_tlr(void)
{
jtag_prelude(TAP_TLR);
void jtag_sleep(u32 us)
{
- usleep(us);
+ alive_sleep(us/1000);
}
/* Try to examine chain layout according to IEEE 1149.1 §12
*/
-int jtag_examine_chain()
+int jtag_examine_chain(void)
{
jtag_device_t *device = jtag_devices;
scan_field_t field;
if ((idcode & 1) == 0)
{
/* LSB must not be 0, this indicates a device in bypass */
- device_count++;
-
- LOG_WARNING("Device was in bypass after TRST/TMS reset");
+ LOG_WARNING("Device does not have IDCODE");
+ idcode=0;
bit_count += 1;
}
break;
}
- if (device)
- {
- device->idcode = idcode;
- device = device->next;
- }
- device_count++;
-
manufacturer = (idcode & 0xffe) >> 1;
part = (idcode & 0xffff000) >> 12;
version = (idcode & 0xf0000000) >> 28;
bit_count += 32;
}
+ if (device)
+ {
+ device->idcode = idcode;
+ device = device->next;
+ }
+ device_count++;
}
/* see if number of discovered devices matches configuration */
return ERROR_OK;
}
-int jtag_validate_chain()
+int jtag_validate_chain(void)
{
jtag_device_t *device = jtag_devices;
int total_ir_length = 0;
return ERROR_OK;
}
+
+static int
+jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
+{
+ Jim_GetOptInfo goi;
+ int e;
+ Jim_Nvp *n;
+ struct command_context_s *context;
+
+ enum {
+ JTAG_CMD_INTERFACE,
+ JTAG_CMD_INIT_RESET,
+ };
+
+ const Jim_Nvp jtag_cmds[] = {
+ { .name = "interface" , .value = JTAG_CMD_INTERFACE },
+ { .name = "arp_init-reset", .value = JTAG_CMD_INIT_RESET },
+
+ { .name = NULL, .value = -1 },
+ };
+
+ context = Jim_GetAssocData(interp, "context");
+ // go past the command
+ Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
+
+ e = Jim_GetOpt_Nvp( &goi, jtag_cmds, &n );
+ if( e != JIM_OK ){
+ Jim_GetOpt_NvpUnknown( &goi, jtag_cmds, 0 );
+ return e;
+ }
+ Jim_SetEmptyResult( goi.interp );
+ switch( n->value ){
+ case JTAG_CMD_INTERFACE:
+ // return the name of the interface
+ // TCL code might need to know the exact type...
+ // FUTURE: we allow this as a means to "set" the interface.
+ if( goi.argc != 0 ){
+ Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
+ return JIM_ERR;
+ }
+ Jim_SetResultString( goi.interp, jtag_interface->name, -1 );
+ return JIM_OK;
+ case JTAG_CMD_INIT_RESET:
+ if( goi.argc != 0 ){
+ Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
+ return JIM_ERR;
+ }
+ e = jtag_init_reset(context);
+ if( e != ERROR_OK ){
+ Jim_SetResult_sprintf( goi.interp, "error: %d", e);
+ return JIM_ERR;
+ }
+ return JIM_OK;
+ }
+
+
+ return JIM_ERR;
+}
+
int jtag_register_commands(struct command_context_s *cmd_ctx)
{
+ register_jim( cmd_ctx, "jtag", jim_jtag_command, "perform jtag tap actions");
+
register_command(cmd_ctx, NULL, "interface", handle_interface_command,
- COMMAND_CONFIG, NULL);
+ COMMAND_CONFIG, "try to configure interface");
register_command(cmd_ctx, NULL, "jtag_speed", handle_jtag_speed_command,
COMMAND_ANY, "set jtag speed (if supported)");
register_command(cmd_ctx, NULL, "jtag_khz", handle_jtag_khz_command,
static int jtag_init_inner(struct command_context_s *cmd_ctx)
{
- int validate_tries = 0;
jtag_device_t *device;
int retval;
LOG_ERROR("trying to validate configured JTAG chain anyway...");
}
- while (jtag_validate_chain() != ERROR_OK)
+ if (jtag_validate_chain() != ERROR_OK)
{
- validate_tries++;
-
- if (validate_tries > 5)
- {
- LOG_ERROR("Could not validate JTAG chain, exit");
- return ERROR_JTAG_INVALID_INTERFACE;
- }
- usleep(10000);
+ LOG_ERROR("Could not validate JTAG chain, continuing anyway...");
}
return ERROR_OK;
static int default_speed_div(int speed, int *khz)
{
+ LOG_ERROR("Translation from jtag_speed to khz not implemented");
return ERROR_FAIL;
}
int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
int i;
+ int retval;
/* check whether the interface is already configured */
if (jtag_interface)
{
if (strcmp(args[0], jtag_interfaces[i]->name) == 0)
{
- if (jtag_interfaces[i]->register_commands(cmd_ctx) != ERROR_OK)
- exit(-1);
+ if ((retval = jtag_interfaces[i]->register_commands(cmd_ctx)) != ERROR_OK)
+ {
+ return retval;
+ }
jtag_interface = jtag_interfaces[i];
{
} else
{
- retval=ERROR_COMMAND_SYNTAX_ERROR;
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
command_print(cmd_ctx, "jtag_speed: %d", jtag_speed);
{
} else
{
- retval=ERROR_COMMAND_SYNTAX_ERROR;
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
+
+ if (jtag!=NULL)
+ {
+ if ((retval=jtag->speed_div(jtag_speed, &speed_khz))!=ERROR_OK)
+ return retval;
+ }
+
command_print(cmd_ctx, "jtag_khz: %d", speed_khz);
return retval;