- Fix setting interface speed:
  - CMD_SET_TCK_FREQUENCY message length is 5, not 4
  - Interface expects speed in Hz, not kHz
- Provide armjtagew_speed_div() in order to fix interactive use
  of `adapter_khz'
- Declare interface as `jtag_only'
- Emit a warning if interface firmware version != 1.6
- In armjtagew_init(), set initial JTAG speed to 32 kHz (before TAP
  initialization). This prevents rare communication errors during
  startup.
- Ticket: #34
---
 src/jtag/drivers/arm-jtag-ew.c |   28 +++++++++++++++++++++++-----
 1 files changed, 23 insertions(+), 5 deletions(-)


diff --git a/src/jtag/drivers/arm-jtag-ew.c b/src/jtag/drivers/arm-jtag-ew.c
index 44eaeff..20f7c99 100644
--- a/src/jtag/drivers/arm-jtag-ew.c
+++ b/src/jtag/drivers/arm-jtag-ew.c
@@ -184,9 +184,9 @@ static int armjtagew_speed(int speed)
 
 
     usb_out_buffer[0] = CMD_SET_TCK_FREQUENCY;
-	buf_set_u32(usb_out_buffer + 1, 0, 32, speed);
+	buf_set_u32(usb_out_buffer + 1, 0, 32, speed*1000);
 
-    result = armjtagew_usb_message(armjtagew_handle, 4, 4);
+    result = armjtagew_usb_message(armjtagew_handle, 5, 4);
 
     if (result < 0)
     {
@@ -196,7 +196,7 @@ static int armjtagew_speed(int speed)
 
 	usb_out_buffer[0] = CMD_GET_TCK_FREQUENCY;
     result = armjtagew_usb_message(armjtagew_handle, 1, 4);
-	speed_real = (int)buf_get_u32(usb_in_buffer,0,32);
+	speed_real = (int)buf_get_u32(usb_in_buffer,0,32) / 1000;
 	if (result < 0)
 	{
         LOG_ERROR("ARM-JTAG-EW getting speed failed (%d)", result);
@@ -204,7 +204,7 @@ static int armjtagew_speed(int speed)
 	}
 	else
 	{
-	LOG_INFO("Requested speed %dkHz, emulator reported %dkHz.", speed, speed_real);
+		LOG_INFO("Requested speed %dkHz, emulator reported %dkHz.", speed, speed_real);
 	}
 
     return ERROR_OK;
@@ -218,6 +218,14 @@ static int armjtagew_khz(int khz, int *jtag_speed)
 	return ERROR_OK;
 }
 
+static int armjtagew_speed_div(int speed, int* khz)
+{
+	*khz = speed;
+
+	return ERROR_OK;
+}
+
+
 static int armjtagew_init(void)
 {
 	int check_cnt;
@@ -248,6 +256,9 @@ static int armjtagew_init(void)
 		LOG_INFO("ARM-JTAG-EW initial read failed, don't worry");
 	}
 
+	// Initial JTAG speed (for reset and initialization): 32 kHz
+	armjtagew_speed(32);
+
 	LOG_INFO("ARM-JTAG-EW JTAG Interface ready");
 
 	armjtagew_reset(0, 0);
@@ -488,6 +499,11 @@ static int armjtagew_get_version_info(void)
 			usb_in_buffer[1], usb_in_buffer[0], \
 			isgraph(usb_in_buffer[2]) ? usb_in_buffer[2] : 'X', \
 			sn, auxinfo);
+	
+	if (1 != usb_in_buffer[1] || 6 != usb_in_buffer[0])
+	{
+		LOG_WARNING("ARM-JTAG-EW firmware version %d.%d is untested with this version of OpenOCD. You might experience unexpected behavior.", usb_in_buffer[1], usb_in_buffer[0]);
+	}
 	return ERROR_OK;
 }
 
@@ -515,9 +531,11 @@ static const struct command_registration armjtagew_command_handlers[] = {
 struct jtag_interface armjtagew_interface = {
 	.name = "arm-jtag-ew",
 	.commands = armjtagew_command_handlers,
-
+	.transports = jtag_only,
+	
 	.execute_queue = armjtagew_execute_queue,
 	.speed = armjtagew_speed,
+	.speed_div = armjtagew_speed_div,
 	.khz = armjtagew_khz,
 	.init = armjtagew_init,
 	.quit = armjtagew_quit,

_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to