#include "types.h"
#include "jtag.h"
#include "configuration.h"
-#include "interpreter.h"
#include "xsvf.h"
#include "target.h"
#include "flash.h"
#include "replacements.h"
-int launchTarget(struct command_context_s *cmd_ctx)
-{
- int retval;
- /* Try to examine & validate jtag chain, though this may require a reset first
- * in which case we continue setup */
- jtag_init(cmd_ctx);
-
- /* try to examine target at this point. If it fails, perhaps a reset will
- * bring it up later on via a telnet/gdb session */
- target_examine(cmd_ctx);
-
- retval=flash_init_drivers(cmd_ctx);
- if (retval!=ERROR_OK)
- return retval;
- LOG_DEBUG("flash init complete");
-
- retval=nand_init(cmd_ctx);
- if (retval!=ERROR_OK)
- return retval;
- LOG_DEBUG("NAND init complete");
-
- retval=pld_init(cmd_ctx);
- if (retval!=ERROR_OK)
- return retval;
- LOG_DEBUG("pld init complete");
- return retval;
-}
/* Give TELNET a way to find out what version this is */
int handle_version_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
Jim_AppendString(interp, tclOutput, string, strlen(string));
}
+static int openocd_retval;
+
/* try to execute as Jim command, otherwise fall back to standard command.
* Note that even if the Jim command caused an error, then we succeeded
* to execute it, hence this fn pretty much always returns ERROR_OK. */
int jim_command(command_context_t *context, char *line)
{
int retval=ERROR_OK;
- int retcode=Jim_Eval(interp, line);
+ int retcode;
+
+ active_cmd_ctx = context;
+ openocd_retval=ERROR_OK;
+ retcode = Jim_Eval(interp, line);
if (retcode == JIM_ERR) {
- Jim_PrintErrorMessage(interp);
- long t;
- Jim_Obj *openocd_result=Jim_GetVariableStr(interp, "openocd_result", JIM_ERRMSG);
- if (openocd_result)
- {
- if (Jim_GetLong(interp, openocd_result, &t)==JIM_OK)
- {
- return t;
- }
+ if (openocd_retval!=ERROR_COMMAND_CLOSE_CONNECTION)
+ {
+ /* We do not print the connection closed error message */
+ Jim_PrintErrorMessage(interp);
}
- return ERROR_FAIL;
+ if (openocd_retval==ERROR_OK)
+ {
+ /* It wasn't a low level OpenOCD command that failed */
+ return ERROR_FAIL;
+ }
+ return openocd_retval;
}
const char *result;
int reslen;
log_add_callback(tcl_output, tclOutput);
retval=command_run_line_internal(active_cmd_ctx, cmd);
- /* we need to be able to get at the retval, so we store in a variable
- */
- Jim_Obj *resultvar=Jim_NewIntObj(interp, retval);
- Jim_IncrRefCount(resultvar);
- Jim_SetGlobalVariableStr(interp, "openocd_result", resultvar);
- Jim_DecrRefCount(interp, resultvar);
+ /* we need to be able to get at the retval, so we store in a global variable */
+ openocd_retval=retval;
if (startLoop)
{
{
if (argc != 2)
return JIM_ERR;
- char *file = (char*)Jim_GetString(argv[1], NULL);
+ const char *file = Jim_GetString(argv[1], NULL);
char *full_path = find_file(file);
if (full_path == NULL)
return JIM_ERR;
return JIM_OK;
}
+static int Jim_Command_script(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+ int retval;
+ const char *file;
+ char *full_path;
+
+ if (argc != 2)
+ {
+ Jim_WrongNumArgs(interp, 1, argv, "file name missing");
+ return JIM_ERR;
+ }
+
+ /* Run a tcl script file */
+ file = Jim_GetString(argv[1], NULL);
+ full_path = find_file(file);
+ if (full_path == NULL)
+ {
+ Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings(interp, Jim_GetResult(interp), "script: could not open file", file, NULL);
+ return JIM_ERR;
+ }
+ retval = Jim_EvalFile(interp, full_path);
+ free(full_path);
+ /* convert a return to ok */
+ if (retval == JIM_RETURN)
+ return JIM_OK;
+ return retval;
+}
+
+
static size_t openocd_jim_fwrite(const void *_ptr, size_t size, size_t n, void *cookie)
{
size_t nbytes;
return NULL;
}
-void initJim(void)
+void add_jim(const char *name, int (*cmd)(Jim_Interp *interp, int argc, Jim_Obj *const *argv), const char *help)
{
+ Jim_CreateCommand(interp, name, cmd, NULL, NULL);
+
+ /* FIX!!! it would be prettier to invoke add_help_text...
+ accumulate help text in Tcl helptext list. */
+ Jim_Obj *helptext=Jim_GetGlobalVariableStr(interp, "ocd_helptext", JIM_ERRMSG);
+ if (Jim_IsShared(helptext))
+ helptext = Jim_DuplicateObj(interp, helptext);
+
+ Jim_Obj *cmd_entry=Jim_NewListObj(interp, NULL, 0);
+
+ Jim_Obj *cmd_list=Jim_NewListObj(interp, NULL, 0);
+ Jim_ListAppendElement(interp, cmd_list, Jim_NewStringObj(interp, name, -1));
+
+ Jim_ListAppendElement(interp, cmd_entry, cmd_list);
+ Jim_ListAppendElement(interp, cmd_entry, Jim_NewStringObj(interp, help, -1));
+ Jim_ListAppendElement(interp, helptext, cmd_entry);
+}
+
+extern unsigned const char startup_tcl[];
+
+void initJim(void)
+{
Jim_CreateCommand(interp, "openocd", Jim_Command_openocd, NULL, NULL);
Jim_CreateCommand(interp, "openocd_throw", Jim_Command_openocd_throw, NULL, NULL);
Jim_CreateCommand(interp, "find", Jim_Command_find, NULL, NULL);
Jim_CreateCommand(interp, "echo", Jim_Command_echo, NULL, NULL);
+ Jim_CreateCommand(interp, "script", Jim_Command_script, NULL, NULL);
Jim_CreateCommand(interp, "mem2array", Jim_Command_mem2array, NULL, NULL );
Jim_CreateCommand(interp, "array2mem", Jim_Command_array2mem, NULL, NULL );
interp->cb_vfprintf = openocd_jim_vfprintf;
interp->cb_fflush = openocd_jim_fflush;
interp->cb_fgets = openocd_jim_fgets;
-}
-
-extern const unsigned char filedata_startup[];
-
-/* after command line parsing */
-void initJim2(void)
-{
- if (Jim_Eval(interp, filedata_startup)==JIM_ERR)
+
+ add_default_dirs();
+
+ if (Jim_Eval(interp, startup_tcl)==JIM_ERR)
{
LOG_ERROR("Failed to run startup.tcl (embedded into OpenOCD compile time)");
Jim_PrintErrorMessage(interp);
command_context_t *cmd_ctx;
cmd_ctx = command_init();
-
+
register_command(cmd_ctx, NULL, "version", handle_version_command,
COMMAND_EXEC, "show OpenOCD version");
register_command(cmd_ctx, NULL, "daemon_startup", handle_daemon_startup_command, COMMAND_CONFIG,
tcl_register_commands(cmd_ctx); /* tcl server commands */
log_register_commands(cmd_ctx);
jtag_register_commands(cmd_ctx);
- interpreter_register_commands(cmd_ctx);
xsvf_register_commands(cmd_ctx);
target_register_commands(cmd_ctx);
flash_register_commands(cmd_ctx);
active_cmd_ctx=cfg_cmd_ctx;
- add_default_dirs();
- initJim2();
-
if (parse_cmdline_args(cfg_cmd_ctx, argc, argv) != ERROR_OK)
return EXIT_FAILURE;