From a98e1094a0443fac738e86ba314bc69879f84db8 Mon Sep 17 00:00:00 2001 From: oharboe Date: Mon, 15 Dec 2008 11:32:22 +0000 Subject: [PATCH] sync up to tap_xxx rename + add with-ioutil for standalone openocd implemetnations git-svn-id: svn://svn.berlios.de/openocd/trunk@1243 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- configure.in | 11 + src/Makefile.am | 1 + src/ecosboard.c | 1029 ++++++---------------------------------- src/helper/Makefile.am | 7 + src/helper/ioutil.c | 590 +++++++++++++++++++++++ src/jtag/zy1000.c | 167 ++++--- src/openocd.c | 9 + 7 files changed, 869 insertions(+), 945 deletions(-) create mode 100644 src/helper/ioutil.c diff --git a/configure.in b/configure.in index 7ed61b2550..8889db4cac 100644 --- a/configure.in +++ b/configure.in @@ -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) diff --git a/src/Makefile.am b/src/Makefile.am index d04308e524..669720f9e6 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -6,6 +6,7 @@ else MAINFILE = main.c endif + openocd_SOURCES = $(MAINFILE) openocd.c # set the include path found by configure diff --git a/src/ecosboard.c b/src/ecosboard.c index 6326b9873d..d2c11b3561 100644 --- a/src/ecosboard.c +++ b/src/ecosboard.c @@ -81,7 +81,6 @@ #include #include - #include #include #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 "); - 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 "); - 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 "); - 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 [, [, ...]]"); - 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(": 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 - 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 "); - #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 - forward uart on port 5555"); + register_command(cmd_ctx, NULL, "uart", handle_uart_command, COMMAND_ANY, + "uart - 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; } diff --git a/src/helper/Makefile.am b/src/helper/Makefile.am index 9162d5fc6e..a7ca723fce 100644 --- a/src/helper/Makefile.am +++ b/src/helper/Makefile.am @@ -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 index 0000000000..faaddf16fe --- /dev/null +++ b/src/helper/ioutil.c @@ -0,0 +1,590 @@ +/*************************************************************************** + * Copyright (C) 2007-2008 by Øyvind Harboe * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +/* this file contains various functionality useful to standalone systems */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "log.h" +#include "types.h" +#include "configuration.h" +#include "target.h" + +#include "command.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#if !BUILD_ECOSBOARD +#include +#endif +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include + +int handle_rm_command(struct command_context_s *cmd_ctx, char *cmd, + char **args, int argc) +{ + if (argc != 1) + { + command_print(cmd_ctx, "rm "); + return ERROR_INVALID_ARGUMENTS; + } + + if (unlink(args[0]) != 0) + { + command_print(cmd_ctx, "failed: %d", errno); + } + + 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) +{ + FILE * pFile; + pFile = fopen(fileName,"rb"); + if (pFile==NULL) + { + LOG_ERROR("Can't open %s\n", fileName); + return ERROR_FAIL; + } + if (fseek(pFile, 0, SEEK_END)!=0) + { + LOG_ERROR("Can't open %s\n", fileName); + fclose(pFile); + return ERROR_FAIL; + } + *len=ftell(pFile); + if (*len==-1) + { + LOG_ERROR("Can't open %s\n", fileName); + fclose(pFile); + return ERROR_FAIL; + } + + if (fseek(pFile, 0, SEEK_SET)!=0) + { + LOG_ERROR("Can't open %s\n", fileName); + fclose(pFile); + return ERROR_FAIL; + } + *data=malloc(*len+1); + if (*data==NULL) + { + LOG_ERROR("Can't open %s\n", fileName); + fclose(pFile); + return ERROR_FAIL; + } + + if (fread(*data, 1, *len, pFile)!=*len) + { + fclose(pFile); + free(*data); + LOG_ERROR("Can't open %s\n", fileName); + return ERROR_FAIL; + } + fclose(pFile); + *(((char *)(*data))+*len)=0; /* sentinel */ + + return ERROR_OK; + + + +} + + + +int handle_cat_command(struct command_context_s *cmd_ctx, char *cmd, + char **args, int argc) +{ + if (argc != 1) + { + command_print(cmd_ctx, "cat "); + 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 "); + 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; +} + + +int handle_append_command(struct command_context_s *cmd_ctx, char *cmd, + char **args, int argc) +{ + if (argc < 1) + { + command_print(cmd_ctx, + "append [, [, ...]]"); + 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; +} + + + +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; +} + + + + +#define SHOW_RESULT(a, b) LOG_ERROR(#a " failed %d\n", (int)b) + +#define IOSIZE 512 +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; + } + + 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 ); + +} + +/* utility fn to copy a directory */ +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; + + int isDir = 0; + 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) + { + LOG_ERROR("unable to read status from %s", fullPath); + break; + } + isDir = S_ISDIR(buf.st_mode) != 0; + + if (isDir) + continue; + + // diag_printf(": 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 ); +} + + + + +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; +} + + +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); + + return JIM_OK; +} + +int handle_peek_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + if (argc != 1) + { + return ERROR_COMMAND_SYNTAX_ERROR; + } + volatile int *address=(volatile int *)strtoul(args[0], NULL, 0); + int value=*address; + command_print(cmd_ctx, "0x%x : 0x%x", address, 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; + } + volatile int *address=(volatile int *)strtoul(args[0], NULL, 0); + int value=strtoul(args[1], NULL, 0); + *address=value; + return ERROR_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; +} + +int ioutil_init(struct command_context_s *cmd_ctx) +{ + 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, "cp", handle_cp_command, + COMMAND_ANY, "copy a file "); + + 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, "meminfo", handle_meminfo_command, + COMMAND_ANY, "display available ram memory"); + + Jim_CreateCommand(interp, "rm", zylinjtag_Jim_Command_rm, NULL, NULL); + + Jim_CreateCommand(interp, "peek", zylinjtag_Jim_Command_peek, NULL, NULL); + Jim_CreateCommand(interp, "poke", zylinjtag_Jim_Command_poke, NULL, NULL); + Jim_CreateCommand(interp, "ls", zylinjtag_Jim_Command_ls, NULL, NULL); + + + return ERROR_OK; +} + + diff --git a/src/jtag/zy1000.c b/src/jtag/zy1000.c index 160a51ef81..86b98ca704 100644 --- a/src/jtag/zy1000.c +++ b/src/jtag/zy1000.c @@ -32,6 +32,12 @@ #include +#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 - 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; +} diff --git a/src/openocd.c b/src/openocd.c index 12d219b086..014433c76f 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -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"); -- 2.30.2