X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Finterface.c;h=e83a772336c70ea57ccebbff4a8b3cac4d6dd6c8;hb=5535399a46deb2de685d743af1726c78720d8b84;hp=be85f98e3835241dcd316399758c38e47832a539;hpb=50c086ffb94f199c088f4cc52b7887b668dddf00;p=openocd.git diff --git a/src/jtag/interface.c b/src/jtag/interface.c index be85f98e38..e83a772336 100644 --- a/src/jtag/interface.c +++ b/src/jtag/interface.c @@ -2,7 +2,7 @@ * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * * * - * Copyright (C) 2007,2008 Øyvind Harboe * + * Copyright (C) 2007,2008 Øyvind Harboe * * oyvind.harboe@zylin.com * * * * Copyright (C) 2009 SoftPLC Corporation * @@ -40,7 +40,7 @@ */ static tap_state_t state_follower = TAP_RESET; -void tap_set_state_impl( tap_state_t new_state ) +void tap_set_state_impl(tap_state_t new_state) { /* this is the state we think the TAPs are in now, was cur_state */ state_follower = new_state; @@ -57,7 +57,7 @@ tap_state_t tap_get_state() */ static tap_state_t end_state_follower = TAP_RESET; -void tap_set_end_state( tap_state_t new_end_state ) +void tap_set_end_state(tap_state_t new_end_state) { /* this is the state we think the TAPs will be in at completion of the current TAP operation, was end_state @@ -71,13 +71,13 @@ tap_state_t tap_get_end_state() } -int tap_move_ndx( tap_state_t astate ) +int tap_move_ndx(tap_state_t astate) { /* given a stable state, return the index into the tms_seqs[] array within tap_get_tms_path() */ int ndx; - switch( astate ) + switch (astate) { case TAP_RESET: ndx = 0; break; case TAP_DRSHIFT: ndx = 2; break; @@ -86,7 +86,7 @@ int tap_move_ndx( tap_state_t astate ) case TAP_IRSHIFT: ndx = 4; break; case TAP_IRPAUSE: ndx = 5; break; default: - LOG_ERROR( "fatal: unstable state \"%s\" used in tap_move_ndx()", tap_state_name(astate) ); + LOG_ERROR("fatal: unstable state \"%s\" used in tap_move_ndx()", tap_state_name(astate)); exit(1); } @@ -118,14 +118,14 @@ struct tms_sequences #define HEX__(n) 0x##n##LU #define B8__(x) \ - (((x) & 0x0000000FLU)?(1<<0):0) \ - +(((x) & 0x000000F0LU)?(1<<1):0) \ - +(((x) & 0x00000F00LU)?(1<<2):0) \ - +(((x) & 0x0000F000LU)?(1<<3):0) \ - +(((x) & 0x000F0000LU)?(1<<4):0) \ - +(((x) & 0x00F00000LU)?(1<<5):0) \ - +(((x) & 0x0F000000LU)?(1<<6):0) \ - +(((x) & 0xF0000000LU)?(1<<7):0) + (((x) & 0x0000000FLU)?(1 << 0):0) \ + +(((x) & 0x000000F0LU)?(1 << 1):0) \ + +(((x) & 0x00000F00LU)?(1 << 2):0) \ + +(((x) & 0x0000F000LU)?(1 << 3):0) \ + +(((x) & 0x000F0000LU)?(1 << 4):0) \ + +(((x) & 0x00F00000LU)?(1 << 5):0) \ + +(((x) & 0x0F000000LU)?(1 << 6):0) \ + +(((x) & 0xF0000000LU)?(1 << 7):0) #define B8(bits,count) { ((uint8_t)B8__(HEX__(bits))), (count) } @@ -133,13 +133,10 @@ static const struct tms_sequences old_tms_seqs[6][6] = /* [from_state_ndx][to_ { /* value clocked to TMS to move from one of six stable states to another. * N.B. OOCD clocks TMS from LSB first, so read these right-to-left. - * N.B. These values are tightly bound to the table in tap_get_tms_path_len(). * N.B. Reset only needs to be 0b11111, but in JLink an even byte of 1's is more stable. * These extra ones cause no TAP state problem, because we go into reset and stay in reset. */ - - /* to state: */ /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */ { B8(1111111,7), B8(0000000,7), B8(0010111,7), B8(0001010,7), B8(0011011,7), B8(0010110,7) }, /* RESET */ @@ -168,24 +165,33 @@ static const struct tms_sequences short_tms_seqs[6][6] = /* [from_state_ndx][t state specific comments: ------------------------ - *->RESET tried the 5 bit reset and it gave me problems, 7 bits seems to + *->RESET tried the 5 bit reset and it gave me problems, 7 bits seems to work better on ARM9 with ft2232 driver. (Dick) RESET->DRSHIFT add 1 extra clock cycles in the RESET state before advancing. needed on ARM9 with ft2232 driver. (Dick) + (For a total of *THREE* extra clocks in RESET; NOP.) RESET->IRSHIFT add 1 extra clock cycles in the RESET state before advancing. needed on ARM9 with ft2232 driver. (Dick) + (For a total of *TWO* extra clocks in RESET; NOP.) + + RESET->* always adds one or more clocks in the target state, + which should be NOPS; except shift states which (as + noted above) add those clocks in RESET. + + The X-to-X transitions always add clocks; from *SHIFT, they go + via IDLE and thus *DO HAVE SIDE EFFECTS* (capture and update). */ /* to state: */ - /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */ - { B8(1111111,7), B8(0000000,7), B8(0010111,7), B8(0001010,7), B8(0011011,7), B8(0010110,7) }, /* RESET */ - { B8(1111111,7), B8(0000000,7), B8(001,3), B8(0101,4), B8(0011,4), B8(01011,5) }, /* IDLE */ - { B8(1111111,7), B8(011,3), B8(00111,5), B8(01,2), B8(001111,6), B8(0101111,7) }, /* DRSHIFT */ - { B8(1111111,7), B8(011,3), B8(01,2), B8(0,1), B8(001111,6), B8(0101111,7) }, /* DRPAUSE */ - { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(001111,6), B8(01,2) }, /* IRSHIFT */ - { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(01,2), B8(0,1) } /* IRPAUSE */ + /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */ + { B8(1111111,7), B8(0000000,7), B8(0010111,7), B8(0001010,7), B8(0011011,7), B8(0010110,7) }, /* RESET */ + { B8(1111111,7), B8(0000000,7), B8(001,3), B8(0101,4), B8(0011,4), B8(01011,5) }, /* IDLE */ + { B8(1111111,7), B8(011,3), B8(00111,5), B8(01,2), B8(001111,6), B8(0101111,7) }, /* DRSHIFT */ + { B8(1111111,7), B8(011,3), B8(01,2), B8(0,1), B8(001111,6), B8(0101111,7) }, /* DRPAUSE */ + { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(001111,6), B8(01,2) }, /* IRSHIFT */ + { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(01,2), B8(0,1)} /* IRPAUSE */ }; @@ -193,13 +199,13 @@ typedef const struct tms_sequences tms_table[6][6]; static tms_table *tms_seqs=&short_tms_seqs; -int tap_get_tms_path( tap_state_t from, tap_state_t to ) +int tap_get_tms_path(tap_state_t from, tap_state_t to) { return (*tms_seqs)[tap_move_ndx(from)][tap_move_ndx(to)].bits; } -int tap_get_tms_path_len( tap_state_t from, tap_state_t to ) +int tap_get_tms_path_len(tap_state_t from, tap_state_t to) { return (*tms_seqs)[tap_move_ndx(from)][tap_move_ndx(to)].bit_count; } @@ -209,10 +215,10 @@ bool tap_is_state_stable(tap_state_t astate) { bool is_stable; - /* A switch() is used because it is symbol dependent + /* A switch () is used because it is symbol dependent (not value dependent like an array), and can also check bounds. */ - switch( astate ) + switch (astate) { case TAP_RESET: case TAP_IDLE: @@ -278,7 +284,7 @@ tap_state_t tap_state_transition(tap_state_t cur_state, bool tms) new_state = TAP_IREXIT2; break; default: - LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state ); + LOG_ERROR("fatal: invalid argument cur_state=%d", cur_state); exit(1); break; } @@ -318,7 +324,7 @@ tap_state_t tap_state_transition(tap_state_t cur_state, bool tms) new_state = TAP_IRPAUSE; break; default: - LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state ); + LOG_ERROR("fatal: invalid argument cur_state=%d", cur_state); exit(1); break; } @@ -331,7 +337,7 @@ const char* tap_state_name(tap_state_t state) { const char* ret; - switch( state ) + switch (state) { case TAP_RESET: ret = "RESET"; break; case TAP_IDLE: ret = "RUN/IDLE"; break; @@ -359,9 +365,9 @@ tap_state_t tap_state_by_name(const char *name) { tap_state_t x; - for( x = 0 ; x < TAP_NUM_STATES ; x++ ){ + for (x = 0 ; x < TAP_NUM_STATES ; x++) { /* be nice to the human */ - if ( 0 == strcasecmp( name, tap_state_name(x) ) ){ + if (0 == strcasecmp(name, tap_state_name(x))) { return x; } } @@ -403,9 +409,9 @@ tap_state_t jtag_debug_state_machine(const void *tms_buf, const void *tdi_buf, DEBUG_JTAG_IO("TAP/SM: TMS bits: %u (bytes: %u)", tap_bits, tap_bytes); tap_out_bits = 0; - for(cur_byte = 0; cur_byte < tap_bytes; cur_byte++) + for (cur_byte = 0; cur_byte < tap_bytes; cur_byte++) { - for(cur_bit = 0; cur_bit < 8; cur_bit++) + for (cur_bit = 0; cur_bit < 8; cur_bit++) { // make sure we do not run off the end of the buffers unsigned tap_bit = cur_byte * 8 + cur_bit;