X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fstm32f1x.c;h=82f112ef7b39cc0d66f74958cf435de079fbe353;hb=1919dbbfd23c699ecdc23d29ee3a79b2dc773571;hp=105bd79c0873ab31e64932639b2151f796bab74c;hpb=7b9b4a0d287cdf84033a0d34d05a25fa80160cf5;p=openocd.git diff --git a/src/flash/nor/stm32f1x.c b/src/flash/nor/stm32f1x.c index 105bd79c08..82f112ef7b 100644 --- a/src/flash/nor/stm32f1x.c +++ b/src/flash/nor/stm32f1x.c @@ -130,7 +130,7 @@ struct stm32x_flash_bank { static int stm32x_mass_erase(struct flash_bank *bank); static int stm32x_get_device_id(struct flash_bank *bank, uint32_t *device_id); -static int stm32x_write_block(struct flash_bank *bank, uint8_t *buffer, +static int stm32x_write_block(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count); /* flash bank stm32x 0 0 @@ -561,7 +561,7 @@ static int stm32x_protect(struct flash_bank *bank, int set, int first, int last) return stm32x_write_options(bank); } -static int stm32x_write_block(struct flash_bank *bank, uint8_t *buffer, +static int stm32x_write_block(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count) { struct stm32x_flash_bank *stm32x_info = bank->driver_priv; @@ -692,7 +692,7 @@ static int stm32x_write_block(struct flash_bank *bank, uint8_t *buffer, return retval; } -static int stm32x_write(struct flash_bank *bank, uint8_t *buffer, +static int stm32x_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count) { struct target *target = bank->target; @@ -720,7 +720,7 @@ static int stm32x_write(struct flash_bank *bank, uint8_t *buffer, } LOG_INFO("odd number of bytes to write, padding with 0xff"); buffer = memcpy(new_buffer, buffer, count); - buffer[count++] = 0xff; + new_buffer[count++] = 0xff; } uint32_t words_remaining = count / 2; @@ -894,7 +894,7 @@ static int stm32x_probe(struct flash_bank *bank) stm32x_info->ppage_size = 4; max_flash_size_in_kb = 128; break; - case 0x422: /* stm32f30x */ + case 0x422: /* stm32f302/3xb/c */ page_size = 2048; stm32x_info->ppage_size = 2; max_flash_size_in_kb = 256; @@ -902,6 +902,14 @@ static int stm32x_probe(struct flash_bank *bank) stm32x_info->option_offset = 6; stm32x_info->default_rdp = 0x55AA; break; + case 0x446: /* stm32f303xD/E */ + page_size = 2048; + stm32x_info->ppage_size = 2; + max_flash_size_in_kb = 512; + stm32x_info->user_data_offset = 16; + stm32x_info->option_offset = 6; + stm32x_info->default_rdp = 0x55AA; + break; case 0x428: /* value line High density */ page_size = 2048; stm32x_info->ppage_size = 4; @@ -921,8 +929,18 @@ static int stm32x_probe(struct flash_bank *bank) stm32x_info->option_offset = 6; stm32x_info->default_rdp = 0x55AA; break; + case 0x438: /* stm32f33x */ + case 0x439: /* stm32f302x6/8 */ + page_size = 2048; + stm32x_info->ppage_size = 2; + max_flash_size_in_kb = 64; + stm32x_info->user_data_offset = 16; + stm32x_info->option_offset = 6; + stm32x_info->default_rdp = 0x55AA; + break; case 0x440: /* stm32f05x */ case 0x444: /* stm32f03x */ + case 0x445: /* stm32f04x */ page_size = 1024; stm32x_info->ppage_size = 4; max_flash_size_in_kb = 64; @@ -931,9 +949,10 @@ static int stm32x_probe(struct flash_bank *bank) stm32x_info->default_rdp = 0x55AA; break; case 0x448: /* stm32f07x */ + case 0x442: /* stm32f09x */ page_size = 2048; stm32x_info->ppage_size = 4; - max_flash_size_in_kb = 128; + max_flash_size_in_kb = 256; stm32x_info->user_data_offset = 16; stm32x_info->option_offset = 6; stm32x_info->default_rdp = 0x55AA; @@ -1022,6 +1041,21 @@ COMMAND_HANDLER(stm32x_handle_part_id_command) } #endif +static const char *get_stm32f0_revision(uint16_t rev_id) +{ + const char *rev_str = NULL; + + switch (rev_id) { + case 0x1000: + rev_str = "1.0"; + break; + case 0x2000: + rev_str = "2.0"; + break; + } + return rev_str; +} + static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size) { uint32_t dbgmcu_idcode; @@ -1116,7 +1150,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size) break; case 0x422: - device_str = "STM32F30x"; + device_str = "STM32F302xB/C"; switch (rev_id) { case 0x1000: @@ -1175,48 +1209,64 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size) } break; - case 0x444: - device_str = "STM32F03x"; + case 0x438: + device_str = "STM32F33x"; switch (rev_id) { case 0x1000: - rev_str = "1.0"; - break; - - case 0x2000: - rev_str = "2.0"; + rev_str = "A"; break; } break; - case 0x440: - device_str = "STM32F05x"; + case 0x439: + device_str = "STM32F302x6/8"; switch (rev_id) { case 0x1000: - rev_str = "1.0"; + rev_str = "A"; break; - case 0x2000: - rev_str = "2.0"; + case 0x1001: + rev_str = "Z"; break; } break; - case 0x448: - device_str = "STM32F07x"; + case 0x444: + device_str = "STM32F03x"; + rev_str = get_stm32f0_revision(rev_id); + break; + + case 0x440: + device_str = "STM32F05x"; + rev_str = get_stm32f0_revision(rev_id); + break; + + case 0x445: + device_str = "STM32F04x"; + rev_str = get_stm32f0_revision(rev_id); + break; + case 0x446: + device_str = "STM32F303xD/E"; switch (rev_id) { case 0x1000: - rev_str = "1.0"; - break; - - case 0x2000: - rev_str = "2.0"; + rev_str = "A"; break; } break; + case 0x448: + device_str = "STM32F07x"; + rev_str = get_stm32f0_revision(rev_id); + break; + + case 0x442: + device_str = "STM32F09x"; + rev_str = get_stm32f0_revision(rev_id); + break; + default: snprintf(buf, buf_size, "Cannot identify target as a STM32F0/1/3\n"); return ERROR_FAIL; @@ -1433,12 +1483,12 @@ COMMAND_HANDLER(stm32x_handle_options_write_command) else if (strcmp("HWWDG", CMD_ARGV[0]) == 0) optionbyte &= ~(1 << 0); else if (strcmp("NORSTSTOP", CMD_ARGV[0]) == 0) - optionbyte &= ~(1 << 1); - else if (strcmp("RSTSTNDBY", CMD_ARGV[0]) == 0) + optionbyte |= (1 << 1); + else if (strcmp("RSTSTOP", CMD_ARGV[0]) == 0) optionbyte &= ~(1 << 1); else if (strcmp("NORSTSTNDBY", CMD_ARGV[0]) == 0) - optionbyte &= ~(1 << 2); - else if (strcmp("RSTSTOP", CMD_ARGV[0]) == 0) + optionbyte |= (1 << 2); + else if (strcmp("RSTSTNDBY", CMD_ARGV[0]) == 0) optionbyte &= ~(1 << 2); else if (stm32x_info->has_dual_banks) { if (strcmp("BOOT0", CMD_ARGV[0]) == 0)