int str9xpec_handle_flash_unlock_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { u8 status; flash_bank_t *bank; if (argc < 1) { 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; } status = str9xpec_unlock_device(bank); if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS) return ERROR_FLASH_OPERATION_FAILED; return ERROR_OK; }
int str9xpec_handle_flash_options_lvdwarn_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *bank; str9xpec_flash_controller_t *str9xpec_info = NULL; if (argc < 2) { 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; } str9xpec_info = bank->driver_priv; if (strcmp(args[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; }
int str9xpec_handle_flash_options_read_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *bank; u8 status; str9xpec_flash_controller_t *str9xpec_info = NULL; if (argc < 1) { 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; } str9xpec_info = bank->driver_priv; status = str9xpec_read_config(bank); if ((status & ISC_STATUS_ERROR) != STR9XPEC_ISC_SUCCESS) return ERROR_FLASH_OPERATION_FAILED; /* boot bank */ if (buf_get_u32(str9xpec_info->options, STR9XPEC_OPT_CSMAPBIT, 1)) command_print(cmd_ctx, "CS Map: bank1"); else 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"); else 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"); else 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"); else 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"); else command_print(cmd_ctx, "LVD Reset Selection: VDD Input Only"); return ERROR_OK; }
int str9xpec_handle_flash_enable_turbo_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { 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; } 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; } str9xpec_info = bank->driver_priv; tap0 = str9xpec_info->tap; /* remove arm core from chain - enter turbo mode */ tap1 = tap0->next_tap; if (tap1 == NULL) { /* things are *WRONG* */ 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?"); return ERROR_OK; } /* enable turbo mode - TURBO-PROG-ENABLE */ str9xpec_set_instr(tap2, 0xD, TAP_IDLE); if ((retval = jtag_execute_queue()) != ERROR_OK) return retval; /* modify scan chain - str9 core has been removed */ tap1->enabled = 0; return ERROR_OK; }
int str9xpec_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *bank; scan_field_t field; u8 *buffer = NULL; jtag_tap_t *tap; u32 idcode; str9xpec_flash_controller_t *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; } str9xpec_info = bank->driver_priv; tap = str9xpec_info->tap; buffer = calloc(CEIL(32, 8), 1); str9xpec_set_instr(tap, ISC_IDCODE, TAP_IRPAUSE); field.tap = tap; field.num_bits = 32; field.out_value = NULL; field.out_mask = NULL; field.in_value = buffer; field.in_check_value = NULL; field.in_check_mask = NULL; field.in_handler = NULL; field.in_handler_priv = NULL; jtag_add_dr_scan(1, &field, TAP_IDLE); jtag_execute_queue(); idcode = buf_get_u32(buffer, 0, 32); command_print(cmd_ctx, "str9xpec part id: 0x%8.8x", idcode); free(buffer); return ERROR_OK; }
COMMAND_HELPER(flash_command_get_bank, unsigned name_index, struct flash_bank **bank) { const char *name = CMD_ARGV[name_index]; int retval = get_flash_bank_by_name(name, bank); if (retval != ERROR_OK) return retval; if (*bank) return ERROR_OK; unsigned bank_num; COMMAND_PARSE_NUMBER(uint, name, bank_num); return get_flash_bank_by_num(bank_num, bank); }
COMMAND_HELPER(flash_command_get_bank, unsigned name_index, struct flash_bank **bank) { const char *name = CMD_ARGV[name_index]; *bank = get_flash_bank_by_name(name); if (*bank) return ERROR_OK; unsigned bank_num; COMMAND_PARSE_NUMBER(uint, name, bank_num); *bank = get_flash_bank_by_num(bank_num); if (!*bank) { command_print(CMD_CTX, "flash bank '%s' not found", name); return ERROR_INVALID_ARGUMENTS; } return ERROR_OK; }
int str9xpec_handle_flash_disable_turbo_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { flash_bank_t *bank; jtag_tap_t *tap; str9xpec_flash_controller_t *str9xpec_info = NULL; if (argc < 1) { 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; } str9xpec_info = bank->driver_priv; tap = str9xpec_info->tap; if (tap == NULL) return ERROR_FAIL; /* exit turbo mode via RESET */ str9xpec_set_instr(tap, ISC_NOOP, TAP_RESET); jtag_execute_queue(); /* restore previous scan chain */ if (tap->next_tap) { tap->next_tap->enabled = 1; } return ERROR_OK; }