+
+ result = jlink_usb_read(jlink_jtag_handle, 2);
+ if (2 != result)
+ {
+ LOG_ERROR("J-Link command EMU_CMD_VERSION failed (%d)\n", result);
+ return ERROR_JTAG_DEVICE_ERROR;
+ }
+
+ len = buf_get_u32(usb_in_buffer, 0, 16);
+ if (len > JLINK_IN_BUFFER_SIZE)
+ {
+ LOG_ERROR("J-Link command EMU_CMD_VERSION impossible return length 0x%0x", len);
+ len = JLINK_IN_BUFFER_SIZE;
+ }
+
+ result = jlink_usb_read(jlink_jtag_handle, len);
+ if (result != len)
+ {
+ LOG_ERROR("J-Link command EMU_CMD_VERSION failed (%d)\n", result);
+ return ERROR_JTAG_DEVICE_ERROR;
+ }
+
+ usb_in_buffer[result] = 0;
+ LOG_INFO("%s", (char *)usb_in_buffer);
+
+ /* query hardware capabilities */
+ jlink_simple_command(EMU_CMD_GET_CAPS);
+
+ result = jlink_usb_read(jlink_jtag_handle, 4);
+ if (4 != result)
+ {
+ LOG_ERROR("J-Link command EMU_CMD_GET_CAPS failed (%d)\n", result);
+ return ERROR_JTAG_DEVICE_ERROR;
+ }
+
+ jlink_caps = buf_get_u32(usb_in_buffer, 0, 32);
+ LOG_INFO("JLink caps 0x%x", (unsigned)jlink_caps);
+
+ if (jlink_caps & (1 << EMU_CAP_GET_HW_VERSION))
+ {
+ /* query hardware version */
+ jlink_simple_command(EMU_CMD_GET_HW_VERSION);
+
+ result = jlink_usb_read(jlink_jtag_handle, 4);
+ if (4 != result)
+ {
+ LOG_ERROR("J-Link command EMU_CMD_GET_HW_VERSION failed (%d)\n", result);
+ return ERROR_JTAG_DEVICE_ERROR;
+ }
+
+ uint32_t jlink_hw_version = buf_get_u32(usb_in_buffer, 0, 32);
+ uint32_t major_revision = (jlink_hw_version / 10000) % 100;
+ if (major_revision >= 5)
+ jlink_hw_jtag_version = 3;
+
+ LOG_INFO("JLink hw version %i", (int)jlink_hw_version);
+ }
+
+ if (jlink_caps & (1 << EMU_CAP_GET_MAX_BLOCK_SIZE))
+ {
+ /* query hardware maximum memory block */
+ jlink_simple_command(EMU_CMD_GET_MAX_MEM_BLOCK);
+
+ result = jlink_usb_read(jlink_jtag_handle, 4);
+ if (4 != result)