-#include "libusb_common.h"
-
-/* See Segger's public documentation:
- * Reference manual for J-Link USB Protocol
- * Document RM08001-R6 Date: June 16, 2009
- * (Or newer, with some SWD information).
- * http://www.segger.com/cms/admin/uploads/productDocs/RM08001_JLinkUSBProtocol.pdf
- */
-
-/*
- * The default pid of the segger is 0x0101
- * But when you change the USB Address it will also
- *
- * pid = ( usb_address > 0x4) ? 0x0101 : (0x101 + usb_address)
- */
-
-#define JLINK_USB_INTERFACE_CLASS 0xff
-#define JLINK_USB_INTERFACE_SUBCLASS 0xff
-#define JLINK_USB_INTERFACE_PROTOCOL 0xff
-
-static unsigned int jlink_write_ep;
-static unsigned int jlink_read_ep;
-static unsigned int jlink_hw_jtag_version = 2;
-
-#define JLINK_USB_TIMEOUT 1000
-
-/* See Section 3.3.2 of the Segger JLink USB protocol manual */
-/* 2048 is the max value we can use here */
-#define JLINK_TAP_BUFFER_SIZE 2048
-/*#define JLINK_TAP_BUFFER_SIZE 256*/
-/*#define JLINK_TAP_BUFFER_SIZE 384*/
-
-#define JLINK_IN_BUFFER_SIZE (2048 + 1)
-#define JLINK_OUT_BUFFER_SIZE (2*2048 + 4)
-
-/* Global USB buffers */
-static uint8_t usb_in_buffer[JLINK_IN_BUFFER_SIZE];
-static uint8_t usb_out_buffer[JLINK_OUT_BUFFER_SIZE];
-
-/* Constants for JLink command */
-#define EMU_CMD_VERSION 0x01
-#define EMU_CMD_RESET_TRST 0x02
-#define EMU_CMD_RESET_TARGET 0x03
-#define EMU_CMD_SET_SPEED 0x05
-#define EMU_CMD_GET_STATE 0x07
-#define EMU_CMD_SET_KS_POWER 0x08
-#define EMU_CMD_REGISTER 0x09
-#define EMU_CMD_GET_SPEEDS 0xc0
-#define EMU_CMD_GET_HW_INFO 0xc1
-#define EMU_CMD_GET_COUNTERS 0xc2
-#define EMU_CMD_SELECT_IF 0xc7
-#define EMU_CMD_HW_CLOCK 0xc8
-#define EMU_CMD_HW_TMS0 0xc9
-#define EMU_CMD_HW_TMS1 0xca
-#define EMU_CMD_HW_DATA0 0xcb
-#define EMU_CMD_HW_DATA1 0xcc
-#define EMU_CMD_HW_JTAG 0xcd
-#define EMU_CMD_HW_JTAG2 0xce
-#define EMU_CMD_HW_JTAG3 0xcf
-#define EMU_CMD_HW_RELEASE_RESET_STOP_EX 0xd0
-#define EMU_CMD_HW_RELEASE_RESET_STOP_TIMED 0xd1
-#define EMU_CMD_GET_MAX_MEM_BLOCK 0xd4
-#define EMU_CMD_HW_JTAG_WRITE 0xd5
-#define EMU_CMD_HW_JTAG_GET_RESULT 0xd6
-#define EMU_CMD_HW_RESET0 0xdc
-#define EMU_CMD_HW_RESET1 0xdd
-#define EMU_CMD_HW_TRST0 0xde
-#define EMU_CMD_HW_TRST1 0xdf
-#define EMU_CMD_GET_CAPS 0xe8
-#define EMU_CMD_GET_CPU_CAPS 0xe9
-#define EMU_CMD_EXEC_CPU_CMD 0xea
-#define EMU_CMD_GET_CAPS_EX 0xed
-#define EMU_CMD_GET_HW_VERSION 0xf0
-#define EMU_CMD_WRITE_DCC 0xf1
-#define EMU_CMD_READ_CONFIG 0xf2
-#define EMU_CMD_WRITE_CONFIG 0xf3
-#define EMU_CMD_WRITE_MEM 0xf4
-#define EMU_CMD_READ_MEM 0xf5
-#define EMU_CMD_MEASURE_RTCK_REACT 0xf6
-#define EMU_CMD_WRITE_MEM_ARM79 0xf7
-#define EMU_CMD_READ_MEM_ARM79 0xf8
-
-/* Register subcommands */
-#define REG_CMD_REGISTER 100
-#define REG_CMD_UNREGISTER 101
-
-/* bits return from EMU_CMD_GET_CAPS */
-#define EMU_CAP_RESERVED_1 0
-#define EMU_CAP_GET_HW_VERSION 1
-#define EMU_CAP_WRITE_DCC 2
-#define EMU_CAP_ADAPTIVE_CLOCKING 3
-#define EMU_CAP_READ_CONFIG 4
-#define EMU_CAP_WRITE_CONFIG 5
-#define EMU_CAP_TRACE 6
-#define EMU_CAP_WRITE_MEM 7
-#define EMU_CAP_READ_MEM 8
-#define EMU_CAP_SPEED_INFO 9
-#define EMU_CAP_EXEC_CODE 10
-#define EMU_CAP_GET_MAX_BLOCK_SIZE 11
-#define EMU_CAP_GET_HW_INFO 12
-#define EMU_CAP_SET_KS_POWER 13
-#define EMU_CAP_RESET_STOP_TIMED 14
-#define EMU_CAP_RESERVED_2 15
-#define EMU_CAP_MEASURE_RTCK_REACT 16
-#define EMU_CAP_SELECT_IF 17
-#define EMU_CAP_RW_MEM_ARM79 18
-#define EMU_CAP_GET_COUNTERS 19
-#define EMU_CAP_READ_DCC 20
-#define EMU_CAP_GET_CPU_CAPS 21
-#define EMU_CAP_EXEC_CPU_CMD 22
-#define EMU_CAP_SWO 23
-#define EMU_CAP_WRITE_DCC_EX 24
-#define EMU_CAP_UPDATE_FIRMWARE_EX 25
-#define EMU_CAP_FILE_IO 26
-#define EMU_CAP_REGISTER 27
-#define EMU_CAP_INDICATORS 28
-#define EMU_CAP_TEST_NET_SPEED 29
-#define EMU_CAP_RAWTRACE 30
-#define EMU_CAP_RESERVED_3 31
-
-static const char * const jlink_cap_str[] = {
- "Always 1.",
- "Supports command EMU_CMD_GET_HARDWARE_VERSION",
- "Supports command EMU_CMD_WRITE_DCC",
- "Supports adaptive clocking",
- "Supports command EMU_CMD_READ_CONFIG",
- "Supports command EMU_CMD_WRITE_CONFIG",
- "Supports trace commands",
- "Supports command EMU_CMD_WRITE_MEM",
- "Supports command EMU_CMD_READ_MEM",
- "Supports command EMU_CMD_GET_SPEED",
- "Supports command EMU_CMD_CODE_...",
- "Supports command EMU_CMD_GET_MAX_BLOCK_SIZE",
- "Supports command EMU_CMD_GET_HW_INFO",
- "Supports command EMU_CMD_SET_KS_POWER",
- "Supports command EMU_CMD_HW_RELEASE_RESET_STOP_TIMED",
- "Reserved",
- "Supports command EMU_CMD_MEASURE_RTCK_REACT",
- "Supports command EMU_CMD_HW_SELECT_IF",
- "Supports command EMU_CMD_READ/WRITE_MEM_ARM79",
- "Supports command EMU_CMD_GET_COUNTERS",
- "Supports command EMU_CMD_READ_DCC",
- "Supports command EMU_CMD_GET_CPU_CAPS",
- "Supports command EMU_CMD_EXEC_CPU_CMD",
- "Supports command EMU_CMD_SWO",
- "Supports command EMU_CMD_WRITE_DCC_EX",
- "Supports command EMU_CMD_UPDATE_FIRMWARE_EX",
- "Supports command EMU_CMD_FILE_IO",
- "Supports command EMU_CMD_REGISTER",
- "Supports command EMU_CMD_INDICATORS",
- "Supports command EMU_CMD_TEST_NET_SPEED",
- "Supports command EMU_CMD_RAWTRACE",
- "Reserved",
-};
-
-/* max speed 12MHz v5.0 jlink */
-#define JLINK_MAX_SPEED 12000
-
-/* J-Link hardware versions */
-#define JLINK_HW_TYPE_JLINK 0
-#define JLINK_HW_TYPE_JTRACE 1
-#define JLINK_HW_TYPE_FLASHER 2
-#define JLINK_HW_TYPE_JLINK_PRO 3
-#define JLINK_HW_TYPE_JLINK_LITE_ADI 5
-#define JLINK_HW_TYPE_LPCLINK2 18
-
-/* Interface selection */
-#define JLINK_TIF_JTAG 0
-#define JLINK_TIF_SWD 1
-#define JLINK_SWD_DIR_IN 0
-#define JLINK_SWD_DIR_OUT 1
-
-/* Queue command functions */
-static void jlink_end_state(tap_state_t state);
-static void jlink_state_move(void);
-static void jlink_path_move(int num_states, tap_state_t *path);
-static void jlink_runtest(int num_cycles);
-static void jlink_scan(bool ir_scan, enum scan_type type, uint8_t *buffer,
- int scan_size, struct scan_command *command);
-static void jlink_reset(int trst, int srst);
-static void jlink_simple_command(uint8_t command);
-static int jlink_get_status(void);
-static int jlink_swd_run_queue(struct adiv5_dap *dap);
-static void jlink_swd_queue_cmd(struct adiv5_dap *dap, uint8_t cmd, uint32_t *dst, uint32_t data);
-static int jlink_swd_switch_seq(struct adiv5_dap *dap, enum swd_special_seq seq);
-
-/* J-Link tap buffer functions */
-static void jlink_tap_init(void);
-static int jlink_tap_execute(void);
-static void jlink_tap_ensure_space(int scans, int bits);
-static void jlink_tap_append_step(int tms, int tdi);
-static void jlink_tap_append_scan(int length, uint8_t *buffer,
- struct scan_command *command);
-
-/* Jlink lowlevel functions */
-struct jlink {
- struct jtag_libusb_device_handle *usb_handle;
-};
-
-static struct jlink *jlink_usb_open(void);
-static void jlink_usb_close(struct jlink *jlink);
-static int jlink_usb_message(struct jlink *jlink, int out_length, int in_length);
-static int jlink_usb_io(struct jlink *jlink, int out_length, int in_length);
-static int jlink_usb_write(struct jlink *jlink, int out_length);
-static int jlink_usb_read(struct jlink *jlink, int expected_size);