#include <usb.h>
#include "usb_common.h"
-
#define USB_VID 0x15ba
#define USB_PID 0x001e
#define ARMJTAGEW_IN_BUFFER_SIZE (4*1024)
#define ARMJTAGEW_OUT_BUFFER_SIZE (4*1024)
-
/* USB command request codes. */
#define CMD_GET_VERSION 0x00
#define CMD_SELECT_DPIMPL 0x10
static struct armjtagew* armjtagew_handle;
-
-
/***************************************************************************/
/* External interface implementation */
return armjtagew_tap_execute();
}
-
/* Sets speed in kHz. */
static int armjtagew_speed(int speed)
{
- int result;
- int speed_real;
+ int result;
+ int speed_real;
- usb_out_buffer[0] = CMD_SET_TCK_FREQUENCY;
- buf_set_u32(usb_out_buffer + 1, 0, 32, speed);
+ usb_out_buffer[0] = CMD_SET_TCK_FREQUENCY;
+ 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)
- {
- LOG_ERROR("ARM-JTAG-EW setting speed failed (%d)", result);
- return ERROR_JTAG_DEVICE_ERROR;
- }
+ if (result < 0)
+ {
+ LOG_ERROR("ARM-JTAG-EW setting speed failed (%d)", result);
+ return ERROR_JTAG_DEVICE_ERROR;
+ }
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);
+ result = armjtagew_usb_message(armjtagew_handle, 1, 4);
+ 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);
- return ERROR_JTAG_DEVICE_ERROR;
+ LOG_ERROR("ARM-JTAG-EW getting speed failed (%d)", result);
+ return ERROR_JTAG_DEVICE_ERROR;
}
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;
+ return ERROR_OK;
}
-
static int armjtagew_khz(int khz, int *jtag_speed)
{
*jtag_speed = khz;
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;
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);
}
}
-
static int armjtagew_get_status(void)
{
int result;
if (result == 0)
{
unsigned int u_tg = buf_get_u32(usb_in_buffer, 0, 16);
- LOG_INFO("U_tg = %d mV, U_aux = %d mV, U_tgpwr = %d mV, I_tgpwr = %d mA, D1 = %d, Target power %s %s\n",
+ LOG_INFO("U_tg = %d mV, U_aux = %d mV, U_tgpwr = %d mV, I_tgpwr = %d mA, D1 = %d, Target power %s %s",
(int)(buf_get_u32(usb_in_buffer + 0, 0, 16)),
(int)(buf_get_u32(usb_in_buffer + 2, 0, 16)),
(int)(buf_get_u32(usb_in_buffer + 4, 0, 16)),
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;
}
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,
return result;
}
-
#ifdef _DEBUG_USB_COMMS_
#define BYTES_PER_LINE 16
strcat(line, s);
}
LOG_DEBUG("%s", line);
+
+ // Prevent GDB timeout (writing to log might take some time)
+ keep_alive();
}
}
#endif
-