From: Zach W. <zw...@us...> - 2009-12-04 12:42:13
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via c65d94f7d0e0c511794ea1f42ddf01e66f97e236 (commit) via 3cb0b56005059314c8d09d2f8574042a4352dab4 (commit) via 79a73a786ee0f95b49d86abbdea1e985049c5b1f (commit) via b58c1d808fcdeb7a751c1ecf4e5512a8943ec263 (commit) from c5eb8e29bdc296c2d0b25cc771639567b5f7707f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit c65d94f7d0e0c511794ea1f42ddf01e66f97e236 Author: Zachary T Welch <zw...@su...> Date: Thu Dec 3 17:14:07 2009 -0800 add flash/nor/core.[ch] The newly moved flash TCL routines access the internals of the module too much. Fix the layering issues by adding new core NOR flash APIs: <flash/nor/core.h>: - flash_driver_find_by_name() - self-descriptive <flash/nor/imp.h>: - flash_bank_add() - encapsulates adding banks to bank list - flash_bank_list() - encapsulates retreiving bank list This allows the externs in flash/nor/imp.h to be removed, and these mechanisms may now be re-used by other flash module code. diff --git a/src/flash/nor/Makefile.am b/src/flash/nor/Makefile.am index ed9ebb3..499ebfa 100644 --- a/src/flash/nor/Makefile.am +++ b/src/flash/nor/Makefile.am @@ -2,6 +2,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/src noinst_LTLIBRARIES = libocdflashnor.la libocdflashnor_la_SOURCES = \ + core.c \ tcl.c \ $(NOR_DRIVERS) diff --git a/src/flash/nor/imp.h b/src/flash/nor/core.c similarity index 66% copy from src/flash/nor/imp.h copy to src/flash/nor/core.c index 29d7f7e..a69c3f4 100644 --- a/src/flash/nor/imp.h +++ b/src/flash/nor/core.c @@ -16,12 +16,50 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef FLASH_NOR_IMP_H -#define FLASH_NOR_IMP_H +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif #include <flash/flash.h> +#include <flash/nor/imp.h> +// in flash.c, to be moved here extern struct flash_driver *flash_drivers[]; extern struct flash_bank *flash_banks; -#endif // FLASH_NOR_IMP_H +struct flash_driver *flash_driver_find_by_name(const char *name) +{ + for (unsigned i = 0; flash_drivers[i]; i++) + { + if (strcmp(name, flash_drivers[i]->name) == 0) + return flash_drivers[i]; + } + return NULL; +} + +void flash_bank_add(struct flash_bank *bank) +{ + /* put flash bank in linked list */ + unsigned bank_num = 0; + if (flash_banks) + { + /* find last flash bank */ + struct flash_bank *p = flash_banks; + while (NULL != p->next) + { + bank_num += 1; + p = p->next; + } + p->next = bank; + bank_num += 1; + } + else + flash_banks = bank; + + bank->bank_number = bank_num; +} + +struct flash_bank *flash_bank_list(void) +{ + return flash_banks; +} diff --git a/src/flash/nor/imp.h b/src/flash/nor/core.h similarity index 82% copy from src/flash/nor/imp.h copy to src/flash/nor/core.h index 29d7f7e..0c6a804 100644 --- a/src/flash/nor/imp.h +++ b/src/flash/nor/core.h @@ -16,12 +16,16 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef FLASH_NOR_IMP_H -#define FLASH_NOR_IMP_H +#ifndef FLASH_NOR_CORE_H +#define FLASH_NOR_CORE_H #include <flash/flash.h> -extern struct flash_driver *flash_drivers[]; -extern struct flash_bank *flash_banks; +/** + * Find a NOR flash driver by its name. + * @param name The name of the requested driver. + * @returns The flash_driver called @c name, or NULL if not found. + */ +struct flash_driver *flash_driver_find_by_name(const char *name); -#endif // FLASH_NOR_IMP_H +#endif // FLASH_NOR_CORE_H diff --git a/src/flash/nor/imp.h b/src/flash/nor/imp.h index 29d7f7e..23ac476 100644 --- a/src/flash/nor/imp.h +++ b/src/flash/nor/imp.h @@ -19,9 +19,18 @@ #ifndef FLASH_NOR_IMP_H #define FLASH_NOR_IMP_H -#include <flash/flash.h> +// this is an internal header +#include "core.h" -extern struct flash_driver *flash_drivers[]; -extern struct flash_bank *flash_banks; +/** + * Adds a new NOR bank to the global list of banks. + * @params bank The bank that should be added. + */ +void flash_bank_add(struct flash_bank *bank); + +/** + * @return The first bank in the global list. + */ +struct flash_bank *flash_bank_list(void); #endif // FLASH_NOR_IMP_H diff --git a/src/flash/nor/tcl.c b/src/flash/nor/tcl.c index 8c13241..b00516d 100644 --- a/src/flash/nor/tcl.c +++ b/src/flash/nor/tcl.c @@ -44,84 +44,65 @@ COMMAND_HANDLER(handle_flash_bank_command) } const char *driver_name = CMD_ARGV[0]; - for (unsigned i = 0; flash_drivers[i]; i++) + struct flash_driver *driver = flash_driver_find_by_name(driver_name); + if (NULL == driver) { - if (strcmp(driver_name, flash_drivers[i]->name) != 0) - continue; - - /* register flash specific commands */ - if (NULL != flash_drivers[i]->commands) - { - int retval = register_commands(CMD_CTX, NULL, - flash_drivers[i]->commands); - if (ERROR_OK != retval) - { - LOG_ERROR("couldn't register '%s' commands", - driver_name); - return ERROR_FAIL; - } - } + /* no matching flash driver found */ + LOG_ERROR("flash driver '%s' not found", driver_name); + return ERROR_FAIL; + } - struct flash_bank *p, *c; - c = malloc(sizeof(struct flash_bank)); - c->name = strdup(bank_name); - c->target = target; - c->driver = flash_drivers[i]; - c->driver_priv = NULL; - COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], c->base); - COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], c->size); - COMMAND_PARSE_NUMBER(int, CMD_ARGV[3], c->chip_width); - COMMAND_PARSE_NUMBER(int, CMD_ARGV[4], c->bus_width); - c->num_sectors = 0; - c->sectors = NULL; - c->next = NULL; - - int retval; - retval = CALL_COMMAND_HANDLER(flash_drivers[i]->flash_bank_command, c); + /* register flash specific commands */ + if (NULL != driver->commands) + { + int retval = register_commands(CMD_CTX, NULL, + driver->commands); if (ERROR_OK != retval) { - LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8" PRIx32, - driver_name, c->base); - free(c); - return retval; - } - - /* put flash bank in linked list */ - if (flash_banks) - { - int bank_num = 0; - /* find last flash bank */ - for (p = flash_banks; p && p->next; p = p->next) bank_num++; - if (p) - p->next = c; - c->bank_number = bank_num + 1; - } - else - { - flash_banks = c; - c->bank_number = 0; + LOG_ERROR("couldn't register '%s' commands", + driver_name); + return ERROR_FAIL; } + } - return ERROR_OK; + struct flash_bank *c = malloc(sizeof(*c)); + c->name = strdup(bank_name); + c->target = target; + c->driver = driver; + c->driver_priv = NULL; + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], c->base); + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], c->size); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[3], c->chip_width); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[4], c->bus_width); + c->num_sectors = 0; + c->sectors = NULL; + c->next = NULL; + + int retval; + retval = CALL_COMMAND_HANDLER(driver->flash_bank_command, c); + if (ERROR_OK != retval) + { + LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8" PRIx32, + driver_name, c->base); + free(c); + return retval; } - /* no matching flash driver found */ - LOG_ERROR("flash driver '%s' not found", driver_name); - return ERROR_FAIL; + return ERROR_OK; + } static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - struct flash_bank *p; - if (argc != 1) { Jim_WrongNumArgs(interp, 1, argv, "no arguments to flash_banks command"); return JIM_ERR; } Jim_Obj *list = Jim_NewListObj(interp, NULL, 0); - for (p = flash_banks; p; p = p->next) + + for (struct flash_bank *p = flash_bank_list(); p; p = p->next) { Jim_Obj *elem = Jim_NewListObj(interp, NULL, 0); commit 3cb0b56005059314c8d09d2f8574042a4352dab4 Author: Zachary T Welch <zw...@su...> Date: Thu Dec 3 16:47:49 2009 -0800 add flash/nor/{tcl.c,imp.h} from flash/flash.c Moves the top-level 'flash' command handlers into flash/nor/tcl.c, with flash/nor/imp.h providing an internal implementation header to share non-public API components. diff --git a/src/flash/flash.c b/src/flash/flash.c index d16949d..b21838c 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -120,39 +120,6 @@ int flash_driver_protect(struct flash_bank *bank, int set, int first, int last) return retval; } -static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv) -{ - struct flash_bank *p; - - if (argc != 1) { - Jim_WrongNumArgs(interp, 1, argv, "no arguments to flash_banks command"); - return JIM_ERR; - } - - Jim_Obj *list = Jim_NewListObj(interp, NULL, 0); - for (p = flash_banks; p; p = p->next) - { - Jim_Obj *elem = Jim_NewListObj(interp, NULL, 0); - - Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "name", -1)); - Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, p->driver->name, -1)); - Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "base", -1)); - Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->base)); - Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "size", -1)); - Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->size)); - Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "bus_width", -1)); - Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->bus_width)); - Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "chip_width", -1)); - Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->chip_width)); - - Jim_ListAppendElement(interp, list, elem); - } - - Jim_SetResult(interp, list); - - return JIM_OK; -} - struct flash_bank *get_flash_bank_by_num_noprobe(int num) { struct flash_bank *p; @@ -238,92 +205,6 @@ COMMAND_HELPER(flash_command_get_bank, unsigned name_index, } -COMMAND_HANDLER(handle_flash_bank_command) -{ - if (CMD_ARGC < 7) - { - LOG_ERROR("usage: flash bank <name> <driver> " - "<base> <size> <chip_width> <bus_width>"); - return ERROR_COMMAND_SYNTAX_ERROR; - } - // save bank name and advance arguments for compatibility - const char *bank_name = *CMD_ARGV++; - CMD_ARGC--; - - struct target *target; - if ((target = get_target(CMD_ARGV[5])) == NULL) - { - LOG_ERROR("target '%s' not defined", CMD_ARGV[5]); - return ERROR_FAIL; - } - - const char *driver_name = CMD_ARGV[0]; - for (unsigned i = 0; flash_drivers[i]; i++) - { - if (strcmp(driver_name, flash_drivers[i]->name) != 0) - continue; - - /* register flash specific commands */ - if (NULL != flash_drivers[i]->commands) - { - int retval = register_commands(CMD_CTX, NULL, - flash_drivers[i]->commands); - if (ERROR_OK != retval) - { - LOG_ERROR("couldn't register '%s' commands", - driver_name); - return ERROR_FAIL; - } - } - - struct flash_bank *p, *c; - c = malloc(sizeof(struct flash_bank)); - c->name = strdup(bank_name); - c->target = target; - c->driver = flash_drivers[i]; - c->driver_priv = NULL; - COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], c->base); - COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], c->size); - COMMAND_PARSE_NUMBER(int, CMD_ARGV[3], c->chip_width); - COMMAND_PARSE_NUMBER(int, CMD_ARGV[4], c->bus_width); - c->num_sectors = 0; - c->sectors = NULL; - c->next = NULL; - - int retval; - retval = CALL_COMMAND_HANDLER(flash_drivers[i]->flash_bank_command, c); - if (ERROR_OK != retval) - { - LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8" PRIx32, - driver_name, c->base); - free(c); - return retval; - } - - /* put flash bank in linked list */ - if (flash_banks) - { - int bank_num = 0; - /* find last flash bank */ - for (p = flash_banks; p && p->next; p = p->next) bank_num++; - if (p) - p->next = c; - c->bank_number = bank_num + 1; - } - else - { - flash_banks = c; - c->bank_number = 0; - } - - return ERROR_OK; - } - - /* no matching flash driver found */ - LOG_ERROR("flash driver '%s' not found", driver_name); - return ERROR_FAIL; -} - COMMAND_HANDLER(handle_flash_info_command) { struct flash_bank *p; @@ -1375,59 +1256,3 @@ int flash_init_drivers(struct command_context *cmd_ctx) return register_commands(cmd_ctx, parent, flash_exec_command_handlers); } -COMMAND_HANDLER(handle_flash_init_command) -{ - if (CMD_ARGC != 0) - return ERROR_COMMAND_SYNTAX_ERROR; - - static bool flash_initialized = false; - if (flash_initialized) - { - LOG_INFO("'flash init' has already been called"); - return ERROR_OK; - } - flash_initialized = true; - - LOG_DEBUG("Initializing flash devices..."); - return flash_init_drivers(CMD_CTX); -} - -static const struct command_registration flash_config_command_handlers[] = { - { - .name = "bank", - .handler = &handle_flash_bank_command, - .mode = COMMAND_CONFIG, - .usage = "<name> <driver> <base> <size> " - "<chip_width> <bus_width> <target> " - "[driver_options ...]", - .help = "Define a new bank with the given name, " - "using the specified NOR flash driver.", - }, - { - .name = "init", - .mode = COMMAND_CONFIG, - .handler = &handle_flash_init_command, - .help = "initialize flash devices", - }, - { - .name = "banks", - .mode = COMMAND_ANY, - .jim_handler = &jim_flash_banks, - .help = "return information about the flash banks", - }, - COMMAND_REGISTRATION_DONE -}; -static const struct command_registration flash_command_handlers[] = { - { - .name = "flash", - .mode = COMMAND_ANY, - .help = "NOR flash command group", - .chain = flash_config_command_handlers, - }, - COMMAND_REGISTRATION_DONE -}; - -int flash_register_commands(struct command_context *cmd_ctx) -{ - return register_commands(cmd_ctx, NULL, flash_command_handlers); -} diff --git a/src/flash/nor/Makefile.am b/src/flash/nor/Makefile.am index 211366b..ed9ebb3 100644 --- a/src/flash/nor/Makefile.am +++ b/src/flash/nor/Makefile.am @@ -2,6 +2,10 @@ AM_CPPFLAGS = -I$(top_srcdir)/src noinst_LTLIBRARIES = libocdflashnor.la libocdflashnor_la_SOURCES = \ + tcl.c \ + $(NOR_DRIVERS) + +NOR_DRIVERS = \ aduc702x.c \ at91sam3.c \ at91sam7.c \ @@ -27,6 +31,7 @@ noinst_HEADERS = \ at91sam3.h \ avrf.h \ cfi.h \ + imp.h \ lpc2000.h \ lpc288x.h \ non_cfi.h \ diff --git a/src/flash/nor/imp.h b/src/flash/nor/imp.h new file mode 100644 index 0000000..29d7f7e --- /dev/null +++ b/src/flash/nor/imp.h @@ -0,0 +1,27 @@ +/*************************************************************************** + * Copyright (C) 2009 Zachary T Welch <zw...@su...> * + * * + * 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. * + ***************************************************************************/ +#ifndef FLASH_NOR_IMP_H +#define FLASH_NOR_IMP_H + +#include <flash/flash.h> + +extern struct flash_driver *flash_drivers[]; +extern struct flash_bank *flash_banks; + +#endif // FLASH_NOR_IMP_H diff --git a/src/flash/nor/tcl.c b/src/flash/nor/tcl.c new file mode 100644 index 0000000..8c13241 --- /dev/null +++ b/src/flash/nor/tcl.c @@ -0,0 +1,203 @@ +/*************************************************************************** + * Copyright (C) 2005 by Dominic Rath <Dom...@gm...> * + * Copyright (C) 2007,2008 Ãyvind Harboe <oyv...@zy...> * + * Copyright (C) 2008 by Spencer Oliver <sp...@sp...> * + * Copyright (C) 2009 Zachary T Welch <zw...@su...> * + * * + * 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. * + ***************************************************************************/ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "imp.h" + +COMMAND_HANDLER(handle_flash_bank_command) +{ + if (CMD_ARGC < 7) + { + LOG_ERROR("usage: flash bank <name> <driver> " + "<base> <size> <chip_width> <bus_width>"); + return ERROR_COMMAND_SYNTAX_ERROR; + } + // save bank name and advance arguments for compatibility + const char *bank_name = *CMD_ARGV++; + CMD_ARGC--; + + struct target *target; + if ((target = get_target(CMD_ARGV[5])) == NULL) + { + LOG_ERROR("target '%s' not defined", CMD_ARGV[5]); + return ERROR_FAIL; + } + + const char *driver_name = CMD_ARGV[0]; + for (unsigned i = 0; flash_drivers[i]; i++) + { + if (strcmp(driver_name, flash_drivers[i]->name) != 0) + continue; + + /* register flash specific commands */ + if (NULL != flash_drivers[i]->commands) + { + int retval = register_commands(CMD_CTX, NULL, + flash_drivers[i]->commands); + if (ERROR_OK != retval) + { + LOG_ERROR("couldn't register '%s' commands", + driver_name); + return ERROR_FAIL; + } + } + + struct flash_bank *p, *c; + c = malloc(sizeof(struct flash_bank)); + c->name = strdup(bank_name); + c->target = target; + c->driver = flash_drivers[i]; + c->driver_priv = NULL; + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], c->base); + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], c->size); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[3], c->chip_width); + COMMAND_PARSE_NUMBER(int, CMD_ARGV[4], c->bus_width); + c->num_sectors = 0; + c->sectors = NULL; + c->next = NULL; + + int retval; + retval = CALL_COMMAND_HANDLER(flash_drivers[i]->flash_bank_command, c); + if (ERROR_OK != retval) + { + LOG_ERROR("'%s' driver rejected flash bank at 0x%8.8" PRIx32, + driver_name, c->base); + free(c); + return retval; + } + + /* put flash bank in linked list */ + if (flash_banks) + { + int bank_num = 0; + /* find last flash bank */ + for (p = flash_banks; p && p->next; p = p->next) bank_num++; + if (p) + p->next = c; + c->bank_number = bank_num + 1; + } + else + { + flash_banks = c; + c->bank_number = 0; + } + + return ERROR_OK; + } + + /* no matching flash driver found */ + LOG_ERROR("flash driver '%s' not found", driver_name); + return ERROR_FAIL; +} + + +static int jim_flash_banks(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + struct flash_bank *p; + + if (argc != 1) { + Jim_WrongNumArgs(interp, 1, argv, "no arguments to flash_banks command"); + return JIM_ERR; + } + + Jim_Obj *list = Jim_NewListObj(interp, NULL, 0); + for (p = flash_banks; p; p = p->next) + { + Jim_Obj *elem = Jim_NewListObj(interp, NULL, 0); + + Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "name", -1)); + Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, p->driver->name, -1)); + Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "base", -1)); + Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->base)); + Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "size", -1)); + Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->size)); + Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "bus_width", -1)); + Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->bus_width)); + Jim_ListAppendElement(interp, elem, Jim_NewStringObj(interp, "chip_width", -1)); + Jim_ListAppendElement(interp, elem, Jim_NewIntObj(interp, p->chip_width)); + + Jim_ListAppendElement(interp, list, elem); + } + + Jim_SetResult(interp, list); + + return JIM_OK; +} + + +COMMAND_HANDLER(handle_flash_init_command) +{ + if (CMD_ARGC != 0) + return ERROR_COMMAND_SYNTAX_ERROR; + + static bool flash_initialized = false; + if (flash_initialized) + { + LOG_INFO("'flash init' has already been called"); + return ERROR_OK; + } + flash_initialized = true; + + LOG_DEBUG("Initializing flash devices..."); + return flash_init_drivers(CMD_CTX); +} + +static const struct command_registration flash_config_command_handlers[] = { + { + .name = "bank", + .handler = &handle_flash_bank_command, + .mode = COMMAND_CONFIG, + .usage = "<name> <driver> <base> <size> " + "<chip_width> <bus_width> <target> " + "[driver_options ...]", + .help = "Define a new bank with the given name, " + "using the specified NOR flash driver.", + }, + { + .name = "init", + .mode = COMMAND_CONFIG, + .handler = &handle_flash_init_command, + .help = "initialize flash devices", + }, + { + .name = "banks", + .mode = COMMAND_ANY, + .jim_handler = &jim_flash_banks, + .help = "return information about the flash banks", + }, + COMMAND_REGISTRATION_DONE +}; +static const struct command_registration flash_command_handlers[] = { + { + .name = "flash", + .mode = COMMAND_ANY, + .help = "NOR flash command group", + .chain = flash_config_command_handlers, + }, + COMMAND_REGISTRATION_DONE +}; + +int flash_register_commands(struct command_context *cmd_ctx) +{ + return register_commands(cmd_ctx, NULL, flash_command_handlers); +} commit 79a73a786ee0f95b49d86abbdea1e985049c5b1f Author: Zachary T Welch <zw...@su...> Date: Thu Dec 3 16:25:51 2009 -0800 separate Jim from jtag/core.c After previous efforts, only one Jim routine remained in jtag/core.c, and moving it to jtag/tcl.c painlessly finishes separating these layers. The headers need separating, but the implementation is clean. diff --git a/src/jtag/core.c b/src/jtag/core.c index 9230cc2..433b50b 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -244,17 +244,6 @@ struct jtag_tap *jtag_tap_by_string(const char *s) return t; } -struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *o) -{ - const char *cp = Jim_GetString(o, NULL); - struct jtag_tap *t = cp ? jtag_tap_by_string(cp) : NULL; - if (NULL == cp) - cp = "(unknown)"; - if (NULL == t) - Jim_SetResult_sprintf(interp, "Tap '%s' could not be found", cp); - return t; -} - struct jtag_tap* jtag_tap_next_enabled(struct jtag_tap* p) { p = p ? p->next_tap : jtag_all_taps(); diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c index 81bafbb..9704c30 100644 --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -51,6 +51,17 @@ static const Jim_Nvp nvp_jtag_tap_event[] = { extern struct jtag_interface *jtag_interface; +struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *o) +{ + const char *cp = Jim_GetString(o, NULL); + struct jtag_tap *t = cp ? jtag_tap_by_string(cp) : NULL; + if (NULL == cp) + cp = "(unknown)"; + if (NULL == t) + Jim_SetResult_sprintf(interp, "Tap '%s' could not be found", cp); + return t; +} + static bool scan_is_safe(tap_state_t state) { switch (state) commit b58c1d808fcdeb7a751c1ecf4e5512a8943ec263 Author: Zachary T Welch <zw...@su...> Date: Thu Dec 3 16:22:46 2009 -0800 switch 'rm' command away from using Jim Commands that do not need to use Jim should be registered as high-level command handlers. diff --git a/src/helper/ioutil.c b/src/helper/ioutil.c index ed82ba1..27bffad 100644 --- a/src/helper/ioutil.c +++ b/src/helper/ioutil.c @@ -401,25 +401,18 @@ void copydir(char *name, char *destdir) -static int -zylinjtag_Jim_Command_rm(Jim_Interp *interp, - int argc, - Jim_Obj * const *argv) +COMMAND_HANDLER(handle_rm_command) { - int del; - if (argc != 2) - { - Jim_WrongNumArgs(interp, 1, argv, "rm ?dirorfile?"); - return JIM_ERR; - } + if (CMD_ARGC != 1) + return ERROR_INVALID_ARGUMENTS; - del = 0; - if (unlink(Jim_GetString(argv[1], NULL)) == 0) - del = 1; - if (rmdir(Jim_GetString(argv[1], NULL)) == 0) - del = 1; + bool del = false; + if (rmdir(CMD_ARGV[0]) == 0) + del = true; + else if (unlink(CMD_ARGV[0]) == 0) + del = true; - return del ? JIM_OK : JIM_ERR; + return del ? ERROR_OK : ERROR_FAIL; } @@ -658,14 +651,14 @@ static const struct command_registration ioutil_command_handlers[] = { .mode = COMMAND_ANY, .help = "display available ram memory", }, - // jim handlers { .name = "rm", .mode = COMMAND_ANY, - .jim_handler = &zylinjtag_Jim_Command_rm, + .handler = &handle_rm_command, .help = "remove a file", .usage = "<file>", }, + // jim handlers { .name = "peek", .mode = COMMAND_ANY, ----------------------------------------------------------------------- Summary of changes: src/flash/flash.c | 175 --------------------- src/flash/nor/Makefile.am | 6 + src/{server/server_stubs.c => flash/nor/core.c} | 43 +++++- src/{helper/ioutil_stubs.c => flash/nor/core.h} | 21 ++-- src/{helper/ioutil.h => flash/nor/imp.h} | 19 ++- src/flash/nor/tcl.c | 184 +++++++++++++++++++++++ src/helper/ioutil.c | 29 ++--- src/jtag/core.c | 11 -- src/jtag/tcl.c | 11 ++ 9 files changed, 275 insertions(+), 224 deletions(-) copy src/{server/server_stubs.c => flash/nor/core.c} (64%) copy src/{helper/ioutil_stubs.c => flash/nor/core.h} (80%) copy src/{helper/ioutil.h => flash/nor/imp.h} (78%) create mode 100644 src/flash/nor/tcl.c hooks/post-receive -- Main OpenOCD repository |