X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fstm32x.c;h=95d15a95189dda15702c6ef103bef8968706fddf;hp=774b7d375571dcea56066fa2c24ecba9f3a5cddf;hb=57c5c5f46304a785092874a7dc0f6abc84794cc3;hpb=f486f86c6c1aff3248fb556541fe1a18ca456c46 diff --git a/src/flash/stm32x.c b/src/flash/stm32x.c index 774b7d3755..95d15a9518 100644 --- a/src/flash/stm32x.c +++ b/src/flash/stm32x.c @@ -29,56 +29,8 @@ #include "binarybuffer.h" -static int stm32x_register_commands(struct command_context_s *cmd_ctx); -static int stm32x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank); -static int stm32x_erase(struct flash_bank_s *bank, int first, int last); -static int stm32x_protect(struct flash_bank_s *bank, int set, int first, int last); -static int stm32x_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count); -static int stm32x_probe(struct flash_bank_s *bank); -static int stm32x_auto_probe(struct flash_bank_s *bank); -//static int stm32x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int stm32x_protect_check(struct flash_bank_s *bank); -static int stm32x_info(struct flash_bank_s *bank, char *buf, int buf_size); - -static int stm32x_handle_lock_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int stm32x_handle_unlock_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int stm32x_handle_options_read_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int stm32x_mass_erase(struct flash_bank_s *bank); -flash_driver_t stm32x_flash = -{ - .name = "stm32x", - .register_commands = stm32x_register_commands, - .flash_bank_command = stm32x_flash_bank_command, - .erase = stm32x_erase, - .protect = stm32x_protect, - .write = stm32x_write, - .probe = stm32x_probe, - .auto_probe = stm32x_auto_probe, - .erase_check = default_flash_mem_blank_check, - .protect_check = stm32x_protect_check, - .info = stm32x_info -}; - -static int stm32x_register_commands(struct command_context_s *cmd_ctx) -{ - command_t *stm32x_cmd = register_command(cmd_ctx, NULL, "stm32x", NULL, COMMAND_ANY, "stm32x flash specific commands"); - - register_command(cmd_ctx, stm32x_cmd, "lock", stm32x_handle_lock_command, COMMAND_EXEC, - "lock device"); - register_command(cmd_ctx, stm32x_cmd, "unlock", stm32x_handle_unlock_command, COMMAND_EXEC, - "unlock protected device"); - register_command(cmd_ctx, stm32x_cmd, "mass_erase", stm32x_handle_mass_erase_command, COMMAND_EXEC, - "mass erase device"); - register_command(cmd_ctx, stm32x_cmd, "options_read", stm32x_handle_options_read_command, COMMAND_EXEC, - "read device option bytes"); - register_command(cmd_ctx, stm32x_cmd, "options_write", stm32x_handle_options_write_command, COMMAND_EXEC, - "write device option bytes"); - return ERROR_OK; -} - /* flash bank stm32x 0 0 */ static int stm32x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank) @@ -410,7 +362,7 @@ static int stm32x_protect(struct flash_bank_s *bank, int set, int first, int las if ((first && (first % stm32x_info->ppage_size)) || ((last + 1) && (last + 1) % stm32x_info->ppage_size)) { - LOG_WARNING("sector start/end incorrect - stm32 has %dK sector protection", stm32x_info->ppage_size); + LOG_WARNING("Error: start and end sectors must be on a %d sector boundary", stm32x_info->ppage_size); return ERROR_FLASH_SECTOR_INVALID; } @@ -828,7 +780,7 @@ static int stm32x_auto_probe(struct flash_bank_s *bank) } #if 0 -static int stm32x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(stm32x_handle_part_id_command) { return ERROR_OK; } @@ -940,9 +892,8 @@ static int stm32x_info(struct flash_bank_s *bank, char *buf, int buf_size) return ERROR_OK; } -static int stm32x_handle_lock_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(stm32x_handle_lock_command) { - flash_bank_t *bank; target_t *target = NULL; stm32x_flash_bank_t *stm32x_info = NULL; @@ -952,12 +903,10 @@ static int stm32x_handle_lock_command(struct command_context_s *cmd_ctx, char *c 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; - } + flash_bank_t *bank; + int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + if (ERROR_OK != retval) + return retval; stm32x_info = bank->driver_priv; @@ -989,9 +938,8 @@ static int stm32x_handle_lock_command(struct command_context_s *cmd_ctx, char *c return ERROR_OK; } -static int stm32x_handle_unlock_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(stm32x_handle_unlock_command) { - flash_bank_t *bank; target_t *target = NULL; stm32x_flash_bank_t *stm32x_info = NULL; @@ -1001,12 +949,10 @@ static int stm32x_handle_unlock_command(struct command_context_s *cmd_ctx, char 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; - } + flash_bank_t *bank; + int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + if (ERROR_OK != retval) + return retval; stm32x_info = bank->driver_priv; @@ -1035,9 +981,8 @@ static int stm32x_handle_unlock_command(struct command_context_s *cmd_ctx, char return ERROR_OK; } -static int stm32x_handle_options_read_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(stm32x_handle_options_read_command) { - flash_bank_t *bank; uint32_t optionbyte; target_t *target = NULL; stm32x_flash_bank_t *stm32x_info = NULL; @@ -1048,12 +993,10 @@ static int stm32x_handle_options_read_command(struct command_context_s *cmd_ctx, 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; - } + flash_bank_t *bank; + int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + if (ERROR_OK != retval) + return retval; stm32x_info = bank->driver_priv; @@ -1094,9 +1037,8 @@ static int stm32x_handle_options_read_command(struct command_context_s *cmd_ctx, return ERROR_OK; } -static int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(stm32x_handle_options_write_command) { - flash_bank_t *bank; target_t *target = NULL; stm32x_flash_bank_t *stm32x_info = NULL; uint16_t optionbyte = 0xF8; @@ -1107,12 +1049,10 @@ static int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx 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; - } + flash_bank_t *bank; + int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + if (ERROR_OK != retval) + return retval; stm32x_info = bank->driver_priv; @@ -1208,9 +1148,8 @@ static int stm32x_mass_erase(struct flash_bank_s *bank) return ERROR_OK; } -static int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(stm32x_handle_mass_erase_command) { - flash_bank_t *bank; int i; if (argc < 1) @@ -1219,12 +1158,10 @@ static int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, c 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; - } + flash_bank_t *bank; + int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank); + if (ERROR_OK != retval) + return retval; if (stm32x_mass_erase(bank) == ERROR_OK) { @@ -1243,3 +1180,41 @@ static int stm32x_handle_mass_erase_command(struct command_context_s *cmd_ctx, c return ERROR_OK; } + +static int stm32x_register_commands(struct command_context_s *cmd_ctx) +{ + command_t *stm32x_cmd = register_command(cmd_ctx, NULL, "stm32x", + NULL, COMMAND_ANY, "stm32x flash specific commands"); + + register_command(cmd_ctx, stm32x_cmd, "lock", + stm32x_handle_lock_command, COMMAND_EXEC, + "lock device"); + register_command(cmd_ctx, stm32x_cmd, "unlock", + stm32x_handle_unlock_command, COMMAND_EXEC, + "unlock protected device"); + register_command(cmd_ctx, stm32x_cmd, "mass_erase", + stm32x_handle_mass_erase_command, COMMAND_EXEC, + "mass erase device"); + register_command(cmd_ctx, stm32x_cmd, "options_read", + stm32x_handle_options_read_command, COMMAND_EXEC, + "read device option bytes"); + register_command(cmd_ctx, stm32x_cmd, "options_write", + stm32x_handle_options_write_command, COMMAND_EXEC, + "write device option bytes"); + + return ERROR_OK; +} + +flash_driver_t stm32x_flash = { + .name = "stm32x", + .register_commands = &stm32x_register_commands, + .flash_bank_command = &stm32x_flash_bank_command, + .erase = &stm32x_erase, + .protect = &stm32x_protect, + .write = &stm32x_write, + .probe = &stm32x_probe, + .auto_probe = &stm32x_auto_probe, + .erase_check = &default_flash_mem_blank_check, + .protect_check = &stm32x_protect_check, + .info = &stm32x_info, + };