Duane Ellis wrote:
> All,
>
> I'm working on the patch that Jeff Williams did that updates the way the 
> TMS path sequences work and have discovered an issue with the FT2232 driver.
>
> Right now, I believe I can show that given the same sets of scan 
> commands - the ft2232 driver does not follow the same tap sequence that 
> other dongles follow.
> I also see this with my cheap-usb-logic-analyzer.
>
> I believe: Two dongles in theory, if given the same sets of commands, 
> should generate the same basic tap state sequences.
>
> To do otherwise is a bug.
>   
I agree.
> I'd like some comments, second opinion, etc, ie: Am I correct? Or am I 
> missing something?
>   

The remainder of your email references a patch that was never accepted 
into the tree.   And I do not think it should be accepted, at least as is.

If this difference in behavior exists in the current HEAD, please 
correct me soon, because I am working on the ft232 stuff starting 
today.  But I think we have to assume that I am only interested in what 
is in the HEAD at this moment.


Dick


> ====
>
> The example place is: jtag_init_inner() - which is called when OpenOCD 
> first starts up.
>
> Which:
> (a) calls jtag_add_tlr()  [putting all taps in reset]
> (b) calls jtag_examine_chain()
> (c) then calls jtag_validate_chain()
>
> When jtag_examine_chain() runs, it basically does a DRSCAN of (N*32) 
> bits to look for TAP IDs.
>
> ====
>
> If you compare the generated wave forms and thus the TAP sequence the 
> JLINK driver uses - vrs the FT2232 sequence, they are different.
>
> I believe what follows is the reason.
>
> ====
>
> For JLINK see: jlink.c - line 417, function jlink_scan(), which does this:
>     (a) if needed move to the IR-SHIFT or DR-SHIFT state (line: 427)
>     (b) Calls jlink_tap_append_scan() - which always leaves the tap in 
> "exit1-ir/dr"
>     (c) The last step @ line 639 transitions to exit1-IR/DR
>     (d) Then always transitions to the ir/dr-pause state (line: 434)
>
> Hence, all jlink IR/DR scans *always* exit via:  SHIFT -> EXIT1 -> PAUSE.
> The "bitbang" (parallel ports) seem to do the same as jlink.
> I believe others do the same thing.
>
> ====
>
> In contrast, the FT2232 driver does something different.
>     (a) switch() statement @ line 1452 - does an "absurd" check.
>          ie: If the current scan is > 128K bytes long...
>     (b) line 1484 - calls ft2232_add_scan() - which
>     (c) line 600 - moves to IR/DR shift if needed.
>     (d) line 623 - loops - over large shift sequences
>     (e) line 673 - deals with the trailing bits.
> And at this point - it is different, it only occurs if the transition is 
> to another state
>     (f)  At line ft2232.c line 737 - is the issue.
>        The last else{} in the file - calls tap_get_tms_path()
>        That function returns the TMS sequence to the next state.
>         In this case, it is to RESET, which is 0x7F
>
> Hence, it is different.
> For example - if it was an IR shift, path is IR-SHIFT -> EXIT1 -> 
> UPDATE-IR without traversing PAUSE-IR, or EXIT2-IR
>
> But it is also different if it was to goto another state, ie: SHIFT-IR 
> to SHIFT-DR ...
>
> ====
>
> Interestingly, the TMS paths - happens to be the same.
>
> ie: If the traversal was:  shift-ir -> move to shift-dir ...
>
> The ft2232 would then generate the TMS sequence
>     1 -> exit1-ir
>     1 -> update-ir
>     1 -> select-dr
>     0 -> capture-dr
>     0 -> shift-dr
>
> While the jlink (and other bit-bangers) would follow a different path:
>     Remember: JLINK always ends in PAUSE-IR/DR
>     thus in this example we are at PAUSE-IR
>     1 -> exit2-ir
>     1 -> update-ir
>     1 -> select-dr
>     0 -> capture-dr
>     0 ->shift-dr
>
> An identical 'tms' sequence - however - by completely different state path.
>
> ====
>
> I believe this also relates to [ GRR - openocd mailing list archive is 
> down right now ... can't make a link right now]
>
> See mail from: Dirk Behme - 3/1/2009 - Subject: RE [Openocd-development] 
> OMAP3-Jtag
>
> dirk> Most probably the issue is with this TMS manipulation
>
> dirk> BUFFER_ADD = tap_get_tms_path( tap_get_state(), tap_get_end_state() ) | 
> (last_bit << 7);
>
> dirk> in ft2232.c which most probably only works if always 7 clocks 
> dirk> are done for each state change (?). And this isn't the case 
> dirk> any more with improved ap_get_tms_path() from Holger.
>
>
> **END**
>
> --Duane.
>   

_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to