X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fstr9xpec.c;h=b618706b9497e2117e6f46acdbbc89dddc7ad072;hp=f8b705e080c6c5aa057102e2cb9107a953be106b;hb=a7479fa89def9d8b1854d629dfdaa0ba17132617;hpb=42c84c59b1a733c27e164920cca58716cd7e8740 diff --git a/src/flash/nor/str9xpec.c b/src/flash/nor/str9xpec.c index f8b705e080..b618706b94 100644 --- a/src/flash/nor/str9xpec.c +++ b/src/flash/nor/str9xpec.c @@ -16,18 +16,63 @@ * 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 #include "config.h" #endif #include "imp.h" -#include "str9xpec.h" #include +/* ISC commands */ + +#define ISC_IDCODE 0xFE +#define ISC_MFG_READ 0x4C +#define ISC_CONFIGURATION 0x07 +#define ISC_ENABLE 0x0C +#define ISC_DISABLE 0x0F +#define ISC_NOOP 0x10 +#define ISC_ADDRESS_SHIFT 0x11 +#define ISC_CLR_STATUS 0x13 +#define ISC_PROGRAM 0x20 +#define ISC_PROGRAM_SECURITY 0x22 +#define ISC_PROGRAM_UC 0x23 +#define ISC_ERASE 0x30 +#define ISC_READ 0x50 +#define ISC_BLANK_CHECK 0x60 + +/* ISC_DEFAULT bit definitions */ + +#define ISC_STATUS_SECURITY 0x40 +#define ISC_STATUS_INT_ERROR 0x30 +#define ISC_STATUS_MODE 0x08 +#define ISC_STATUS_BUSY 0x04 +#define ISC_STATUS_ERROR 0x03 + +/* Option bytes definitions */ + +#define STR9XPEC_OPT_CSMAPBIT 48 +#define STR9XPEC_OPT_LVDTHRESBIT 49 +#define STR9XPEC_OPT_LVDSELBIT 50 +#define STR9XPEC_OPT_LVDWARNBIT 51 +#define STR9XPEC_OPT_OTPBIT 63 + +enum str9xpec_status_codes { + STR9XPEC_INVALID_COMMAND = 1, + STR9XPEC_ISC_SUCCESS = 2, + STR9XPEC_ISC_DISABLED = 3, + STR9XPEC_ISC_INTFAIL = 32, +}; + +struct str9xpec_flash_controller { + struct jtag_tap *tap; + uint32_t *sector_bits; + int chain_pos; + int isc_enable; + uint8_t options[8]; +}; 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); @@ -35,16 +80,14 @@ static int str9xpec_write_options(struct flash_bank *bank); static 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) - { + if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) != new_instr) { struct scan_field field; field.num_bits = tap->ir_length; - void * t = calloc(DIV_ROUND_UP(field.num_bits, 8), 1); + void *t = calloc(DIV_ROUND_UP(field.num_bits, 8), 1); field.out_value = t; buf_set_u32(t, 0, field.num_bits, new_instr); field.in_value = NULL; @@ -98,8 +141,7 @@ static int str9xpec_isc_enable(struct flash_bank *bank) /* check ISC status */ status = str9xpec_isc_status(tap); - if (status & ISC_STATUS_MODE) - { + if (status & ISC_STATUS_MODE) { /* we have entered isc mode */ str9xpec_info->isc_enable = 1; LOG_DEBUG("ISC_MODE Enabled"); @@ -127,8 +169,7 @@ static int str9xpec_isc_disable(struct flash_bank *bank) /* check ISC status */ status = str9xpec_isc_status(tap); - if (!(status & ISC_STATUS_MODE)) - { + if (!(status & ISC_STATUS_MODE)) { /* we have left isc mode */ str9xpec_info->isc_enable = 0; LOG_DEBUG("ISC_MODE Disabled"); @@ -156,7 +197,6 @@ static int str9xpec_read_config(struct flash_bank *bank) field.out_value = NULL; field.in_value = str9xpec_info->options; - jtag_add_dr_scan(tap, 1, &field, TAP_IDLE); jtag_execute_queue(); @@ -175,8 +215,7 @@ static int str9xpec_build_block_list(struct flash_bank *bank) uint32_t offset = 0; int b1_size = 0x2000; - switch (bank->size) - { + switch (bank->size) { case (256 * 1024): b0_sectors = 4; break; @@ -209,8 +248,7 @@ static int str9xpec_build_block_list(struct flash_bank *bank) num_sectors = 0; - for (i = 0; i < b0_sectors; i++) - { + for (i = 0; i < b0_sectors; i++) { bank->sectors[num_sectors].offset = offset; bank->sectors[num_sectors].size = 0x10000; offset += bank->sectors[i].size; @@ -219,8 +257,7 @@ static int str9xpec_build_block_list(struct flash_bank *bank) str9xpec_info->sector_bits[num_sectors++] = i; } - for (i = 0; i < b1_sectors; i++) - { + for (i = 0; i < b1_sectors; i++) { bank->sectors[num_sectors].offset = offset; bank->sectors[num_sectors].size = b1_size; offset += bank->sectors[i].size; @@ -237,15 +274,12 @@ static int str9xpec_build_block_list(struct flash_bank *bank) FLASH_BANK_COMMAND_HANDLER(str9xpec_flash_bank_command) { struct str9xpec_flash_controller *str9xpec_info; - struct arm *armv4_5 = NULL; + struct arm *arm = NULL; struct arm7_9_common *arm7_9 = NULL; struct arm_jtag *jtag_info = NULL; if (CMD_ARGC < 6) - { - LOG_WARNING("incomplete flash_bank str9x configuration"); - return ERROR_FLASH_BANK_INVALID; - } + return ERROR_COMMAND_SYNTAX_ERROR; str9xpec_info = malloc(sizeof(struct str9xpec_flash_controller)); bank->driver_priv = str9xpec_info; @@ -253,11 +287,12 @@ FLASH_BANK_COMMAND_HANDLER(str9xpec_flash_bank_command) /* 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; + arm = bank->target->arch_info; + arm7_9 = arm->arch_info; jtag_info = &arm7_9->jtag_info; - str9xpec_info->tap = bank->target->tap; + /* The core is the next tap after the flash controller in the chain */ + str9xpec_info->tap = jtag_tap_by_position(jtag_info->tap->abs_chain_position - 1); str9xpec_info->isc_enable = 0; str9xpec_build_block_list(bank); @@ -280,21 +315,18 @@ static int str9xpec_blank_check(struct flash_bank *bank, int first, int last) tap = str9xpec_info->tap; - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) str9xpec_isc_enable(bank); - } - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) return ERROR_FLASH_OPERATION_FAILED; - } buffer = calloc(DIV_ROUND_UP(64, 8), 1); LOG_DEBUG("blank check: first_bank: %i, last_bank: %i", first, last); - for (i = first; i <= last; i++) { + for (i = first; i <= last; i++) buf_set_u32(buffer, str9xpec_info->sector_bits[i], 1, 1); - } /* execute ISC_BLANK_CHECK command */ str9xpec_set_instr(tap, ISC_BLANK_CHECK, TAP_IRPAUSE); @@ -316,8 +348,7 @@ static int str9xpec_blank_check(struct flash_bank *bank, int first, int last) status = str9xpec_isc_status(tap); - for (i = first; i <= last; i++) - { + for (i = first; i <= last; i++) { if (buf_get_u32(buffer, str9xpec_info->sector_bits[i], 1)) bank->sectors[i].is_erased = 0; else @@ -342,8 +373,7 @@ static int str9xpec_protect_check(struct flash_bank *bank) status = str9xpec_read_config(bank); - for (i = 0; i < bank->num_sectors; i++) - { + for (i = 0; i < bank->num_sectors; i++) { if (buf_get_u32(str9xpec_info->options, str9xpec_info->sector_bits[i], 1)) bank->sectors[i].is_protected = 1; else @@ -367,13 +397,11 @@ static int str9xpec_erase_area(struct flash_bank *bank, int first, int last) tap = str9xpec_info->tap; - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) str9xpec_isc_enable(bank); - } - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) return ISC_STATUS_ERROR; - } buffer = calloc(DIV_ROUND_UP(64, 8), 1); @@ -381,21 +409,14 @@ static int str9xpec_erase_area(struct flash_bank *bank, int first, int last) /* last bank: 0xFF signals a full erase (unlock complete device) */ /* last bank: 0xFE signals a option byte erase */ - if (last == 0xFF) - { - for (i = 0; i < 64; i++) { + if (last == 0xFF) { + for (i = 0; i < 64; i++) buf_set_u32(buffer, i, 1, 1); - } - } - else if (last == 0xFE) - { + } else if (last == 0xFE) buf_set_u32(buffer, 49, 1, 1); - } - else - { - for (i = first; i <= last; i++) { + else { + for (i = first; i <= last; i++) buf_set_u32(buffer, str9xpec_info->sector_bits[i], 1, 1); - } } LOG_DEBUG("ISC_ERASE"); @@ -413,9 +434,8 @@ static int str9xpec_erase_area(struct flash_bank *bank, int first, int last) jtag_add_sleep(10); /* wait for erase completion */ - while (!((status = str9xpec_isc_status(tap)) & ISC_STATUS_BUSY)) { + while (!((status = str9xpec_isc_status(tap)) & ISC_STATUS_BUSY)) alive_sleep(1); - } free(buffer); @@ -446,13 +466,11 @@ static int str9xpec_lock_device(struct flash_bank *bank) str9xpec_info = bank->driver_priv; tap = str9xpec_info->tap; - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) str9xpec_isc_enable(bank); - } - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) return ISC_STATUS_ERROR; - } /* set security address */ str9xpec_set_address(bank, 0x80); @@ -501,22 +519,15 @@ static int str9xpec_protect(struct flash_bank *bank, int set, int first, int las LOG_DEBUG("protect: first_bank: %i, last_bank: %i", first, last); /* last bank: 0xFF signals a full device protect */ - if (last == 0xFF) - { + if (last == 0xFF) { if (set) - { status = str9xpec_lock_device(bank); - } - else - { + else { /* perform full erase to unlock device */ status = str9xpec_unlock_device(bank); } - } - else - { - for (i = first; i <= last; i++) - { + } else { + for (i = first; i <= last; i++) { if (set) buf_set_u32(str9xpec_info->options, str9xpec_info->sector_bits[i], 1, 1); else @@ -552,7 +563,7 @@ static int str9xpec_set_address(struct flash_bank *bank, uint8_t sector) return ERROR_OK; } -static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, +static int str9xpec_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count) { struct str9xpec_flash_controller *str9xpec_info = bank->driver_priv; @@ -570,28 +581,23 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, tap = str9xpec_info->tap; - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) str9xpec_isc_enable(bank); - } - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) return ERROR_FLASH_OPERATION_FAILED; - } - if (offset & 0x7) - { + if (offset & 0x7) { LOG_WARNING("offset 0x%" PRIx32 " breaks required 8-byte alignment", offset); return ERROR_FLASH_DST_BREAKS_ALIGNMENT; } - for (i = 0; i < bank->num_sectors; i++) - { + for (i = 0; i < bank->num_sectors; i++) { uint32_t sec_start = bank->sectors[i].offset; uint32_t sec_end = sec_start + bank->sectors[i].size; /* check if destination falls within the current sector */ - if ((check_address >= sec_start) && (check_address < sec_end)) - { + if ((check_address >= sec_start) && (check_address < sec_end)) { /* check if destination ends in the current sector */ if (offset + count < sec_end) check_address = offset + count; @@ -599,13 +605,11 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, 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; - } } if (check_address != offset + count) @@ -617,15 +621,13 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, LOG_DEBUG("ISC_PROGRAM"); - for (i = first_sector; i <= last_sector; i++) - { + for (i = first_sector; i <= last_sector; i++) { str9xpec_set_address(bank, str9xpec_info->sector_bits[i]); dwords_remaining = dwords_remaining < (bank->sectors[i].size/8) ? dwords_remaining : (bank->sectors[i].size/8); - while (dwords_remaining > 0) - { + while (dwords_remaining > 0) { str9xpec_set_instr(tap, ISC_PROGRAM, TAP_IRPAUSE); field.num_bits = 64; @@ -662,17 +664,11 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, } } - if (bytes_remaining) - { + if (bytes_remaining) { uint8_t last_dword[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - i = 0; - while (bytes_remaining > 0) - { - last_dword[i++] = *(buffer + bytes_written); - bytes_remaining--; - bytes_written++; - } + /* copy the last remaining bytes into the write buffer */ + memcpy(last_dword, buffer+bytes_written, bytes_remaining); str9xpec_set_instr(tap, ISC_PROGRAM, TAP_IRPAUSE); @@ -762,22 +758,13 @@ static int str9xpec_erase_check(struct flash_bank *bank) return str9xpec_blank_check(bank, 0, bank->num_sectors - 1); } -static int get_str9xpec_info(struct flash_bank *bank, char *buf, int buf_size) -{ - snprintf(buf, buf_size, "str9xpec flash driver info"); - return ERROR_OK; -} - COMMAND_HANDLER(str9xpec_handle_flash_options_read_command) { uint8_t status; struct str9xpec_flash_controller *str9xpec_info = NULL; if (CMD_ARGC < 1) - { - command_print(CMD_CTX, "str9xpec options_read "); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -840,13 +827,11 @@ static int str9xpec_write_options(struct flash_bank *bank) if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS) return status; - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) str9xpec_isc_enable(bank); - } - if (!str9xpec_info->isc_enable) { + if (!str9xpec_info->isc_enable) return ISC_STATUS_ERROR; - } /* according to data 64th bit has to be set */ buf_set_u32(str9xpec_info->options, 63, 1, 1); @@ -888,10 +873,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_write_command) uint8_t status; if (CMD_ARGC < 1) - { - command_print(CMD_CTX, "str9xpec options_write "); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -915,10 +897,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_cmap_command) struct str9xpec_flash_controller *str9xpec_info = NULL; if (CMD_ARGC < 2) - { - command_print(CMD_CTX, "str9xpec options_cmap "); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -928,13 +907,9 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_cmap_command) str9xpec_info = bank->driver_priv; if (strcmp(CMD_ARGV[1], "bank1") == 0) - { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_CSMAPBIT, 1, 1); - } else - { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_CSMAPBIT, 1, 0); - } return ERROR_OK; } @@ -944,10 +919,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_lvdthd_command) struct str9xpec_flash_controller *str9xpec_info = NULL; if (CMD_ARGC < 2) - { - command_print(CMD_CTX, "str9xpec options_lvdthd <2.4v | 2.7v>"); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -957,13 +929,9 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_lvdthd_command) str9xpec_info = bank->driver_priv; if (strcmp(CMD_ARGV[1], "2.7v") == 0) - { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDTHRESBIT, 1, 1); - } else - { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDTHRESBIT, 1, 0); - } return ERROR_OK; } @@ -973,10 +941,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_lvdsel_command) struct str9xpec_flash_controller *str9xpec_info = NULL; if (CMD_ARGC < 2) - { - command_print(CMD_CTX, "str9xpec options_lvdsel "); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -986,13 +951,9 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_lvdsel_command) str9xpec_info = bank->driver_priv; if (strcmp(CMD_ARGV[1], "vdd_vddq") == 0) - { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDSELBIT, 1, 1); - } else - { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDSELBIT, 1, 0); - } return ERROR_OK; } @@ -1002,10 +963,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_lvdwarn_command) struct str9xpec_flash_controller *str9xpec_info = NULL; if (CMD_ARGC < 2) - { - command_print(CMD_CTX, "str9xpec options_lvdwarn "); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -1015,13 +973,9 @@ COMMAND_HANDLER(str9xpec_handle_flash_options_lvdwarn_command) str9xpec_info = bank->driver_priv; if (strcmp(CMD_ARGV[1], "vdd_vddq") == 0) - { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDWARNBIT, 1, 1); - } else - { buf_set_u32(str9xpec_info->options, STR9XPEC_OPT_LVDWARNBIT, 1, 0); - } return ERROR_OK; } @@ -1031,10 +985,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_lock_command) uint8_t status; if (CMD_ARGC < 1) - { - command_print(CMD_CTX, "str9xpec lock "); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -1054,10 +1005,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_unlock_command) uint8_t status; if (CMD_ARGC < 1) - { - command_print(CMD_CTX, "str9xpec unlock "); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -1084,10 +1032,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_enable_turbo_command) struct str9xpec_flash_controller *str9xpec_info = NULL; if (CMD_ARGC < 1) - { - command_print(CMD_CTX, "str9xpec enable_turbo "); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -1096,27 +1041,30 @@ COMMAND_HANDLER(str9xpec_handle_flash_enable_turbo_command) str9xpec_info = bank->driver_priv; - tap0 = str9xpec_info->tap; - /* remove arm core from chain - enter turbo mode */ + tap0 = str9xpec_info->tap; + if (tap0 == NULL) { + /* things are *WRONG* */ + command_print(CMD_CTX, "**STR9FLASH** (tap0) invalid chain?"); + return ERROR_FAIL; + } tap1 = tap0->next_tap; - if (tap1 == NULL) - { + if (tap1 == NULL) { /* things are *WRONG* */ - command_print(CMD_CTX,"**STR9FLASH** (tap1) invalid chain?"); - return ERROR_OK; + command_print(CMD_CTX, "**STR9FLASH** (tap1) invalid chain?"); + return ERROR_FAIL; } tap2 = tap1->next_tap; - if (tap2 == NULL) - { + if (tap2 == NULL) { /* things are *WRONG* */ - command_print(CMD_CTX,"**STR9FLASH** (tap2) invalid chain?"); - return ERROR_OK; + command_print(CMD_CTX, "**STR9FLASH** (tap2) invalid chain?"); + return ERROR_FAIL; } /* enable turbo mode - TURBO-PROG-ENABLE */ str9xpec_set_instr(tap2, 0xD, TAP_IDLE); - if ((retval = jtag_execute_queue()) != ERROR_OK) + retval = jtag_execute_queue(); + if (retval != ERROR_OK) return retval; /* modify scan chain - str9 core has been removed */ @@ -1131,10 +1079,7 @@ COMMAND_HANDLER(str9xpec_handle_flash_disable_turbo_command) struct str9xpec_flash_controller *str9xpec_info = NULL; if (CMD_ARGC < 1) - { - command_print(CMD_CTX, "str9xpec disable_turbo "); - return ERROR_OK; - } + return ERROR_COMMAND_SYNTAX_ERROR; struct flash_bank *bank; int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank); @@ -1153,9 +1098,8 @@ COMMAND_HANDLER(str9xpec_handle_flash_disable_turbo_command) jtag_execute_queue(); /* restore previous scan chain */ - if (tap->next_tap) { + if (tap->next_tap) tap->next_tap->enabled = 1; - } return ERROR_OK; } @@ -1163,60 +1107,70 @@ COMMAND_HANDLER(str9xpec_handle_flash_disable_turbo_command) static const struct command_registration str9xpec_config_command_handlers[] = { { .name = "enable_turbo", + .usage = "", .handler = str9xpec_handle_flash_enable_turbo_command, .mode = COMMAND_EXEC, .help = "enable str9xpec turbo mode", }, { .name = "disable_turbo", + .usage = "", .handler = str9xpec_handle_flash_disable_turbo_command, .mode = COMMAND_EXEC, .help = "disable str9xpec turbo mode", }, { .name = "options_cmap", + .usage = " ", .handler = str9xpec_handle_flash_options_cmap_command, .mode = COMMAND_EXEC, .help = "configure str9xpec boot sector", }, { .name = "options_lvdthd", + .usage = " <2.4v | 2.7v>", .handler = str9xpec_handle_flash_options_lvdthd_command, .mode = COMMAND_EXEC, .help = "configure str9xpec lvd threshold", }, { .name = "options_lvdsel", + .usage = " ", .handler = str9xpec_handle_flash_options_lvdsel_command, .mode = COMMAND_EXEC, .help = "configure str9xpec lvd selection", }, { .name = "options_lvdwarn", + .usage = " ", .handler = str9xpec_handle_flash_options_lvdwarn_command, .mode = COMMAND_EXEC, .help = "configure str9xpec lvd warning", }, { .name = "options_read", + .usage = "", .handler = str9xpec_handle_flash_options_read_command, .mode = COMMAND_EXEC, .help = "read str9xpec options", }, { .name = "options_write", + .usage = "", .handler = str9xpec_handle_flash_options_write_command, .mode = COMMAND_EXEC, .help = "write str9xpec options", }, { .name = "lock", + .usage = "", .handler = str9xpec_handle_flash_lock_command, .mode = COMMAND_EXEC, .help = "lock str9xpec device", }, { .name = "unlock", + .usage = "", .handler = str9xpec_handle_flash_unlock_command, .mode = COMMAND_EXEC, .help = "unlock str9xpec device", @@ -1235,12 +1189,13 @@ static const struct command_registration str9xpec_command_handlers[] = { .name = "str9xpec", .mode = COMMAND_ANY, .help = "str9xpec flash command group", + .usage = "", .chain = str9xpec_config_command_handlers, }, COMMAND_REGISTRATION_DONE }; -struct flash_driver str9xpec_flash = { +const struct flash_driver str9xpec_flash = { .name = "str9xpec", .commands = str9xpec_command_handlers, .flash_bank_command = str9xpec_flash_bank_command, @@ -1252,5 +1207,5 @@ struct flash_driver str9xpec_flash = { .auto_probe = str9xpec_probe, .erase_check = str9xpec_erase_check, .protect_check = str9xpec_protect_check, - .info = get_str9xpec_info, + .free_driver_priv = default_flash_free_driver_priv, };