X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fjtag.c;h=f53bd26cf370e708bebe6145dd11f82ba04d1fa7;hb=8c21ca7e81d3408392e6691fc34cb793eb964749;hp=ec5578b745f3e1be153dde269051aaa270cd0b18;hpb=d7c4e1ec9370d6c053ad93967793383683175ed2;p=openocd.git diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c index ec5578b745..f53bd26cf3 100644 --- a/src/jtag/jtag.c +++ b/src/jtag/jtag.c @@ -428,15 +428,13 @@ void jtag_alloc_in_value32(scan_field_t *field) interface_jtag_alloc_in_value32(field); } -void jtag_add_ir_scan_noverify(int in_num_fields, const scan_field_t *in_fields, tap_state_t state) +void jtag_add_ir_scan_noverify(int in_count, const scan_field_t *in_fields, + tap_state_t state) { - int retval; jtag_prelude(state); - retval=interface_jtag_add_ir_scan(in_num_fields, in_fields, state); - if (retval!=ERROR_OK) - jtag_error=retval; - + int retval = interface_jtag_add_ir_scan(in_count, in_fields, state); + jtag_set_error(retval); } @@ -476,15 +474,14 @@ void jtag_add_ir_scan(int in_num_fields, scan_field_t *in_fields, tap_state_t st * This function assumes that the caller handles extra fields for bypassed TAPs * */ -void jtag_add_plain_ir_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state) +void jtag_add_plain_ir_scan(int in_num_fields, const scan_field_t *in_fields, + tap_state_t state) { - int retval; - jtag_prelude(state); - retval=interface_jtag_add_plain_ir_scan(in_num_fields, in_fields, state); - if (retval!=ERROR_OK) - jtag_error=retval; + int retval = interface_jtag_add_plain_ir_scan( + in_num_fields, in_fields, state); + jtag_set_error(retval); } void jtag_add_callback(jtag_callback1_t f, u8 *in) @@ -556,42 +553,34 @@ void jtag_add_dr_scan_check(int in_num_fields, scan_field_t *in_fields, tap_stat /** - * Generate a DR SCAN using the fields passed to the function - * - * For not bypassed TAPs the function checks in_fields and uses fields specified there. - * For bypassed TAPs the function generates a dummy 1bit field. - * - * The bypass status of TAPs is set by jtag_add_ir_scan(). - * + * Generate a DR SCAN using the fields passed to the function. + * For connected TAPs, the function checks in_fields and uses fields + * specified there. For bypassed TAPs, the function generates a dummy + * 1-bit field. The bypass status of TAPs is set by jtag_add_ir_scan(). */ -void jtag_add_dr_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state) +void jtag_add_dr_scan(int in_num_fields, const scan_field_t *in_fields, + tap_state_t state) { - int retval; - jtag_prelude(state); - retval=interface_jtag_add_dr_scan(in_num_fields, in_fields, state); - if (retval!=ERROR_OK) - jtag_error=retval; + int retval; + retval = interface_jtag_add_dr_scan(in_num_fields, in_fields, state); + jtag_set_error(retval); } - - /** - * Duplicate the scan fields passed into the function into a DR SCAN command - * - * This function assumes that the caller handles extra fields for bypassed TAPs - * + * Duplicate the scan fields passed into the function into a DR SCAN + * command. Unlike jtag_add_dr_scan(), this function assumes that the + * caller handles extra fields for bypassed TAPs. */ -void jtag_add_plain_dr_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state) +void jtag_add_plain_dr_scan(int in_num_fields, const scan_field_t *in_fields, + tap_state_t state) { - int retval; - jtag_prelude(state); - retval=interface_jtag_add_plain_dr_scan(in_num_fields, in_fields, state); - if (retval!=ERROR_OK) - jtag_error=retval; + int retval; + retval = interface_jtag_add_plain_dr_scan(in_num_fields, in_fields, state); + jtag_set_error(retval); } void jtag_add_dr_out(jtag_tap_t* tap, @@ -610,20 +599,13 @@ void jtag_add_dr_out(jtag_tap_t* tap, void jtag_add_tlr(void) { jtag_prelude(TAP_RESET); - - int retval; - retval=interface_jtag_add_tlr(); - if (retval!=ERROR_OK) - jtag_error=retval; - + jtag_set_error(interface_jtag_add_tlr()); jtag_call_event_callbacks(JTAG_TRST_ASSERTED); } void jtag_add_pathmove(int num_states, const tap_state_t *path) { tap_state_t cur_state = cmd_queue_cur_state; - int i; - int retval; /* the last state has to be a stable state */ if (!tap_is_state_stable(path[num_states - 1])) @@ -632,7 +614,7 @@ void jtag_add_pathmove(int num_states, const tap_state_t *path) exit(-1); } - for (i=0; i %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[i])); + LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", + tap_state_name(cur_state), tap_state_name(path[i])); exit(-1); } cur_state = path[i]; @@ -651,51 +634,37 @@ void jtag_add_pathmove(int num_states, const tap_state_t *path) jtag_checks(); - retval = interface_jtag_add_pathmove(num_states, path); + jtag_set_error(interface_jtag_add_pathmove(num_states, path)); cmd_queue_cur_state = path[num_states - 1]; - if (retval!=ERROR_OK) - jtag_error=retval; } void jtag_add_runtest(int num_cycles, tap_state_t state) { - int retval; - jtag_prelude(state); - - /* executed by sw or hw fifo */ - retval=interface_jtag_add_runtest(num_cycles, state); - if (retval!=ERROR_OK) - jtag_error=retval; + jtag_set_error(interface_jtag_add_runtest(num_cycles, state)); } -void jtag_add_clocks( int num_cycles ) +void jtag_add_clocks(int num_cycles) { - int retval; - - if( !tap_is_state_stable(cmd_queue_cur_state) ) + if (!tap_is_state_stable(cmd_queue_cur_state)) { - LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"", - tap_state_name(cmd_queue_cur_state) ); - jtag_error = ERROR_JTAG_NOT_STABLE_STATE; + LOG_ERROR("jtag_add_clocks() called with TAP in unstable state \"%s\"", + tap_state_name(cmd_queue_cur_state)); + jtag_set_error(ERROR_JTAG_NOT_STABLE_STATE); return; } - if( num_cycles > 0 ) + if (num_cycles > 0) { jtag_checks(); - - retval = interface_jtag_add_clocks(num_cycles); - if (retval != ERROR_OK) - jtag_error=retval; + jtag_set_error(interface_jtag_add_clocks(num_cycles)); } } void jtag_add_reset(int req_tlr_or_trst, int req_srst) { int trst_with_tlr = 0; - int retval; /* FIX!!! there are *many* different cases here. A better * approach is needed for legal combinations of transitions... @@ -719,7 +688,7 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst) if (((jtag_reset_config & RESET_SRST_PULLS_TRST) && (req_srst == 1)) && (!req_tlr_or_trst)) { LOG_ERROR("BUG: requested reset would assert trst"); - jtag_error=ERROR_FAIL; + jtag_set_error(ERROR_FAIL); return; } @@ -732,7 +701,7 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst) if (req_srst && !(jtag_reset_config & RESET_HAS_SRST)) { LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this"); - jtag_error=ERROR_FAIL; + jtag_set_error(ERROR_FAIL); return; } @@ -752,10 +721,10 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst) jtag_srst = req_srst; - retval = interface_jtag_add_reset(jtag_trst, jtag_srst); - if (retval!=ERROR_OK) + int retval = interface_jtag_add_reset(jtag_trst, jtag_srst); + if (retval != ERROR_OK) { - jtag_error=retval; + jtag_set_error(retval); return; } jtag_execute_queue(); @@ -903,17 +872,8 @@ int default_interface_jtag_execute_queue(void) void jtag_execute_queue_noclear(void) { - /* each flush can take as much as 1-2ms on high bandwidth low latency interfaces. - * E.g. a JTAG over TCP/IP or USB.... - */ jtag_flush_queue_count++; - - int retval=interface_jtag_execute_queue(); - /* we keep the first error */ - if ((jtag_error==ERROR_OK)&&(retval!=ERROR_OK)) - { - jtag_error=retval; - } + jtag_set_error(interface_jtag_execute_queue()); } int jtag_get_flush_queue_count(void) @@ -923,11 +883,8 @@ int jtag_get_flush_queue_count(void) int jtag_execute_queue(void) { - int retval; jtag_execute_queue_noclear(); - retval=jtag_error; - jtag_error=ERROR_OK; - return retval; + return jtag_error_clear(); } static int jtag_reset_callback(enum jtag_event event, void *priv) @@ -2115,24 +2072,22 @@ next: static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - if (argc != 1) - { - LOG_ERROR("jtag_nsrst_delay -- command requires one argument"); + if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; - } - jtag_set_nsrst_delay(strtoul(args[0], NULL, 0)); + if (argc == 1) + jtag_set_nsrst_delay(strtoul(args[0], NULL, 0)); + command_print(cmd_ctx, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay()); return ERROR_OK; } static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - if (argc != 1) - { - LOG_ERROR("jtag_ntrst_delay -- command requires one argument"); + if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; - } - jtag_set_ntrst_delay(strtoul(args[0], NULL, 0)); + if (argc == 1) + jtag_set_ntrst_delay(strtoul(args[0], NULL, 0)); + command_print(cmd_ctx, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay()); return ERROR_OK; } @@ -2205,33 +2160,27 @@ static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, } -static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, + char *cmd, char **args, int argc) { - int trst = -1; - int srst = -1; - - if (argc < 2) - { + if (argc != 2) return ERROR_COMMAND_SYNTAX_ERROR; - } + int trst = -1; if (args[0][0] == '1') trst = 1; else if (args[0][0] == '0') trst = 0; else - { return ERROR_COMMAND_SYNTAX_ERROR; - } + int srst = -1; if (args[1][0] == '1') srst = 1; else if (args[1][0] == '0') srst = 0; else - { return ERROR_COMMAND_SYNTAX_ERROR; - } if (jtag_interface_init(cmd_ctx) != ERROR_OK) return ERROR_JTAG_INIT_FAILED; @@ -2242,18 +2191,16 @@ static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cm return ERROR_OK; } -static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int handle_runtest_command(struct command_context_s *cmd_ctx, + char *cmd, char **args, int argc) { - if (argc < 1) - { + if (argc != 1) return ERROR_COMMAND_SYNTAX_ERROR; - } jtag_add_runtest(strtol(args[0], NULL, 0), jtag_get_end_state()); jtag_execute_queue(); return ERROR_OK; - } /* @@ -2709,9 +2656,15 @@ void jtag_set_nsrst_delay(unsigned delay) { jtag_nsrst_delay = delay; } +unsigned jtag_get_nsrst_delay(void) +{ + return jtag_nsrst_delay; +} void jtag_set_ntrst_delay(unsigned delay) { jtag_ntrst_delay = delay; } - - +unsigned jtag_get_ntrst_delay(void) +{ + return jtag_ntrst_delay; +}