X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fflash.c;h=b21838cfaaad3086d196de71bd8e52f6fb838fb5;hp=7bc74ab73a7edae8124e7607cbda4b55b5afc7a1;hb=3cb0b56005059314c8d09d2f8574042a4352dab4;hpb=833e7f5248778bcb31b4db1a1b91160995415203 diff --git a/src/flash/flash.c b/src/flash/flash.c index 7bc74ab73a..b21838cfaa 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -29,8 +29,8 @@ #include "flash.h" #include "common.h" -#include "image.h" -#include "time_support.h" +#include +#include static int flash_write_unlock(struct target *target, struct image *image, uint32_t *written, int erase, bool unlock); @@ -78,7 +78,6 @@ struct flash_driver *flash_drivers[] = { }; struct flash_bank *flash_banks; -static struct command *flash_cmd; /* wafer thin wrapper for invoking the flash driver */ static int flash_driver_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count) @@ -121,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; @@ -239,87 +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 " - " "); - 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; - - struct flash_bank *p, *c; - - /* register flash specific commands */ - if (flash_drivers[i]->register_commands(CMD_CTX) != ERROR_OK) - { - LOG_ERROR("couldn't register '%s' commands", driver_name); - return ERROR_FAIL; - } - - 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; @@ -555,7 +440,7 @@ static int flash_check_sector_parameters(struct command_context *cmd_ctx, COMMAND_HANDLER(handle_flash_erase_command) { - if (CMD_ARGC != 2) + if (CMD_ARGC != 3) return ERROR_COMMAND_SYNTAX_ERROR; uint32_t bank_nr; @@ -595,7 +480,7 @@ COMMAND_HANDLER(handle_flash_erase_command) COMMAND_HANDLER(handle_flash_protect_command) { - if (CMD_ARGC != 3) + if (CMD_ARGC != 4) return ERROR_COMMAND_SYNTAX_ERROR; uint32_t bank_nr; @@ -1272,64 +1157,102 @@ int default_flash_blank_check(struct flash_bank *bank) return ERROR_OK; } +static const struct command_registration flash_exec_command_handlers[] = { + { + .name = "probe", + .handler = &handle_flash_probe_command, + .mode = COMMAND_EXEC, + .usage = "", + .help = "identify flash bank", + }, + { + .name = "info", + .handler = &handle_flash_info_command, + .mode = COMMAND_EXEC, + .usage = "", + .help = "print bank information", + }, + { + .name = "erase_check", + .handler = &handle_flash_erase_check_command, + .mode = COMMAND_EXEC, + .usage = "", + .help = "check erase state of sectors", + }, + { + .name = "protect_check", + .handler = &handle_flash_protect_check_command, + .mode = COMMAND_EXEC, + .usage = "", + .help = "check protection state of sectors", + }, + { + .name = "erase_sector", + .handler = &handle_flash_erase_command, + .mode = COMMAND_EXEC, + .usage = " ", + .help = "erase sectors", + }, + { + .name = "erase_address", + .handler = &handle_flash_erase_address_command, + .mode = COMMAND_EXEC, + .usage = "
", + .help = "erase address range", + + }, + { + .name = "fillw", + .handler = &handle_flash_fill_command, + .mode = COMMAND_EXEC, + .usage = "
", + .help = "fill with pattern (no autoerase)", + }, + { + .name = "fillh", + .handler = &handle_flash_fill_command, + .mode = COMMAND_EXEC, + .usage = "
", + .help = "fill with pattern", + }, + { + .name = "fillb", + .handler = &handle_flash_fill_command, + .mode = COMMAND_EXEC, + .usage = "
", + .help = "fill with pattern", + + }, + { + .name = "write_bank", + .handler = &handle_flash_write_bank_command, + .mode = COMMAND_EXEC, + .usage = " ", + .help = "write binary data", + }, + { + .name = "write_image", + .handler = &handle_flash_write_image_command, + .mode = COMMAND_EXEC, + .usage = " [erase] [unlock] [offset] [type]", + .help = "write an image to flash" + }, + { + .name = "protect", + .handler = &handle_flash_protect_command, + .mode = COMMAND_EXEC, + .usage = " ", + .help = "set protection of sectors", + }, + COMMAND_REGISTRATION_DONE +}; + int flash_init_drivers(struct command_context *cmd_ctx) { - register_jim(cmd_ctx, "ocd_flash_banks", - jim_flash_banks, "return information about the flash banks"); - if (!flash_banks) return ERROR_OK; - COMMAND_REGISTER(cmd_ctx, flash_cmd, "info", - handle_flash_info_command, COMMAND_EXEC, - "print info about flash bank "); - COMMAND_REGISTER(cmd_ctx, flash_cmd, "probe", - handle_flash_probe_command, COMMAND_EXEC, - "identify flash bank "); - COMMAND_REGISTER(cmd_ctx, flash_cmd, "erase_check", - handle_flash_erase_check_command, COMMAND_EXEC, - "check erase state of sectors in flash bank "); - COMMAND_REGISTER(cmd_ctx, flash_cmd, "protect_check", - handle_flash_protect_check_command, COMMAND_EXEC, - "check protection state of sectors in flash bank "); - COMMAND_REGISTER(cmd_ctx, flash_cmd, "erase_sector", - handle_flash_erase_command, COMMAND_EXEC, - "erase sectors at "); - COMMAND_REGISTER(cmd_ctx, flash_cmd, "erase_address", - handle_flash_erase_address_command, COMMAND_EXEC, - "erase address range
"); - - COMMAND_REGISTER(cmd_ctx, flash_cmd, "fillw", - handle_flash_fill_command, COMMAND_EXEC, - "fill with pattern (no autoerase)
"); - COMMAND_REGISTER(cmd_ctx, flash_cmd, "fillh", - handle_flash_fill_command, COMMAND_EXEC, - "fill with pattern
"); - COMMAND_REGISTER(cmd_ctx, flash_cmd, "fillb", - handle_flash_fill_command, COMMAND_EXEC, - "fill with pattern
"); - - COMMAND_REGISTER(cmd_ctx, flash_cmd, "write_bank", - handle_flash_write_bank_command, COMMAND_EXEC, - "write binary data to "); - COMMAND_REGISTER(cmd_ctx, flash_cmd, "write_image", - handle_flash_write_image_command, COMMAND_EXEC, - "write_image [erase] [unlock] [offset] [type]"); - COMMAND_REGISTER(cmd_ctx, flash_cmd, "protect", - handle_flash_protect_command, COMMAND_EXEC, - "set protection of sectors at "); - - return ERROR_OK; + struct command *parent = command_find_in_context(cmd_ctx, "flash"); + return register_commands(cmd_ctx, parent, flash_exec_command_handlers); } -int flash_register_commands(struct command_context *cmd_ctx) -{ - flash_cmd = COMMAND_REGISTER(cmd_ctx, NULL, "flash", - NULL, COMMAND_ANY, NULL); - - COMMAND_REGISTER(cmd_ctx, flash_cmd, "bank", - handle_flash_bank_command, COMMAND_CONFIG, - "flash bank " - " [driver_options ...]"); - return ERROR_OK; -}