Commit ba8c605d authored by ntfreak's avatar ntfreak
Browse files

- stm32 erase will use mass_erase if all banks selected

git-svn-id: svn://svn.berlios.de/openocd/trunk@706 b42882b7-edfa-0310-969c-e2dbd0fdcd60
parent c526c43c
...@@ -1007,15 +1007,20 @@ int stellaris_handle_mass_erase_command(struct command_context_s *cmd_ctx, char ...@@ -1007,15 +1007,20 @@ int stellaris_handle_mass_erase_command(struct command_context_s *cmd_ctx, char
return ERROR_OK; return ERROR_OK;
} }
stellaris_mass_erase(bank); if (stellaris_mass_erase(bank) == ERROR_OK)
/* set all sectors as erased */
for (i = 0; i < bank->num_sectors; i++)
{ {
bank->sectors[i].is_erased = 1; /* set all sectors as erased */
for (i = 0; i < bank->num_sectors; i++)
{
bank->sectors[i].is_erased = 1;
}
command_print(cmd_ctx, "stellaris mass erase complete");
}
else
{
command_print(cmd_ctx, "stellaris mass erase failed");
} }
command_print(cmd_ctx, "stellaris mass erase complete");
return ERROR_OK; return ERROR_OK;
} }
...@@ -50,6 +50,7 @@ int stm32x_handle_unlock_command(struct command_context_s *cmd_ctx, char *cmd, c ...@@ -50,6 +50,7 @@ int stm32x_handle_unlock_command(struct command_context_s *cmd_ctx, char *cmd, c
int stm32x_handle_options_read_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int stm32x_handle_options_read_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int stm32x_mass_erase(struct flash_bank_s *bank);
flash_driver_t stm32x_flash = flash_driver_t stm32x_flash =
{ {
...@@ -316,7 +317,6 @@ int stm32x_protect_check(struct flash_bank_s *bank) ...@@ -316,7 +317,6 @@ int stm32x_protect_check(struct flash_bank_s *bank)
int stm32x_erase(struct flash_bank_s *bank, int first, int last) int stm32x_erase(struct flash_bank_s *bank, int first, int last)
{ {
target_t *target = bank->target; target_t *target = bank->target;
int i; int i;
u32 status; u32 status;
...@@ -324,7 +324,12 @@ int stm32x_erase(struct flash_bank_s *bank, int first, int last) ...@@ -324,7 +324,12 @@ int stm32x_erase(struct flash_bank_s *bank, int first, int last)
{ {
return ERROR_TARGET_NOT_HALTED; return ERROR_TARGET_NOT_HALTED;
} }
if ((first == 0) && (last == (bank->num_sectors - 1)))
{
return stm32x_mass_erase(bank);
}
/* unlock flash registers */ /* unlock flash registers */
target_write_u32(target, STM32_FLASH_KEYR, KEY1); target_write_u32(target, STM32_FLASH_KEYR, KEY1);
target_write_u32(target, STM32_FLASH_KEYR, KEY2); target_write_u32(target, STM32_FLASH_KEYR, KEY2);
...@@ -931,30 +936,10 @@ int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx, char ...@@ -931,30 +936,10 @@ int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx, char
return ERROR_OK; return ERROR_OK;
} }
int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) int stm32x_mass_erase(struct flash_bank_s *bank)
{ {
target_t *target = NULL; target_t *target = bank->target;
stm32x_flash_bank_t *stm32x_info = NULL;
flash_bank_t *bank;
u32 status; u32 status;
int i;
if (argc < 1)
{
command_print(cmd_ctx, "stm32x mass_erase <bank>");
return ERROR_OK;
}
bank = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
if (!bank)
{
command_print(cmd_ctx, "flash bank '#%s' is out of bounds", args[0]);
return ERROR_OK;
}
stm32x_info = bank->driver_priv;
target = bank->target;
if (target->state != TARGET_HALTED) if (target->state != TARGET_HALTED)
{ {
...@@ -975,23 +960,51 @@ int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cm ...@@ -975,23 +960,51 @@ int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cm
if( status & FLASH_WRPRTERR ) if( status & FLASH_WRPRTERR )
{ {
command_print(cmd_ctx, "stm32x device protected"); LOG_ERROR("stm32x device protected");
return ERROR_OK; return ERROR_OK;
} }
if( status & FLASH_PGERR ) if( status & FLASH_PGERR )
{ {
command_print(cmd_ctx, "stm32x device programming failed"); LOG_ERROR("stm32x device programming failed");
return ERROR_OK; return ERROR_OK;
} }
/* set all sectors as erased */ return ERROR_OK;
for (i = 0; i < bank->num_sectors; i++) }
int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
flash_bank_t *bank;
int i;
if (argc < 1)
{ {
bank->sectors[i].is_erased = 1; command_print(cmd_ctx, "stm32x mass_erase <bank>");
return ERROR_OK;
}
bank = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
if (!bank)
{
command_print(cmd_ctx, "flash bank '#%s' is out of bounds", args[0]);
return ERROR_OK;
} }
command_print(cmd_ctx, "stm32x mass erase complete"); if (stm32x_mass_erase(bank) == ERROR_OK)
{
/* set all sectors as erased */
for (i = 0; i < bank->num_sectors; i++)
{
bank->sectors[i].is_erased = 1;
}
command_print(cmd_ctx, "stm32x mass erase complete");
}
else
{
command_print(cmd_ctx, "stm32x mass erase failed");
}
return ERROR_OK; return ERROR_OK;
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment