X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fdummy.c;h=49161a607c80b0dd6dd198348ecb1b75f4aac35f;hb=1c28cbab0241b400cc7a7fc2e3f7170b0c7a952e;hp=0565edafb098953d8f84d75d10d7c2b0e705bfee;hpb=0cba0d4df3fe120f08945703506f8405760325c9;p=openocd.git diff --git a/src/jtag/dummy.c b/src/jtag/dummy.c index 0565edafb0..49161a607c 100644 --- a/src/jtag/dummy.c +++ b/src/jtag/dummy.c @@ -26,32 +26,49 @@ #include "jtag.h" #include "bitbang.h" -int dummy_speed(int speed); -int dummy_register_commands(struct command_context_s *cmd_ctx); -int dummy_init(void); -int dummy_quit(void); -/* The dummy driver is used to easily check the code path +/* my private tap controller state, which tracks state for calling code */ +static tap_state_t dummy_state = TAP_RESET; + +static int dummy_clock; /* edge detector */ + +static int clock_count; /* count clocks in any stable state, only stable states */ + +static u32 dummy_data; + + +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); + + +/* The dummy driver is used to easily check the code path * where the target is unresponsive. */ -jtag_interface_t dummy_interface = +jtag_interface_t dummy_interface = { .name = "dummy", - + .execute_queue = bitbang_execute_queue, - .speed = dummy_speed, + .speed = dummy_speed, .register_commands = dummy_register_commands, + .khz = dummy_khz, + .speed_div = dummy_speed_div, + .init = dummy_init, .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, @@ -59,41 +76,111 @@ 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 ) + { + tap_state_t old_state = dummy_state; + dummy_state = tap_state_transition( old_state, tms ); + + if( old_state != 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; + + if (trst || (srst && (jtag_reset_config & RESET_SRST_PULLS_TRST))) + dummy_state = TAP_RESET; + + LOG_DEBUG("reset to: %s", tap_state_name(dummy_state) ); } -int dummy_speed(int speed) +static int dummy_khz(int khz, int *jtag_speed) { + if (khz==0) + { + *jtag_speed=0; + } + else + { + *jtag_speed=64000/khz; + } return ERROR_OK; } -int dummy_register_commands(struct command_context_s *cmd_ctx) +static int dummy_speed_div(int speed, int *khz) { + if (speed==0) + { + *khz = 0; + } + else + { + *khz=64000/speed; + } + return ERROR_OK; } -int dummy_init(void) +static int dummy_speed(int speed) { - bitbang_interface = &dummy_bitbang; + return ERROR_OK; +} +static int dummy_register_commands(struct command_context_s *cmd_ctx) +{ return ERROR_OK; } -int dummy_quit(void) +static int dummy_init(void) { + bitbang_interface = &dummy_bitbang; + return ERROR_OK; } -void dummy_led(int on) +static int dummy_quit(void) { + return ERROR_OK; } + +static void dummy_led(int on) +{ +} +