Georg Acher <acher@in.tum.de> corrected TDO sampling
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 5 Oct 2008 19:44:41 +0000 (19:44 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Sun, 5 Oct 2008 19:44:41 +0000 (19:44 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1016 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/bitbang.c

index 24346712a8d66cf4af238621e7d1d6e28c9a8670..0f462a83ad956dfcfeff1bcf241615cf4bd1c9e8 100644 (file)
@@ -172,35 +172,33 @@ void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 
        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;
                }
        }