- 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