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>
This commit is contained in:
parent
38607b2e56
commit
f035b0851b
|
@ -171,6 +171,31 @@ int flash_get_bank_count(void)
|
||||||
return i;
|
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)
|
struct flash_bank *get_flash_bank_by_name_noprobe(const char *name)
|
||||||
{
|
{
|
||||||
unsigned requested = get_flash_name_index(name);
|
unsigned requested = get_flash_name_index(name);
|
||||||
|
|
|
@ -76,7 +76,7 @@ struct flash_sector {
|
||||||
* per-bank basis, if required.
|
* per-bank basis, if required.
|
||||||
*/
|
*/
|
||||||
struct flash_bank {
|
struct flash_bank {
|
||||||
const char *name;
|
char *name;
|
||||||
|
|
||||||
struct target *target; /**< Target to which this bank belongs. */
|
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.
|
* This routine must be called when the system may modify the status.
|
||||||
*/
|
*/
|
||||||
void flash_set_dirty(void);
|
void flash_set_dirty(void);
|
||||||
|
|
||||||
/** @returns The number of flash banks currently defined. */
|
/** @returns The number of flash banks currently defined. */
|
||||||
int flash_get_bank_count(void);
|
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.
|
* Provides default read implementation for flash memory.
|
||||||
* @param bank The bank to read.
|
* @param bank The bank to read.
|
||||||
|
|
|
@ -209,6 +209,14 @@ struct flash_driver {
|
||||||
* @returns ERROR_OK if successful; otherwise, an error code.
|
* @returns ERROR_OK if successful; otherwise, an error code.
|
||||||
*/
|
*/
|
||||||
int (*auto_probe)(struct flash_bank *bank);
|
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) \
|
#define FLASH_BANK_COMMAND_HANDLER(name) \
|
||||||
|
|
|
@ -353,6 +353,7 @@ int openocd_main(int argc, char *argv[])
|
||||||
/* Start the executable meat that can evolve into thread in future. */
|
/* Start the executable meat that can evolve into thread in future. */
|
||||||
ret = openocd_thread(argc, argv, cmd_ctx);
|
ret = openocd_thread(argc, argv, cmd_ctx);
|
||||||
|
|
||||||
|
flash_free_all_banks();
|
||||||
gdb_service_free();
|
gdb_service_free();
|
||||||
server_free();
|
server_free();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue