- 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
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development