aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2018-02-15 02:29:56 +0100
committerMatthias Welwarsky <matthias@welwarsky.de>2018-03-30 10:13:09 +0100
commitf035b0851bbc6a9ccc2b20128ae2e4d3abd9ba38 (patch)
tree3b4d42087195b5b9a7c1815994d1e3f0cc235986
parent38607b2e560fc4d9a24e594fc0bdd66d574faea9 (diff)
flash/nor: implement flash bank deallocation on OpenOCD exit
Change-Id: I8fcf09b2a85b3b68743f5fd68a31edea933b9b17 Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/4414 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
-rw-r--r--src/flash/nor/core.c25
-rw-r--r--src/flash/nor/core.h9
-rw-r--r--src/flash/nor/driver.h8
-rw-r--r--src/openocd.c1
4 files changed, 42 insertions, 1 deletions
diff --git a/src/flash/nor/core.c b/src/flash/nor/core.c
index 6eb7052e..636d50c5 100644
--- a/src/flash/nor/core.c
+++ b/src/flash/nor/core.c
@@ -171,6 +171,31 @@ int flash_get_bank_count(void)
return i;
}
+void default_flash_free_driver_priv(struct flash_bank *bank)
+{
+ free(bank->driver_priv);
+ bank->driver_priv = NULL;
+}
+
+void flash_free_all_banks(void)
+{
+ struct flash_bank *bank = flash_banks;
+ while (bank) {
+ struct flash_bank *next = bank->next;
+ if (bank->driver->free_driver_priv)
+ bank->driver->free_driver_priv(bank);
+ else
+ LOG_WARNING("Flash driver of %s does not support free_driver_priv()", bank->name);
+
+ free(bank->name);
+ free(bank->sectors);
+ free(bank->prot_blocks);
+ free(bank);
+ bank = next;
+ }
+ flash_banks = NULL;
+}
+
struct flash_bank *get_flash_bank_by_name_noprobe(const char *name)
{
unsigned requested = get_flash_name_index(name);
diff --git a/src/flash/nor/core.h b/src/flash/nor/core.h
index 338363e2..1bfe1ab9 100644
--- a/src/flash/nor/core.h
+++ b/src/flash/nor/core.h
@@ -76,7 +76,7 @@ struct flash_sector {
* per-bank basis, if required.
*/
struct flash_bank {
- const char *name;
+ char *name;
struct target *target; /**< Target to which this bank belongs. */
@@ -153,8 +153,15 @@ int flash_write(struct target *target,
* This routine must be called when the system may modify the status.
*/
void flash_set_dirty(void);
+
/** @returns The number of flash banks currently defined. */
int flash_get_bank_count(void);
+
+/** Deallocates bank->driver_priv */
+void default_flash_free_driver_priv(struct flash_bank *bank);
+
+/** Deallocates all flash banks */
+void flash_free_all_banks(void);
/**
* Provides default read implementation for flash memory.
* @param bank The bank to read.
diff --git a/src/flash/nor/driver.h b/src/flash/nor/driver.h
index 0ae4d8e2..e7b32344 100644
--- a/src/flash/nor/driver.h
+++ b/src/flash/nor/driver.h
@@ -209,6 +209,14 @@ struct flash_driver {
* @returns ERROR_OK if successful; otherwise, an error code.
*/
int (*auto_probe)(struct flash_bank *bank);
+
+ /**
+ * Deallocates private driver structures.
+ * Use default_flash_free_driver_priv() to simply free(bank->driver_priv)
+ *
+ * @param bank - the bank being destroyed
+ */
+ void (*free_driver_priv)(struct flash_bank *bank);
};
#define FLASH_BANK_COMMAND_HANDLER(name) \
diff --git a/src/openocd.c b/src/openocd.c
index bd52f4ac..1874530c 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -353,6 +353,7 @@ int openocd_main(int argc, char *argv[])
/* Start the executable meat that can evolve into thread in future. */
ret = openocd_thread(argc, argv, cmd_ctx);
+ flash_free_all_banks();
gdb_service_free();
server_free();