diff --git a/jtag/ChangeLog b/jtag/ChangeLog index 12c8011d..655b6b17 100644 --- a/jtag/ChangeLog +++ b/jtag/ChangeLog @@ -1,3 +1,11 @@ +2003-08-14 Marcel Telka + + * include/jtag.h (flasherase): New function prototype (patch 772267, Thomas Fröhlich). + * src/flash.c (flasherase): New function (patch 772267, Thomas Fröhlich). + * src/cmd/Makefile.am (libcmd_a_SOURCES): Added eraseflash.c (patch 772267, Thomas Fröhlich). + * src/cmd/cmd.c (cmds): Added cmd_eraseflash (patch 772267, Thomas Fröhlich). + * src/cmd/eraseflash.c: New file (patch 772267, Thomas Fröhlich). + 2003-08-14 Marcel Telka * src/tap/chain.c (chain_shift_instructions): Moved test for parts without active instruction before diff --git a/jtag/NEWS b/jtag/NEWS index fb6a5aca..305c9a72 100644 --- a/jtag/NEWS +++ b/jtag/NEWS @@ -25,6 +25,7 @@ jtag-0.5: * Added new 'include' command. * Added new commands 'signal', 'register', 'bit', and enhanced 'instruction' command to allow create JTAG declarations from command line (or script). + * Added new 'eraseflash' command (patch 772267, Thomas Fröhlich). * JTAG declarations are now executed as scripts. * Added support for parts without IDCODE instruction. * Added support for "downto" in bit vectors and "observe_only" into bsdl2jtag diff --git a/jtag/THANKS b/jtag/THANKS index e1e963fb..e09e8f11 100644 --- a/jtag/THANKS +++ b/jtag/THANKS @@ -6,6 +6,7 @@ Ian Campbell Alex (d18c7db) Rainer Dörken Chris Ellec +Thomas Fröhlich Jiun-Shian Ho Jachym Holecek August Hörandl diff --git a/jtag/include/jtag.h b/jtag/include/jtag.h index 8aa63b17..a5c38996 100644 --- a/jtag/include/jtag.h +++ b/jtag/include/jtag.h @@ -46,4 +46,6 @@ void discovery( chain_t *chain ); void readmem( bus_t *bus, FILE *f, uint32_t addr, uint32_t len ); +void flasherase( bus_t *bus, uint32_t addr, int number ); + #endif /* JTAG_H */ diff --git a/jtag/src/cmd/Makefile.am b/jtag/src/cmd/Makefile.am index 697f15ba..1650b07f 100644 --- a/jtag/src/cmd/Makefile.am +++ b/jtag/src/cmd/Makefile.am @@ -45,6 +45,7 @@ libcmd_a_SOURCES = \ peekpoke.c \ readmem.c \ flashmem.c \ + eraseflash.c \ script.c \ include.c \ cmd.c diff --git a/jtag/src/cmd/cmd.c b/jtag/src/cmd/cmd.c index c955a112..f9a97876 100644 --- a/jtag/src/cmd/cmd.c +++ b/jtag/src/cmd/cmd.c @@ -54,6 +54,7 @@ extern cmd_t cmd_poke; extern cmd_t cmd_readmem; extern cmd_t cmd_detectflash; extern cmd_t cmd_flashmem; +extern cmd_t cmd_eraseflash; extern cmd_t cmd_script; extern cmd_t cmd_include; @@ -81,6 +82,7 @@ const cmd_t *cmds[] = { &cmd_readmem, &cmd_detectflash, &cmd_flashmem, + &cmd_eraseflash, &cmd_script, &cmd_include, NULL /* last must be NULL */ diff --git a/jtag/src/cmd/eraseflash.c b/jtag/src/cmd/eraseflash.c new file mode 100644 index 00000000..c0256cee --- /dev/null +++ b/jtag/src/cmd/eraseflash.c @@ -0,0 +1,85 @@ +/* + * $Id$ + * + * Copyright (C) 2003 TF + * + * 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. + * + * Written by Thomas Froehlich , 2003. + * + */ + +#include + +#include +#include +#include + +#include "jtag.h" +#include "flash.h" + +#include "cmd.h" + +static int +cmd_eraseflash_run( char *params[] ) +{ + uint32_t adr = 0; + int number = 0; + + if (cmd_params( params ) != 3) + return -1; + if (!cmd_test_cable()) + return 1; + if (!bus) { + printf( _("Error: Bus driver missing.\n") ); + return 1; + } + if (cmd_get_number( params[1], &adr )) + return -1; + if (cmd_get_number( params[2], &number )) + return -1; + flasherase( bus, adr, number ); + return 1; +} + +static void +cmd_eraseflash_help( void ) +{ + int i; + + printf( _( + "Usage: %s ADDR BLOCKS\n" + "\n" + "ADDR target addres for erasing block\n" + "BLOCKS number of blocks to erase\n" + "\n" + "ADDR could be in decimal or hexadecimal (prefixed with 0x) form.\n" + "BLOCKS musst be in decimal form; count from 1\n" + "\n" + "'%s' works only with part 0. Part 0 must support bus operations.\n" + "Supported Flash Memories\n" + ), "eraseflash", "eraseflash"); + + for (i = 0; flash_drivers[i]; i++) + printf( _("%s\n %s\n"), _(flash_drivers[i]->name), _(flash_drivers[i]->description) ); +} + +cmd_t cmd_eraseflash = { + "eraseflash", + N_("erase flash memory by number of blocks"), + cmd_eraseflash_help, + cmd_eraseflash_run +}; diff --git a/jtag/src/flash.c b/jtag/src/flash.c index cb4c630e..c4f084bc 100644 --- a/jtag/src/flash.c +++ b/jtag/src/flash.c @@ -337,3 +337,40 @@ flashmem( bus_t *bus, FILE *f, uint32_t addr ) cfi_array_free( cfi_array ); } + +void +flasherase( bus_t *bus, uint32_t addr, int number ) +{ + cfi_query_structure_t *cfi; + cfi_array_t *cfi_array; + int i; + + printf( _("addr: 0x%08X\n"), addr); + + flashcheck( bus, &cfi_array ); + if (!cfi_array || !flash_driver) { + printf( _("no flash driver found\n") ); + return; + } + cfi = &cfi_array->cfi_chips[0]->cfi; + + printf( _("program:\n") ); + for (i = 1; i <= number; i++) { + int addr_block = (cfi->device_geometry.erase_block_regions[0].erase_block_size * flash_driver->bus_width / 2); + int block_no = addr / addr_block; + printf( _("addr: 0x%08X\n"), addr); + fflush(stdout); + flash_driver->unlock_block( cfi_array, addr ); + printf( _("block %d unlocked\n"), block_no ); + printf( _("erasing block %d: %d\n"), block_no, flash_driver->erase_block( cfi_array, addr ) ); + + addr |= (addr_block - 1); + addr += 1; + } + printf( _("\nDone.\n") ); + + cfi_array_free( cfi_array ); + /* BYPASS */ + // parts_set_instruction( ps, "BYPASS" ); + // chain_shift_instructions( chain ); +}