X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fstr7x.c;h=eaef1970e60aecd814e954c4c6e0328a614e4b77;hb=250185c096bab341f99fb984aebda671d55e1ab0;hp=d748841059a2dd0748622149a0946d29ef81b42f;hpb=d2d4f776d8e24e8e651d1c896c90c15c38633172;p=openocd.git diff --git a/src/flash/nor/str7x.c b/src/flash/nor/str7x.c index d748841059..eaef1970e6 100644 --- a/src/flash/nor/str7x.c +++ b/src/flash/nor/str7x.c @@ -19,9 +19,7 @@ * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * along with this program. If not, see . * ***************************************************************************/ #ifdef HAVE_CONFIG_H @@ -90,7 +88,6 @@ struct str7x_flash_bank { uint32_t disable_bit; uint32_t busy_bits; uint32_t register_base; - struct working_area *write_algorithm; }; struct str7x_mem_layout { @@ -114,7 +111,7 @@ enum str7x_status_codes { STR7X_BUSY = 11 }; -static struct str7x_mem_layout mem_layout_str7bank0[] = { +static const struct str7x_mem_layout mem_layout_str7bank0[] = { {0x00000000, 0x02000, 0x01}, {0x00002000, 0x02000, 0x02}, {0x00004000, 0x02000, 0x04}, @@ -125,7 +122,7 @@ static struct str7x_mem_layout mem_layout_str7bank0[] = { {0x00030000, 0x10000, 0x80} }; -static struct str7x_mem_layout mem_layout_str7bank1[] = { +static const struct str7x_mem_layout mem_layout_str7bank1[] = { {0x00000000, 0x02000, 0x10000}, {0x00002000, 0x02000, 0x20000} }; @@ -227,8 +224,6 @@ FLASH_BANK_COMMAND_HANDLER(str7x_flash_bank_command) str7x_build_block_list(bank); - str7x_info->write_algorithm = NULL; - return ERROR_OK; } @@ -445,12 +440,13 @@ static int str7x_protect(struct flash_bank *bank, int set, int first, int last) return ERROR_OK; } -static int str7x_write_block(struct flash_bank *bank, uint8_t *buffer, +static int str7x_write_block(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count) { struct str7x_flash_bank *str7x_info = bank->driver_priv; struct target *target = bank->target; uint32_t buffer_size = 32768; + struct working_area *write_algorithm; struct working_area *source; uint32_t address = bank->base + offset; struct reg_param reg_params[6]; @@ -487,22 +483,22 @@ static int str7x_write_block(struct flash_bank *bank, uint8_t *buffer, /* flash write code */ if (target_alloc_working_area_try(target, sizeof(str7x_flash_write_code), - &str7x_info->write_algorithm) != ERROR_OK) { + &write_algorithm) != ERROR_OK) { return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; - }; + } - target_write_buffer(target, str7x_info->write_algorithm->address, - sizeof(str7x_flash_write_code), - (uint8_t *)str7x_flash_write_code); + uint8_t code[sizeof(str7x_flash_write_code)]; + target_buffer_set_u32_array(target, code, ARRAY_SIZE(str7x_flash_write_code), + str7x_flash_write_code); + target_write_buffer(target, write_algorithm->address, sizeof(code), code); /* memory buffer */ while (target_alloc_working_area_try(target, buffer_size, &source) != ERROR_OK) { buffer_size /= 2; if (buffer_size <= 256) { - /* if we already allocated the writing code, but failed to get a + /* we already allocated the writing code, but failed to get a * buffer, free the algorithm */ - if (str7x_info->write_algorithm) - target_free_working_area(target, str7x_info->write_algorithm); + target_free_working_area(target, write_algorithm); LOG_WARNING("no large enough working area available, can't do block memory writes"); return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; @@ -532,8 +528,8 @@ static int str7x_write_block(struct flash_bank *bank, uint8_t *buffer, buf_set_u32(reg_params[5].value, 0, 32, str7x_info->busy_bits); retval = target_run_algorithm(target, 0, NULL, 6, reg_params, - str7x_info->write_algorithm->address, - str7x_info->write_algorithm->address + (sizeof(str7x_flash_write_code) - 4), + write_algorithm->address, + write_algorithm->address + (sizeof(str7x_flash_write_code) - 4), 10000, &arm_algo); if (retval != ERROR_OK) break; @@ -549,7 +545,7 @@ static int str7x_write_block(struct flash_bank *bank, uint8_t *buffer, } target_free_working_area(target, source); - target_free_working_area(target, str7x_info->write_algorithm); + target_free_working_area(target, write_algorithm); destroy_reg_param(®_params[0]); destroy_reg_param(®_params[1]); @@ -561,7 +557,7 @@ static int str7x_write_block(struct flash_bank *bank, uint8_t *buffer, return retval; } -static int str7x_write(struct flash_bank *bank, uint8_t *buffer, +static int str7x_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count) { struct target *target = bank->target; @@ -710,13 +706,13 @@ COMMAND_HANDLER(str7x_handle_part_id_command) static int get_str7x_info(struct flash_bank *bank, char *buf, int buf_size) { - snprintf(buf, buf_size, "str7x flash driver info"); - /* STR7x flash doesn't support sector protection interrogation. - * FLASH_NVWPAR acts as a write only register; its read value - * doesn't reflect the actual protection state of the sectors. + /* Setting the write protection on a sector is a permanent change but it + * can be disabled temporarily. FLASH_NVWPAR reflects the permanent + * protection state of the sectors, not the temporary. */ - LOG_WARNING("STR7x flash lock information might not be correct " - "due to hardware limitations."); + snprintf(buf, buf_size, "STR7x flash protection info is only valid after a power cycle, " + "clearing the protection is only temporary and may not be reflected in the current " + "info returned."); return ERROR_OK; } @@ -803,7 +799,7 @@ static const struct command_registration str7x_command_handlers[] = { COMMAND_REGISTRATION_DONE }; -struct flash_driver str7x_flash = { +const struct flash_driver str7x_flash = { .name = "str7x", .commands = str7x_command_handlers, .flash_bank_command = str7x_flash_bank_command, @@ -816,4 +812,5 @@ struct flash_driver str7x_flash = { .erase_check = default_flash_blank_check, .protect_check = str7x_protect_check, .info = get_str7x_info, + .free_driver_priv = default_flash_free_driver_priv, };