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
This commit is contained in:
zwelch 2009-07-06 10:34:33 +00:00
parent e48e7000b0
commit a604b570da
1 changed files with 27 additions and 15 deletions

View File

@ -305,7 +305,6 @@ static int jlink_register_commands(struct command_context_s *cmd_ctx)
static int jlink_init(void) static int jlink_init(void)
{ {
int check_cnt;
int i; int i;
jlink_jtag_handle = jlink_usb_open(); 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."); LOG_ERROR("Cannot find jlink Interface! Please check connection and permissions.");
return ERROR_JTAG_INIT_FAILED; 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; 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 (jlink_get_version_info() == ERROR_OK)
}
if (check_cnt == 3)
{ {
LOG_INFO("J-Link initial read failed, don't worry"); /* attempt to get status */
jlink_get_status();
} }
LOG_INFO("J-Link JTAG Interface ready"); 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)) if ((dev->descriptor.idVendor == VID) && (dev->descriptor.idProduct == PID))
{ {
result->usb_handle = usb_open(dev); 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 required under win32 */
usb_set_configuration(result->usb_handle, dev->config[0].bConfigurationValue); usb_set_configuration(result->usb_handle, dev->config[0].bConfigurationValue);