diff options
author | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2008-03-13 08:16:34 +0000 |
---|---|---|
committer | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2008-03-13 08:16:34 +0000 |
commit | b8dab6d056e4c9d9964e8958717692e030235aac (patch) | |
tree | 772c3b78fa92963f1d8d1be3b888ad91514cc180 | |
parent | 979d6b794362c8e2e0dc4d0e7040ae7be862462a (diff) | |
download | openocd_libswd-b8dab6d056e4c9d9964e8958717692e030235aac.tar.gz openocd_libswd-b8dab6d056e4c9d9964e8958717692e030235aac.tar.bz2 openocd_libswd-b8dab6d056e4c9d9964e8958717692e030235aac.tar.xz openocd_libswd-b8dab6d056e4c9d9964e8958717692e030235aac.zip |
XScale excessive waiting fix.
git-svn-id: svn://svn.berlios.de/openocd/trunk@509 b42882b7-edfa-0310-969c-e2dbd0fdcd60
-rw-r--r-- | src/target/xscale.c | 104 |
1 files changed, 58 insertions, 46 deletions
diff --git a/src/target/xscale.c b/src/target/xscale.c index 18c5c3de..771812cc 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -481,41 +481,47 @@ int xscale_read_tx(target_t *target, int consume) jtag_set_check_value(fields+2, &field2_check_value, &field2_check_mask, NULL); gettimeofday(&timeout, NULL); - timeval_add_time(&timeout, 5, 0); + timeval_add_time(&timeout, 1, 0); for (;;) { - /* if we want to consume the register content (i.e. clear TX_READY), - * we have to go straight from Capture-DR to Shift-DR - * otherwise, we go from Capture-DR to Exit1-DR to Pause-DR - */ - if (consume) - jtag_add_pathmove(3, path); - else - { - jtag_add_pathmove(sizeof(noconsume_path)/sizeof(*noconsume_path), noconsume_path); - } - - jtag_add_dr_scan(3, fields, TAP_RTI); - - if ((retval = jtag_execute_queue()) != ERROR_OK) - { - ERROR("JTAG error while reading TX"); - return ERROR_TARGET_TIMEOUT; - } - - gettimeofday(&now, NULL); - if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec))) - { - ERROR("time out reading TX register"); - return ERROR_TARGET_TIMEOUT; - } - if (!((!(field0_in & 1)) && consume)) + int i; + for (i=0; i<100; i++) { - break; + /* if we want to consume the register content (i.e. clear TX_READY), + * we have to go straight from Capture-DR to Shift-DR + * otherwise, we go from Capture-DR to Exit1-DR to Pause-DR + */ + if (consume) + jtag_add_pathmove(3, path); + else + { + jtag_add_pathmove(sizeof(noconsume_path)/sizeof(*noconsume_path), noconsume_path); + } + + jtag_add_dr_scan(3, fields, TAP_RTI); + + if ((retval = jtag_execute_queue()) != ERROR_OK) + { + ERROR("JTAG error while reading TX"); + return ERROR_TARGET_TIMEOUT; + } + + gettimeofday(&now, NULL); + if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec))) + { + ERROR("time out reading TX register"); + return ERROR_TARGET_TIMEOUT; + } + if (!((!(field0_in & 1)) && consume)) + { + goto done; + } } - usleep(500*1000); /* avoid flooding the logs */ + DEBUG("waiting 10ms"); + usleep(10*1000); /* avoid flooding the logs */ } + done: if (!(field0_in & 1)) return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; @@ -571,31 +577,37 @@ int xscale_write_rx(target_t *target) jtag_set_check_value(fields+2, &field2_check_value, &field2_check_mask, NULL); gettimeofday(&timeout, NULL); - timeval_add_time(&timeout, 5, 0); + timeval_add_time(&timeout, 1, 0); /* poll until rx_read is low */ DEBUG("polling RX"); for (;;) { - jtag_add_dr_scan(3, fields, TAP_RTI); - - if ((retval = jtag_execute_queue()) != ERROR_OK) - { - ERROR("JTAG error while writing RX"); - return retval; - } - - gettimeofday(&now, NULL); - if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec))) + int i; + for (i=0; i<10; i++) { - ERROR("time out writing RX register"); - return ERROR_TARGET_TIMEOUT; + jtag_add_dr_scan(3, fields, TAP_RTI); + + if ((retval = jtag_execute_queue()) != ERROR_OK) + { + ERROR("JTAG error while writing RX"); + return retval; + } + + gettimeofday(&now, NULL); + if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec)&& (now.tv_usec > timeout.tv_usec))) + { + ERROR("time out writing RX register"); + return ERROR_TARGET_TIMEOUT; + } + if (!(field0_in & 1)) + goto done; } - if (!(field0_in & 1)) - break; - usleep(500*1000); /* wait 500ms to avoid flooding the logs */ + DEBUG("waiting 10ms"); + usleep(10*1000); /* wait 10ms to avoid flooding the logs */ } - + done: + /* set rx_valid */ field2 = 0x1; jtag_add_dr_scan(3, fields, TAP_RTI); |