Shrink JLink buffer sizes to specified 2KB courtesy of Jeff Williams <jeffw@gadgetwor...
[fw/openocd] / 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