Small changes that might improve stability.
[openocd.git] / src / jtag / jlink.c
1 /***************************************************************************
2 * Copyright (C) 2007 by Juergen Stuber <juergen@jstuber.net> *
3 * based on Dominic Rath's and Benedikt Sauter's usbprog.c *
4 * *
5 * Copyright (C) 2008 by Spencer Oliver *
6 * spen@spen-soft.co.uk *
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
22 ***************************************************************************/
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include "replacements.h"
29
30 #include "jtag.h"
31
32 #include <usb.h>
33 #include <string.h>
34 #include <errno.h>
35
36 #include "log.h"
37
38 #define VID 0x1366
39 #define PID 0x0101
40
41 #define JLINK_WRITE_ENDPOINT 0x02
42 #define JLINK_READ_ENDPOINT 0x81
43
44 #define JLINK_USB_TIMEOUT 1000
45
46 // See Section 1.3.2 of the Segger JLink USB protocol manual
47 #define JLINK_IN_BUFFER_SIZE 2048
48 #define JLINK_OUT_BUFFER_SIZE 2*2048+4
49 #define JLINK_EMU_RESULT_BUFFER_SIZE 64
50
51 /* Global USB buffers */
52 static u8 usb_in_buffer[JLINK_IN_BUFFER_SIZE];
53 static u8 usb_out_buffer[JLINK_OUT_BUFFER_SIZE];
54 static u8 usb_emu_result_buffer[JLINK_EMU_RESULT_BUFFER_SIZE];
55
56 /* Constants for JLink command */
57 #define EMU_CMD_VERSION 0x01
58 #define EMU_CMD_SET_SPEED 0x05
59 #define EMU_CMD_GET_STATE 0x07
60 #define EMU_CMD_HW_CLOCK 0xc8
61 #define EMU_CMD_HW_TMS0 0xc9
62 #define EMU_CMD_HW_TMS1 0xca
63 #define EMU_CMD_HW_JTAG3 0xcf
64 #define EMU_CMD_GET_MAX_MEM_BLOCK 0xd4
65 #define EMU_CMD_HW_RESET0 0xdc
66 #define EMU_CMD_HW_RESET1 0xdd
67 #define EMU_CMD_HW_TRST0 0xde
68 #define EMU_CMD_HW_TRST1 0xdf
69 #define EMU_CMD_GET_CAPS 0xe8
70
71 /* max speed 12MHz v5.0 jlink */
72 #define JLINK_MAX_SPEED 12000
73
74 /* External interface functions */
75 static int jlink_execute_queue(void);
76 static int jlink_speed(int speed);
77 static int jlink_speed_div(int speed, int* khz);
78 static int jlink_khz(int khz, int *jtag_speed);
79 static int jlink_register_commands(struct command_context_s *cmd_ctx);
80 static int jlink_init(void);
81 static int jlink_quit(void);
82
83 /* CLI command handler functions */
84 static int jlink_handle_jlink_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
85
86 /* Queue command functions */
87 static void jlink_end_state(tap_state_t state);
88 static void jlink_state_move(void);
89 static void jlink_path_move(int num_states, tap_state_t *path);
90 static void jlink_runtest(int num_cycles);
91 static void jlink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, scan_command_t *command);
92 static void jlink_reset(int trst, int srst);
93 static void jlink_simple_command(u8 command);
94 static int jlink_get_status(void);
95
96 /* J-Link tap buffer functions */
97 static void jlink_tap_init(void);
98 static int jlink_tap_execute(void);
99 static void jlink_tap_ensure_space(int scans, int bits);
100 static void jlink_tap_append_step(int tms, int tdi);
101 static void jlink_tap_append_scan(int length, u8 *buffer, scan_command_t *command);
102
103 /* Jlink lowlevel functions */
104 typedef struct jlink_jtag
105 {
106 struct usb_dev_handle* usb_handle;
107 } jlink_jtag_t;
108
109 static jlink_jtag_t *jlink_usb_open(void);
110 static void jlink_usb_close(jlink_jtag_t *jlink_jtag);
111 static int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length);
112 static int jlink_usb_write(jlink_jtag_t *jlink_jtag, int out_length);
113 static int jlink_usb_read(jlink_jtag_t *jlink_jtag, int expected_size);
114 static int jlink_usb_read_emu_result(jlink_jtag_t *jlink_jtag);
115
116 /* helper functions */
117 static int jlink_get_version_info(void);
118
119 #ifdef _DEBUG_USB_COMMS_
120 static void jlink_debug_buffer(u8 *buffer, int length);
121 #endif
122
123 static enum tap_state jlink_last_state = TAP_RESET;
124
125 static jlink_jtag_t* jlink_jtag_handle;
126
127 /***************************************************************************/
128 /* External interface implementation */
129
130 jtag_interface_t jlink_interface =
131 {
132 .name = "jlink",
133 .execute_queue = jlink_execute_queue,
134 .speed = jlink_speed,
135 .speed_div = jlink_speed_div,
136 .khz = jlink_khz,
137 .register_commands = jlink_register_commands,
138 .init = jlink_init,
139 .quit = jlink_quit
140 };
141
142 static void jlink_execute_end_state(jtag_command_t *cmd)
143 {
144 DEBUG_JTAG_IO("end_state: %i", cmd->cmd.end_state->end_state);
145
146 if (cmd->cmd.end_state->end_state != TAP_INVALID)
147 jlink_end_state(cmd->cmd.end_state->end_state);
148 }
149
150 static void jlink_execute_runtest(jtag_command_t *cmd)
151 {
152 DEBUG_JTAG_IO("runtest %i cycles, end in %i",
153 cmd->cmd.runtest->num_cycles,
154 cmd->cmd.runtest->end_state);
155
156 if (cmd->cmd.runtest->end_state != TAP_INVALID)
157 jlink_end_state(cmd->cmd.runtest->end_state);
158
159 jlink_runtest(cmd->cmd.runtest->num_cycles);
160 }
161
162 static void jlink_execute_statemove(jtag_command_t *cmd)
163 {
164 DEBUG_JTAG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
165
166 if (cmd->cmd.statemove->end_state != TAP_INVALID)
167 {
168 jlink_end_state(cmd->cmd.statemove->end_state);
169 }
170 jlink_state_move();
171 }
172
173 static void jlink_execute_pathmove(jtag_command_t *cmd)
174 {
175 DEBUG_JTAG_IO("pathmove: %i states, end in %i",
176 cmd->cmd.pathmove->num_states,
177 cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
178
179 jlink_path_move(cmd->cmd.pathmove->num_states,
180 cmd->cmd.pathmove->path);
181 }
182
183 static void jlink_execute_scan(jtag_command_t *cmd)
184 {
185 int scan_size;
186 enum scan_type type;
187 u8 *buffer;
188
189 DEBUG_JTAG_IO("scan end in %s", tap_state_name(cmd->cmd.scan->end_state));
190
191 if (cmd->cmd.scan->end_state != TAP_INVALID)
192 jlink_end_state(cmd->cmd.scan->end_state);
193
194 scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
195 DEBUG_JTAG_IO("scan input, length = %d", scan_size);
196
197 #ifdef _DEBUG_USB_COMMS_
198 jlink_debug_buffer(buffer, (scan_size + 7) / 8);
199 #endif
200 type = jtag_scan_type(cmd->cmd.scan);
201 jlink_scan(cmd->cmd.scan->ir_scan,
202 type, buffer, scan_size, cmd->cmd.scan);
203 }
204
205 static void jlink_execute_reset(jtag_command_t *cmd)
206 {
207 DEBUG_JTAG_IO("reset trst: %i srst %i",
208 cmd->cmd.reset->trst, cmd->cmd.reset->srst);
209
210 jlink_tap_execute();
211
212 if ( (cmd->cmd.reset->trst == 1) || ( cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST) ) )
213 {
214 tap_set_state(TAP_RESET);
215 }
216
217 jlink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
218 jlink_tap_execute();
219 }
220
221 static void jlink_execute_sleep(jtag_command_t *cmd)
222 {
223 DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us);
224 jlink_tap_execute();
225 jtag_sleep(cmd->cmd.sleep->us);
226 }
227
228 static void jlink_execute_command(jtag_command_t *cmd)
229 {
230 switch (cmd->type)
231 {
232 case JTAG_END_STATE: jlink_execute_end_state(cmd); break;
233 case JTAG_RUNTEST: jlink_execute_runtest(cmd); break;
234 case JTAG_STATEMOVE: jlink_execute_statemove(cmd); break;
235 case JTAG_PATHMOVE: jlink_execute_pathmove(cmd); break;
236 case JTAG_SCAN: jlink_execute_scan(cmd); break;
237 case JTAG_RESET: jlink_execute_reset(cmd); break;
238 case JTAG_SLEEP: jlink_execute_sleep(cmd); break;
239 default:
240 LOG_ERROR("BUG: unknown JTAG command type encountered");
241 exit(-1);
242 }
243 }
244
245 static int jlink_execute_queue(void)
246 {
247 jtag_command_t *cmd = jtag_command_queue;
248
249 while (cmd != NULL)
250 {
251 jlink_execute_command(cmd);
252 cmd = cmd->next;
253 }
254
255 return jlink_tap_execute();
256 }
257
258 /* Sets speed in kHz. */
259 static int jlink_speed(int speed)
260 {
261 int result;
262
263 if (speed > JLINK_MAX_SPEED)
264 {
265 LOG_INFO("Ignoring speed request: %dkHz exceeds %dkHz maximum",
266 speed, JLINK_MAX_SPEED);
267 return ERROR_OK;
268 }
269
270 /* check for RTCK setting */
271 if (speed == 0)
272 speed = -1;
273
274 usb_out_buffer[0] = EMU_CMD_SET_SPEED;
275 usb_out_buffer[1] = (speed >> 0) & 0xff;
276 usb_out_buffer[2] = (speed >> 8) & 0xff;
277
278 result = jlink_usb_write(jlink_jtag_handle, 3);
279 if (result != 3)
280 {
281 LOG_ERROR("J-Link setting speed failed (%d)", result);
282 return ERROR_JTAG_DEVICE_ERROR;
283 }
284
285 return ERROR_OK;
286 }
287
288 static int jlink_speed_div(int speed, int* khz)
289 {
290 *khz = speed;
291
292 return ERROR_OK;
293 }
294
295 static int jlink_khz(int khz, int *jtag_speed)
296 {
297 *jtag_speed = khz;
298
299 return ERROR_OK;
300 }
301
302 static int jlink_register_commands(struct command_context_s *cmd_ctx)
303 {
304 register_command(cmd_ctx, NULL, "jlink_info", jlink_handle_jlink_info_command, COMMAND_EXEC,
305 "query jlink info");
306 return ERROR_OK;
307 }
308
309 static int jlink_init(void)
310 {
311 int check_cnt;
312
313 jlink_jtag_handle = jlink_usb_open();
314
315 if (jlink_jtag_handle == 0)
316 {
317 LOG_ERROR("Cannot find jlink Interface! Please check connection and permissions.");
318 return ERROR_JTAG_INIT_FAILED;
319 }
320
321 check_cnt = 0;
322 while (check_cnt < 3)
323 {
324 if (jlink_get_version_info() == ERROR_OK)
325 {
326 /* attempt to get status */
327 jlink_get_status();
328 break;
329 }
330
331 check_cnt++;
332 }
333
334 if (check_cnt == 3)
335 {
336 LOG_INFO("J-Link initial read failed, don't worry");
337 }
338
339 LOG_INFO("J-Link JTAG Interface ready");
340
341 jlink_reset(0, 0);
342 jtag_sleep(3000);
343 jlink_tap_init();
344 jlink_speed(jtag_speed);
345
346 return ERROR_OK;
347 }
348
349 static int jlink_quit(void)
350 {
351 jlink_usb_close(jlink_jtag_handle);
352 return ERROR_OK;
353 }
354
355 /***************************************************************************/
356 /* Queue command implementations */
357
358 static void jlink_end_state(tap_state_t state)
359 {
360 if (tap_is_state_stable(state))
361 {
362 tap_set_end_state(state);
363 }
364 else
365 {
366 LOG_ERROR("BUG: %i is not a valid end state", state);
367 exit(-1);
368 }
369 }
370
371 /* Goes to the end state. */
372 static void jlink_state_move(void)
373 {
374 int i;
375 int tms = 0;
376 u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
377 u8 tms_scan_bits = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
378
379 for (i = 0; i < tms_scan_bits; i++)
380 {
381 tms = (tms_scan >> i) & 1;
382 jlink_tap_append_step(tms, 0);
383 }
384
385 tap_set_state(tap_get_end_state());
386 }
387
388 static void jlink_path_move(int num_states, tap_state_t *path)
389 {
390 int i;
391
392 for (i = 0; i < num_states; i++)
393 {
394 if (path[i] == tap_state_transition(tap_get_state(), false))
395 {
396 jlink_tap_append_step(0, 0);
397 }
398 else if (path[i] == tap_state_transition(tap_get_state(), true))
399 {
400 jlink_tap_append_step(1, 0);
401 }
402 else
403 {
404 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(path[i]));
405 exit(-1);
406 }
407
408 tap_set_state(path[i]);
409 }
410
411 tap_set_end_state(tap_get_state());
412 }
413
414 static void jlink_runtest(int num_cycles)
415 {
416 int i;
417
418 tap_state_t saved_end_state = tap_get_end_state();
419
420 /* only do a state_move when we're not already in IDLE */
421 if (tap_get_state() != TAP_IDLE)
422 {
423 jlink_end_state(TAP_IDLE);
424 jlink_state_move();
425 // num_cycles--;
426 }
427
428 /* execute num_cycles */
429 for (i = 0; i < num_cycles; i++)
430 {
431 jlink_tap_append_step(0, 0);
432 }
433
434 /* finish in end_state */
435 jlink_end_state(saved_end_state);
436 if (tap_get_state() != tap_get_end_state())
437 {
438 jlink_state_move();
439 }
440 }
441
442 static void jlink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, scan_command_t *command)
443 {
444 tap_state_t saved_end_state;
445
446 jlink_tap_ensure_space(1, scan_size + 8);
447
448 saved_end_state = tap_get_end_state();
449
450 /* Move to appropriate scan state */
451 jlink_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT);
452
453 /* Only move if we're not already there */
454 if (tap_get_state() != tap_get_end_state())
455 jlink_state_move();
456
457 jlink_end_state(saved_end_state);
458
459 /* Scan */
460 jlink_tap_append_scan(scan_size, buffer, command);
461
462 /* We are in Exit1, go to Pause */
463 jlink_tap_append_step(0, 0);
464
465 tap_set_state(ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE);
466
467 if (tap_get_state() != tap_get_end_state())
468 {
469 jlink_state_move();
470 }
471 }
472
473 static void jlink_reset(int trst, int srst)
474 {
475 LOG_DEBUG("trst: %i, srst: %i", trst, srst);
476
477 /* Signals are active low */
478 if (srst == 0)
479 {
480 jlink_simple_command(EMU_CMD_HW_RESET1);
481 }
482 if (srst == 1)
483 {
484 jlink_simple_command(EMU_CMD_HW_RESET0);
485 }
486
487 if (trst == 1)
488 {
489 jlink_simple_command(EMU_CMD_HW_TRST0);
490 }
491 if (trst == 0)
492 {
493 jlink_simple_command(EMU_CMD_HW_TRST1);
494 jtag_sleep(5000);
495 jlink_end_state(TAP_RESET);
496 jlink_state_move();
497 }
498 }
499
500 static void jlink_simple_command(u8 command)
501 {
502 int result;
503
504 DEBUG_JTAG_IO("0x%02x", command);
505
506 usb_out_buffer[0] = command;
507 result = jlink_usb_write(jlink_jtag_handle, 1);
508
509 if (result != 1)
510 {
511 LOG_ERROR("J-Link command 0x%02x failed (%d)", command, result);
512 }
513 }
514
515 static int jlink_get_status(void)
516 {
517 int result;
518
519 jlink_simple_command(EMU_CMD_GET_STATE);
520
521 result = jlink_usb_read(jlink_jtag_handle, 8);
522 if (result != 8)
523 {
524 LOG_ERROR("J-Link command EMU_CMD_GET_STATE failed (%d)\n", result);
525 return ERROR_JTAG_DEVICE_ERROR;
526 }
527
528 int vref = usb_in_buffer[0] + (usb_in_buffer[1] << 8);
529 LOG_INFO("Vref = %d.%d TCK = %d TDI = %d TDO = %d TMS = %d SRST = %d TRST = %d\n", \
530 vref / 1000, vref % 1000, \
531 usb_in_buffer[2], usb_in_buffer[3], usb_in_buffer[4], \
532 usb_in_buffer[5], usb_in_buffer[6], usb_in_buffer[7]);
533
534 if (vref < 1500)
535 LOG_ERROR("Vref too low. Check Target Power\n");
536
537 return ERROR_OK;
538 }
539
540 static int jlink_get_version_info(void)
541 {
542 int result;
543 int len;
544 u32 jlink_caps, jlink_max_size;
545
546 /* query hardware version */
547 jlink_simple_command(EMU_CMD_VERSION);
548
549 result = jlink_usb_read(jlink_jtag_handle, 2);
550 if (2 != result)
551 {
552 LOG_ERROR("J-Link command EMU_CMD_VERSION failed (%d)\n", result);
553 return ERROR_JTAG_DEVICE_ERROR;
554 }
555
556 len = buf_get_u32(usb_in_buffer, 0, 16);
557 result = jlink_usb_read(jlink_jtag_handle, len);
558 if (result != len)
559 {
560 LOG_ERROR("J-Link command EMU_CMD_VERSION failed (%d)\n", result);
561 return ERROR_JTAG_DEVICE_ERROR;
562 }
563
564 usb_in_buffer[result] = 0;
565 LOG_INFO("%s", (char *)usb_in_buffer);
566
567 /* query hardware capabilities */
568 jlink_simple_command(EMU_CMD_GET_CAPS);
569
570 result = jlink_usb_read(jlink_jtag_handle, 4);
571 if (4 != result)
572 {
573 LOG_ERROR("J-Link command EMU_CMD_GET_CAPS failed (%d)\n", result);
574 return ERROR_JTAG_DEVICE_ERROR;
575 }
576
577 jlink_caps = buf_get_u32(usb_in_buffer, 0, 32);
578 LOG_INFO("JLink caps 0x%x", jlink_caps);
579
580
581 /* query hardware maximum memory block */
582 jlink_simple_command(EMU_CMD_GET_MAX_MEM_BLOCK);
583
584 result = jlink_usb_read(jlink_jtag_handle, 4);
585 if (4 != result)
586 {
587 LOG_ERROR("J-Link command EMU_CMD_GET_MAX_MEM_BLOCK failed (%d)\n", result);
588 return ERROR_JTAG_DEVICE_ERROR;
589 }
590
591 jlink_max_size = buf_get_u32(usb_in_buffer, 0, 32);
592 LOG_INFO("JLink max mem block %i", jlink_max_size);
593
594
595 return ERROR_OK;
596 }
597
598 static int jlink_handle_jlink_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
599 {
600 if (jlink_get_version_info() == ERROR_OK)
601 {
602 /* attempt to get status */
603 jlink_get_status();
604 }
605
606 return ERROR_OK;
607 }
608
609 /***************************************************************************/
610 /* J-Link tap functions */
611
612 /* 2048 is the max value we can use here */
613 #define JLINK_TAP_BUFFER_SIZE 1024
614
615 static unsigned tap_length=0;
616 static u8 tms_buffer[JLINK_TAP_BUFFER_SIZE];
617 static u8 tdi_buffer[JLINK_TAP_BUFFER_SIZE];
618 static u8 tdo_buffer[JLINK_TAP_BUFFER_SIZE];
619
620 typedef struct
621 {
622 int first; /* First bit position in tdo_buffer to read */
623 int length; /* Number of bits to read */
624 scan_command_t *command; /* Corresponding scan command */
625 u8 *buffer;
626 } pending_scan_result_t;
627
628 #define MAX_PENDING_SCAN_RESULTS 256
629
630 static int pending_scan_results_length;
631 static pending_scan_result_t pending_scan_results_buffer[MAX_PENDING_SCAN_RESULTS];
632
633 static void jlink_tap_init(void)
634 {
635 tap_length = 0;
636 pending_scan_results_length = 0;
637 }
638
639 static void jlink_tap_ensure_space(int scans, int bits)
640 {
641 int available_scans = MAX_PENDING_SCAN_RESULTS - pending_scan_results_length;
642 int available_bits = JLINK_TAP_BUFFER_SIZE * 8 - tap_length - 64;
643
644 if (scans > available_scans || bits > available_bits)
645 {
646 jlink_tap_execute();
647 }
648 }
649
650 static void jlink_tap_append_step(int tms, int tdi)
651 {
652 int index = tap_length / 8;
653
654 if (index >= JLINK_TAP_BUFFER_SIZE)
655 {
656 LOG_ERROR("jlink_tap_append_step: overflow");
657 exit(-1);
658 }
659
660 int bit_index = tap_length % 8;
661 u8 bit = 1 << bit_index;
662
663 // we do not pad TMS, so be sure to initialize all bits
664 if (0 == bit_index)
665 {
666 tms_buffer[index] = tdi_buffer[index] = 0;
667 }
668
669 if (tms)
670 tms_buffer[index] |= bit;
671 else
672 tms_buffer[index] &= ~bit;
673
674 if (tdi)
675 tdi_buffer[index] |= bit;
676 else
677 tdi_buffer[index] &= ~bit;
678
679 tap_length++;
680 }
681
682 static void jlink_tap_append_scan(int length, u8 *buffer, scan_command_t *command)
683 {
684 pending_scan_result_t *pending_scan_result =
685 &pending_scan_results_buffer[pending_scan_results_length];
686 int i;
687
688 pending_scan_result->first = tap_length;
689 pending_scan_result->length = length;
690 pending_scan_result->command = command;
691 pending_scan_result->buffer = buffer;
692
693 for (i = 0; i < length; i++)
694 {
695 int tms = (i < (length - 1)) ? 0 : 1;
696 int tdi = (buffer[i / 8] & (1 << (i % 8)))!=0;
697 jlink_tap_append_step(tms, tdi);
698 }
699 pending_scan_results_length++;
700 }
701
702 /* Pad and send a tap sequence to the device, and receive the answer.
703 * For the purpose of padding we assume that we are in idle or pause state. */
704 static int jlink_tap_execute(void)
705 {
706 int byte_length;
707 int i;
708 int result;
709
710 if (!tap_length)
711 return ERROR_OK;
712
713 /* JLink returns an extra NULL in packet when size of in message is a multiple of 64, creates problems with usb comms */
714 /* WARNING This will interfere with tap state counting */
715 while ((TAP_SCAN_BYTES(tap_length)%64)==0)
716 {
717 jlink_tap_append_step((tap_get_state() == TAP_RESET)?1:0, 0);
718 }
719
720 // number of full bytes (plus one if some would be left over)
721 byte_length = TAP_SCAN_BYTES(tap_length);
722
723 usb_out_buffer[0] = EMU_CMD_HW_JTAG3;
724 usb_out_buffer[1] = 0;
725 usb_out_buffer[2] = (tap_length >> 0) & 0xff;
726 usb_out_buffer[3] = (tap_length >> 8) & 0xff;
727 memcpy(usb_out_buffer + 4, tms_buffer, byte_length);
728 memcpy(usb_out_buffer + 4 + byte_length, tdi_buffer, byte_length);
729
730 jlink_last_state = jtag_debug_state_machine(tms_buffer, tdi_buffer,
731 tap_length, jlink_last_state);
732
733 result = jlink_usb_message(jlink_jtag_handle, 4 + 2 * byte_length, byte_length);
734 if (result != byte_length)
735 {
736 LOG_ERROR("jlink_tap_execute, wrong result %d (expected %d)", result, byte_length);
737 jlink_tap_init();
738 return ERROR_JTAG_QUEUE_FAILED;
739 }
740
741 memcpy(tdo_buffer, usb_in_buffer, byte_length);
742
743 for (i = 0; i < pending_scan_results_length; i++)
744 {
745 pending_scan_result_t *pending_scan_result = &pending_scan_results_buffer[i];
746 u8 *buffer = pending_scan_result->buffer;
747 int length = pending_scan_result->length;
748 int first = pending_scan_result->first;
749 scan_command_t *command = pending_scan_result->command;
750
751 /* Copy to buffer */
752 buf_set_buf(tdo_buffer, first, buffer, 0, length);
753
754 DEBUG_JTAG_IO("pending scan result, length = %d", length);
755
756 #ifdef _DEBUG_USB_COMMS_
757 jlink_debug_buffer(buffer, byte_length);
758 #endif
759
760 if (jtag_read_buffer(buffer, command) != ERROR_OK)
761 {
762 jlink_tap_init();
763 return ERROR_JTAG_QUEUE_FAILED;
764 }
765
766 if (pending_scan_result->buffer != NULL)
767 {
768 free(pending_scan_result->buffer);
769 }
770 }
771
772 jlink_tap_init();
773 return ERROR_OK;
774 }
775
776 /*****************************************************************************/
777 /* JLink USB low-level functions */
778
779 static jlink_jtag_t* jlink_usb_open()
780 {
781 struct usb_bus *busses;
782 struct usb_bus *bus;
783 struct usb_device *dev;
784
785 jlink_jtag_t *result;
786
787 result = (jlink_jtag_t*) malloc(sizeof(jlink_jtag_t));
788
789 usb_init();
790 usb_find_busses();
791 usb_find_devices();
792
793 busses = usb_get_busses();
794
795 /* find jlink_jtag device in usb bus */
796
797 for (bus = busses; bus; bus = bus->next)
798 {
799 for (dev = bus->devices; dev; dev = dev->next)
800 {
801 if ((dev->descriptor.idVendor == VID) && (dev->descriptor.idProduct == PID))
802 {
803 result->usb_handle = usb_open(dev);
804
805 /* usb_set_configuration required under win32 */
806 usb_set_configuration(result->usb_handle, dev->config[0].bConfigurationValue);
807 usb_claim_interface(result->usb_handle, 0);
808
809 #if 0
810 /*
811 * This makes problems under Mac OS X. And is not needed
812 * under Windows. Hopefully this will not break a linux build
813 */
814 usb_set_altinterface(result->usb_handle, 0);
815 #endif
816 return result;
817 }
818 }
819 }
820
821 free(result);
822 return NULL;
823 }
824
825 static void jlink_usb_close(jlink_jtag_t *jlink_jtag)
826 {
827 usb_close(jlink_jtag->usb_handle);
828 free(jlink_jtag);
829 }
830
831 /* Send a message and receive the reply. */
832 static int jlink_usb_message(jlink_jtag_t *jlink_jtag, int out_length, int in_length)
833 {
834 int result;
835 int result2;
836
837 result = jlink_usb_write(jlink_jtag, out_length);
838 if (result != out_length)
839 {
840 LOG_ERROR("usb_bulk_write failed (requested=%d, result=%d)",
841 out_length, result);
842 return ERROR_JTAG_DEVICE_ERROR;
843 }
844
845 result = jlink_usb_read(jlink_jtag, in_length);
846 if ((result != in_length) && (result != (in_length + 1)))
847 {
848 LOG_ERROR("usb_bulk_read failed (requested=%d, result=%d)",
849 in_length, result);
850 return ERROR_JTAG_DEVICE_ERROR;
851 }
852
853 if (result == in_length)
854 {
855 /* Must read the result from the EMU too */
856 result2 = jlink_usb_read_emu_result(jlink_jtag);
857 if (1 != result2)
858 {
859 LOG_ERROR("jlink_usb_read_emu_result retried requested=1, result=%d, in_length=%i", result2,in_length);
860 /* Try again once, should only happen if (in_length%64==0) */
861 result2 = jlink_usb_read_emu_result(jlink_jtag);
862 if (1 != result2)
863 {
864 LOG_ERROR("jlink_usb_read_emu_result failed "
865 "(requested=1, result=%d)", result2);
866 return ERROR_JTAG_DEVICE_ERROR;
867 }
868 }
869
870 /* Check the result itself */
871 result2 = usb_emu_result_buffer[0];
872 }
873 else
874 {
875 /* Save the result, then remove it from return value */
876 result2 = usb_in_buffer[result--];
877 }
878
879 if (result2)
880 {
881 LOG_ERROR("jlink_usb_message failed with result=%d)", result2);
882 return ERROR_JTAG_DEVICE_ERROR;
883 }
884
885 return result;
886 }
887
888 /* calls the given usb_bulk_* function, allowing for the data to trickle in with some timeouts */
889 static int usb_bulk_with_retries(
890 int (*f)(usb_dev_handle *, int, char *, int, int),
891 usb_dev_handle *dev, int ep,
892 char *bytes, int size, int timeout)
893 {
894 int tries = 3, count = 0;
895
896 while (tries && (count < size))
897 {
898 int result = f(dev, ep, bytes + count, size - count, timeout);
899 if (result > 0)
900 count += result;
901 else if ((-ETIMEDOUT != result) || !--tries)
902 return result;
903 }
904 return count;
905 }
906
907 static int wrap_usb_bulk_write(usb_dev_handle *dev, int ep,
908 char *buff, int size, int timeout)
909 {
910 /* usb_bulk_write() takes const char *buff */
911 return usb_bulk_write(dev, ep, buff, size, timeout);
912 }
913
914 static inline int usb_bulk_write_ex(usb_dev_handle *dev, int ep,
915 char *bytes, int size, int timeout)
916 {
917 return usb_bulk_with_retries(&wrap_usb_bulk_write,
918 dev, ep, bytes, size, timeout);
919 }
920
921 static inline int usb_bulk_read_ex(usb_dev_handle *dev, int ep,
922 char *bytes, int size, int timeout)
923 {
924 return usb_bulk_with_retries(&usb_bulk_read,
925 dev, ep, bytes, size, timeout);
926 }
927
928 /* Write data from out_buffer to USB. */
929 static int jlink_usb_write(jlink_jtag_t *jlink_jtag, int out_length)
930 {
931 int result;
932
933 if (out_length > JLINK_OUT_BUFFER_SIZE)
934 {
935 LOG_ERROR("jlink_jtag_write illegal out_length=%d (max=%d)", out_length, JLINK_OUT_BUFFER_SIZE);
936 return -1;
937 }
938
939 result = usb_bulk_write_ex(jlink_jtag->usb_handle, JLINK_WRITE_ENDPOINT,
940 (char *)usb_out_buffer, out_length, JLINK_USB_TIMEOUT);
941
942 DEBUG_JTAG_IO("jlink_usb_write, out_length = %d, result = %d", out_length, result);
943
944 #ifdef _DEBUG_USB_COMMS_
945 jlink_debug_buffer(usb_out_buffer, out_length);
946 #endif
947 return result;
948 }
949
950 /* Read data from USB into in_buffer. */
951 static int jlink_usb_read(jlink_jtag_t *jlink_jtag, int expected_size)
952 {
953 int result = usb_bulk_read_ex(jlink_jtag->usb_handle, JLINK_READ_ENDPOINT,
954 (char *)usb_in_buffer, expected_size, JLINK_USB_TIMEOUT);
955
956 DEBUG_JTAG_IO("jlink_usb_read, result = %d", result);
957
958 #ifdef _DEBUG_USB_COMMS_
959 jlink_debug_buffer(usb_in_buffer, result);
960 #endif
961 return result;
962 }
963
964 /* Read the result from the previous EMU cmd into result_buffer. */
965 static int jlink_usb_read_emu_result(jlink_jtag_t *jlink_jtag)
966 {
967 int result = usb_bulk_read_ex(jlink_jtag->usb_handle, JLINK_READ_ENDPOINT,
968 (char *)usb_emu_result_buffer, 1 /* JLINK_EMU_RESULT_BUFFER_SIZE */,
969 JLINK_USB_TIMEOUT);
970
971 DEBUG_JTAG_IO("jlink_usb_read_result, result = %d", result);
972
973 #ifdef _DEBUG_USB_COMMS_
974 jlink_debug_buffer(usb_emu_result_buffer, result);
975 #endif
976 return result;
977 }
978
979 #ifdef _DEBUG_USB_COMMS_
980 #define BYTES_PER_LINE 16
981
982 static void jlink_debug_buffer(u8 *buffer, int length)
983 {
984 char line[81];
985 char s[4];
986 int i;
987 int j;
988
989 for (i = 0; i < length; i += BYTES_PER_LINE)
990 {
991 snprintf(line, 5, "%04x", i);
992 for (j = i; j < i + BYTES_PER_LINE && j < length; j++)
993 {
994 snprintf(s, 4, " %02x", buffer[j]);
995 strcat(line, s);
996 }
997 LOG_DEBUG("%s", line);
998 }
999 }
1000 #endif
1001

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)