flash support (only full erase/write) for 568013 and 568037
authorRodrigo L. Rosa <rodrigorosa.lg@gmail.com>
Wed, 18 May 2011 02:41:21 +0000 (19:41 -0700)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Wed, 18 May 2011 16:47:55 +0000 (18:47 +0200)
src/flash/nor/Makefile.am
src/flash/nor/drivers.c
src/flash/nor/dsp5680xx_flash.c [new file with mode: 0644]
tcl/target/dsp568013.cfg
tcl/target/dsp568037.cfg

index 95bd313d3d5042c53065807ab751d6d267a22c6d..98460af7797780f8129e0ce825d4036d228a7b20 100644 (file)
@@ -30,6 +30,7 @@ NOR_DRIVERS = \
        str9x.c \
        str9xpec.c \
        tms470.c \
+       dsp5680xx_flash.c \
        virtual.c
 
 noinst_HEADERS = \
index 5489419f9c8a32b2d79710e46407f6b7f8179f1e..52febf175284fd394de5d404c6fd7437f09ebda2 100644 (file)
@@ -43,6 +43,7 @@ extern struct flash_driver faux_flash;
 extern struct flash_driver virtual_flash;
 extern struct flash_driver stmsmi_flash;
 extern struct flash_driver em357_flash;
+extern struct flash_driver dsp5680xx_flash;
 
 /**
  * The list of built-in flash drivers.
@@ -71,6 +72,7 @@ static struct flash_driver *flash_drivers[] = {
        &virtual_flash,
        &stmsmi_flash,
        &em357_flash,
+       &dsp5680xx_flash,
        NULL,
 };
 
diff --git a/src/flash/nor/dsp5680xx_flash.c b/src/flash/nor/dsp5680xx_flash.c
new file mode 100644 (file)
index 0000000..7b88f7a
--- /dev/null
@@ -0,0 +1,206 @@
+/***************************************************************************
+ *   Copyright (C) 2011 by Rodrigo L. Rosa                                 *
+ *   rodrigorosa.LG@gmail.com                                              *
+ *                                                                         *
+ *   Based on a file written by:                                           *
+ *   Kevin McGuire                                                         * 
+ *   Marcel Wijlaars                                                       *
+ *   Michael Ashton                                                        *
+ *                                                                         *
+ *   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
+
+#ifndef DSP5680XX_FLASH_H
+#define DSP5680XX_FLASH_H
+
+#include "imp.h"
+#include <helper/binarybuffer.h>
+#include <helper/time_support.h>
+#include <target/algorithm.h>
+#include <target/dsp5680xx.h>
+
+struct dsp5680xx_flash_bank {
+       struct working_area *write_algorithm;
+};
+
+static int dsp5680xx_build_sector_list(struct flash_bank *bank){
+  //LOG_USER("%s not implemented",__FUNCTION__);
+  //return ERROR_OK;
+
+  // sector size is 512
+  // bank->num_sectors = bank->size / 512; // Bank size is actually 0x2000, but it is set much higher as part of the workaround for byte/word addressing issues.
+  bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
+  int i;
+  for (i = 0; i < bank->num_sectors; ++i){
+    bank->sectors[i].offset = 0;// not implemented.
+    bank->sectors[i].size = HFM_SECTOR_SIZE;
+    //offset += bank->sectors[i].size;
+    bank->sectors[i].is_erased = -1;
+    bank->sectors[i].is_protected = -1;
+  }
+  LOG_USER("%s not tested yet.",__FUNCTION__);
+  return ERROR_OK;
+
+}
+
+// flash bank dsp5680xx 0 0 0 0 <target#>
+FLASH_BANK_COMMAND_HANDLER(dsp5680xx_flash_bank_command){
+  struct dsp5680xx_flash_bank *nbank;
+
+  nbank = malloc(sizeof(struct dsp5680xx_flash_bank));
+
+  bank->base = HFM_FLASH_BASE_ADDR;
+  bank->size = HFM_SIZE; // top 4k not accessible
+  bank->driver_priv = nbank;
+  bank->num_sectors = HFM_SECTOR_COUNT;// This number is anything >0. not really used.
+  dsp5680xx_build_sector_list(bank);
+
+  return ERROR_OK;
+}
+
+static int dsp5680xx_flash_protect_check(struct flash_bank *bank){
+  int retval = ERROR_OK;
+  uint8_t protected = 0; 
+  if(bank->sectors[0].is_protected == -1){
+    retval = dsp5680xx_f_protect_check(bank->target,&protected);
+    if(retval == ERROR_OK)
+      if(protected)
+       bank->sectors[0].is_protected = 1;
+      else
+       bank->sectors[0].is_protected = 0;
+    else
+      bank->sectors[0].is_protected = -1;
+  }
+  return retval;
+}
+
+static int dsp5680xx_flash_protect(struct flash_bank *bank, int set, int first, int last){
+  int retval;
+  if(set){
+    retval = dsp5680xx_f_lock(bank->target);
+    if(retval == ERROR_OK)
+      bank->sectors[0].is_protected = 1;
+  }else{    
+    retval = dsp5680xx_f_unlock(bank->target);
+    if(retval == ERROR_OK)
+      bank->sectors[0].is_protected = 0;
+  }
+  return retval;
+}
+
+/*
+static int dsp5680xx_write_block(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count){
+  LOG_USER("%s not implemented",__FUNCTION__);
+  return ERROR_OK;
+}
+
+static int dsp5680xx_write_single(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count){
+  LOG_USER("%s not implemented",__FUNCTION__);
+  return ERROR_OK;
+}
+*/
+
+//-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+//-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+//  Flash stuff test
+//-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+//-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
+
+static int dsp5680xx_flash_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count){
+  int retval;
+  if((offset + count/2)>bank->size){
+    LOG_ERROR("%s: Flash bank cannot fit data.",__FUNCTION__);
+    return ERROR_FAIL;
+  }
+  if(offset%2){
+    LOG_ERROR("%s: Writing to odd addresses not supported. This chip uses word addressing, Openocd only supports byte addressing. The workaround results in disabling writing to odd byte addresses.",__FUNCTION__);
+    return ERROR_FAIL;
+  }
+  retval = dsp5680xx_f_wr(bank->target,  buffer, bank->base + offset/2,  count);
+  if(retval == ERROR_OK)
+    bank->sectors[0].is_erased = 0;
+  else
+    bank->sectors[0].is_erased = -1;
+  return retval;
+}
+
+static int dsp5680xx_probe(struct flash_bank *bank){
+  //LOG_USER("%s not implemented",__FUNCTION__);
+        return ERROR_OK;
+}
+
+static int dsp5680xx_flash_info(struct flash_bank *bank, char *buf, int buf_size){
+       snprintf(buf, buf_size, "\ndsp5680xx flash driver info:\n - Currently only full erase/lock/unlock are implemented. \n - Call with bank==0 and sector 0 to 0.\n - Protect requires arp_init-reset to complete. \n - Before removing protection the master tap must be selected, and arp_init-reset is required to complete unlocking.");
+       return ERROR_OK;
+}
+/*
+static int dsp5680xx_set_write_enable(struct target *target, int enable){
+       LOG_USER("%s not implemented",__FUNCTION__);
+        return ERROR_OK;
+}
+
+
+static int dsp5680xx_check_flash_completion(struct target* target, unsigned int timeout_ms){
+  LOG_USER("%s not implemented",__FUNCTION__);
+  return ERROR_OK;
+}
+*/
+
+static int dsp5680xx_flash_erase(struct flash_bank * bank, int first, int last){
+  int retval;
+  retval = dsp5680xx_f_erase(bank->target, (uint32_t) first, (uint32_t) last);
+  if(retval == ERROR_OK)
+    bank->sectors[0].is_erased = 1;
+  else
+    bank->sectors[0].is_erased = -1;
+  return retval;
+}
+
+static int dsp5680xx_flash_erase_check(struct flash_bank * bank){
+  int retval = ERROR_OK;
+  uint8_t erased = 0;
+  if(bank->sectors[0].is_erased == -1){
+    retval = dsp5680xx_f_erase_check(bank->target,&erased);
+    if (retval != ERROR_OK){
+      bank->sectors[0].is_erased = -1;
+    }else{
+      if(erased)
+       bank->sectors[0].is_erased = 1;
+      else
+       bank->sectors[0].is_erased = 0;
+    }
+  }
+  return retval;
+}
+
+struct flash_driver dsp5680xx_flash = {
+  .name = "dsp5680xx_flash",
+  .flash_bank_command = dsp5680xx_flash_bank_command,
+  .erase = dsp5680xx_flash_erase,
+  .protect = dsp5680xx_flash_protect,
+  .write = dsp5680xx_flash_write,
+  //.read = default_flash_read,
+  //.probe = dsp5680xx_probe,
+  .auto_probe = dsp5680xx_probe,
+  .erase_check = dsp5680xx_flash_erase_check,
+  .protect_check = dsp5680xx_flash_protect_check,
+  .info = dsp5680xx_flash_info
+};
+#endif // dsp5680xx_flash.h
index 1940309800929d7787f3a6d7a2ba5c4f83a4398e..fa7c4d95126789ff47f89c8445fc37075f456507 100644 (file)
@@ -68,6 +68,6 @@ jtag configure $_CHIPNAME.chp -event tap-disable "
 $_TARGETNAME configure -work-area-virt 0
 
 #setup flash
-#set _FLASHNAME $_CHIPNAME.flash
-#flash bank $_FLASHNAME dsp5680xx_flash 0 0 2 1 $_TARGETNAME
+set _FLASHNAME $_CHIPNAME.flash
+flash bank $_FLASHNAME dsp5680xx_flash 0 0 2 1 $_TARGETNAME
 
index 64cab81fbf055d2259613fc43fa0b17867fdef20..6089e9d242a49bf517234ccc21c01078ec532ffc 100644 (file)
@@ -68,6 +68,6 @@ jtag configure $_CHIPNAME.chp -event tap-disable "
 $_TARGETNAME configure -work-area-virt 0
 
 #setup flash
-#set _FLASHNAME $_CHIPNAME.flash
-#flash bank $_FLASHNAME dsp5680xx_flash 0 0 2 1 $_TARGETNAME
+set _FLASHNAME $_CHIPNAME.flash
+flash bank $_FLASHNAME dsp5680xx_flash 0 0 2 1 $_TARGETNAME
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)