summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-07-06 10:34:33 +0000
committerzwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-07-06 10:34:33 +0000
commita604b570da3bedd9f633acc73b03956a9f802b85 (patch)
tree8841f63e705b1e4ab5094c9fa5a369f0d84c688d /src
parente48e7000b0f88dee06f52bcda8e1e7fafe37afaa (diff)
downloadopenocd+libswd-a604b570da3bedd9f633acc73b03956a9f802b85.tar.gz
openocd+libswd-a604b570da3bedd9f633acc73b03956a9f802b85.tar.bz2
openocd+libswd-a604b570da3bedd9f633acc73b03956a9f802b85.tar.xz
openocd+libswd-a604b570da3bedd9f633acc73b03956a9f802b85.zip
Gary Carlson <gcarlson@carlson-minot.com>:
Fix intermittent J-Link interface startup failures: - Use usb_reset to ensure selected dongle is in known good state. - Assert emulator reset durning status check to prevent supurious failures. - Eliminate status check loop; not needed due to other fixes. git-svn-id: svn://svn.berlios.de/openocd/trunk@2471 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src')
-rw-r--r--src/jtag/jlink.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/src/jtag/jlink.c b/src/jtag/jlink.c
index 56187e2e..b41731d2 100644
--- a/src/jtag/jlink.c
+++ b/src/jtag/jlink.c
@@ -305,7 +305,6 @@ static int jlink_register_commands(struct command_context_s *cmd_ctx)
static int jlink_init(void)
{
- int check_cnt;
int i;
jlink_jtag_handle = jlink_usb_open();
@@ -315,24 +314,28 @@ static int jlink_init(void)
LOG_ERROR("Cannot find jlink Interface! Please check connection and permissions.");
return ERROR_JTAG_INIT_FAILED;
}
+
+ /*
+ * The next three instructions were added after discovering a problem while using an oscilloscope. For the V8
+ * SAM-ICE dongle (and likely other j-link device variants), the reset line to the target microprocessor was found to
+ * cycle only intermittently during emulator startup (even after encountering the downstream reset instruction later
+ * in the code). This was found to create two issues: 1) In general it is a bad practice to not reset a CPU to a known
+ * state when starting an emulator and 2) something critical happens inside the dongle when it does the first read
+ * following a new USB session. Keeping the processor in reset during the first read collecting version information
+ * seems to prevent errant "J-Link command EMU_CMD_VERSION failed" issues.
+ */
+
+ LOG_INFO("J-Link initialization started / target CPU reset initiated");
+ jlink_simple_command(EMU_CMD_HW_TRST0);
+ jlink_simple_command(EMU_CMD_HW_RESET0);
+ sleep(1);
jlink_hw_jtag_version = 2;
- check_cnt = 0;
- while (check_cnt < 3)
- {
- if (jlink_get_version_info() == ERROR_OK)
- {
- /* attempt to get status */
- jlink_get_status();
- break;
- }
-
- check_cnt++;
- }
- if (check_cnt == 3)
+ if (jlink_get_version_info() == ERROR_OK)
{
- LOG_INFO("J-Link initial read failed, don't worry");
+ /* attempt to get status */
+ jlink_get_status();
}
LOG_INFO("J-Link JTAG Interface ready");
@@ -860,6 +863,15 @@ static jlink_jtag_t* jlink_usb_open()
if ((dev->descriptor.idVendor == VID) && (dev->descriptor.idProduct == PID))
{
result->usb_handle = usb_open(dev);
+
+ /*
+ * Some j-link dongles experience intermittent communication issues at startup to varying degrees
+ * depending on the host operating system. Troubleshooting this problem all the way back to libusb
+ * revealed that without a usb reset, the hardware can start in an uncertain state causing a litany
+ * of annoying problems. The next step was added to the original code to address this problem.
+ */
+
+ usb_reset(result->usb_handle);
/* usb_set_configuration required under win32 */
usb_set_configuration(result->usb_handle, dev->config[0].bConfigurationValue);