Hi,
I corrected the timing for TDO-sampling and cleaned up the code a bit. The
code now works flawlessly with a wiggler-type interface. I guess that the
other cables (essentially only pin permutations) should still work. 

I've tested the new code also on another target (MIPS-like), so the sampling
problem was not related to my strange ARM-HW.

-- 
         Georg Acher, [EMAIL PROTECTED]         
         http://www.lrr.in.tum.de/~acher
         "Oh no, not again !" The bowl of petunias          
Index: bitbang.c
===================================================================
--- bitbang.c   (revision 1015)
+++ bitbang.c   (working copy)
@@ -172,35 +172,33 @@
 
        for (bit_cnt = 0; bit_cnt < scan_size; bit_cnt++)
        {
+               int val=0;
+               int tms=(bit_cnt==scan_size-1) ? 1 : 0;
+               int tdi;
+               int bytec=bit_cnt/8;
+               int bcval=1<<(bit_cnt % 8);
+
                /* if we're just reading the scan, but don't care about the 
output
                 * default to outputting 'low', this also makes valgrind traces 
more readable,
                 * as it removes the dependency on an uninitialised value
                 */ 
-               if ((type != SCAN_IN) && ((buffer[bit_cnt/8] >> (bit_cnt % 8)) 
& 0x1))
-               {
-                       bitbang_interface->write(0, (bit_cnt==scan_size-1) ? 1 
: 0, 1);
-                       bitbang_interface->write(1, (bit_cnt==scan_size-1) ? 1 
: 0, 1);
-               } else {
-                       bitbang_interface->write(0, (bit_cnt==scan_size-1) ? 1 
: 0, 0);
-                       bitbang_interface->write(1, (bit_cnt==scan_size-1) ? 1 
: 0, 0);
-               }
+               tdi=0;
+               if ((type != SCAN_IN) && (buffer[bytec] & bcval))
+                       tdi=1;
+
+               bitbang_interface->write(0, tms, tdi);
+
+               if (type!=SCAN_OUT)
+                       val=bitbang_interface->read();
+
+               bitbang_interface->write(1, tms, tdi);
                
                if (type != SCAN_OUT)
                {
-                       /*
-                       TDO should be sampled on the rising edge, and will 
change 
-                       on the falling edge. 
-                       
-                       Because there is no way to read the signal exactly at 
the rising edge,
-                       read after the rising edge.
-
-                       This is plain IEEE 1149 JTAG - nothing specific to the 
OpenOCD or its JTAG
-                       API. 
-                       */
-                       if (bitbang_interface->read())
-                               buffer[(bit_cnt)/8] |= 1 << ((bit_cnt) % 8);
+                       if (val)
+                               buffer[bytec] |= bcval;
                        else
-                               buffer[(bit_cnt)/8] &= ~(1 << ((bit_cnt) % 8));
+                               buffer[bytec] &= ~bcval;
                }
        }
        
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to