Added the faux flash driver and target. Used for testing.
authorØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 20 Oct 2009 10:22:55 +0000 (12:22 +0200)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 20 Oct 2009 10:23:56 +0000 (12:23 +0200)
src/flash/Makefile.am
src/flash/ecos.c
src/flash/faux.c [new file with mode: 0644]
src/flash/flash.c
tcl/target/faux.cfg [new file with mode: 0644]

index 27846d768016efd377000eaffcf17a47dcaa10a4..d448197a978d80b925d19a64edf4d322042917d6 100644 (file)
@@ -38,6 +38,7 @@ libflash_la_SOURCES = \
        mflash.c \
        pic32mx.c \
        avrf.c \
+       faux.c \
        mx3_nand.c
 
 noinst_HEADERS = \
index 76859df5db90046fbd8894bf965f3d8b96cde1cb..8583544e038b8d5c962c6347c56c5abf28f7f850 100644 (file)
@@ -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 (file)
index 0000000..c5928ad
--- /dev/null
@@ -0,0 +1,153 @@
+/***************************************************************************
+ *   Copyright (C) 2009 Øyvind Harboe                                      *
+ *   oyvind.harboe@zylin.com                                               *
+ *                                                                         *
+ *   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;
+}
index 87eec6e4d07089bfd502bda4f2b31071d623216e..db04e6e52f9d982176f60d9fd309ce5787173339 100644 (file)
@@ -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 (file)
index 0000000..cc09ee3
--- /dev/null
@@ -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