sync up to tap_xxx rename + add with-ioutil for standalone openocd implemetnations
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 15 Dec 2008 11:32:22 +0000 (11:32 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 15 Dec 2008 11:32:22 +0000 (11:32 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1243 b42882b7-edfa-0310-969c-e2dbd0fdcd60

configure.in
src/Makefile.am
src/ecosboard.c
src/helper/Makefile.am
src/helper/ioutil.c [new file with mode: 0644]
src/jtag/zy1000.c
src/openocd.c

index 7ed61b25506a8809e982f0f810bfae592421a642..8889db4cac0ef169a92f42d72326b129c3831f1e 100644 (file)
@@ -67,6 +67,10 @@ AC_ARG_ENABLE(ecosboard,
   AS_HELP_STRING([--enable-ecosboard], [Enable building support for eCosBoard based JTAG debugger]), 
   [build_ecosboard=$enableval], [build_ecosboard=no])
 
+AC_ARG_ENABLE(ioutil,
+  AS_HELP_STRING([--enable-ioutil], [Enable ioutil functions - useful for standalone OpenOCD implementations]), 
+  [build_ioutil=$enableval], [build_ioutil=no])
+
 case "${host_cpu}" in 
   arm*)
     AC_ARG_ENABLE(ep93xx,
@@ -179,6 +183,12 @@ else
   AC_DEFINE(BUILD_ECOSBOARD, 0, [0 if you don't want eCosBoard.])
 fi
 
+if test $build_ioutil = yes; then
+  AC_DEFINE(BUILD_IOUTIL, 1, [1 if you want ioutils.])
+else
+  AC_DEFINE(BUILD_IOUTIL, 0, [0 if you don't want ioutils.])
+fi
+
 if test $build_at91rm9200 = yes; then
   build_bitbang=yes
   AC_DEFINE(BUILD_AT91RM9200, 1, [1 if you want at91rm9200.])
@@ -274,6 +284,7 @@ AM_CONDITIONAL(DUMMY, test $build_dummy = yes)
 AM_CONDITIONAL(GIVEIO, test $parport_use_giveio = yes)
 AM_CONDITIONAL(EP93XX, test $build_ep93xx = yes)
 AM_CONDITIONAL(ECOSBOARD, test $build_ecosboard = yes)
+AM_CONDITIONAL(IOUTIL, test $build_ioutil = yes)
 AM_CONDITIONAL(AT91RM9200, test $build_at91rm9200 = yes)
 AM_CONDITIONAL(BITBANG, test $build_bitbang = yes)
 AM_CONDITIONAL(FT2232_LIBFTDI, test $build_ft2232_libftdi = yes)
index d04308e5249fa0bb5ac3c96784549a4e700e4eab..669720f9e6fbd934155b9a54376d6f3e219207db 100644 (file)
@@ -6,6 +6,7 @@ else
 MAINFILE = main.c
 endif
 
+
 openocd_SOURCES = $(MAINFILE) openocd.c
 
 # set the include path found by configure
index 6326b9873dad52dd726041e35107721e41aa1083..d2c11b3561c672bbb5fedaa584ee82faec234e71 100644 (file)
@@ -81,7 +81,6 @@
 #include <ifaddrs.h>
 #include <string.h>
 
-
 #include <unistd.h>
 #include <stdio.h>
 #define MAX_IFS 64
@@ -98,14 +97,6 @@ struct tftpd_fileops fileops =
 
 #endif
 
-#define ZYLIN_VERSION "1.48"
-#define ZYLIN_DATE __DATE__
-#define ZYLIN_TIME __TIME__
-/* hmmm....  we can't pick up the right # during build if we've checked this out
- * in Eclipse... arrggghh...*/
-#define ZYLIN_OPENOCD "$Revision$"
-#define ZYLIN_OPENOCD_VERSION "Zylin JTAG ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE " " ZYLIN_TIME
-#define ZYLIN_CONFIG_DIR "/config/settings"
 
 void diag_write(char *buf, int len)
 {
@@ -122,39 +113,6 @@ static bool writeLog = true;
 char hwaddr[512];
 
 
-/* Give TELNET a way to find out what version this is */
-int handle_zy1000_version_command(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
-{
-       if (argc > 1)
-       {
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-       if (argc == 0)
-       {
-               command_print(cmd_ctx, ZYLIN_OPENOCD_VERSION);
-       } else if (strcmp("openocd", args[0])==0)
-       {
-               int revision;
-               revision=atol(ZYLIN_OPENOCD+strlen("XRevision: "));
-               command_print(cmd_ctx, "%d", revision);
-       } else if (strcmp("zy1000", args[0])==0)
-       {
-               command_print(cmd_ctx, "%s", ZYLIN_VERSION);
-       } else if (strcmp("date", args[0])==0)
-       {
-               command_print(cmd_ctx, "%s", ZYLIN_DATE);
-       } else
-       {
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-
-       return ERROR_OK;
-}
-
-
-
-
 extern flash_driver_t *flash_drivers[];
 extern target_type_t *target_types[];
 
@@ -184,48 +142,17 @@ void start_profile(void)
 
        // no more interrupts than 1/10ms.
        //profile_on((void *)0, (void *)0x40000, 16, 10000); // SRAM
-//     profile_on(0, &_etext, 16, 10000); // SRAM & DRAM
+       //      profile_on(0, &_etext, 16, 10000); // SRAM & DRAM
        profile_on(start_of_code, end_of_code, 16, 10000); // Nios DRAM
 }
 #endif
 
-// launch GDB server if a config file exists
-bool zylinjtag_parse_config_file(struct command_context_s *cmd_ctx, const char *config_file_name)
-{
-       bool foundFile = false;
-       FILE *config_file = NULL;
-       command_print(cmd_ctx, "executing config file %s", config_file_name);
-       config_file = fopen(config_file_name, "r");
-       if (config_file)
-       {
-               fclose(config_file);
-               int retval;
-               retval = command_run_linef(cmd_ctx, "script %s", config_file_name);
-               if (retval == ERROR_OK)
-               {
-                       foundFile = true;
-               }
-               else
-               {
-                       command_print(cmd_ctx, "Failed executing %s %d", config_file_name, retval);
-               }
-       }
-       else
-       {
-               command_print(cmd_ctx, "No %s found", config_file_name);
-       }
-
-       return foundFile;
-}
-
 extern int eth0_up;
 static FILE *log;
 
 static char reboot_stack[2048];
 
-
-static void
-zylinjtag_reboot(cyg_addrword_t data)
+static void zylinjtag_reboot(cyg_addrword_t data)
 {
        serialLog = true;
        diag_printf("Rebooting in 100 ticks..\n");
@@ -240,324 +167,28 @@ static cyg_handle_t zylinjtag_thread_handle;
 
 void reboot(void)
 {
-    cyg_thread_create(1,
-                      zylinjtag_reboot,
-                      (cyg_addrword_t)0,
-                      "reboot Thread",
-                      (void *)reboot_stack,
-                      sizeof(reboot_stack),
-                      &zylinjtag_thread_handle,
-                      &zylinjtag_thread_object);
+       cyg_thread_create(1, zylinjtag_reboot, (cyg_addrword_t) 0, "reboot Thread",
+                       (void *) reboot_stack, sizeof(reboot_stack),
+                       &zylinjtag_thread_handle, &zylinjtag_thread_object);
        cyg_thread_resume(zylinjtag_thread_handle);
 }
 
-int configuration_output_handler(struct command_context_s *context, const char* line)
+int configuration_output_handler(struct command_context_s *context,
+               const char* line)
 {
        diag_printf("%s", line);
 
        return ERROR_OK;
 }
 
-int zy1000_configuration_output_handler_log(struct command_context_s *context, const char* line)
+int zy1000_configuration_output_handler_log(struct command_context_s *context,
+               const char* line)
 {
        LOG_USER_N("%s", line);
 
        return ERROR_OK;
 }
 
-int handle_rm_command(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
-{
-       if (argc != 1)
-       {
-               command_print(cmd_ctx, "rm <filename>");
-               return ERROR_INVALID_ARGUMENTS;
-       }
-
-       if (unlink(args[0]) != 0)
-       {
-               command_print(cmd_ctx, "failed: %d", errno);
-       }
-
-       return ERROR_OK;
-}
-
-int loadFile(const char *fileName, void **data, int *len);
-
-int handle_cat_command(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
-{
-       if (argc != 1)
-       {
-               command_print(cmd_ctx, "cat <filename>");
-               return ERROR_INVALID_ARGUMENTS;
-       }
-
-       // NOTE!!! we only have line printing capability so we print the entire file as a single line.
-       void *data;
-       int len;
-
-       int retval = loadFile(args[0], &data, &len);
-       if (retval == ERROR_OK)
-       {
-               command_print(cmd_ctx, "%s", data);
-               free(data);
-       }
-       else
-       {
-               command_print(cmd_ctx, "%s not found %d", args[0], retval);
-       }
-
-       return ERROR_OK;
-}
-int handle_trunc_command(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
-{
-       if (argc != 1)
-       {
-               command_print(cmd_ctx, "trunc <filename>");
-               return ERROR_INVALID_ARGUMENTS;
-       }
-
-       FILE *config_file = NULL;
-       config_file = fopen(args[0], "w");
-       if (config_file != NULL)
-               fclose(config_file);
-
-       return ERROR_OK;
-}
-
-
-int handle_meminfo_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       static int prev = 0;
-       struct mallinfo info;
-
-       if (argc != 0)
-       {
-               command_print(cmd_ctx, "meminfo");
-               return ERROR_INVALID_ARGUMENTS;
-       }
-
-       info = mallinfo();
-
-       if (prev > 0)
-       {
-               command_print(cmd_ctx, "Diff:            %d", prev - info.fordblks);
-       }
-       prev = info.fordblks;
-
-       command_print(cmd_ctx, "Available ram:   %d", info.fordblks );
-
-       return ERROR_OK;
-}
-
-static bool savePower;
-
-static void setPower(bool power)
-{
-       savePower = power;
-       if (power)
-       {
-               HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x14, 0x8);
-       } else
-       {
-               HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x8);
-       }
-}
-
-int handle_power_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       if (argc > 1)
-       {
-               return ERROR_INVALID_ARGUMENTS;
-       }
-
-       if (argc == 1)
-       {
-               if (strcmp(args[0], "on") == 0)
-               {
-                       setPower(1);
-               }
-               else if (strcmp(args[0], "off") == 0)
-               {
-                       setPower(0);
-               } else
-               {
-                       command_print(cmd_ctx, "arg is \"on\" or \"off\"");
-                       return ERROR_INVALID_ARGUMENTS;
-               }
-       }
-
-       command_print(cmd_ctx, "Target power %s", savePower ? "on" : "off");
-
-       return ERROR_OK;
-}
-
-int handle_append_command(struct command_context_s *cmd_ctx, char *cmd,
-               char **args, int argc)
-{
-       if (argc < 1)
-       {
-               command_print(cmd_ctx,
-                               "append <filename> [<string1>, [<string2>, ...]]");
-               return ERROR_INVALID_ARGUMENTS;
-       }
-
-       FILE *config_file = NULL;
-       config_file = fopen(args[0], "a");
-       if (config_file != NULL)
-       {
-               int i;
-               fseek(config_file, 0, SEEK_END);
-
-               for (i = 1; i < argc; i++)
-               {
-                       fwrite(args[i], strlen(args[i]), 1, config_file);
-                       if (i != argc - 1)
-                       {
-                               fwrite(" ", 1, 1, config_file);
-                       }
-               }
-               fwrite("\n", 1, 1, config_file);
-               fclose(config_file);
-       }
-
-       return ERROR_OK;
-}
-
-extern int telnet_socket;
-
-int readMore(int fd, void *data, int length)
-{
-       /* used in select() */
-       fd_set read_fds;
-
-       /* monitor sockets for acitvity */
-       int fd_max = 1;
-       FD_ZERO(&read_fds);
-       /* listen for new connections */
-       FD_SET(fd, &read_fds);
-
-       // Maximum 5 seconds.
-       struct timeval tv;
-       tv.tv_sec = 5;
-       tv.tv_usec = 0;
-
-       int retval = select(fd_max + 1, &read_fds, NULL, NULL, &tv);
-       if (retval == 0)
-       {
-               diag_printf("Timed out waiting for binary payload\n");
-               return -1;
-       }
-       if (retval != 1)
-               return -1;
-
-       return read_socket(fd, data, length);
-}
-
-int readAll(int fd, void *data, int length)
-{
-       int pos = 0;
-       for (;;)
-       {
-               int actual = readMore(fd, ((char *) data) + pos, length - pos);
-               //              diag_printf("Read %d bytes(pos=%d, length=%d)\n", actual, pos, length);
-               if (actual <= 0)
-                       return -1;
-               pos += actual;
-               if (pos == length)
-                       break;
-       }
-       return length;
-}
-
-int handle_peek_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       cyg_uint32 value;
-       if (argc != 1)
-       {
-               return ERROR_INVALID_ARGUMENTS;
-       }
-       HAL_READ_UINT32(strtoul(args[0], NULL, 0), value);
-       command_print(cmd_ctx, "0x%x : 0x%x", strtoul(args[0], NULL, 0), value);
-       return ERROR_OK;
-}
-
-int handle_poke_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       if (argc != 2)
-       {
-               return ERROR_INVALID_ARGUMENTS;
-       }
-       HAL_WRITE_UINT32(strtoul(args[0], NULL, 0), strtoul(args[1], NULL, 0));
-       return ERROR_OK;
-}
-
-int handle_cp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       if (argc != 2)
-       {
-               return ERROR_INVALID_ARGUMENTS;
-       }
-
-       // NOTE!!! we only have line printing capability so we print the entire file as a single line.
-       void *data;
-       int len;
-
-       int retval = loadFile(args[0], &data, &len);
-       if (retval != ERROR_OK)
-               return retval;
-
-       FILE *f = fopen(args[1], "wb");
-       if (f == NULL)
-               retval = ERROR_INVALID_ARGUMENTS;
-
-       int pos = 0;
-       for (;;)
-       {
-               int chunk = len - pos;
-               static const int maxChunk = 512 * 1024; // ~1/sec
-               if (chunk > maxChunk)
-               {
-                       chunk = maxChunk;
-               }
-
-               if ((retval==ERROR_OK)&&(fwrite(((char *)data)+pos, 1, chunk, f)!=chunk))
-                       retval = ERROR_INVALID_ARGUMENTS;
-
-               if (retval != ERROR_OK)
-               {
-                       break;
-               }
-
-               command_print(cmd_ctx, "%d", len - pos);
-
-               pos += chunk;
-
-               if (pos == len)
-                       break;
-       }
-
-       if (retval == ERROR_OK)
-       {
-               command_print(cmd_ctx, "Copied %s to %s", args[0], args[1]);
-       } else
-       {
-               command_print(cmd_ctx, "Failed: %d", retval);
-       }
-
-       if (data != NULL)
-               free(data);
-       if (f != NULL)
-               fclose(f);
-
-       if (retval != ERROR_OK)
-               unlink(args[1]);
-
-       return retval;
-}
-
 #ifdef CYGPKG_PROFILE_GPROF
 extern void start_profile();
 
@@ -618,115 +249,9 @@ void _zylinjtag_diag_write_char(char c, void **param)
 #endif
 }
 
-#define SHOW_RESULT(a, b) diag_printf(#a " failed %d\n", (int)b)
-
-#define IOSIZE 512
-static void copyfile(char *name2, char *name1)
-{
-
-       int err;
-       char buf[IOSIZE];
-       int fd1, fd2;
-       ssize_t done, wrote;
-
-       fd1 = open(name1, O_WRONLY | O_CREAT);
-       if (fd1 < 0)
-               SHOW_RESULT( open, fd1 );
-
-       fd2 = open(name2, O_RDONLY);
-       if (fd2 < 0)
-               SHOW_RESULT( open, fd2 );
-
-       for (;;)
-       {
-               done = read(fd2, buf, IOSIZE );
-               if (done < 0)
-               {
-                       SHOW_RESULT( read, done );
-                       break;
-               }
+void copyfile(char *name2, char *name1);
 
-        if( done == 0 ) break;
-
-               wrote = write(fd1, buf, done);
-        if( wrote != done ) SHOW_RESULT( write, wrote );
-
-        if( wrote != done ) break;
-       }
-
-       err = close(fd1);
-    if( err < 0 ) SHOW_RESULT( close, err );
-
-       err = close(fd2);
-    if( err < 0 ) SHOW_RESULT( close, err );
-
-}
-static void copydir(char *name, char *destdir)
-{
-       int err;
-       DIR *dirp;
-
-       dirp = opendir(destdir);
-       if (dirp==NULL)
-       {
-               mkdir(destdir, 0777);
-       } else
-       {
-               err = closedir(dirp);
-       }
-
-       dirp = opendir(name);
-    if( dirp == NULL ) SHOW_RESULT( opendir, -1 );
-
-       for (;;)
-       {
-               struct dirent *entry = readdir(dirp);
-
-               if (entry == NULL)
-                       break;
-
-               if (strcmp(entry->d_name, ".") == 0)
-                       continue;
-               if (strcmp(entry->d_name, "..") == 0)
-                       continue;
-
-               bool isDir = false;
-               struct stat buf;
-               char fullPath[PATH_MAX];
-               strncpy(fullPath, name, PATH_MAX);
-               strcat(fullPath, "/");
-               strncat(fullPath, entry->d_name, PATH_MAX - strlen(fullPath));
-
-               if (stat(fullPath, &buf) == -1)
-               {
-                       diag_printf("unable to read status from %s", fullPath);
-                       break;
-               }
-               isDir = S_ISDIR(buf.st_mode) != 0;
-
-               if (isDir)
-                       continue;
-
-               //        diag_printf("<INFO>: entry %14s",entry->d_name);
-               char fullname[PATH_MAX];
-               char fullname2[PATH_MAX];
-
-               strcpy(fullname, name);
-               strcat(fullname, "/");
-               strcat(fullname, entry->d_name);
-
-               strcpy(fullname2, destdir);
-               strcat(fullname2, "/");
-               strcat(fullname2, entry->d_name);
-               //        diag_printf("from %s to %s\n", fullname, fullname2);
-               copyfile(fullname, fullname2);
-
-               //       diag_printf("\n");
-       }
-
-       err = closedir(dirp);
-    if( err < 0 ) SHOW_RESULT( stat, err );
-}
+void copydir(char *name, char *destdir);
 
 #if 0
 MTAB_ENTRY( romfs_mte1,
@@ -746,7 +271,6 @@ void openocd_sleep_postlude()
        cyg_mutex_lock(&httpstate.jim_lock);
 }
 
-
 void format(void)
 {
        diag_printf("Formatting JFFS2...\n");
@@ -761,12 +285,10 @@ void format(void)
                reboot();
        }
 
-
        cyg_uint32 len;
        cyg_io_flash_getconfig_devsize_t ds;
-       len = sizeof (ds);
-       err = cyg_io_get_config(handle,
-                               CYG_IO_GET_CONFIG_FLASH_DEVSIZE, &ds, &len);
+       len = sizeof(ds);
+       err = cyg_io_get_config(handle, CYG_IO_GET_CONFIG_FLASH_DEVSIZE, &ds, &len);
        if (err != ENOERR)
        {
                diag_printf("Flash error cyg_io_get_config %d\n", err);
@@ -775,15 +297,14 @@ void format(void)
 
        cyg_io_flash_getconfig_erase_t e;
        void *err_addr;
-       len = sizeof (e);
+       len = sizeof(e);
 
        e.offset = 0;
        e.len = ds.dev_size;
        e.err_address = &err_addr;
 
        diag_printf("Formatting 0x%08x bytes\n", ds.dev_size);
-       err = cyg_io_get_config(handle, CYG_IO_GET_CONFIG_FLASH_ERASE,
-                               &e, &len);
+       err = cyg_io_get_config(handle, CYG_IO_GET_CONFIG_FLASH_ERASE, &e, &len);
        if (err != ENOERR)
        {
                diag_printf("Flash erase error %d offset 0x%p\n", err, err_addr);
@@ -795,11 +316,7 @@ void format(void)
        reboot();
 }
 
-
-
-static int
-zylinjtag_Jim_Command_format_jffs2(Jim_Interp *interp,
-                                   int argc,
+static int zylinjtag_Jim_Command_format_jffs2(Jim_Interp *interp, int argc,
                Jim_Obj * const *argv)
 {
        if (argc != 1)
@@ -808,29 +325,8 @@ zylinjtag_Jim_Command_format_jffs2(Jim_Interp *interp,
        }
 
        format();
-       for(;;);
-}
-
-
-static int
-zylinjtag_Jim_Command_rm(Jim_Interp *interp,
-                                   int argc,
-               Jim_Obj * const *argv)
-{
-       int del;
-       if (argc != 2)
-       {
-               Jim_WrongNumArgs(interp, 1, argv, "rm ?dirorfile?");
-               return JIM_ERR;
-       }
-
-       del = 0;
-       if (unlink(Jim_GetString(argv[1], NULL)) == 0)
-               del = 1;
-       if (rmdir(Jim_GetString(argv[1], NULL)) == 0)
-               del = 1;
-
-       return del ? JIM_OK : JIM_ERR;
+       for (;;)
+               ;
 }
 
 static int zylinjtag_Jim_Command_threads(Jim_Interp *interp, int argc,
@@ -887,198 +383,28 @@ static int zylinjtag_Jim_Command_threads(Jim_Interp *interp, int argc,
                Jim_ListAppendElement(interp, threadObj, Jim_NewStringObj(interp,
                                state_string, strlen(state_string)));
 
-               Jim_ListAppendElement   (interp, threadObj, Jim_NewIntObj(interp, id));
-               Jim_ListAppendElement(interp, threadObj, Jim_NewIntObj(interp, info.set_pri));
-               Jim_ListAppendElement(interp, threadObj, Jim_NewIntObj(interp, info.cur_pri));
+               Jim_ListAppendElement(interp, threadObj, Jim_NewIntObj(interp, id));
+               Jim_ListAppendElement(interp, threadObj, Jim_NewIntObj(interp,
+                               info.set_pri));
+               Jim_ListAppendElement(interp, threadObj, Jim_NewIntObj(interp,
+                               info.cur_pri));
 
                Jim_ListAppendElement(interp, threads, threadObj);
        }
-       Jim_SetResult( interp, threads);
-
-       return JIM_OK;
-}
-
-
-static int
-zylinjtag_Jim_Command_ls(Jim_Interp *interp,
-                                   int argc,
-               Jim_Obj * const *argv)
-{
-       if (argc != 2)
-       {
-               Jim_WrongNumArgs(interp, 1, argv, "ls ?dir?");
-               return JIM_ERR;
-       }
-
-       char *name = (char*) Jim_GetString(argv[1], NULL);
-
-       DIR *dirp = NULL;
-       dirp = opendir(name);
-       if (dirp == NULL)
-       {
-               return JIM_ERR;
-       }
-       Jim_Obj *objPtr = Jim_NewListObj(interp, NULL, 0);
-
-       for (;;)
-       {
-               struct dirent *entry = NULL;
-               entry = readdir(dirp);
-               if (entry == NULL)
-                       break;
-
-               if ((strcmp(".", entry->d_name)==0)||(strcmp("..", entry->d_name)==0))
-                       continue;
-
-        Jim_ListAppendElement(interp, objPtr, Jim_NewStringObj(interp, entry->d_name, strlen(entry->d_name)));
-       }
-       closedir(dirp);
-
-       Jim_SetResult(interp, objPtr);
+       Jim_SetResult(interp, threads);
 
        return JIM_OK;
 }
 
-
-static int
-zylinjtag_Jim_Command_getmem(Jim_Interp *interp,
-                                   int argc,
-               Jim_Obj * const *argv)
-{
-       if (argc != 3)
-       {
-               Jim_WrongNumArgs(interp, 1, argv, "ls ?dir?");
-               return JIM_ERR;
-       }
-
-       long address;
-       long length;
-       if (Jim_GetLong(interp, argv[1], &address) != JIM_OK)
-               return JIM_ERR;
-       if (Jim_GetLong(interp, argv[2], &length) != JIM_OK)
-               return JIM_ERR;
-
-       if (length < 0 && length > (4096 * 1024))
-       {
-               Jim_WrongNumArgs(interp, 1, argv, "getmem ?dir?");
-               return JIM_ERR;
-       }
-
-       void *mem = malloc(length);
-       if (mem == NULL)
-               return JIM_ERR;
-
-       target_t *target = get_current_target(cmd_ctx);
-
-       int retval;
-       int size = 1;
-       int count = length;
-       if ((address % 4 == 0) && (count % 4 == 0))
-       {
-               size = 4;
-               count /= 4;
-       }
-
-       if ((retval  = target->type->read_memory(target, address, size, count, mem)) != ERROR_OK)
-       {
-               free(mem);
-               return JIM_ERR;
-       }
-
-       Jim_Obj *objPtr = Jim_NewStringObj(interp, mem, length);
-       Jim_SetResult(interp, objPtr);
-
-       free(mem);
-
-       return JIM_OK;
-}
-
-static int
-zylinjtag_Jim_Command_peek(Jim_Interp *interp,
-                                   int argc,
-               Jim_Obj * const *argv)
-{
-       if (argc != 2)
-       {
-               Jim_WrongNumArgs(interp, 1, argv, "peek ?address?");
-               return JIM_ERR;
-       }
-
-       long address;
-       if (Jim_GetLong(interp, argv[1], &address) != JIM_OK)
-               return JIM_ERR;
-
-       int value = *((volatile int *) address);
-
-       Jim_SetResult(interp, Jim_NewIntObj(interp, value));
-
-       return JIM_OK;
-}
-
-static int
-zylinjtag_Jim_Command_poke(Jim_Interp *interp,
-                                   int argc,
-               Jim_Obj * const *argv)
-{
-       if (argc != 3)
-       {
-               Jim_WrongNumArgs(interp, 1, argv, "poke ?address? ?value?");
-               return JIM_ERR;
-       }
-
-       long address;
-       if (Jim_GetLong(interp, argv[1], &address) != JIM_OK)
-               return JIM_ERR;
-       long value;
-       if (Jim_GetLong(interp, argv[2], &value) != JIM_OK)
-               return JIM_ERR;
-
-       *((volatile int *) address) = value;
-
-       return JIM_OK;
-}
-
-
-
-static int
-zylinjtag_Jim_Command_flash(Jim_Interp *interp,
-                                   int argc,
-               Jim_Obj * const *argv)
-{
-       int retval;
-       u32 base = 0;
-       flash_bank_t *t = get_flash_bank_by_num_noprobe(0);
-       if (t != NULL)
-       {
-               base = t->base;
-               retval = JIM_OK;
-    } else
-       {
-               retval = JIM_ERR;
-       }
-
-       if (retval == JIM_OK)
-       {
-               Jim_SetResult(interp, Jim_NewIntObj(interp, base));
-       }
-
-       return retval;
-}
-
-
-
-
-
-static int
-zylinjtag_Jim_Command_log(Jim_Interp *interp,
-                                   int argc,
+static int zylinjtag_Jim_Command_log(Jim_Interp *interp, int argc,
                Jim_Obj * const *argv)
 {
        Jim_Obj *tclOutput = Jim_NewStringObj(interp, "", 0);
 
        if (logCount >= logSize)
        {
-       Jim_AppendString(httpstate.jim_interp, tclOutput, logBuffer+logCount%logSize, logSize-logCount%logSize);
+               Jim_AppendString(httpstate.jim_interp, tclOutput, logBuffer + logCount
+                               % logSize, logSize - logCount % logSize);
        }
        Jim_AppendString(httpstate.jim_interp, tclOutput, logBuffer, writePtr);
 
@@ -1086,18 +412,14 @@ zylinjtag_Jim_Command_log(Jim_Interp *interp,
        return JIM_OK;
 }
 
-static int
-zylinjtag_Jim_Command_reboot(Jim_Interp *interp,
-                                   int argc,
+static int zylinjtag_Jim_Command_reboot(Jim_Interp *interp, int argc,
                Jim_Obj * const *argv)
 {
        reboot();
        return JIM_OK;
 }
 
-static int
-zylinjtag_Jim_Command_mac(Jim_Interp *interp,
-                                   int argc,
+static int zylinjtag_Jim_Command_mac(Jim_Interp *interp, int argc,
                Jim_Obj * const *argv)
 {
 
@@ -1110,9 +432,7 @@ zylinjtag_Jim_Command_mac(Jim_Interp *interp,
        return JIM_OK;
 }
 
-static int
-zylinjtag_Jim_Command_ip(Jim_Interp *interp,
-                                   int argc,
+static int zylinjtag_Jim_Command_ip(Jim_Interp *interp, int argc,
                Jim_Obj * const *argv)
 {
        Jim_Obj *tclOutput = Jim_NewStringObj(interp, "", 0);
@@ -1156,7 +476,6 @@ zylinjtag_Jim_Command_ip(Jim_Interp *interp,
 
 extern Jim_Interp *interp;
 
-
 static void zylinjtag_startNetwork()
 {
        // Bring TCP/IP up immediately before we're ready to accept commands.
@@ -1181,18 +500,18 @@ static void zylinjtag_startNetwork()
 
        interp = httpstate.jim_interp;
 
-    Jim_CreateCommand(httpstate.jim_interp, "log", zylinjtag_Jim_Command_log, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "reboot", zylinjtag_Jim_Command_reboot, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "peek", zylinjtag_Jim_Command_peek, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "zy1000_flash", zylinjtag_Jim_Command_flash, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "poke", zylinjtag_Jim_Command_poke, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "ls", zylinjtag_Jim_Command_ls, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "threads", zylinjtag_Jim_Command_threads, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "getmem", zylinjtag_Jim_Command_getmem, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "mac", zylinjtag_Jim_Command_mac, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "ip", zylinjtag_Jim_Command_ip, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "rm", zylinjtag_Jim_Command_rm, NULL, NULL);
-    Jim_CreateCommand(httpstate.jim_interp, "format_jffs2", zylinjtag_Jim_Command_format_jffs2, NULL, NULL);
+       Jim_CreateCommand(httpstate.jim_interp, "log", zylinjtag_Jim_Command_log,
+                       NULL, NULL);
+       Jim_CreateCommand(httpstate.jim_interp, "reboot",
+                       zylinjtag_Jim_Command_reboot, NULL, NULL);
+       Jim_CreateCommand(httpstate.jim_interp, "threads",
+                       zylinjtag_Jim_Command_threads, NULL, NULL);
+       Jim_CreateCommand(httpstate.jim_interp, "mac", zylinjtag_Jim_Command_mac,
+                       NULL, NULL);
+       Jim_CreateCommand(httpstate.jim_interp, "ip", zylinjtag_Jim_Command_ip,
+                       NULL, NULL);
+       Jim_CreateCommand(httpstate.jim_interp, "format_jffs2",
+                       zylinjtag_Jim_Command_format_jffs2, NULL, NULL);
 
        cyg_httpd_start();
 
@@ -1225,18 +544,14 @@ static void zylinjtag_startNetwork()
                        (int) ((unsigned char *) &ifr.ifr_hwaddr.sa_data)[4],
                        (int) ((unsigned char *) &ifr.ifr_hwaddr.sa_data)[5]);
 
-
-       discover_message=alloc_printf("ZY1000 Zylin JTAG debugger MAC %s", hwaddr);
+       discover_message
+                       = alloc_printf("ZY1000 Zylin JTAG debugger MAC %s", hwaddr);
 
        discover_launch();
 }
 
-
-
-
-
-static void
-print_exception_handler(cyg_addrword_t data, cyg_code_t exception, cyg_addrword_t info)
+static void print_exception_handler(cyg_addrword_t data, cyg_code_t exception,
+               cyg_addrword_t info)
 {
        writeLog = false;
        serialLog = true;
@@ -1245,17 +560,17 @@ print_exception_handler(cyg_addrword_t data, cyg_code_t exception, cyg_addrword_
        {
 #ifdef CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION
        case CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION:
-               infoStr = "undefined instruction";
-               break;
+       infoStr = "undefined instruction";
+       break;
        case CYGNUM_HAL_VECTOR_SOFTWARE_INTERRUPT:
-               infoStr = "software interrupt";
-               break;
+       infoStr = "software interrupt";
+       break;
        case CYGNUM_HAL_VECTOR_ABORT_PREFETCH:
-               infoStr = "abort prefetch";
-               break;
+       infoStr = "abort prefetch";
+       break;
        case CYGNUM_HAL_VECTOR_ABORT_DATA:
-               infoStr = "abort data";
-               break;
+       infoStr = "abort data";
+       break;
 #endif
        default:
                break;
@@ -1282,11 +597,8 @@ static void setHandler(cyg_code_t exception)
        cyg_exception_handler_t *old_handler;
        cyg_addrword_t old_data;
 
-       cyg_exception_set_handler(exception,
-       print_exception_handler,
-       0,
-       &old_handler,
-       &old_data);
+       cyg_exception_set_handler(exception, print_exception_handler, 0,
+                       &old_handler, &old_data);
 }
 
 static cyg_thread zylinjtag_uart_thread_object;
@@ -1296,7 +608,6 @@ static char uart_stack[4096];
 static char forwardBuffer[1024]; // NB! must be smaller than a TCP/IP packet!!!!!
 static char backwardBuffer[1024];
 
-
 void setNoDelay(int session, int flag)
 {
 #if 1
@@ -1324,8 +635,7 @@ struct
 } tcpipSent[512 * 1024];
 int cur;
 
-static void
-zylinjtag_uart(cyg_addrword_t data)
+static void zylinjtag_uart(cyg_addrword_t data)
 {
        int so_reuseaddr_option = 1;
 
@@ -1336,7 +646,8 @@ zylinjtag_uart(cyg_addrword_t data)
                exit(-1);
        }
 
-       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*)&so_reuseaddr_option, sizeof(int));
+       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*) &so_reuseaddr_option,
+                       sizeof(int));
 
        struct sockaddr_in sin;
        unsigned int address_size;
@@ -1417,7 +728,8 @@ zylinjtag_uart(cyg_addrword_t data)
                        if (actual2 <= 0)
                        {
                                memset(backwardBuffer, 's', sizeof(backwardBuffer));
-                               actual2=read(serHandle, backwardBuffer, sizeof(backwardBuffer));
+                               actual2 = read(serHandle, backwardBuffer,
+                                               sizeof(backwardBuffer));
                                if (actual2 < 0)
                                {
                                        if (errno != EAGAIN)
@@ -1441,7 +753,8 @@ zylinjtag_uart(cyg_addrword_t data)
                                y = written;
                        }
 
-                       if (FD_ISSET(session, &read_fds)&&(sizeof(forwardBuffer)>actual))
+                       if (FD_ISSET(session, &read_fds)
+                                       && (sizeof(forwardBuffer) > actual))
                        {
                                // NB! Here it is important that we empty the TCP/IP read buffer
                                // to make transmission tick right
@@ -1449,7 +762,8 @@ zylinjtag_uart(cyg_addrword_t data)
                                pos = 0;
                                int t;
                                // this will block if there is no data at all
-                               t=read_socket(session, forwardBuffer+actual, sizeof(forwardBuffer)-actual);
+                               t = read_socket(session, forwardBuffer + actual,
+                                               sizeof(forwardBuffer) - actual);
                                if (t <= 0)
                                {
                                        goto closeSession;
@@ -1475,7 +789,8 @@ zylinjtag_uart(cyg_addrword_t data)
                                        }
                                        // The serial buffer is full
                                        written = 0;
-                               } else
+                               }
+                               else
                                {
                                        actual -= written;
                                        pos += written;
@@ -1492,14 +807,14 @@ zylinjtag_uart(cyg_addrword_t data)
                        }
 
                }
-           closeSession:
-           close(session);
+               closeSession: close(session);
                close(serHandle);
 
                int i;
                for (i = 0; i < 1024; i++)
                {
-               diag_printf("%d %d %d %d\n", tcpipSent[i].req, tcpipSent[i].actual, tcpipSent[i].req2, tcpipSent[i].actual2);
+                       diag_printf("%d %d %d %d\n", tcpipSent[i].req, tcpipSent[i].actual,
+                                       tcpipSent[i].req2, tcpipSent[i].actual2);
 
                }
        }
@@ -1509,28 +824,23 @@ zylinjtag_uart(cyg_addrword_t data)
 
 void startUart(void)
 {
-    cyg_thread_create(1,
-                      zylinjtag_uart,
-                      (cyg_addrword_t)0,
-                      "uart thread",
-                      (void *)uart_stack,
-                      sizeof(uart_stack),
-                      &zylinjtag_uart_thread_handle,
-                      &zylinjtag_uart_thread_object);
+       cyg_thread_create(1, zylinjtag_uart, (cyg_addrword_t) 0, "uart thread",
+                       (void *) uart_stack, sizeof(uart_stack),
+                       &zylinjtag_uart_thread_handle, &zylinjtag_uart_thread_object);
        cyg_thread_set_priority(zylinjtag_uart_thread_handle, 1); // low priority as it sits in a busy loop
        cyg_thread_resume(zylinjtag_uart_thread_handle);
 }
 
-
-
-int handle_uart_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+int handle_uart_command(struct command_context_s *cmd_ctx, char *cmd,
+               char **args, int argc)
 {
        static int current_baud = 38400;
        if (argc == 0)
        {
                command_print(cmd_ctx, "%d", current_baud);
                return ERROR_OK;
-       } else if (argc != 1)
+       }
+       else if (argc != 1)
        {
                return ERROR_INVALID_ARGUMENTS;
        }
@@ -1577,9 +887,10 @@ int handle_uart_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
                return ERROR_FAIL;
        }
 
-
-       err = cyg_io_get_config(serial_handle, CYG_IO_GET_CONFIG_SERIAL_OUTPUT_DRAIN, &buf, &len);
-       err = cyg_io_get_config(serial_handle, CYG_IO_GET_CONFIG_SERIAL_INFO, &buf, &len);
+       err = cyg_io_get_config(serial_handle,
+                       CYG_IO_GET_CONFIG_SERIAL_OUTPUT_DRAIN, &buf, &len);
+       err = cyg_io_get_config(serial_handle, CYG_IO_GET_CONFIG_SERIAL_INFO, &buf,
+                       &len);
        if (err != ENOERR)
        {
                command_print(cmd_ctx, "Failed to get serial port settings %d", err);
@@ -1587,7 +898,8 @@ int handle_uart_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
        }
        buf.baud = baud;
 
-       err = cyg_io_set_config(serial_handle, CYG_IO_SET_CONFIG_SERIAL_INFO, &buf, &len);
+       err = cyg_io_set_config(serial_handle, CYG_IO_SET_CONFIG_SERIAL_INFO, &buf,
+                       &len);
        if (err != ENOERR)
        {
                command_print(cmd_ctx, "Failed to set serial port settings %d", err);
@@ -1599,49 +911,27 @@ int handle_uart_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
 
 bool logAllToSerial = false;
 
-/* boolean parameter stored on config */
-bool boolParam(char *var)
-{
-       bool result = false;
-       char *name = alloc_printf(ZYLIN_CONFIG_DIR "/%s", var);
-       if (name == NULL)
-               return result;
-
-       void *data;
-       int len;
-       if (loadFile(name, &data, &len) == ERROR_OK)
-       {
-               if (len > 1)
-                       len = 1;
-               result = strncmp((char *) data, "1", len) == 0;
-               free(data);
-       }
-       free(name);
-       return result;
-}
+
+int boolParam(char *var);
+
 
 command_context_t *setup_command_handler();
 
+extern const char *zylin_config_dir;
+
 int add_default_dirs(void)
 {
-       add_script_search_dir(ZYLIN_CONFIG_DIR);
+       add_script_search_dir(zylin_config_dir);
        add_script_search_dir("/rom/lib/openocd");
        add_script_search_dir("/rom");
        return ERROR_OK;
 }
 
-static cyg_uint8 *ramblockdevice;
-static const int ramblockdevice_size=4096*1024;
 int main(int argc, char *argv[])
 {
        /* ramblockdevice will be the same address every time. The deflate app uses a buffer 16mBytes out, so we
         * need to allocate towards the end of the heap.  */
 
-       ramblockdevice=(cyg_uint8 *)malloc(ramblockdevice_size);
-       memset(ramblockdevice, 0xff, ramblockdevice_size);
-
-
-
 #ifdef CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION
        setHandler(CYGNUM_HAL_VECTOR_UNDEF_INSTRUCTION);
        setHandler(CYGNUM_HAL_VECTOR_ABORT_PREFETCH);
@@ -1650,10 +940,12 @@ int main(int argc, char *argv[])
 
        int err;
 
-       setPower(true); // on by default
-
        atexit(keep_webserver);
 
+       diag_init_putc(_zylinjtag_diag_write_char);
+       // We want this in the log.
+       diag_printf("Zylin ZY1000.\n");
+
        err = mount("", "/ram", "ramfs");
        if (err < 0)
        {
@@ -1688,11 +980,6 @@ int main(int argc, char *argv[])
                exit(-1);
        }
 
-       diag_init_putc(_zylinjtag_diag_write_char);
-
-       // We want this in the log.
-       diag_printf("Zylin ZY1000. Copyright Zylin AS 2007-2008.\n");
-       diag_printf("%s\n", ZYLIN_OPENOCD_VERSION);
 
        copydir("/rom", "/ram/cgi");
 
@@ -1701,12 +988,13 @@ int main(int argc, char *argv[])
        {
                diag_printf("unable to mount jffs2, falling back to ram disk..\n");
                err = mount("", "/config", "ramfs");
-               if (err<0)
+               if (err < 0)
                {
                        diag_printf("unable to mount /config as ramdisk.\n");
                        reboot();
                }
-       } else
+       }
+       else
        {
                /* are we using a ram disk instead of a flash disk? This is used
                 * for ZY1000 live demo...
@@ -1716,7 +1004,7 @@ int main(int argc, char *argv[])
                if (boolParam("ramdisk"))
                {
                        diag_printf("Unmounting /config from flash and using ram instead\n");
-                       err=umount("/config");
+                       err = umount("/config");
                        if (err < 0)
                        {
                                diag_printf("unable to unmount jffs\n");
@@ -1737,22 +1025,21 @@ int main(int argc, char *argv[])
                                reboot();
                        }
 
-       //              copydir("/config2", "/config");
+                       //              copydir("/config2", "/config");
                        copyfile("/config2/ip", "/config/ip");
                        copydir("/config2/settings", "/config/settings");
 
                        umount("/config2");
-               } else
-               {
-                       /* we're not going to use a ram block disk */
-                       free(ramblockdevice);
                }
        }
 
-
-       mkdir(ZYLIN_CONFIG_DIR, 0777);
-       mkdir(ZYLIN_CONFIG_DIR "/target", 0777);
-       mkdir(ZYLIN_CONFIG_DIR "/event", 0777);
+       mkdir(zylin_config_dir, 0777);
+       char *dirname=alloc_printf("%s/target", zylin_config_dir);
+       mkdir(dirname, 0777);
+       free(dirname);
+       dirname=alloc_printf("%s/event", zylin_config_dir);
+       mkdir(dirname, 0777);
+       free(dirname);
 
        logAllToSerial = boolParam("logserial");
 
@@ -1767,43 +1054,18 @@ int main(int argc, char *argv[])
        add_default_dirs();
 
        /* initialize commandline interface */
-       command_context_t *cmd_ctx;
+       command_context_t * cmd_ctx;
        cmd_ctx = setup_command_handler();
        command_set_output_handler(cmd_ctx, configuration_output_handler, NULL);
        command_context_mode(cmd_ctx, COMMAND_CONFIG);
 
-
-       register_command(cmd_ctx, NULL, "zy1000_version", handle_zy1000_version_command,
-                       COMMAND_EXEC, "show zy1000 version numbers");
-
-       register_command(cmd_ctx, NULL, "rm", handle_rm_command, COMMAND_ANY,
-                       "remove file");
-
-       register_command(cmd_ctx, NULL, "cat", handle_cat_command, COMMAND_ANY,
-                       "display file content");
-
-       register_command(cmd_ctx, NULL, "trunc", handle_trunc_command, COMMAND_ANY,
-                       "truncate a file to 0 size");
-
-       register_command(cmd_ctx, NULL, "append_file", handle_append_command,
-                       COMMAND_ANY, "append a variable number of strings to a file");
-
-       register_command(cmd_ctx, NULL, "power", handle_power_command, COMMAND_ANY,
-                       "power <on/off> - turn power switch to target on/off. No arguments - print status.");
-
-       register_command(cmd_ctx, NULL, "meminfo", handle_meminfo_command,
-                       COMMAND_ANY, "display available ram memory");
-
-       register_command(cmd_ctx, NULL, "cp", handle_cp_command,
-                                        COMMAND_ANY, "copy a file <from> <to>");
-
 #ifdef CYGPKG_PROFILE_GPROF
        register_command(cmd_ctx, NULL, "ecosboard_profile", eCosBoard_handle_eCosBoard_profile_command,
                        COMMAND_ANY, NULL);
 #endif
-       register_command(cmd_ctx, NULL, "uart", handle_uart_command,
-                                        COMMAND_ANY, "uart <baud>  - forward uart on port 5555");
 
+       register_command(cmd_ctx, NULL, "uart", handle_uart_command, COMMAND_ANY,
+                       "uart <baud>  - forward uart on port 5555");
 
        int errVal;
        errVal = log_init(cmd_ctx);
@@ -1821,11 +1083,12 @@ int main(int argc, char *argv[])
 
        if (logAllToSerial)
        {
-               diag_printf(ZYLIN_CONFIG_DIR "/logserial=1 => sending log output to serial port using \"debug_level 3\" as default.\n");
+               diag_printf(
+                                "%s/logserial=1 => sending log output to serial port using \"debug_level 3\" as default.\n", zylin_config_dir);
                command_run_line(cmd_ctx, "debug_level 3");
        }
 
-       zylinjtag_parse_config_file(cmd_ctx, "/rom/openocd.cfg");
+       command_run_linef(cmd_ctx, "script /rom/openocd.cfg");
 
        // FIX!!!  Yuk!
        // diag_printf() is really invoked from many more places than we trust it
@@ -1834,7 +1097,8 @@ int main(int argc, char *argv[])
        // Disabling it here is safe and gives us enough logged debug output for now. Crossing
        // fingers that it doesn't cause any crashes.
        diag_printf("Init complete, GDB & telnet servers launched.\n");
-       command_set_output_handler(cmd_ctx, zy1000_configuration_output_handler_log, NULL);
+       command_set_output_handler(cmd_ctx,
+                       zy1000_configuration_output_handler_log, NULL);
        if (!logAllToSerial)
        {
                serialLog = false;
@@ -1852,13 +1116,11 @@ int main(int argc, char *argv[])
        umount("/config");
 
        exit(0);
-       for (;;);
+       for (;;)
+               ;
 }
 
-
-
-cyg_int32
-cyg_httpd_exec_cgi_tcl(char *file_name);
+cyg_int32 cyg_httpd_exec_cgi_tcl(char *file_name);
 cyg_int32 homeForm(CYG_HTTPD_STATE *p)
 {
        cyg_httpd_exec_cgi_tcl("/ram/cgi/index.tcl");
@@ -1960,18 +1222,12 @@ FSTAB_ENTRY( tftpfs_fste, "tftpfs", 0,
 // This set of file operations are used for normal open files.
 
 static cyg_fileops tftpfs_fileops =
-{
-       tftpfs_fo_read,
-       tftpfs_fo_write,
-       tftpfs_fo_lseek,
-       (cyg_fileop_ioctl *)cyg_fileio_erofs,
-    cyg_fileio_seltrue,
-    tftpfs_fo_fsync,
-    tftpfs_fo_close,
+{ tftpfs_fo_read, tftpfs_fo_write, tftpfs_fo_lseek,
+               (cyg_fileop_ioctl *) cyg_fileio_erofs, cyg_fileio_seltrue,
+               tftpfs_fo_fsync, tftpfs_fo_close,
                (cyg_fileop_fstat *) cyg_fileio_erofs,
                (cyg_fileop_getinfo *) cyg_fileio_erofs,
-       (cyg_fileop_setinfo *)cyg_fileio_erofs,
-};
+               (cyg_fileop_setinfo *) cyg_fileio_erofs, };
 
 // -------------------------------------------------------------------------
 // tftpfs_mount()
@@ -2068,7 +1324,8 @@ static int fetchTftp(struct Tftp *tftp)
        if (!tftp->readFile)
        {
                int err;
-           tftp->actual = tftp_client_get( tftp->file, tftp->server, 0, tftp->mem, tftpMaxSize,   TFTP_OCTET, &err);
+               tftp->actual = tftp_client_get(tftp->file, tftp->server, 0, tftp->mem,
+                               tftpMaxSize, TFTP_OCTET, &err);
 
                if (tftp->actual < 0)
                {
@@ -2083,8 +1340,7 @@ static int fetchTftp(struct Tftp *tftp)
 // tftpfs_fo_write()
 // Read data from file.
 
-static int
-tftpfs_fo_read(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
+static int tftpfs_fo_read(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
 {
        struct Tftp *tftp = (struct Tftp *) fp->f_data;
 
@@ -2116,9 +1372,7 @@ tftpfs_fo_read(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
        return ENOERR;
 }
 
-
-static int
-tftpfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
+static int tftpfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
 {
        struct Tftp *tftp = (struct Tftp *) fp->f_data;
 
@@ -2149,8 +1403,7 @@ tftpfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
        return ENOERR;
 }
 
-static int
-tftpfs_fo_fsync(struct CYG_FILE_TAG *fp, int mode)
+static int tftpfs_fo_fsync(struct CYG_FILE_TAG *fp, int mode)
 {
        int error = ENOERR;
        return error;
@@ -2167,7 +1420,8 @@ static int tftpfs_fo_close(struct CYG_FILE_TAG *fp)
 
        if (tftp->write)
        {
-           tftp_client_put( tftp->file, tftp->server, 0, tftp->mem, fp->f_offset,   TFTP_OCTET, &error);
+               tftp_client_put(tftp->file, tftp->server, 0, tftp->mem, fp->f_offset,
+                               TFTP_OCTET, &error);
        }
 
        freeTftp(tftp);
@@ -2227,13 +1481,13 @@ void usleep(int us)
 }
 
 // Chunked version.
-cyg_int32
-show_log_entry(CYG_HTTPD_STATE *phttpstate)
+cyg_int32 show_log_entry(CYG_HTTPD_STATE *phttpstate)
 {
        cyg_httpd_start_chunked("text");
        if (logCount >= logSize)
        {
-        cyg_httpd_write_chunked(logBuffer+logCount%logSize, logSize-logCount%logSize);
+               cyg_httpd_write_chunked(logBuffer + logCount % logSize, logSize
+                               - logCount % logSize);
        }
        cyg_httpd_write_chunked(logBuffer, writePtr);
        cyg_httpd_end_chunked();
@@ -2247,8 +1501,7 @@ static int logfs_mount(cyg_fstab_entry *fste, cyg_mtab_entry *mte);
 static int logfs_umount(cyg_mtab_entry *mte);
 static int logfs_open(cyg_mtab_entry *mte, cyg_dir dir, const char *name,
                int mode, cyg_file *fte);
-static int
-logfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio);
+static int logfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio);
 
 // File operations
 static int logfs_fo_fsync(struct CYG_FILE_TAG *fp, int mode);
@@ -2285,18 +1538,12 @@ FSTAB_ENTRY( logfs_fste, "logfs", 0,
 // This set of file operations are used for normal open files.
 
 static cyg_fileops logfs_fileops =
-{
-       (cyg_fileop_read *)cyg_fileio_erofs,
-    (cyg_fileop_write *)logfs_fo_write,
+{ (cyg_fileop_read *) cyg_fileio_erofs, (cyg_fileop_write *) logfs_fo_write,
                (cyg_fileop_lseek *) cyg_fileio_erofs,
-       (cyg_fileop_ioctl *)cyg_fileio_erofs,
-    cyg_fileio_seltrue,
-    logfs_fo_fsync,
-    logfs_fo_close,
-       (cyg_fileop_fstat *)cyg_fileio_erofs,
+               (cyg_fileop_ioctl *) cyg_fileio_erofs, cyg_fileio_seltrue,
+               logfs_fo_fsync, logfs_fo_close, (cyg_fileop_fstat *) cyg_fileio_erofs,
                (cyg_fileop_getinfo *) cyg_fileio_erofs,
-       (cyg_fileop_setinfo *)cyg_fileio_erofs,
-};
+               (cyg_fileop_setinfo *) cyg_fileio_erofs, };
 
 // -------------------------------------------------------------------------
 // logfs_mount()
@@ -2329,8 +1576,7 @@ static int logfs_open(cyg_mtab_entry *mte, cyg_dir dir, const char *name,
 // logfs_fo_write()
 // Write data to file.
 
-static int
-logfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
+static int logfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
 {
        int i;
        for (i = 0; i < uio->uio_iovcnt; i++)
@@ -2345,8 +1591,7 @@ logfs_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
 
        return ENOERR;
 }
-static int
-logfs_fo_fsync(struct CYG_FILE_TAG *fp, int mode)
+static int logfs_fo_fsync(struct CYG_FILE_TAG *fp, int mode)
 {
        return ENOERR;
 }
index 9162d5fc6e1e94b65e0fbdad47fcff931e81edee..a7ca723fce7e3e4d5b0f28a8c37d6cfc663861fb 100644 (file)
@@ -9,9 +9,16 @@ else
 CONFIGFILES = options.c jim.c jim-eventloop.c 
 endif
 
+
+
 libhelper_a_SOURCES = binarybuffer.c $(CONFIGFILES) configuration.c log.c command.c time_support.c \
        replacements.c fileio.c startup_tcl.c
 
+if IOUTIL
+libhelper_a_SOURCES += ioutil.c
+endif
+
+
 noinst_HEADERS = binarybuffer.h configuration.h types.h log.h command.h \
        time_support.h replacements.h fileio.h jim.h jim-eventloop.h \
        startup.tcl bin2char.c
diff --git a/src/helper/ioutil.c b/src/helper/ioutil.c
new file mode 100644 (file)
index 0000000..faaddf1
--- /dev/null
@@ -0,0 +1,590 @@
+/***************************************************************************\r
+ *   Copyright (C) 2007-2008 by Ã˜yvind Harboe                              *\r
+ *                                                                         *\r
+ *   This program is free software; you can redistribute it and/or modify  *\r
+ *   it under the terms of the GNU General Public License as published by  *\r
+ *   the Free Software Foundation; either version 2 of the License, or     *\r
+ *   (at your option) any later version.                                   *\r
+ *                                                                         *\r
+ *   This program is distributed in the hope that it will be useful,       *\r
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
+ *   GNU General Public License for more details.                          *\r
+ *                                                                         *\r
+ *   You should have received a copy of the GNU General Public License     *\r
+ *   along with this program; if not, write to the                         *\r
+ *   Free Software Foundation, Inc.,                                       *\r
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
+ ***************************************************************************/\r
+\r
+/* this file contains various functionality useful to standalone systems */\r
+\r
+#ifdef HAVE_CONFIG_H\r
+#include "config.h"\r
+#endif\r
+\r
+#include "log.h"\r
+#include "types.h"\r
+#include "configuration.h"\r
+#include "target.h"\r
+\r
+#include "command.h"\r
+\r
+#include <time_support.h>\r
+#include <sys/time.h>\r
+#include <sys/types.h>\r
+#include <strings.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <unistd.h>\r
+#if !BUILD_ECOSBOARD\r
+#include <malloc.h>\r
+#endif\r
+#include <errno.h>\r
+\r
+\r
+#include <fcntl.h>\r
+#include <sys/stat.h>\r
+#include <dirent.h>\r
+#include <netinet/tcp.h>\r
+#include <sys/ioctl.h>\r
+#include <sys/socket.h>\r
+#include <netinet/in.h>\r
+#include <net/if.h>\r
+#include <arpa/inet.h>\r
+#include <sys/types.h>\r
+#include <sys/socket.h>\r
+#include <netdb.h>\r
+#include <netinet/in.h>\r
+#include <unistd.h>\r
+#include <arpa/inet.h>\r
+#include <stdio.h>\r
+#include <string.h>\r
+\r
+\r
+#include <unistd.h>\r
+#include <stdio.h>\r
+\r
+int handle_rm_command(struct command_context_s *cmd_ctx, char *cmd,\r
+               char **args, int argc)\r
+{\r
+       if (argc != 1)\r
+       {\r
+               command_print(cmd_ctx, "rm <filename>");\r
+               return ERROR_INVALID_ARGUMENTS;\r
+       }\r
+\r
+       if (unlink(args[0]) != 0)\r
+       {\r
+               command_print(cmd_ctx, "failed: %d", errno);\r
+       }\r
+\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+/* loads a file and returns a pointer to it in memory. The file contains\r
+ * a 0 byte(sentinel) after len bytes - the length of the file. */\r
+int loadFile(const char *fileName, void **data, int *len)\r
+{\r
+       FILE * pFile;\r
+       pFile = fopen(fileName,"rb");\r
+       if (pFile==NULL)\r
+       {\r
+               LOG_ERROR("Can't open %s\n", fileName);\r
+               return ERROR_FAIL;\r
+       }\r
+       if (fseek(pFile, 0, SEEK_END)!=0)\r
+       {\r
+               LOG_ERROR("Can't open %s\n", fileName);\r
+               fclose(pFile);\r
+               return ERROR_FAIL;\r
+       }\r
+       *len=ftell(pFile);\r
+       if (*len==-1)\r
+       {\r
+               LOG_ERROR("Can't open %s\n", fileName);\r
+               fclose(pFile);\r
+               return ERROR_FAIL;\r
+       }\r
+\r
+       if (fseek(pFile, 0, SEEK_SET)!=0)\r
+       {\r
+               LOG_ERROR("Can't open %s\n", fileName);\r
+               fclose(pFile);\r
+               return ERROR_FAIL;\r
+       }\r
+       *data=malloc(*len+1);\r
+       if (*data==NULL)\r
+       {\r
+               LOG_ERROR("Can't open %s\n", fileName);\r
+               fclose(pFile);\r
+               return ERROR_FAIL;\r
+       }\r
+\r
+       if (fread(*data, 1, *len, pFile)!=*len)\r
+       {\r
+               fclose(pFile);\r
+               free(*data);\r
+               LOG_ERROR("Can't open %s\n", fileName);\r
+               return ERROR_FAIL;\r
+       }\r
+       fclose(pFile);\r
+       *(((char *)(*data))+*len)=0; /* sentinel */\r
+\r
+       return ERROR_OK;\r
+\r
+\r
+\r
+}\r
+\r
+\r
+\r
+int handle_cat_command(struct command_context_s *cmd_ctx, char *cmd,\r
+               char **args, int argc)\r
+{\r
+       if (argc != 1)\r
+       {\r
+               command_print(cmd_ctx, "cat <filename>");\r
+               return ERROR_INVALID_ARGUMENTS;\r
+       }\r
+\r
+       // NOTE!!! we only have line printing capability so we print the entire file as a single line.\r
+       void *data;\r
+       int len;\r
+\r
+       int retval = loadFile(args[0], &data, &len);\r
+       if (retval == ERROR_OK)\r
+       {\r
+               command_print(cmd_ctx, "%s", data);\r
+               free(data);\r
+       }\r
+       else\r
+       {\r
+               command_print(cmd_ctx, "%s not found %d", args[0], retval);\r
+       }\r
+\r
+       return ERROR_OK;\r
+}\r
+int handle_trunc_command(struct command_context_s *cmd_ctx, char *cmd,\r
+               char **args, int argc)\r
+{\r
+       if (argc != 1)\r
+       {\r
+               command_print(cmd_ctx, "trunc <filename>");\r
+               return ERROR_INVALID_ARGUMENTS;\r
+       }\r
+\r
+       FILE *config_file = NULL;\r
+       config_file = fopen(args[0], "w");\r
+       if (config_file != NULL)\r
+               fclose(config_file);\r
+\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+int handle_meminfo_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)\r
+{\r
+       static int prev = 0;\r
+       struct mallinfo info;\r
+\r
+       if (argc != 0)\r
+       {\r
+               command_print(cmd_ctx, "meminfo");\r
+               return ERROR_INVALID_ARGUMENTS;\r
+       }\r
+\r
+       info = mallinfo();\r
+\r
+       if (prev > 0)\r
+       {\r
+               command_print(cmd_ctx, "Diff:            %d", prev - info.fordblks);\r
+       }\r
+       prev = info.fordblks;\r
+\r
+       command_print(cmd_ctx, "Available ram:   %d", info.fordblks );\r
+\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+int handle_append_command(struct command_context_s *cmd_ctx, char *cmd,\r
+               char **args, int argc)\r
+{\r
+       if (argc < 1)\r
+       {\r
+               command_print(cmd_ctx,\r
+                               "append <filename> [<string1>, [<string2>, ...]]");\r
+               return ERROR_INVALID_ARGUMENTS;\r
+       }\r
+\r
+       FILE *config_file = NULL;\r
+       config_file = fopen(args[0], "a");\r
+       if (config_file != NULL)\r
+       {\r
+               int i;\r
+               fseek(config_file, 0, SEEK_END);\r
+\r
+               for (i = 1; i < argc; i++)\r
+               {\r
+                       fwrite(args[i], strlen(args[i]), 1, config_file);\r
+                       if (i != argc - 1)\r
+                       {\r
+                               fwrite(" ", 1, 1, config_file);\r
+                       }\r
+               }\r
+               fwrite("\n", 1, 1, config_file);\r
+               fclose(config_file);\r
+       }\r
+\r
+       return ERROR_OK;\r
+}\r
+\r
+\r
+\r
+int handle_cp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)\r
+{\r
+       if (argc != 2)\r
+       {\r
+               return ERROR_INVALID_ARGUMENTS;\r
+       }\r
+\r
+       // NOTE!!! we only have line printing capability so we print the entire file as a single line.\r
+       void *data;\r
+       int len;\r
+\r
+       int retval = loadFile(args[0], &data, &len);\r
+       if (retval != ERROR_OK)\r
+               return retval;\r
+\r
+       FILE *f = fopen(args[1], "wb");\r
+       if (f == NULL)\r
+               retval = ERROR_INVALID_ARGUMENTS;\r
+\r
+       int pos = 0;\r
+       for (;;)\r
+       {\r
+               int chunk = len - pos;\r
+               static const int maxChunk = 512 * 1024; // ~1/sec\r
+               if (chunk > maxChunk)\r
+               {\r
+                       chunk = maxChunk;\r
+               }\r
+\r
+               if ((retval==ERROR_OK)&&(fwrite(((char *)data)+pos, 1, chunk, f)!=chunk))\r
+                       retval = ERROR_INVALID_ARGUMENTS;\r
+\r
+               if (retval != ERROR_OK)\r
+               {\r
+                       break;\r
+               }\r
+\r
+               command_print(cmd_ctx, "%d", len - pos);\r
+\r
+               pos += chunk;\r
+\r
+               if (pos == len)\r
+                       break;\r
+       }\r
+\r
+       if (retval == ERROR_OK)\r
+       {\r
+               command_print(cmd_ctx, "Copied %s to %s", args[0], args[1]);\r
+       } else\r
+       {\r
+               command_print(cmd_ctx, "Failed: %d", retval);\r
+       }\r
+\r
+       if (data != NULL)\r
+               free(data);\r
+       if (f != NULL)\r
+               fclose(f);\r
+\r
+       if (retval != ERROR_OK)\r
+               unlink(args[1]);\r
+\r
+       return retval;\r
+}\r
+\r
+\r
+\r
+\r
+#define SHOW_RESULT(a, b) LOG_ERROR(#a " failed %d\n", (int)b)\r
+\r
+#define IOSIZE 512\r
+void copyfile(char *name2, char *name1)\r
+{\r
+\r
+       int err;\r
+       char buf[IOSIZE];\r
+       int fd1, fd2;\r
+       ssize_t done, wrote;\r
+\r
+       fd1 = open(name1, O_WRONLY | O_CREAT);\r
+       if (fd1 < 0)\r
+               SHOW_RESULT( open, fd1 );\r
+\r
+       fd2 = open(name2, O_RDONLY);\r
+       if (fd2 < 0)\r
+               SHOW_RESULT( open, fd2 );\r
+\r
+       for (;;)\r
+       {\r
+               done = read(fd2, buf, IOSIZE );\r
+               if (done < 0)\r
+               {\r
+                       SHOW_RESULT( read, done );\r
+                       break;\r
+               }\r
+\r
+        if( done == 0 ) break;\r
+\r
+               wrote = write(fd1, buf, done);\r
+        if( wrote != done ) SHOW_RESULT( write, wrote );\r
+\r
+        if( wrote != done ) break;\r
+       }\r
+\r
+       err = close(fd1);\r
+    if( err < 0 ) SHOW_RESULT( close, err );\r
+\r
+       err = close(fd2);\r
+    if( err < 0 ) SHOW_RESULT( close, err );\r
+\r
+}\r
+\r
+/* utility fn to copy a directory */\r
+void copydir(char *name, char *destdir)\r
+{\r
+       int err;\r
+       DIR *dirp;\r
+\r
+       dirp = opendir(destdir);\r
+       if (dirp==NULL)\r
+       {\r
+               mkdir(destdir, 0777);\r
+       } else\r
+       {\r
+               err = closedir(dirp);\r
+       }\r
+\r
+       dirp = opendir(name);\r
+    if( dirp == NULL ) SHOW_RESULT( opendir, -1 );\r
+\r
+       for (;;)\r
+       {\r
+               struct dirent *entry = readdir(dirp);\r
+\r
+               if (entry == NULL)\r
+                       break;\r
+\r
+               if (strcmp(entry->d_name, ".") == 0)\r
+                       continue;\r
+               if (strcmp(entry->d_name, "..") == 0)\r
+                       continue;\r
+\r
+               int isDir = 0;\r
+               struct stat buf;\r
+               char fullPath[PATH_MAX];\r
+               strncpy(fullPath, name, PATH_MAX);\r
+               strcat(fullPath, "/");\r
+               strncat(fullPath, entry->d_name, PATH_MAX - strlen(fullPath));\r
+\r
+               if (stat(fullPath, &buf) == -1)\r
+               {\r
+                       LOG_ERROR("unable to read status from %s", fullPath);\r
+                       break;\r
+               }\r
+               isDir = S_ISDIR(buf.st_mode) != 0;\r
+\r
+               if (isDir)\r
+                       continue;\r
+\r
+               //        diag_printf("<INFO>: entry %14s",entry->d_name);\r
+               char fullname[PATH_MAX];\r
+               char fullname2[PATH_MAX];\r
+\r
+               strcpy(fullname, name);\r
+               strcat(fullname, "/");\r
+               strcat(fullname, entry->d_name);\r
+\r
+               strcpy(fullname2, destdir);\r
+               strcat(fullname2, "/");\r
+               strcat(fullname2, entry->d_name);\r
+               //        diag_printf("from %s to %s\n", fullname, fullname2);\r
+               copyfile(fullname, fullname2);\r
+\r
+               //       diag_printf("\n");\r
+       }\r
+\r
+       err = closedir(dirp);\r
+    if( err < 0 ) SHOW_RESULT( stat, err );\r
+}\r
+\r
+\r
+\r
+\r
+static int\r
+zylinjtag_Jim_Command_rm(Jim_Interp *interp,\r
+                                   int argc,\r
+               Jim_Obj * const *argv)\r
+{\r
+       int del;\r
+       if (argc != 2)\r
+       {\r
+               Jim_WrongNumArgs(interp, 1, argv, "rm ?dirorfile?");\r
+               return JIM_ERR;\r
+       }\r
+\r
+       del = 0;\r
+       if (unlink(Jim_GetString(argv[1], NULL)) == 0)\r
+               del = 1;\r
+       if (rmdir(Jim_GetString(argv[1], NULL)) == 0)\r
+               del = 1;\r
+\r
+       return del ? JIM_OK : JIM_ERR;\r
+}\r
+\r
+\r
+static int\r
+zylinjtag_Jim_Command_ls(Jim_Interp *interp,\r
+                                   int argc,\r
+               Jim_Obj * const *argv)\r
+{\r
+       if (argc != 2)\r
+       {\r
+               Jim_WrongNumArgs(interp, 1, argv, "ls ?dir?");\r
+               return JIM_ERR;\r
+       }\r
+\r
+       char *name = (char*) Jim_GetString(argv[1], NULL);\r
+\r
+       DIR *dirp = NULL;\r
+       dirp = opendir(name);\r
+       if (dirp == NULL)\r
+       {\r
+               return JIM_ERR;\r
+       }\r
+       Jim_Obj *objPtr = Jim_NewListObj(interp, NULL, 0);\r
+\r
+       for (;;)\r
+       {\r
+               struct dirent *entry = NULL;\r
+               entry = readdir(dirp);\r
+               if (entry == NULL)\r
+                       break;\r
+\r
+               if ((strcmp(".", entry->d_name)==0)||(strcmp("..", entry->d_name)==0))\r
+                       continue;\r
+\r
+        Jim_ListAppendElement(interp, objPtr, Jim_NewStringObj(interp, entry->d_name, strlen(entry->d_name)));\r
+       }\r
+       closedir(dirp);\r
+\r
+       Jim_SetResult(interp, objPtr);\r
+\r
+       return JIM_OK;\r
+}\r
+\r
+int handle_peek_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)\r
+{\r
+       if (argc != 1)\r
+       {\r
+               return ERROR_COMMAND_SYNTAX_ERROR;\r
+       }\r
+       volatile int *address=(volatile int *)strtoul(args[0], NULL, 0);\r
+       int value=*address;\r
+       command_print(cmd_ctx, "0x%x : 0x%x", address, value);\r
+       return ERROR_OK;\r
+}\r
+\r
+int handle_poke_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)\r
+{\r
+       if (argc != 2)\r
+       {\r
+               return ERROR_INVALID_ARGUMENTS;\r
+       }\r
+       volatile int *address=(volatile int *)strtoul(args[0], NULL, 0);\r
+       int value=strtoul(args[1], NULL, 0);\r
+       *address=value;\r
+       return ERROR_OK;\r
+}\r
+\r
+static int\r
+zylinjtag_Jim_Command_peek(Jim_Interp *interp,\r
+                                   int argc,\r
+               Jim_Obj * const *argv)\r
+{\r
+       if (argc != 2)\r
+       {\r
+               Jim_WrongNumArgs(interp, 1, argv, "peek ?address?");\r
+               return JIM_ERR;\r
+       }\r
+\r
+       long address;\r
+       if (Jim_GetLong(interp, argv[1], &address) != JIM_OK)\r
+               return JIM_ERR;\r
+\r
+       int value = *((volatile int *) address);\r
+\r
+       Jim_SetResult(interp, Jim_NewIntObj(interp, value));\r
+\r
+       return JIM_OK;\r
+}\r
+\r
+static int\r
+zylinjtag_Jim_Command_poke(Jim_Interp *interp,\r
+                                   int argc,\r
+               Jim_Obj * const *argv)\r
+{\r
+       if (argc != 3)\r
+       {\r
+               Jim_WrongNumArgs(interp, 1, argv, "poke ?address? ?value?");\r
+               return JIM_ERR;\r
+       }\r
+\r
+       long address;\r
+       if (Jim_GetLong(interp, argv[1], &address) != JIM_OK)\r
+               return JIM_ERR;\r
+       long value;\r
+       if (Jim_GetLong(interp, argv[2], &value) != JIM_OK)\r
+               return JIM_ERR;\r
+\r
+       *((volatile int *) address) = value;\r
+\r
+       return JIM_OK;\r
+}\r
+\r
+int ioutil_init(struct command_context_s *cmd_ctx)\r
+{\r
+       register_command(cmd_ctx, NULL, "rm", handle_rm_command, COMMAND_ANY,\r
+                       "remove file");\r
+\r
+       register_command(cmd_ctx, NULL, "cat", handle_cat_command, COMMAND_ANY,\r
+                       "display file content");\r
+\r
+       register_command(cmd_ctx, NULL, "trunc", handle_trunc_command, COMMAND_ANY,\r
+                       "truncate a file to 0 size");\r
+\r
+       register_command(cmd_ctx, NULL, "cp", handle_cp_command,\r
+                                        COMMAND_ANY, "copy a file <from> <to>");\r
+\r
+       register_command(cmd_ctx, NULL, "append_file", handle_append_command,\r
+                       COMMAND_ANY, "append a variable number of strings to a file");\r
+\r
+       register_command(cmd_ctx, NULL, "meminfo", handle_meminfo_command,\r
+                       COMMAND_ANY, "display available ram memory");\r
+\r
+    Jim_CreateCommand(interp, "rm", zylinjtag_Jim_Command_rm, NULL, NULL);\r
+\r
+    Jim_CreateCommand(interp, "peek", zylinjtag_Jim_Command_peek, NULL, NULL);\r
+    Jim_CreateCommand(interp, "poke", zylinjtag_Jim_Command_poke, NULL, NULL);\r
+    Jim_CreateCommand(interp, "ls", zylinjtag_Jim_Command_ls, NULL, NULL);\r
+\r
+\r
+    return ERROR_OK;\r
+}\r
+\r
+\r
index 160a51ef81a795432dd60032464217f337818b69..86b98ca704d48459e0156804410c04886c5cd4b9 100644 (file)
 
 #include <stdlib.h>
 
+#define ZYLIN_VERSION "1.48"
+#define ZYLIN_DATE __DATE__
+#define ZYLIN_TIME __TIME__
+#define ZYLIN_OPENOCD "$Revision: 1241 $"
+#define ZYLIN_OPENOCD_VERSION "Zylin JTAG ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE " " ZYLIN_TIME
+const char *zylin_config_dir="/config/settings";
 
 extern int jtag_error;
 
@@ -223,7 +229,7 @@ int zy1000_speed(int speed)
        {
                if(speed > 8190 || speed < 2)
                {
-                       LOG_ERROR("valid ZY1000 jtag_speed=[8190,2]. Divisor is 64MHz / even values between 8190-2, i.e. min 7814Hz, max 32MHz");
+                       LOG_USER("valid ZY1000 jtag_speed=[8190,2]. Divisor is 64MHz / even values between 8190-2, i.e. min 7814Hz, max 32MHz");
                        return ERROR_INVALID_ARGUMENTS;
                }
 
@@ -234,86 +240,119 @@ int zy1000_speed(int speed)
        return ERROR_OK;
 }
 
-int zy1000_register_commands(struct command_context_s *cmd_ctx)
-{
-       return ERROR_OK;
-}
+static bool savePower;
 
 
-int zy1000_init(void)
+static void setPower(bool power)
 {
-       ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x30); // Turn on LED1 & LED2
-
-        /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
-       zy1000_reset(0, 0);
-       zy1000_speed(jtag_speed);
-
-       bitbang_interface = &zy1000_bitbang;
-
-       return ERROR_OK;
+       savePower = power;
+       if (power)
+       {
+               HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x14, 0x8);
+       } else
+       {
+               HAL_WRITE_UINT32(ZY1000_JTAG_BASE+0x10, 0x8);
+       }
 }
 
-int zy1000_quit(void)
+int handle_power_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
+       if (argc > 1)
+       {
+               return ERROR_INVALID_ARGUMENTS;
+       }
+
+       if (argc == 1)
+       {
+               if (strcmp(args[0], "on") == 0)
+               {
+                       setPower(1);
+               }
+               else if (strcmp(args[0], "off") == 0)
+               {
+                       setPower(0);
+               } else
+               {
+                       command_print(cmd_ctx, "arg is \"on\" or \"off\"");
+                       return ERROR_INVALID_ARGUMENTS;
+               }
+       }
+
+       command_print(cmd_ctx, "Target power %s", savePower ? "on" : "off");
 
        return ERROR_OK;
 }
 
 
-
-/* loads a file and returns a pointer to it in memory. The file contains
- * a 0 byte(sentinel) after len bytes - the length of the file. */
-int loadFile(const char *fileName, void **data, int *len)
+/* Give TELNET a way to find out what version this is */
+int handle_zy1000_version_command(struct command_context_s *cmd_ctx, char *cmd,
+               char **args, int argc)
 {
-       FILE * pFile;
-       pFile = fopen(fileName,"rb");
-       if (pFile==NULL)
+       if (argc > 1)
        {
-               LOG_ERROR("Can't open %s\n", fileName);
-               return ERROR_JTAG_DEVICE_ERROR;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
-       if (fseek(pFile, 0, SEEK_END)!=0)
+       if (argc == 0)
        {
-               LOG_ERROR("Can't open %s\n", fileName);
-               fclose(pFile);
-               return ERROR_JTAG_DEVICE_ERROR;
+               command_print(cmd_ctx, ZYLIN_OPENOCD_VERSION);
        }
-       *len=ftell(pFile);
-       if (*len==-1)
+       else if (strcmp("openocd", args[0]) == 0)
        {
-               LOG_ERROR("Can't open %s\n", fileName);
-               fclose(pFile);
-               return ERROR_JTAG_DEVICE_ERROR;
+               int revision;
+               revision = atol(ZYLIN_OPENOCD+strlen("XRevision: "));
+               command_print(cmd_ctx, "%d", revision);
        }
-
-       if (fseek(pFile, 0, SEEK_SET)!=0)
+       else if (strcmp("zy1000", args[0]) == 0)
        {
-               LOG_ERROR("Can't open %s\n", fileName);
-               fclose(pFile);
-               return ERROR_JTAG_DEVICE_ERROR;
+               command_print(cmd_ctx, "%s", ZYLIN_VERSION);
        }
-       *data=malloc(*len+1);
-       if (*data==NULL)
+       else if (strcmp("date", args[0]) == 0)
        {
-               LOG_ERROR("Can't open %s\n", fileName);
-               fclose(pFile);
-               return ERROR_JTAG_DEVICE_ERROR;
+               command_print(cmd_ctx, "%s", ZYLIN_DATE);
        }
-
-       if (fread(*data, 1, *len, pFile)!=*len)
+       else
        {
-               fclose(pFile);
-       free(*data);
-               LOG_ERROR("Can't open %s\n", fileName);
-               return ERROR_JTAG_DEVICE_ERROR;
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
-       fclose(pFile);
-       *(((char *)(*data))+*len)=0; /* sentinel */
 
        return ERROR_OK;
+}
+
 
+int zy1000_register_commands(struct command_context_s *cmd_ctx)
+{
+       register_command(cmd_ctx, NULL, "power", handle_power_command, COMMAND_ANY,
+                       "power <on/off> - turn power switch to target on/off. No arguments - print status.");
+       register_command(cmd_ctx, NULL, "zy1000_version", handle_zy1000_version_command,
+                       COMMAND_EXEC, "show zy1000 version numbers");
 
 
+       return ERROR_OK;
+}
+
+
+int zy1000_init(void)
+{
+       LOG_ERROR("%s\n", ZYLIN_OPENOCD_VERSION);
+
+       ZY1000_POKE(ZY1000_JTAG_BASE+0x10, 0x30); // Turn on LED1 & LED2
+
+       setPower(true); // on by default
+
+
+        /* deassert resets. Important to avoid infinite loop waiting for SRST to deassert */
+       zy1000_reset(0, 0);
+       zy1000_speed(jtag_speed);
+
+       bitbang_interface = &zy1000_bitbang;
+
+       return ERROR_OK;
+}
+
+int zy1000_quit(void)
+{
+
+       return ERROR_OK;
 }
 
 
@@ -703,7 +742,7 @@ int interface_jtag_add_pathmove(int num_states, enum tap_state *path)
                }
                else
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(path[state_count)]);
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(path[state_count]));
                        exit(-1);
                }
 
@@ -760,3 +799,25 @@ void embeddedice_write_dcc(jtag_tap_t *tap, int reg_addr, u8 *buffer, int little
        }
 }
 
+int loadFile(const char *fileName, void **data, int *len);
+
+/* boolean parameter stored on config */
+int boolParam(char *var)
+{
+       bool result = false;
+       char *name = alloc_printf("%s/%s", zylin_config_dir, var);
+       if (name == NULL)
+               return result;
+
+       void *data;
+       int len;
+       if (loadFile(name, &data, &len) == ERROR_OK)
+       {
+               if (len > 1)
+                       len = 1;
+               result = strncmp((char *) data, "1", len) == 0;
+               free(data);
+       }
+       free(name);
+       return result;
+}
index 12d219b0863f985a81f6bfdefb6f7b1dd6c8932d..014433c76f1600e63a22125c746ea449f291466c 100644 (file)
@@ -118,6 +118,8 @@ static int log_target_callback_event_handler(struct target_s *target, enum targe
        return ERROR_OK;
 }
 
+int ioutil_init(struct command_context_s *cmd_ctx);
+
 /* OpenOCD can't really handle failure of this command. Patches welcome! :-) */
 int handle_init_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
@@ -130,6 +132,13 @@ int handle_init_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
 
        atexit(exit_handler);
 
+#if BUILD_IOUTIL
+       if (ioutil_init(cmd_ctx) != ERROR_OK)
+       {
+               return ERROR_FAIL;
+       }
+#endif
+
        if (target_init(cmd_ctx) != ERROR_OK)
                return ERROR_FAIL;
        LOG_DEBUG("target init complete");

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)