X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fdummy.c;h=49161a607c80b0dd6dd198348ecb1b75f4aac35f;hb=1c28cbab0241b400cc7a7fc2e3f7170b0c7a952e;hp=bfdf0dcccfe37c757b8248f85d5c0ad19f96fb68;hpb=99fe9c819cb7b78ec325be82d955371ca8fb5e70;p=openocd.git diff --git a/src/jtag/dummy.c b/src/jtag/dummy.c index bfdf0dcccf..49161a607c 100644 --- a/src/jtag/dummy.c +++ b/src/jtag/dummy.c @@ -32,13 +32,15 @@ static tap_state_t dummy_state = TAP_RESET; static int dummy_clock; /* edge detector */ -static tap_state_t tap_state_transition(tap_state_t cur_state, int tms); +static int clock_count; /* count clocks in any stable state, only stable states */ +static u32 dummy_data; -int dummy_speed(int speed); -int dummy_register_commands(struct command_context_s *cmd_ctx); -int dummy_init(void); -int dummy_quit(void); + +static int dummy_speed(int speed); +static int dummy_register_commands(struct command_context_s *cmd_ctx); +static int dummy_init(void); +static int dummy_quit(void); static int dummy_khz(int khz, int *jtag_speed); static int dummy_speed_div(int speed, int *khz); @@ -61,12 +63,12 @@ jtag_interface_t dummy_interface = .quit = dummy_quit, }; -int dummy_read(void); -void dummy_write(int tck, int tms, int tdi); -void dummy_reset(int trst, int srst); -void dummy_led(int on); +static int dummy_read(void); +static void dummy_write(int tck, int tms, int tdi); +static void dummy_reset(int trst, int srst); +static void dummy_led(int on); -bitbang_interface_t dummy_bitbang = +static bitbang_interface_t dummy_bitbang = { .read = dummy_read, .write = dummy_write, @@ -74,33 +76,59 @@ bitbang_interface_t dummy_bitbang = .blink = dummy_led }; -int dummy_read(void) +static int dummy_read(void) { - return 1; + int data = 1 & dummy_data; + dummy_data = (dummy_data >> 1) | (1<<31); + return data; } -void dummy_write(int tck, int tms, int tdi) +static void dummy_write(int tck, int tms, int tdi) { /* TAP standard: "state transitions occur on rising edge of clock" */ if( tck != dummy_clock ) { if( tck ) { - int old_state = dummy_state; - dummy_state = tap_state_transition( dummy_state, tms ); + tap_state_t old_state = dummy_state; + dummy_state = tap_state_transition( old_state, tms ); + if( old_state != dummy_state ) - LOG_DEBUG( "dummy_tap=%s", jtag_state_name(dummy_state) ); + { + if( clock_count ) + { + LOG_DEBUG("dummy_tap: %d stable clocks", clock_count); + clock_count = 0; + } + + LOG_DEBUG("dummy_tap: %s", tap_state_name(dummy_state) ); + +#if defined(DEBUG) + if(dummy_state == TAP_DRCAPTURE) + dummy_data = 0x01255043; +#endif + } + else + { + /* this is a stable state clock edge, no change of state here, + * simply increment clock_count for subsequent logging + */ + ++clock_count; + } } dummy_clock = tck; } } -void dummy_reset(int trst, int srst) +static void dummy_reset(int trst, int srst) { dummy_clock = 0; - dummy_state = TAP_RESET; - LOG_DEBUG( "reset to %s", jtag_state_name(dummy_state) ); + + if (trst || (srst && (jtag_reset_config & RESET_SRST_PULLS_TRST))) + dummy_state = TAP_RESET; + + LOG_DEBUG("reset to: %s", tap_state_name(dummy_state) ); } static int dummy_khz(int khz, int *jtag_speed) @@ -130,132 +158,29 @@ static int dummy_speed_div(int speed, int *khz) return ERROR_OK; } -int dummy_speed(int speed) +static int dummy_speed(int speed) { return ERROR_OK; } -int dummy_register_commands(struct command_context_s *cmd_ctx) +static int dummy_register_commands(struct command_context_s *cmd_ctx) { return ERROR_OK; } -int dummy_init(void) +static int dummy_init(void) { bitbang_interface = &dummy_bitbang; return ERROR_OK; } -int dummy_quit(void) +static int dummy_quit(void) { return ERROR_OK; } -void dummy_led(int on) +static void dummy_led(int on) { } - -/** - * Function tap_state_transition - * takes a current TAP state and returns the next state according to the tms value. - * - * Even though there is code to duplicate this elsewhere, we do it here a little - * differently just to get a second opinion, i.e. a verification, on state tracking - * in that other logic. Plus array lookups without index checking are no favorite thing. - * This is educational for developers new to TAP controllers. - */ -static tap_state_t tap_state_transition(tap_state_t cur_state, int tms) -{ - tap_state_t new_state; - - if (tms) - { - switch (cur_state) - { - case TAP_RESET: - new_state = cur_state; - break; - case TAP_IDLE: - case TAP_DRUPDATE: - case TAP_IRUPDATE: - new_state = TAP_DRSELECT; - break; - case TAP_DRSELECT: - new_state = TAP_IRSELECT; - break; - case TAP_DRCAPTURE: - case TAP_DRSHIFT: - new_state = TAP_DREXIT1; - break; - case TAP_DREXIT1: - case TAP_DREXIT2: - new_state = TAP_DRUPDATE; - break; - case TAP_DRPAUSE: - new_state = TAP_DREXIT2; - break; - case TAP_IRSELECT: - new_state = TAP_RESET; - break; - case TAP_IRCAPTURE: - case TAP_IRSHIFT: - new_state = TAP_IREXIT1; - break; - case TAP_IREXIT1: - case TAP_IREXIT2: - new_state = TAP_IRUPDATE; - break; - case TAP_IRPAUSE: - new_state = TAP_IREXIT2; - break; - default: - LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state ); - exit(1); - break; - } - } - else - { - switch (cur_state) - { - case TAP_RESET: - case TAP_IDLE: - case TAP_DRUPDATE: - case TAP_IRUPDATE: - new_state = TAP_IDLE; - break; - case TAP_DRSELECT: - new_state = TAP_DRCAPTURE; - break; - case TAP_DRCAPTURE: - case TAP_DRSHIFT: - case TAP_DREXIT2: - new_state = TAP_DRSHIFT; - break; - case TAP_DREXIT1: - case TAP_DRPAUSE: - new_state = TAP_DRPAUSE; - break; - case TAP_IRSELECT: - new_state = TAP_IRCAPTURE; - break; - case TAP_IRCAPTURE: - case TAP_IRSHIFT: - case TAP_IREXIT2: - new_state = TAP_IRSHIFT; - break; - case TAP_IREXIT1: - case TAP_IRPAUSE: - new_state = TAP_IRPAUSE; - break; - default: - LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state ); - exit(1); - break; - } - } - - return new_state; -}