Here is the modified patch
Gaëtan

On 06/01/2010 02:01 PM, [email protected] wrote:
"gcembed"<[email protected]>  napisał(a):
  >  Hello,
  >  I have added a new command for stm32x : mass_erase_unlock
  >  This function combine "stm32x unlock 0" + reset to apply unlock +
  >  "stm32x mass_erase 0"

Maybe "unlock_mass_erase" would be a better name?

4\/3!!
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

diff --git a/src/flash/nor/stm32x.c b/src/flash/nor/stm32x.c
index d11a8ed..2e31b62 100644
--- a/src/flash/nor/stm32x.c
+++ b/src/flash/nor/stm32x.c
@@ -1235,6 +1235,71 @@ COMMAND_HANDLER(stm32x_handle_mass_erase_command)
        return ERROR_OK;
 }
 
+COMMAND_HANDLER(stm32x_handle_unlock_mass_erase_command)
+{
+       uint32_t status;
+       struct flash_bank *bank;
+       int retval;
+
+       if (CMD_ARGC < 1)
+       {
+               command_print(CMD_CTX, "stm32x unlock_mass_erase <bank>");
+               return ERROR_OK;
+       }
+
+       retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
+
+       struct target *target = bank->target;
+       if (target->state != TARGET_HALTED)
+       {
+               LOG_ERROR("Target not halted");
+               return ERROR_TARGET_NOT_HALTED;
+       }
+
+       /* unlock option flash registers */
+       target_write_u32(target, STM32_FLASH_KEYR, KEY1);
+       target_write_u32(target, STM32_FLASH_KEYR, KEY2);
+
+       /* Reset to apply no settings */
+       target_write_u32(target, 0xE000ED0C, 0x05FA0004);
+       usleep(1000);
+
+       /* unlock option flash registers */
+       target_write_u32(target, STM32_FLASH_KEYR, KEY1);
+       target_write_u32(target, STM32_FLASH_KEYR, KEY2);
+
+       /* mass erase flash memory */
+       target_write_u32(target, STM32_FLASH_CR, FLASH_MER);
+       target_write_u32(target, STM32_FLASH_CR, FLASH_MER | FLASH_STRT);
+
+       status = stm32x_wait_status_busy(bank, 100);
+       target_read_u32(target, STM32_FLASH_SR, &status);
+
+       target_write_u32(target, STM32_FLASH_CR, FLASH_LOCK);
+
+       if (status & FLASH_WRPRTERR)
+       {
+               LOG_ERROR("stm32x device protected");
+               return ERROR_FLASH_OPERATION_FAILED;
+       }
+
+       if (status & FLASH_PGERR)
+       {
+               LOG_ERROR("stm32x device programming failed");
+               return ERROR_FLASH_OPERATION_FAILED;
+       }
+       /* set all sectors as erased */
+       for (int i = 0; i < bank->num_sectors; i++)
+       {
+               bank->sectors[i].is_erased = 1;
+       }
+       command_print(CMD_CTX, "stm32x mass erase with unlock complete");
+
+       return ERROR_OK;
+}
+
 static const struct command_registration stm32x_exec_command_handlers[] = {
        {
                .name = "lock",
@@ -1258,6 +1323,15 @@ static const struct command_registration 
stm32x_exec_command_handlers[] = {
                .help = "Erase entire flash device.",
        },
        {
+               .name = "unlock_mass_erase",
+               .handler = stm32x_handle_unlock_mass_erase_command,
+               .mode = COMMAND_EXEC,
+               .usage = "bank_id",
+               .help = "Erase entire flash device with auto-unlock. "
+                       "This will unlock, reset and then mass erase stm32x. "
+                       "This is an improve version of unlock + mass_erase",
+       },
+       {
                .name = "options_read",
                .handler = stm32x_handle_options_read_command,
                .mode = COMMAND_EXEC,
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to