command_t -> struct command
[fw/openocd] / src / flash / str9xpec.c
index 33471e6b3a67c4d054701833d8d173f7e1636920..d1b02c5e24e191e4ab736e0b880a90393d0f3529 100644 (file)
 #include "arm7_9_common.h"
 
 
-static int str9xpec_register_commands(struct command_context_s *cmd_ctx);
-static int str9xpec_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank);
-static int str9xpec_erase(struct flash_bank_s *bank, int first, int last);
-static int str9xpec_protect(struct flash_bank_s *bank, int set, int first, int last);
-static int str9xpec_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count);
-static int str9xpec_probe(struct flash_bank_s *bank);
-static int str9xpec_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_protect_check(struct flash_bank_s *bank);
-static int str9xpec_erase_check(struct flash_bank_s *bank);
-static int str9xpec_info(struct flash_bank_s *bank, char *buf, int buf_size);
-
-static int str9xpec_erase_area(struct flash_bank_s *bank, int first, int last);
-static int str9xpec_set_address(struct flash_bank_s *bank, uint8_t sector);
-static int str9xpec_write_options(struct flash_bank_s *bank);
-
-static int str9xpec_handle_flash_options_cmap_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_handle_flash_options_lvdthd_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_handle_flash_options_lvdsel_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_handle_flash_options_lvdwarn_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_handle_flash_options_read_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_handle_flash_options_write_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_handle_flash_lock_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_handle_flash_unlock_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_handle_flash_enable_turbo_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-static int str9xpec_handle_flash_disable_turbo_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-
-flash_driver_t str9xpec_flash =
-{
-       .name = "str9xpec",
-       .register_commands = str9xpec_register_commands,
-       .flash_bank_command = str9xpec_flash_bank_command,
-       .erase = str9xpec_erase,
-       .protect = str9xpec_protect,
-       .write = str9xpec_write,
-       .probe = str9xpec_probe,
-       .auto_probe = str9xpec_probe,
-       .erase_check = str9xpec_erase_check,
-       .protect_check = str9xpec_protect_check,
-       .info = str9xpec_info
-};
-
-static int str9xpec_register_commands(struct command_context_s *cmd_ctx)
-{
-       command_t *str9xpec_cmd = register_command(cmd_ctx, NULL, "str9xpec", NULL, COMMAND_ANY, "str9xpec flash specific commands");
-
-       register_command(cmd_ctx, str9xpec_cmd, "enable_turbo", str9xpec_handle_flash_enable_turbo_command, COMMAND_EXEC,
-                                        "enable str9xpec turbo mode");
-       register_command(cmd_ctx, str9xpec_cmd, "disable_turbo", str9xpec_handle_flash_disable_turbo_command, COMMAND_EXEC,
-                                        "disable str9xpec turbo mode");
-       register_command(cmd_ctx, str9xpec_cmd, "options_cmap", str9xpec_handle_flash_options_cmap_command, COMMAND_EXEC,
-                                        "configure str9xpec boot sector");
-       register_command(cmd_ctx, str9xpec_cmd, "options_lvdthd", str9xpec_handle_flash_options_lvdthd_command, COMMAND_EXEC,
-                                        "configure str9xpec lvd threshold");
-       register_command(cmd_ctx, str9xpec_cmd, "options_lvdsel", str9xpec_handle_flash_options_lvdsel_command, COMMAND_EXEC,
-                                        "configure str9xpec lvd selection");
-       register_command(cmd_ctx, str9xpec_cmd, "options_lvdwarn", str9xpec_handle_flash_options_lvdwarn_command, COMMAND_EXEC,
-                                        "configure str9xpec lvd warning");
-       register_command(cmd_ctx, str9xpec_cmd, "options_read", str9xpec_handle_flash_options_read_command, COMMAND_EXEC,
-                                        "read str9xpec options");
-       register_command(cmd_ctx, str9xpec_cmd, "options_write", str9xpec_handle_flash_options_write_command, COMMAND_EXEC,
-                                        "write str9xpec options");
-       register_command(cmd_ctx, str9xpec_cmd, "lock", str9xpec_handle_flash_lock_command, COMMAND_EXEC,
-                                        "lock str9xpec device");
-       register_command(cmd_ctx, str9xpec_cmd, "unlock", str9xpec_handle_flash_unlock_command, COMMAND_EXEC,
-                                        "unlock str9xpec device");
-       register_command(cmd_ctx, str9xpec_cmd, "part_id", str9xpec_handle_part_id_command, COMMAND_EXEC,
-                                        "print part id of str9xpec flash bank <num>");
-
-       return ERROR_OK;
-}
+static int str9xpec_erase_area(struct flash_bank *bank, int first, int last);
+static int str9xpec_set_address(struct flash_bank *bank, uint8_t sector);
+static int str9xpec_write_options(struct flash_bank *bank);
 
-int str9xpec_set_instr(jtag_tap_t *tap, uint32_t new_instr, tap_state_t end_state)
+int str9xpec_set_instr(struct jtag_tap *tap, uint32_t new_instr, tap_state_t end_state)
 {
        if (tap == NULL) {
                return ERROR_TARGET_INVALID;
@@ -107,7 +40,7 @@ int str9xpec_set_instr(jtag_tap_t *tap, uint32_t new_instr, tap_state_t end_stat
 
        if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) != new_instr)
        {
-               scan_field_t field;
+               struct scan_field field;
 
                field.tap = tap;
                field.num_bits = tap->ir_length;
@@ -123,9 +56,9 @@ int str9xpec_set_instr(jtag_tap_t *tap, uint32_t new_instr, tap_state_t end_stat
        return ERROR_OK;
 }
 
-static uint8_t str9xpec_isc_status(jtag_tap_t *tap)
+static uint8_t str9xpec_isc_status(struct jtag_tap *tap)
 {
-       scan_field_t field;
+       struct scan_field field;
        uint8_t status;
 
        if (str9xpec_set_instr(tap, ISC_NOOP, TAP_IRPAUSE) != ERROR_OK)
@@ -148,11 +81,11 @@ static uint8_t str9xpec_isc_status(jtag_tap_t *tap)
        return status;
 }
 
-static int str9xpec_isc_enable(struct flash_bank_s *bank)
+static int str9xpec_isc_enable(struct flash_bank *bank)
 {
        uint8_t status;
-       jtag_tap_t *tap;
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct jtag_tap *tap;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        tap = str9xpec_info->tap;
 
@@ -175,11 +108,11 @@ static int str9xpec_isc_enable(struct flash_bank_s *bank)
        return ERROR_OK;
 }
 
-static int str9xpec_isc_disable(struct flash_bank_s *bank)
+static int str9xpec_isc_disable(struct flash_bank *bank)
 {
        uint8_t status;
-       jtag_tap_t *tap;
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct jtag_tap *tap;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        tap = str9xpec_info->tap;
 
@@ -204,13 +137,13 @@ static int str9xpec_isc_disable(struct flash_bank_s *bank)
        return ERROR_OK;
 }
 
-static int str9xpec_read_config(struct flash_bank_s *bank)
+static int str9xpec_read_config(struct flash_bank *bank)
 {
-       scan_field_t field;
+       struct scan_field field;
        uint8_t status;
-       jtag_tap_t *tap;
+       struct jtag_tap *tap;
 
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        tap = str9xpec_info->tap;
 
@@ -233,9 +166,9 @@ static int str9xpec_read_config(struct flash_bank_s *bank)
        return status;
 }
 
-static int str9xpec_build_block_list(struct flash_bank_s *bank)
+static int str9xpec_build_block_list(struct flash_bank *bank)
 {
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        int i;
        int num_sectors;
@@ -272,7 +205,7 @@ static int str9xpec_build_block_list(struct flash_bank_s *bank)
        num_sectors = b0_sectors + b1_sectors;
 
        bank->num_sectors = num_sectors;
-       bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors);
+       bank->sectors = malloc(sizeof(struct flash_sector) * num_sectors);
        str9xpec_info->sector_bits = malloc(sizeof(uint32_t) * num_sectors);
 
        num_sectors = 0;
@@ -302,12 +235,12 @@ static int str9xpec_build_block_list(struct flash_bank_s *bank)
 
 /* flash bank str9x <base> <size> 0 0 <target#>
  */
-static int str9xpec_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank)
+FLASH_BANK_COMMAND_HANDLER(str9xpec_flash_bank_command)
 {
-       str9xpec_flash_controller_t *str9xpec_info;
-       armv4_5_common_t *armv4_5 = NULL;
-       arm7_9_common_t *arm7_9 = NULL;
-       arm_jtag_t *jtag_info = NULL;
+       struct str9xpec_flash_controller *str9xpec_info;
+       struct arm *armv4_5 = NULL;
+       struct arm7_9_common *arm7_9 = NULL;
+       struct arm_jtag *jtag_info = NULL;
 
        if (argc < 6)
        {
@@ -315,7 +248,7 @@ static int str9xpec_flash_bank_command(struct command_context_s *cmd_ctx, char *
                return ERROR_FLASH_BANK_INVALID;
        }
 
-       str9xpec_info = malloc(sizeof(str9xpec_flash_controller_t));
+       str9xpec_info = malloc(sizeof(struct str9xpec_flash_controller));
        bank->driver_priv = str9xpec_info;
 
        /* REVISIT verify that the jtag position of flash controller is
@@ -336,15 +269,15 @@ static int str9xpec_flash_bank_command(struct command_context_s *cmd_ctx, char *
        return ERROR_OK;
 }
 
-static int str9xpec_blank_check(struct flash_bank_s *bank, int first, int last)
+static int str9xpec_blank_check(struct flash_bank *bank, int first, int last)
 {
-       scan_field_t field;
+       struct scan_field field;
        uint8_t status;
-       jtag_tap_t *tap;
+       struct jtag_tap *tap;
        int i;
        uint8_t *buffer = NULL;
 
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        tap = str9xpec_info->tap;
 
@@ -403,12 +336,12 @@ static int str9xpec_blank_check(struct flash_bank_s *bank, int first, int last)
        return ERROR_OK;
 }
 
-static int str9xpec_protect_check(struct flash_bank_s *bank)
+static int str9xpec_protect_check(struct flash_bank *bank)
 {
        uint8_t status;
        int i;
 
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        status = str9xpec_read_config(bank);
 
@@ -425,15 +358,15 @@ static int str9xpec_protect_check(struct flash_bank_s *bank)
        return ERROR_OK;
 }
 
-static int str9xpec_erase_area(struct flash_bank_s *bank, int first, int last)
+static int str9xpec_erase_area(struct flash_bank *bank, int first, int last)
 {
-       scan_field_t field;
+       struct scan_field field;
        uint8_t status;
-       jtag_tap_t *tap;
+       struct jtag_tap *tap;
        int i;
        uint8_t *buffer = NULL;
 
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        tap = str9xpec_info->tap;
 
@@ -495,7 +428,7 @@ static int str9xpec_erase_area(struct flash_bank_s *bank, int first, int last)
        return status;
 }
 
-static int str9xpec_erase(struct flash_bank_s *bank, int first, int last)
+static int str9xpec_erase(struct flash_bank *bank, int first, int last)
 {
        int status;
 
@@ -507,12 +440,12 @@ static int str9xpec_erase(struct flash_bank_s *bank, int first, int last)
        return ERROR_OK;
 }
 
-static int str9xpec_lock_device(struct flash_bank_s *bank)
+static int str9xpec_lock_device(struct flash_bank *bank)
 {
-       scan_field_t field;
+       struct scan_field field;
        uint8_t status;
-       jtag_tap_t *tap;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct jtag_tap *tap;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        str9xpec_info = bank->driver_priv;
        tap = str9xpec_info->tap;
@@ -549,7 +482,7 @@ static int str9xpec_lock_device(struct flash_bank_s *bank)
        return status;
 }
 
-static int str9xpec_unlock_device(struct flash_bank_s *bank)
+static int str9xpec_unlock_device(struct flash_bank *bank)
 {
        uint8_t status;
 
@@ -558,12 +491,12 @@ static int str9xpec_unlock_device(struct flash_bank_s *bank)
        return status;
 }
 
-static int str9xpec_protect(struct flash_bank_s *bank, int set, int first, int last)
+static int str9xpec_protect(struct flash_bank *bank, int set, int first, int last)
 {
        uint8_t status;
        int i;
 
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        status = str9xpec_read_config(bank);
 
@@ -604,11 +537,11 @@ static int str9xpec_protect(struct flash_bank_s *bank, int set, int first, int l
        return ERROR_OK;
 }
 
-static int str9xpec_set_address(struct flash_bank_s *bank, uint8_t sector)
+static int str9xpec_set_address(struct flash_bank *bank, uint8_t sector)
 {
-       jtag_tap_t *tap;
-       scan_field_t field;
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct jtag_tap *tap;
+       struct scan_field field;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
 
        tap = str9xpec_info->tap;
 
@@ -625,16 +558,16 @@ static int str9xpec_set_address(struct flash_bank_s *bank, uint8_t sector)
        return ERROR_OK;
 }
 
-static int str9xpec_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
+static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
 {
-       str9xpec_flash_controller_t *str9xpec_info = bank->driver_priv;
+       struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv;
        uint32_t dwords_remaining = (count / 8);
        uint32_t bytes_remaining = (count & 0x00000007);
        uint32_t bytes_written = 0;
        uint8_t status;
        uint32_t check_address = offset;
-       jtag_tap_t *tap;
-       scan_field_t field;
+       struct jtag_tap *tap;
+       struct scan_field field;
        uint8_t *scanbuf;
        int i;
        int first_sector = 0;
@@ -788,31 +721,26 @@ static int str9xpec_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t o
        return ERROR_OK;
 }
 
-static int str9xpec_probe(struct flash_bank_s *bank)
+static int str9xpec_probe(struct flash_bank *bank)
 {
        return ERROR_OK;
 }
 
-static int str9xpec_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_part_id_command)
 {
-       flash_bank_t *bank;
-       scan_field_t field;
+       struct scan_field field;
        uint8_t *buffer = NULL;
-       jtag_tap_t *tap;
+       struct jtag_tap *tap;
        uint32_t idcode;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (argc < 1)
-       {
                return ERROR_COMMAND_SYNTAX_ERROR;
-       }
 
-       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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
        tap = str9xpec_info->tap;
@@ -838,22 +766,21 @@ static int str9xpec_handle_part_id_command(struct command_context_s *cmd_ctx, ch
        return ERROR_OK;
 }
 
-static int str9xpec_erase_check(struct flash_bank_s *bank)
+static int str9xpec_erase_check(struct flash_bank *bank)
 {
        return str9xpec_blank_check(bank, 0, bank->num_sectors - 1);
 }
 
-static int str9xpec_info(struct flash_bank_s *bank, char *buf, int buf_size)
+static int str9xpec_info(struct flash_bank *bank, char *buf, int buf_size)
 {
        snprintf(buf, buf_size, "str9xpec flash driver info");
        return ERROR_OK;
 }
 
-static int str9xpec_handle_flash_options_read_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_options_read_command)
 {
-       flash_bank_t *bank;
        uint8_t status;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (argc < 1)
        {
@@ -861,12 +788,10 @@ static int str9xpec_handle_flash_options_read_command(struct command_context_s *
                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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
@@ -908,12 +833,12 @@ static int str9xpec_handle_flash_options_read_command(struct command_context_s *
        return ERROR_OK;
 }
 
-static int str9xpec_write_options(struct flash_bank_s *bank)
+static int str9xpec_write_options(struct flash_bank *bank)
 {
-       scan_field_t field;
+       struct scan_field field;
        uint8_t status;
-       jtag_tap_t *tap;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct jtag_tap *tap;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        str9xpec_info = bank->driver_priv;
        tap = str9xpec_info->tap;
@@ -969,9 +894,8 @@ static int str9xpec_write_options(struct flash_bank_s *bank)
        return status;
 }
 
-static int str9xpec_handle_flash_options_write_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_options_write_command)
 {
-       flash_bank_t *bank;
        uint8_t status;
 
        if (argc < 1)
@@ -980,12 +904,10 @@ static int str9xpec_handle_flash_options_write_command(struct command_context_s
                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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        status = str9xpec_write_options(bank);
 
@@ -995,10 +917,9 @@ static int str9xpec_handle_flash_options_write_command(struct command_context_s
        return ERROR_OK;
 }
 
-static int str9xpec_handle_flash_options_cmap_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_options_cmap_command)
 {
-       flash_bank_t *bank;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (argc < 2)
        {
@@ -1006,12 +927,10 @@ static int str9xpec_handle_flash_options_cmap_command(struct command_context_s *
                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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
@@ -1027,10 +946,9 @@ static int str9xpec_handle_flash_options_cmap_command(struct command_context_s *
        return ERROR_OK;
 }
 
-static int str9xpec_handle_flash_options_lvdthd_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_options_lvdthd_command)
 {
-       flash_bank_t *bank;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (argc < 2)
        {
@@ -1038,12 +956,10 @@ static int str9xpec_handle_flash_options_lvdthd_command(struct command_context_s
                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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
@@ -1059,10 +975,9 @@ static int str9xpec_handle_flash_options_lvdthd_command(struct command_context_s
        return ERROR_OK;
 }
 
-int str9xpec_handle_flash_options_lvdsel_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_options_lvdsel_command)
 {
-       flash_bank_t *bank;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (argc < 2)
        {
@@ -1070,12 +985,10 @@ int str9xpec_handle_flash_options_lvdsel_command(struct command_context_s *cmd_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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
@@ -1091,10 +1004,9 @@ int str9xpec_handle_flash_options_lvdsel_command(struct command_context_s *cmd_c
        return ERROR_OK;
 }
 
-static int str9xpec_handle_flash_options_lvdwarn_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_options_lvdwarn_command)
 {
-       flash_bank_t *bank;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (argc < 2)
        {
@@ -1102,12 +1014,10 @@ static int str9xpec_handle_flash_options_lvdwarn_command(struct command_context_
                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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
@@ -1123,10 +1033,9 @@ static int str9xpec_handle_flash_options_lvdwarn_command(struct command_context_
        return ERROR_OK;
 }
 
-static int str9xpec_handle_flash_lock_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_lock_command)
 {
        uint8_t status;
-       flash_bank_t *bank;
 
        if (argc < 1)
        {
@@ -1134,12 +1043,10 @@ static int str9xpec_handle_flash_lock_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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        status = str9xpec_lock_device(bank);
 
@@ -1149,10 +1056,9 @@ static int str9xpec_handle_flash_lock_command(struct command_context_s *cmd_ctx,
        return ERROR_OK;
 }
 
-static int str9xpec_handle_flash_unlock_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_unlock_command)
 {
        uint8_t status;
-       flash_bank_t *bank;
 
        if (argc < 1)
        {
@@ -1160,12 +1066,10 @@ static int str9xpec_handle_flash_unlock_command(struct command_context_s *cmd_ct
                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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        status = str9xpec_unlock_device(bank);
 
@@ -1175,14 +1079,12 @@ static int str9xpec_handle_flash_unlock_command(struct command_context_s *cmd_ct
        return ERROR_OK;
 }
 
-static int str9xpec_handle_flash_enable_turbo_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_enable_turbo_command)
 {
-       int retval;
-       flash_bank_t *bank;
-       jtag_tap_t *tap0;
-       jtag_tap_t *tap1;
-       jtag_tap_t *tap2;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct jtag_tap *tap0;
+       struct jtag_tap *tap1;
+       struct jtag_tap *tap2;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (argc < 1)
        {
@@ -1190,12 +1092,10 @@ static int str9xpec_handle_flash_enable_turbo_command(struct command_context_s *
                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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
@@ -1228,11 +1128,10 @@ static int str9xpec_handle_flash_enable_turbo_command(struct command_context_s *
        return ERROR_OK;
 }
 
-static int str9xpec_handle_flash_disable_turbo_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(str9xpec_handle_flash_disable_turbo_command)
 {
-       flash_bank_t *bank;
-       jtag_tap_t *tap;
-       str9xpec_flash_controller_t *str9xpec_info = NULL;
+       struct jtag_tap *tap;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
        if (argc < 1)
        {
@@ -1240,12 +1139,10 @@ static int str9xpec_handle_flash_disable_turbo_command(struct command_context_s
                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;
-       }
+       struct flash_bank *bank;
+       int retval = flash_command_get_bank_by_num(cmd_ctx, args[0], &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
        tap = str9xpec_info->tap;
@@ -1265,3 +1162,59 @@ static int str9xpec_handle_flash_disable_turbo_command(struct command_context_s
 
        return ERROR_OK;
 }
+
+static int str9xpec_register_commands(struct command_context *cmd_ctx)
+{
+       struct command *str9xpec_cmd = register_command(cmd_ctx, NULL, "str9xpec",
+                       NULL, COMMAND_ANY, "str9xpec flash specific commands");
+
+       register_command(cmd_ctx, str9xpec_cmd, "enable_turbo",
+                       str9xpec_handle_flash_enable_turbo_command,
+                       COMMAND_EXEC, "enable str9xpec turbo mode");
+       register_command(cmd_ctx, str9xpec_cmd, "disable_turbo",
+                       str9xpec_handle_flash_disable_turbo_command,
+                       COMMAND_EXEC, "disable str9xpec turbo mode");
+       register_command(cmd_ctx, str9xpec_cmd, "options_cmap",
+                       str9xpec_handle_flash_options_cmap_command,
+                       COMMAND_EXEC, "configure str9xpec boot sector");
+       register_command(cmd_ctx, str9xpec_cmd, "options_lvdthd",
+                       str9xpec_handle_flash_options_lvdthd_command,
+                       COMMAND_EXEC, "configure str9xpec lvd threshold");
+       register_command(cmd_ctx, str9xpec_cmd, "options_lvdsel",
+                       str9xpec_handle_flash_options_lvdsel_command,
+                       COMMAND_EXEC, "configure str9xpec lvd selection");
+       register_command(cmd_ctx, str9xpec_cmd, "options_lvdwarn",
+                       str9xpec_handle_flash_options_lvdwarn_command,
+                       COMMAND_EXEC, "configure str9xpec lvd warning");
+       register_command(cmd_ctx, str9xpec_cmd, "options_read",
+                       str9xpec_handle_flash_options_read_command,
+                       COMMAND_EXEC, "read str9xpec options");
+       register_command(cmd_ctx, str9xpec_cmd, "options_write",
+                       str9xpec_handle_flash_options_write_command,
+                       COMMAND_EXEC, "write str9xpec options");
+       register_command(cmd_ctx, str9xpec_cmd, "lock",
+                       str9xpec_handle_flash_lock_command,
+                       COMMAND_EXEC, "lock str9xpec device");
+       register_command(cmd_ctx, str9xpec_cmd, "unlock",
+                       str9xpec_handle_flash_unlock_command,
+                       COMMAND_EXEC, "unlock str9xpec device");
+       register_command(cmd_ctx, str9xpec_cmd, "part_id",
+                       str9xpec_handle_part_id_command,
+                       COMMAND_EXEC, "print part id of str9xpec flash bank <num>");
+
+       return ERROR_OK;
+}
+
+struct flash_driver str9xpec_flash = {
+               .name = "str9xpec",
+               .register_commands = &str9xpec_register_commands,
+               .flash_bank_command = &str9xpec_flash_bank_command,
+               .erase = &str9xpec_erase,
+               .protect = &str9xpec_protect,
+               .write = &str9xpec_write,
+               .probe = &str9xpec_probe,
+               .auto_probe = &str9xpec_probe,
+               .erase_check = &str9xpec_erase_check,
+               .protect_check = &str9xpec_protect_check,
+               .info = &str9xpec_info,
+       };