- return ERROR_OK;
-}
-
-Jim_Interp *interp;
-command_context_t *active_cmd_ctx;
-
-static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 val)
-{
- char *namebuf;
- Jim_Obj *nameObjPtr, *valObjPtr;
- int result;
-
- namebuf = alloc_printf("%s(%d)", varname, idx);
-
- nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
- valObjPtr = Jim_NewIntObj(interp, val);
- Jim_IncrRefCount(nameObjPtr);
- Jim_IncrRefCount(valObjPtr);
- result = Jim_SetVariable(interp, nameObjPtr, valObjPtr);
- Jim_DecrRefCount(interp, nameObjPtr);
- Jim_DecrRefCount(interp, valObjPtr);
- free(namebuf);
- /* printf( "%s = 0%08x\n", namebuf, val ); */
- return result;
-}
-
-static int Jim_Command_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-{
- target_t *target;
- long l;
- u32 width;
- u32 len;
- u32 addr;
- u32 count;
- u32 v;
- const char *varname;
- u8 buffer[4096];
- int i, n, e, retval;
-
- /* argv[1] = name of array to receive the data
- * argv[2] = desired width
- * argv[3] = memory address
- * argv[4] = length in bytes to read
- */
- if (argc != 5) {
- Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
- return JIM_ERR;
- }
- varname = Jim_GetString(argv[1], &len);
- /* given "foo" get space for worse case "foo(%d)" .. add 20 */
-
- e = Jim_GetLong(interp, argv[2], &l);
- width = l;
- if (e != JIM_OK) {
- return e;
- }
-
- e = Jim_GetLong(interp, argv[3], &l);
- addr = l;
- if (e != JIM_OK) {
- return e;
- }
- e = Jim_GetLong(interp, argv[4], &l);
- len = l;
- if (e != JIM_OK) {
- return e;
- }
- switch (width) {
- case 8:
- width = 1;
- break;
- case 16:
- width = 2;
- break;
- case 32:
- width = 4;
- break;
- default:
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
- return JIM_ERR;
- }
- if (len == 0) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: zero width read?", NULL);
- return JIM_ERR;
- }
- if ((addr + (len * width)) < addr) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: addr + len - wraps to zero?", NULL);
- return JIM_ERR;
- }
- /* absurd transfer size? */
- if (len > 65536) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: absurd > 64K item request", NULL);
- return JIM_ERR;
- }
-
- if ((width == 1) ||
- ((width == 2) && ((addr & 1) == 0)) ||
- ((width == 4) && ((addr & 3) == 0))) {
- /* all is well */
- } else {
- char buf[100];
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- sprintf(buf, "mem2array address: 0x%08x is not aligned for %d byte reads", addr, width);
- Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
- return JIM_ERR;
- }
-
- target = get_current_target(active_cmd_ctx);
-
- /* Transfer loop */
-
- /* index counter */
- n = 0;
- /* assume ok */
- e = JIM_OK;
- while (len) {
- /* Slurp... in buffer size chunks */
-
- count = len; /* in objects.. */
- if (count > (sizeof(buffer)/width)) {
- count = (sizeof(buffer)/width);
- }
-
- retval = target->type->read_memory( target, addr, width, count, buffer );
-
- if (retval != ERROR_OK) {
- /* BOO !*/
- LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
- e = JIM_ERR;
- len = 0;
- } else {
- v = 0; /* shut up gcc */
- for (i = 0 ;i < count ;i++, n++) {
- switch (width) {
- case 4:
- v = target_buffer_get_u32(target, &buffer[i*width]);
- break;
- case 2:
- v = target_buffer_get_u16(target, &buffer[i*width]);
- break;
- case 1:
- v = buffer[i] & 0x0ff;
- break;
- }
- new_int_array_element(interp, varname, n, v);
- }
- len -= count;
- }
- }
-
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
-
- return JIM_OK;
-}
-
-static void tcl_output(void *privData, const char *file, int line, const char *function, const char *string)
-{
- Jim_Obj *tclOutput=(Jim_Obj *)privData;
-
- Jim_AppendString(interp, tclOutput, string, strlen(string));
-}
-
-/* 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);
-
- 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;
- }
- }
- return ERROR_FAIL;
- }
- const char *result;
- int reslen;
- result = Jim_GetString(Jim_GetResult(interp), &reslen);
-
- if (retcode == JIM_EXIT) {
- /* ignore. */
- /* exit(Jim_GetExitCode(interp)); */
- } else {
- if (reslen) {
- int i;
- char buff[256+1];
- for (i = 0; i < reslen; i += 256)
- {
- int chunk;
- chunk = reslen - i;
- if (chunk > 256)
- chunk = 256;
- strncpy(buff, result+i, chunk);
- buff[chunk] = 0;
- LOG_USER_N("%s", buff);
- }
- LOG_USER_N("%s", "\n");
- }
- }
- return retval;
-}
-
-int startLoop = 0;