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

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)