Georg Acher <acher@in.tum.de> corrected TDO sampling

git-svn-id: svn://svn.berlios.de/openocd/trunk@1016 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
oharboe
2008-10-05 19:44:41 +00:00
parent 4eda44db36
commit 9807a00206
+19 -21
View 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;
}
}