From: Øyvind H. <go...@us...> - 2009-10-20 12:25:26
|
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 1c8177d78ea2b24159ef4e3647c947a1ad7e02ed (commit) via 176e80eec3a840ed2c5479308ee290831b08aaaa (commit) from 6eb09d6e6d65b33c26a4f609e2ba4c20bfd5902b (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 1c8177d78ea2b24159ef4e3647c947a1ad7e02ed Author: Ãyvind Harboe <oyv...@zy...> Date: Tue Oct 20 12:22:55 2009 +0200 Added the faux flash driver and target. Used for testing. diff --git a/src/flash/Makefile.am b/src/flash/Makefile.am index 27846d7..d448197 100644 --- a/src/flash/Makefile.am +++ b/src/flash/Makefile.am @@ -38,6 +38,7 @@ libflash_la_SOURCES = \ mflash.c \ pic32mx.c \ avrf.c \ + faux.c \ mx3_nand.c noinst_HEADERS = \ diff --git a/src/flash/ecos.c b/src/flash/ecos.c index 76859df..8583544 100644 --- a/src/flash/ecos.c +++ b/src/flash/ecos.c @@ -148,7 +148,7 @@ static int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char info->driverPath = strdup(args[6]); /* eCos flash sector sizes are not exposed to OpenOCD, use 0x10000 as - * a way to improve impeadance matach between OpenOCD and eCos flash + * a way to improve impedance match between OpenOCD and eCos flash * driver. */ int i = 0; diff --git a/src/flash/faux.c b/src/flash/faux.c new file mode 100644 index 0000000..c5928ad --- /dev/null +++ b/src/flash/faux.c @@ -0,0 +1,153 @@ +/*************************************************************************** + * Copyright (C) 2009 Ãyvind Harboe * + * oyv...@zy... * + * * + * 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 "flash.h" +#include "image.h" + + +static int faux_register_commands(struct command_context_s *cmd_ctx); +static int faux_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank); +static int faux_erase(struct flash_bank_s *bank, int first, int last); +static int faux_protect(struct flash_bank_s *bank, int set, int first, int last); +static int faux_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count); +static int faux_probe(struct flash_bank_s *bank); +static int faux_protect_check(struct flash_bank_s *bank); +static int faux_info(struct flash_bank_s *bank, char *buf, int buf_size); + +flash_driver_t faux_flash = +{ + .name = "faux", + .register_commands = faux_register_commands, + .flash_bank_command = faux_flash_bank_command, + .erase = faux_erase, + .protect = faux_protect, + .write = faux_write, + .probe = faux_probe, + .auto_probe = faux_probe, + .erase_check = default_flash_blank_check, + .protect_check = faux_protect_check, + .info = faux_info +}; + +typedef struct faux_flash_bank_s +{ + struct target_s *target; + uint8_t *memory; + uint32_t start_address; +} faux_flash_bank_t; + +static const int sectorSize = 0x10000; + + +/* flash bank faux <base> <size> <chip_width> <bus_width> <target#> <driverPath> + */ +static int faux_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank) +{ + faux_flash_bank_t *info; + + if (argc < 6) + { + LOG_WARNING("incomplete flash_bank faux configuration"); + return ERROR_FLASH_BANK_INVALID; + } + + info = malloc(sizeof(faux_flash_bank_t)); + if (info == NULL) + { + LOG_ERROR("no memory for flash bank info"); + return ERROR_FAIL; + } + info->memory = malloc(bank->size); + if (info == NULL) + { + free(info); + LOG_ERROR("no memory for flash bank info"); + return ERROR_FAIL; + } + bank->driver_priv = info; + + /* Use 0x10000 as a fixed sector size. */ + int i = 0; + uint32_t offset = 0; + bank->num_sectors = bank->size/sectorSize; + bank->sectors = malloc(sizeof(flash_sector_t) * bank->num_sectors); + for (i = 0; i < bank->num_sectors; i++) + { + bank->sectors[i].offset = offset; + bank->sectors[i].size = sectorSize; + offset += bank->sectors[i].size; + bank->sectors[i].is_erased = -1; + bank->sectors[i].is_protected = 0; + } + + info->target = get_target(args[5]); + if (info->target == NULL) + { + LOG_ERROR("target '%s' not defined", args[5]); + free(info->memory); + free(info); + return ERROR_FAIL; + } + return ERROR_OK; +} + +static int faux_register_commands(struct command_context_s *cmd_ctx) +{ + return ERROR_OK; +} + +static int faux_erase(struct flash_bank_s *bank, int first, int last) +{ + faux_flash_bank_t *info = bank->driver_priv; + memset(info->memory + first*sectorSize, 0xff, sectorSize*(last-first + 1)); + return ERROR_OK; +} + +static int faux_protect(struct flash_bank_s *bank, int set, int first, int last) +{ + LOG_USER("set protection sector %d to %d to %s", first, last, set?"on":"off"); + return ERROR_OK; +} + +static int faux_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count) +{ + faux_flash_bank_t *info = bank->driver_priv; + memcpy(info->memory + offset, buffer, count); + return ERROR_OK; +} + +static int faux_protect_check(struct flash_bank_s *bank) +{ + return ERROR_OK; +} + +static int faux_info(struct flash_bank_s *bank, char *buf, int buf_size) +{ + snprintf(buf, buf_size, "faux flash driver"); + return ERROR_OK; +} + +static int faux_probe(struct flash_bank_s *bank) +{ + return ERROR_OK; +} diff --git a/src/flash/flash.c b/src/flash/flash.c index 87eec6e..db04e6e 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -64,6 +64,7 @@ extern flash_driver_t ecosflash_flash; extern flash_driver_t ocl_flash; extern flash_driver_t pic32mx_flash; extern flash_driver_t avr_flash; +extern flash_driver_t faux_flash; flash_driver_t *flash_drivers[] = { &lpc2000_flash, @@ -83,6 +84,7 @@ flash_driver_t *flash_drivers[] = { &ocl_flash, &pic32mx_flash, &avr_flash, + &faux_flash, NULL, }; diff --git a/tcl/target/faux.cfg b/tcl/target/faux.cfg new file mode 100644 index 0000000..cc09ee3 --- /dev/null +++ b/tcl/target/faux.cfg @@ -0,0 +1,29 @@ +#Script for faux target - used for testing + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME at91eb40a +} + +if { [info exists ENDIAN] } { + set _ENDIAN $ENDIAN +} else { + set _ENDIAN little +} + +if { [info exists CPUTAPID ] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID 0x00000000 +} + + +jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID + +#target configuration +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME arm7tdmi -endian $_ENDIAN -chain-position $_TARGETNAME -variant arm7tdmi-s_r4 + +#dummy flash driver +flash bank faux 0x01000000 0x200000 2 2 0 commit 176e80eec3a840ed2c5479308ee290831b08aaaa Author: Ãyvind Harboe <oyv...@zy...> Date: Tue Oct 20 12:03:36 2009 +0200 Added 'unlock' option to flash write_image diff --git a/doc/openocd.texi b/doc/openocd.texi index 7ebe457..107441d 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -3537,7 +3537,7 @@ The @var{num} parameter is a value shown by @command{flash banks}. @end deffn @anchor{flash write_image} -@deffn Command {flash write_image} [erase] filename [offset] [type] +@deffn Command {flash write_image} [erase] [unlock] filename [offset] [type] Write the image @file{filename} to the current target's flash bank(s). A relocation @var{offset} may be specified, in which case it is added to the base address for each section in the image. @@ -3546,8 +3546,9 @@ explicitly as @option{bin} (binary), @option{ihex} (Intel hex), @option{elf} (ELF file), @option{s19} (Motorola s19). @option{mem}, or @option{builder}. The relevant flash sectors will be erased prior to programming -if the @option{erase} parameter is given. -The flash bank to use is inferred from the @var{address} of +if the @option{erase} parameter is given. If @option{unlock} is +provided, then the flash banks are unlocked before erase and +program. The flash bank to use is inferred from the @var{address} of each image segment. @end deffn diff --git a/src/flash/flash.c b/src/flash/flash.c index d1b023c..87eec6e 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -43,6 +43,7 @@ static int handle_flash_write_bank_command(struct command_context_s *cmd_ctx, ch static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int handle_flash_fill_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int handle_flash_protect_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int flash_write_unlock(target_t *target, image_t *image, uint32_t *written, int erase, bool unlock); /* flash drivers */ @@ -199,7 +200,7 @@ int flash_init_drivers(struct command_context_s *cmd_ctx) register_command(cmd_ctx, flash_cmd, "write_bank", handle_flash_write_bank_command, COMMAND_EXEC, "write binary data to <bank> <file> <offset>"); register_command(cmd_ctx, flash_cmd, "write_image", handle_flash_write_image_command, COMMAND_EXEC, - "write_image [erase] <file> [offset] [type]"); + "write_image [erase] [unlock] <file> [offset] [type]"); register_command(cmd_ctx, flash_cmd, "protect", handle_flash_protect_command, COMMAND_EXEC, "set protection of sectors at <bank> <first> <last> <on | off>"); } @@ -697,13 +698,26 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c /* flash auto-erase is disabled by default*/ int auto_erase = 0; + bool auto_unlock = false; - if (strcmp(args[0], "erase") == 0) + for (;;) { - auto_erase = 1; - args++; - argc--; - command_print(cmd_ctx, "auto erase enabled"); + if (strcmp(args[0], "erase") == 0) + { + auto_erase = 1; + args++; + argc--; + command_print(cmd_ctx, "auto erase enabled"); + } else if (strcmp(args[0], "unlock") == 0) + { + auto_unlock = true; + args++; + argc--; + command_print(cmd_ctx, "auto unlock enabled"); + } else + { + break; + } } if (argc < 1) @@ -738,7 +752,7 @@ static int handle_flash_write_image_command(struct command_context_s *cmd_ctx, c return retval; } - retval = flash_write(target, &image, &written, auto_erase); + retval = flash_write_unlock(target, &image, &written, auto_erase, auto_unlock); if (retval != ERROR_OK) { image_close(&image); @@ -994,7 +1008,8 @@ flash_bank_t *get_flash_bank_by_addr(target_t *target, uint32_t addr) } /* erase given flash region, selects proper bank according to target and address */ -int flash_erase_address_range(target_t *target, uint32_t addr, uint32_t length) +static int flash_iterate_address_range(target_t *target, uint32_t addr, uint32_t length, + int (*callback)(struct flash_bank_s *bank, int first, int last)) { flash_bank_t *c; int first = -1; @@ -1016,7 +1031,7 @@ int flash_erase_address_range(target_t *target, uint32_t addr, uint32_t length) if (addr != c->base) return ERROR_FLASH_DST_BREAKS_ALIGNMENT; - return flash_driver_erase(c, 0, c->num_sectors - 1); + return callback(c, 0, c->num_sectors - 1); } /* check whether it fits */ @@ -1039,11 +1054,29 @@ int flash_erase_address_range(target_t *target, uint32_t addr, uint32_t length) if (first == -1 || last == -1) return ERROR_OK; - return flash_driver_erase(c, first, last); + return callback(c, first, last); +} + + + +int flash_erase_address_range(target_t *target, uint32_t addr, uint32_t length) +{ + return flash_iterate_address_range(target, addr, length, &flash_driver_erase); +} + +static int flash_driver_unprotect(struct flash_bank_s *bank, int first, int last) +{ + return flash_driver_protect(bank, 0, first, last); } +static int flash_unlock_address_range(target_t *target, uint32_t addr, uint32_t length) +{ + return flash_iterate_address_range(target, addr, length, &flash_driver_unprotect); +} + + /* write (optional verify) an image to flash memory of the given target */ -int flash_write(target_t *target, image_t *image, uint32_t *written, int erase) +static int flash_write_unlock(target_t *target, image_t *image, uint32_t *written, int erase, bool unlock) { int retval = ERROR_OK; @@ -1166,10 +1199,17 @@ int flash_write(target_t *target, image_t *image, uint32_t *written, int erase) retval = ERROR_OK; - if (erase) + if (unlock) + { + retval = flash_unlock_address_range(target, run_address, run_size); + } + if (retval == ERROR_OK) { - /* calculate and erase sectors */ - retval = flash_erase_address_range(target, run_address, run_size); + if (erase) + { + /* calculate and erase sectors */ + retval = flash_erase_address_range(target, run_address, run_size); + } } if (retval == ERROR_OK) @@ -1195,6 +1235,11 @@ int flash_write(target_t *target, image_t *image, uint32_t *written, int erase) return retval; } +int flash_write(target_t *target, image_t *image, uint32_t *written, int erase) +{ + return flash_write_unlock(target, image, written, erase, false); +} + int default_flash_mem_blank_check(struct flash_bank_s *bank) { target_t *target = bank->target; ----------------------------------------------------------------------- Summary of changes: doc/openocd.texi | 7 +- src/flash/Makefile.am | 1 + src/flash/ecos.c | 2 +- src/flash/faux.c | 153 ++++++++++++++++++++++++++ src/flash/flash.c | 75 ++++++++++--- tcl/target/{samsung_s3c4510.cfg => faux.cfg} | 14 ++- 6 files changed, 229 insertions(+), 23 deletions(-) create mode 100644 src/flash/faux.c copy tcl/target/{samsung_s3c4510.cfg => faux.cfg} (65%) hooks/post-receive -- Main OpenOCD repository |