X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fstm32x.c;h=ebb55f838b71280f1f5d3dc6b13c1cca6461efbb;hb=45af9d83c90134ec929599bf4a05360e8bd1e8be;hp=e87e0cceba8b95068ae5354687683c6d77a733d0;hpb=c882cb089477050eb46f5f9fba90ff52179acd71;p=openocd.git
diff --git a/src/flash/stm32x.c b/src/flash/stm32x.c
index e87e0cceba..ebb55f838b 100644
--- a/src/flash/stm32x.c
+++ b/src/flash/stm32x.c
@@ -40,6 +40,7 @@ int stm32x_erase(struct flash_bank_s *bank, int first, int last);
int stm32x_protect(struct flash_bank_s *bank, int set, int first, int last);
int stm32x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count);
int stm32x_probe(struct flash_bank_s *bank);
+int stm32x_auto_probe(struct flash_bank_s *bank);
int stm32x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int stm32x_protect_check(struct flash_bank_s *bank);
int stm32x_erase_check(struct flash_bank_s *bank);
@@ -60,7 +61,7 @@ flash_driver_t stm32x_flash =
.protect = stm32x_protect,
.write = stm32x_write,
.probe = stm32x_probe,
- .auto_probe = stm32x_probe,
+ .auto_probe = stm32x_auto_probe,
.erase_check = stm32x_erase_check,
.protect_check = stm32x_protect_check,
.info = stm32x_info
@@ -83,41 +84,6 @@ int stm32x_register_commands(struct command_context_s *cmd_ctx)
return ERROR_OK;
}
-int stm32x_build_block_list(struct flash_bank_s *bank)
-{
- int i;
- int num_sectors = 0;
-
- switch (bank->size)
- {
- case 32 * 1024:
- num_sectors = 32;
- break;
- case 64 * 1024:
- num_sectors = 64;
- break;
- case 128 * 1024:
- num_sectors = 128;
- break;
- default:
- ERROR("BUG: unknown bank->size encountered");
- exit(-1);
- }
-
- bank->num_sectors = num_sectors;
- bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors);
-
- for (i = 0; i < num_sectors; i++)
- {
- bank->sectors[i].offset = i * 1024;
- bank->sectors[i].size = 1024;
- bank->sectors[i].is_erased = -1;
- bank->sectors[i].is_protected = 1;
- }
-
- return ERROR_OK;
-}
-
/* flash bank stm32x 0 0
*/
int stm32x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank)
@@ -133,15 +99,8 @@ int stm32x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char
stm32x_info = malloc(sizeof(stm32x_flash_bank_t));
bank->driver_priv = stm32x_info;
- if (bank->base != 0x08000000)
- {
- WARNING("overriding flash base address for STM32x device with 0x08000000");
- bank->base = 0x08000000;
- }
-
- stm32x_build_block_list(bank);
-
stm32x_info->write_algorithm = NULL;
+ stm32x_info->probed = 0;
return ERROR_OK;
}
@@ -333,7 +292,7 @@ int stm32x_blank_check(struct flash_bank_s *bank, int first, int last)
{
return ERROR_TARGET_NOT_HALTED;
}
-
+
buffer = malloc(256);
for (i = first; i <= last; i++)
@@ -397,11 +356,11 @@ int stm32x_erase(struct flash_bank_s *bank, int first, int last)
int i;
u32 status;
- if (target->state != TARGET_HALTED)
+ if (bank->target->state != TARGET_HALTED)
{
return ERROR_TARGET_NOT_HALTED;
}
-
+
/* unlock flash registers */
target_write_u32(target, STM32_FLASH_KEYR, KEY1);
target_write_u32(target, STM32_FLASH_KEYR, KEY2);
@@ -557,7 +516,7 @@ int stm32x_write_block(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 co
if ((retval = target->type->run_algorithm(target, 0, NULL, 4, reg_params, stm32x_info->write_algorithm->address, \
stm32x_info->write_algorithm->address + (sizeof(stm32x_flash_write_code) - 10), 10000, &armv7m_info)) != ERROR_OK)
{
- ERROR("error executing str7x flash write algorithm");
+ ERROR("error executing stm32x flash write algorithm");
break;
}
@@ -593,11 +552,11 @@ int stm32x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count)
u8 status;
u32 retval;
- if (target->state != TARGET_HALTED)
+ if (bank->target->state != TARGET_HALTED)
{
return ERROR_TARGET_NOT_HALTED;
}
-
+
if (offset & 0x1)
{
WARNING("offset 0x%x breaks required 2-byte alignment", offset);
@@ -681,9 +640,68 @@ int stm32x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count)
int stm32x_probe(struct flash_bank_s *bank)
{
+ target_t *target = bank->target;
+ stm32x_flash_bank_t *stm32x_info = bank->driver_priv;
+ int i;
+ u16 num_sectors;
+ u32 device_id;
+
+ if (bank->target->state != TARGET_HALTED)
+ {
+ return ERROR_TARGET_NOT_HALTED;
+ }
+
+ stm32x_info->probed = 0;
+
+ /* read stm32 device id register */
+ target_read_u32(target, 0xE0042000, &device_id);
+ INFO( "device id = 0x%08x", device_id );
+
+ if (!(device_id & 0x410))
+ {
+ WARNING( "Cannot identify target as a STM32 family." );
+ return ERROR_FLASH_OPERATION_FAILED;
+ }
+
+ /* get flash size from target */
+ target_read_u16(target, 0x1FFFF7E0, &num_sectors);
+
+ /* check for early silicon rev A */
+ if ((device_id >> 16) == 0 )
+ {
+ /* number of sectors incorrect on revA */
+ WARNING( "STM32 Rev A Silicon detected, probe inaccurate - assuming 128k flash" );
+ num_sectors = 128;
+ }
+
+ INFO( "flash size = %dkbytes", num_sectors );
+
+ bank->base = 0x08000000;
+ bank->size = num_sectors * 1024;
+ bank->num_sectors = num_sectors;
+ bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors);
+
+ for (i = 0; i < num_sectors; i++)
+ {
+ bank->sectors[i].offset = i * 1024;
+ bank->sectors[i].size = 1024;
+ bank->sectors[i].is_erased = -1;
+ bank->sectors[i].is_protected = 1;
+ }
+
+ stm32x_info->probed = 1;
+
return ERROR_OK;
}
+int stm32x_auto_probe(struct flash_bank_s *bank)
+{
+ stm32x_flash_bank_t *stm32x_info = bank->driver_priv;
+ if (stm32x_info->probed)
+ return ERROR_OK;
+ return stm32x_probe(bank);
+}
+
int stm32x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
return ERROR_OK;