server: use register_commands
[fw/openocd] / src / flash / str9xpec.c
index e679d42d5461cf0f8cd42009028b603d973c936a..7519413c73d416e22ceb61a8f7fabac54be84b03 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 ){
+       if (tap == NULL{
                return ERROR_TARGET_INVALID;
        }
 
        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;
-               field.out_value = calloc(CEIL(field.num_bits, 8), 1);
+               field.out_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
                field.in_value = NULL;
 
@@ -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,30 +235,30 @@ 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)
+       if (CMD_ARGC < 6)
        {
                LOG_WARNING("incomplete flash_bank str9x configuration");
                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;
 
-       /* find out jtag position of flash controller
-        * it is always after the arm966 core */
-
+       /* REVISIT verify that the jtag position of flash controller is
+        * right after *THIS* core, which must be a STR9xx core ...
+        */
        armv4_5 = bank->target->arch_info;
        arm7_9 = armv4_5->arch_info;
        jtag_info = &arm7_9->jtag_info;
 
-       str9xpec_info->tap = jtag_tap_by_position(jtag_info->tap->abs_chain_position - 1);
+       str9xpec_info->tap = bank->target->tap;
        str9xpec_info->isc_enable = 0;
 
        str9xpec_build_block_list(bank);
@@ -336,27 +269,27 @@ 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;
 
        if (!str9xpec_info->isc_enable) {
-               str9xpec_isc_enable(bank );
+               str9xpec_isc_enable(bank);
        }
 
        if (!str9xpec_info->isc_enable) {
                return ERROR_FLASH_OPERATION_FAILED;
        }
 
-       buffer = calloc(CEIL(64, 8), 1);
+       buffer = calloc(DIV_ROUND_UP(64, 8), 1);
 
        LOG_DEBUG("blank check: first_bank: %i, last_bank: %i", first, last);
 
@@ -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,27 +358,27 @@ 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;
 
        if (!str9xpec_info->isc_enable) {
-               str9xpec_isc_enable(bank );
+               str9xpec_isc_enable(bank);
        }
 
        if (!str9xpec_info->isc_enable) {
                return ISC_STATUS_ERROR;
        }
 
-       buffer = calloc(CEIL(64, 8), 1);
+       buffer = calloc(DIV_ROUND_UP(64, 8), 1);
 
        LOG_DEBUG("erase: first_bank: %i, last_bank: %i", first, last);
 
@@ -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,18 +440,18 @@ 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;
 
        if (!str9xpec_info->isc_enable) {
-               str9xpec_isc_enable(bank );
+               str9xpec_isc_enable(bank);
        }
 
        if (!str9xpec_info->isc_enable) {
@@ -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);
 
@@ -575,7 +508,7 @@ static int str9xpec_protect(struct flash_bank_s *bank, int set, int first, int l
        /* last bank: 0xFF signals a full device protect */
        if (last == 0xFF)
        {
-               if (set )
+               if (set)
                {
                        status = str9xpec_lock_device(bank);
                }
@@ -589,7 +522,7 @@ static int str9xpec_protect(struct flash_bank_s *bank, int set, int first, int l
        {
                for (i = first; i <= last; i++)
                {
-                       if (set )
+                       if (set)
                                buf_set_u32(str9xpec_info->options, str9xpec_info->sector_bits[i], 1, 1);
                        else
                                buf_set_u32(str9xpec_info->options, str9xpec_info->sector_bits[i], 1, 0);
@@ -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;
@@ -671,11 +604,11 @@ static int str9xpec_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t o
                                check_address = sec_end;
                }
 
-               if ((offset >= sec_start) && (offset < sec_end)){
+               if ((offset >= sec_start) && (offset < sec_end)) {
                        first_sector = i;
                }
 
-               if ((offset + count >= sec_start) && (offset + count < sec_end)){
+               if ((offset + count >= sec_start) && (offset + count < sec_end)) {
                        last_sector = i;
                }
        }
@@ -685,7 +618,7 @@ static int str9xpec_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t o
 
        LOG_DEBUG("first_sector: %i, last_sector: %i", first_sector, last_sector);
 
-       scanbuf = calloc(CEIL(64, 8), 1);
+       scanbuf = calloc(DIV_ROUND_UP(64, 8), 1);
 
        LOG_DEBUG("ISC_PROGRAM");
 
@@ -788,36 +721,31 @@ 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)
-       {
+       if (CMD_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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
        tap = str9xpec_info->tap;
 
-       buffer = calloc(CEIL(32, 8), 1);
+       buffer = calloc(DIV_ROUND_UP(32, 8), 1);
 
        str9xpec_set_instr(tap, ISC_IDCODE, TAP_IRPAUSE);
 
@@ -831,42 +759,39 @@ static int str9xpec_handle_part_id_command(struct command_context_s *cmd_ctx, ch
 
        idcode = buf_get_u32(buffer, 0, 32);
 
-       command_print(cmd_ctx, "str9xpec part id: 0x%8.8" PRIx32 "", idcode);
+       command_print(CMD_CTX, "str9xpec part id: 0x%8.8" PRIx32 "", idcode);
 
        free(buffer);
 
        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" );
+       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)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx, "str9xpec options_read <bank>");
+               command_print(CMD_CTX, "str9xpec options_read <bank>");
                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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
@@ -877,55 +802,55 @@ static int str9xpec_handle_flash_options_read_command(struct command_context_s *
 
        /* boot bank */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_CSMAPBIT, 1))
-               command_print(cmd_ctx, "CS Map: bank1");
+               command_print(CMD_CTX, "CS Map: bank1");
        else
-               command_print(cmd_ctx, "CS Map: bank0");
+               command_print(CMD_CTX, "CS Map: bank0");
 
        /* OTP lock */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_OTPBIT, 1))
-               command_print(cmd_ctx, "OTP Lock: OTP Locked");
+               command_print(CMD_CTX, "OTP Lock: OTP Locked");
        else
-               command_print(cmd_ctx, "OTP Lock: OTP Unlocked");
+               command_print(CMD_CTX, "OTP Lock: OTP Unlocked");
 
        /* LVD Threshold */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_LVDTHRESBIT, 1))
-               command_print(cmd_ctx, "LVD Threshold: 2.7v");
+               command_print(CMD_CTX, "LVD Threshold: 2.7v");
        else
-               command_print(cmd_ctx, "LVD Threshold: 2.4v");
+               command_print(CMD_CTX, "LVD Threshold: 2.4v");
 
        /* LVD reset warning */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_LVDWARNBIT, 1))
-               command_print(cmd_ctx, "LVD Reset Warning: VDD or VDDQ Inputs");
+               command_print(CMD_CTX, "LVD Reset Warning: VDD or VDDQ Inputs");
        else
-               command_print(cmd_ctx, "LVD Reset Warning: VDD Input Only");
+               command_print(CMD_CTX, "LVD Reset Warning: VDD Input Only");
 
        /* LVD reset select */
        if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_LVDSELBIT, 1))
-               command_print(cmd_ctx, "LVD Reset Selection: VDD or VDDQ Inputs");
+               command_print(CMD_CTX, "LVD Reset Selection: VDD or VDDQ Inputs");
        else
-               command_print(cmd_ctx, "LVD Reset Selection: VDD Input Only");
+               command_print(CMD_CTX, "LVD Reset Selection: VDD Input Only");
 
        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;
 
        /* erase config options first */
-       status = str9xpec_erase_area(bank, 0xFE, 0xFE );
+       status = str9xpec_erase_area(bank, 0xFE, 0xFE);
 
        if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS)
                return status;
 
        if (!str9xpec_info->isc_enable) {
-               str9xpec_isc_enable(bank );
+               str9xpec_isc_enable(bank);
        }
 
        if (!str9xpec_info->isc_enable) {
@@ -969,23 +894,20 @@ 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)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx, "str9xpec options_write <bank>");
+               command_print(CMD_CTX, "str9xpec options_write <bank>");
                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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        status = str9xpec_write_options(bank);
 
@@ -995,27 +917,24 @@ 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)
+       if (CMD_ARGC < 2)
        {
-               command_print(cmd_ctx, "str9xpec options_cmap <bank> <bank0 | bank1>");
+               command_print(CMD_CTX, "str9xpec options_cmap <bank> <bank0 | bank1>");
                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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
-       if (strcmp(args[1], "bank1") == 0)
+       if (strcmp(CMD_ARGV[1], "bank1") == 0)
        {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_CSMAPBIT, 1, 1);
        }
@@ -1027,27 +946,24 @@ 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)
+       if (CMD_ARGC < 2)
        {
-               command_print(cmd_ctx, "str9xpec options_lvdthd <bank> <2.4v | 2.7v>");
+               command_print(CMD_CTX, "str9xpec options_lvdthd <bank> <2.4v | 2.7v>");
                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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
-       if (strcmp(args[1], "2.7v") == 0)
+       if (strcmp(CMD_ARGV[1], "2.7v") == 0)
        {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDTHRESBIT, 1, 1);
        }
@@ -1059,27 +975,24 @@ 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)
+       if (CMD_ARGC < 2)
        {
-               command_print(cmd_ctx, "str9xpec options_lvdsel <bank> <vdd | vdd_vddq>");
+               command_print(CMD_CTX, "str9xpec options_lvdsel <bank> <vdd | vdd_vddq>");
                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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
-       if (strcmp(args[1], "vdd_vddq") == 0)
+       if (strcmp(CMD_ARGV[1], "vdd_vddq") == 0)
        {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDSELBIT, 1, 1);
        }
@@ -1091,27 +1004,24 @@ 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)
+       if (CMD_ARGC < 2)
        {
-               command_print(cmd_ctx, "str9xpec options_lvdwarn <bank> <vdd | vdd_vddq>");
+               command_print(CMD_CTX, "str9xpec options_lvdwarn <bank> <vdd | vdd_vddq>");
                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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
 
-       if (strcmp(args[1], "vdd_vddq") == 0)
+       if (strcmp(CMD_ARGV[1], "vdd_vddq") == 0)
        {
                buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDWARNBIT, 1, 1);
        }
@@ -1123,23 +1033,20 @@ 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)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx, "str9xpec lock <bank>");
+               command_print(CMD_CTX, "str9xpec lock <bank>");
                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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        status = str9xpec_lock_device(bank);
 
@@ -1149,23 +1056,20 @@ 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)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx, "str9xpec unlock <bank>");
+               command_print(CMD_CTX, "str9xpec unlock <bank>");
                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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        status = str9xpec_unlock_device(bank);
 
@@ -1175,28 +1079,24 @@ 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;
-
-       if (argc < 1)
-       {
-               command_print(cmd_ctx, "str9xpec enable_turbo <bank>");
-               return ERROR_OK;
-       }
+       struct jtag_tap *tap0;
+       struct jtag_tap *tap1;
+       struct jtag_tap *tap2;
+       struct str9xpec_flash_controller *str9xpec_info = NULL;
 
-       bank = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
-       if (!bank)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx, "flash bank '#%s' is out of bounds", args[0]);
+               command_print(CMD_CTX, "str9xpec enable_turbo <bank>");
                return ERROR_OK;
        }
 
+       struct flash_bank *bank;
+       int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
+
        str9xpec_info = bank->driver_priv;
 
        tap0 = str9xpec_info->tap;
@@ -1206,14 +1106,14 @@ static int str9xpec_handle_flash_enable_turbo_command(struct command_context_s *
        if (tap1 == NULL)
        {
                /* things are *WRONG* */
-               command_print(cmd_ctx,"**STR9FLASH** (tap1) invalid chain?");
+               command_print(CMD_CTX,"**STR9FLASH** (tap1) invalid chain?");
                return ERROR_OK;
        }
        tap2 = tap1->next_tap;
        if (tap2 == NULL)
        {
                /* things are *WRONG* */
-               command_print(cmd_ctx,"**STR9FLASH** (tap2) invalid chain?");
+               command_print(CMD_CTX,"**STR9FLASH** (tap2) invalid chain?");
                return ERROR_OK;
        }
 
@@ -1228,24 +1128,21 @@ 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)
+       if (CMD_ARGC < 1)
        {
-               command_print(cmd_ctx, "str9xpec disable_turbo <bank>");
+               command_print(CMD_CTX, "str9xpec disable_turbo <bank>");
                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 = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
+       if (ERROR_OK != retval)
+               return retval;
 
        str9xpec_info = bank->driver_priv;
        tap = str9xpec_info->tap;
@@ -1254,7 +1151,8 @@ static int str9xpec_handle_flash_disable_turbo_command(struct command_context_s
                return ERROR_FAIL;
 
        /* exit turbo mode via RESET */
-       str9xpec_set_instr(tap, ISC_NOOP, TAP_RESET);
+       str9xpec_set_instr(tap, ISC_NOOP, TAP_IDLE);
+       jtag_add_tlr();
        jtag_execute_queue();
 
        /* restore previous scan chain */
@@ -1264,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 = COMMAND_REGISTER(cmd_ctx, NULL, "str9xpec",
+                       NULL, COMMAND_ANY, "str9xpec flash specific commands");
+
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "enable_turbo",
+                       str9xpec_handle_flash_enable_turbo_command,
+                       COMMAND_EXEC, "enable str9xpec turbo mode");
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "disable_turbo",
+                       str9xpec_handle_flash_disable_turbo_command,
+                       COMMAND_EXEC, "disable str9xpec turbo mode");
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "options_cmap",
+                       str9xpec_handle_flash_options_cmap_command,
+                       COMMAND_EXEC, "configure str9xpec boot sector");
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "options_lvdthd",
+                       str9xpec_handle_flash_options_lvdthd_command,
+                       COMMAND_EXEC, "configure str9xpec lvd threshold");
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "options_lvdsel",
+                       str9xpec_handle_flash_options_lvdsel_command,
+                       COMMAND_EXEC, "configure str9xpec lvd selection");
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "options_lvdwarn",
+                       str9xpec_handle_flash_options_lvdwarn_command,
+                       COMMAND_EXEC, "configure str9xpec lvd warning");
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "options_read",
+                       str9xpec_handle_flash_options_read_command,
+                       COMMAND_EXEC, "read str9xpec options");
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "options_write",
+                       str9xpec_handle_flash_options_write_command,
+                       COMMAND_EXEC, "write str9xpec options");
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "lock",
+                       str9xpec_handle_flash_lock_command,
+                       COMMAND_EXEC, "lock str9xpec device");
+       COMMAND_REGISTER(cmd_ctx, str9xpec_cmd, "unlock",
+                       str9xpec_handle_flash_unlock_command,
+                       COMMAND_EXEC, "unlock str9xpec device");
+       COMMAND_REGISTER(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,
+       };